1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2016, 2017, 2018 Igalia S.L.
4  * Copyright (C) 2017, 2018 Metrological Group B.V.
5  */
6 
7 #ifndef __SOUP_HSTS_ENFORCER_H__
8 #define __SOUP_HSTS_ENFORCER_H__ 1
9 
10 #include <libsoup/soup-types.h>
11 
12 G_BEGIN_DECLS
13 
14 #define SOUP_TYPE_HSTS_ENFORCER		   (soup_hsts_enforcer_get_type ())
15 #define SOUP_HSTS_ENFORCER(obj)		   (G_TYPE_CHECK_INSTANCE_CAST ((obj), SOUP_TYPE_HSTS_ENFORCER, SoupHSTSEnforcer))
16 #define SOUP_HSTS_ENFORCER_CLASS(klass)	   (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_HSTS_ENFORCER, SoupHSTSEnforcerClass))
17 #define SOUP_IS_HSTS_ENFORCER(obj)	   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SOUP_TYPE_HSTS_ENFORCER))
18 #define SOUP_IS_HSTS_ENFORCER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), SOUP_TYPE_HSTS_ENFORCER))
19 #define SOUP_HSTS_ENFORCER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), SOUP_TYPE_HSTS_ENFORCER, SoupHSTSEnforcerClass))
20 
21 typedef struct _SoupHSTSEnforcerPrivate SoupHSTSEnforcerPrivate;
22 
23 struct _SoupHSTSEnforcer {
24 	GObject parent;
25 
26 	SoupHSTSEnforcerPrivate *priv;
27 };
28 
29 /**
30  * SoupHSTSEnforcerClass:
31  * @parent_class: The parent class.
32  * @is_persistent: The @is_persistent function advertises whether the enforcer is persistent or
33  * whether changes made to it will be lost when the underlying #SoupSession is finished.
34  * @has_valid_policy: The @has_valid_policy function is called to check whether there is a valid
35  * policy for the given domain. This method should return %TRUE for #SoupHSTSEnforcer to
36  * change the scheme of the #SoupURI in the #SoupMessage to HTTPS. Implementations might want to
37  * chain up to the @has_valid_policy in the parent class to check, for instance, for runtime
38  * policies.
39  * @changed: the class closure for the #SoupHSTSEnforcer::changed signal.
40  **/
41 typedef struct {
42 	GObjectClass parent_class;
43 
44 	gboolean (*is_persistent) (SoupHSTSEnforcer *hsts_enforcer);
45 	gboolean (*has_valid_policy) (SoupHSTSEnforcer *hsts_enforcer, const char *domain);
46 
47 	/* signals */
48 	void (*changed) (SoupHSTSEnforcer *enforcer,
49 			 SoupHSTSPolicy	  *old_policy,
50 			 SoupHSTSPolicy	  *new_policy);
51 
52 	void (*hsts_enforced) (SoupHSTSEnforcer *enforcer,
53 			       SoupMessage      *message);
54 
55 	/* Padding for future expansion */
56 	void (*_libsoup_reserved1) (void);
57 	void (*_libsoup_reserved2) (void);
58 	void (*_libsoup_reserved3) (void);
59 	void (*_libsoup_reserved4) (void);
60 } SoupHSTSEnforcerClass;
61 
62 SOUP_AVAILABLE_IN_2_68
63 GType		  soup_hsts_enforcer_get_type			   (void);
64 SOUP_AVAILABLE_IN_2_68
65 SoupHSTSEnforcer *soup_hsts_enforcer_new			   (void);
66 SOUP_AVAILABLE_IN_2_68
67 gboolean	  soup_hsts_enforcer_is_persistent		   (SoupHSTSEnforcer *hsts_enforcer);
68 SOUP_AVAILABLE_IN_2_68
69 gboolean	  soup_hsts_enforcer_has_valid_policy		   (SoupHSTSEnforcer *hsts_enforcer,
70 								    const char	     *domain);
71 SOUP_AVAILABLE_IN_2_68
72 void		  soup_hsts_enforcer_set_session_policy		   (SoupHSTSEnforcer *hsts_enforcer,
73 								    const char	     *domain,
74 								    gboolean	      include_subdomains);
75 SOUP_AVAILABLE_IN_2_68
76 void		  soup_hsts_enforcer_set_policy			   (SoupHSTSEnforcer *hsts_enforcer,
77 								    SoupHSTSPolicy   *policy);
78 
79 SOUP_AVAILABLE_IN_2_68
80 GList            *soup_hsts_enforcer_get_domains                   (SoupHSTSEnforcer *hsts_enforcer,
81 								    gboolean          session_policies);
82 
83 SOUP_AVAILABLE_IN_2_68
84 GList            *soup_hsts_enforcer_get_policies                  (SoupHSTSEnforcer *hsts_enforcer,
85 								    gboolean          session_policies);
86 
87 G_END_DECLS
88 
89 #endif /* __SOUP_HSTS_ENFORCER_H__ */
90