00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef DNS_ACL_H
00021 #define DNS_ACL_H 1
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <isc/lang.h>
00037 #include <isc/magic.h>
00038 #include <isc/netaddr.h>
00039 #include <isc/refcount.h>
00040
00041 #ifdef HAVE_GEOIP
00042 #include <dns/geoip.h>
00043 #endif
00044 #include <dns/name.h>
00045 #include <dns/types.h>
00046 #include <dns/iptable.h>
00047
00048 #ifdef HAVE_GEOIP
00049 #include <GeoIP.h>
00050 #endif
00051
00052
00053
00054
00055
00056 typedef enum {
00057 dns_aclelementtype_ipprefix,
00058 dns_aclelementtype_keyname,
00059 dns_aclelementtype_nestedacl,
00060 dns_aclelementtype_localhost,
00061 dns_aclelementtype_localnets,
00062 #ifdef HAVE_GEOIP
00063 dns_aclelementtype_geoip,
00064 #endif
00065 dns_aclelementtype_any
00066 } dns_aclelementtype_t;
00067
00068 typedef struct dns_aclipprefix dns_aclipprefix_t;
00069
00070 struct dns_aclipprefix {
00071 isc_netaddr_t address;
00072 unsigned int prefixlen;
00073 };
00074
00075 struct dns_aclelement {
00076 dns_aclelementtype_t type;
00077 isc_boolean_t negative;
00078 dns_name_t keyname;
00079 #ifdef HAVE_GEOIP
00080 dns_geoip_elem_t geoip_elem;
00081 #endif
00082 dns_acl_t *nestedacl;
00083 int node_num;
00084 };
00085
00086 struct dns_acl {
00087 unsigned int magic;
00088 isc_mem_t *mctx;
00089 isc_refcount_t refcount;
00090 dns_iptable_t *iptable;
00091 #define node_count iptable->radix->num_added_node
00092 dns_aclelement_t *elements;
00093 isc_boolean_t has_negatives;
00094 unsigned int alloc;
00095 unsigned int length;
00096 char *name;
00097 ISC_LINK(dns_acl_t) nextincache;
00098 };
00099
00100 struct dns_aclenv {
00101 dns_acl_t *localhost;
00102 dns_acl_t *localnets;
00103 isc_boolean_t match_mapped;
00104 #ifdef HAVE_GEOIP
00105 dns_geoip_databases_t *geoip;
00106 isc_boolean_t geoip_use_ecs;
00107 #endif
00108 };
00109
00110 #define DNS_ACL_MAGIC ISC_MAGIC('D','a','c','l')
00111 #define DNS_ACL_VALID(a) ISC_MAGIC_VALID(a, DNS_ACL_MAGIC)
00112
00113
00114
00115
00116
00117 ISC_LANG_BEGINDECLS
00118
00119 isc_result_t
00120 dns_acl_create(isc_mem_t *mctx, int n, dns_acl_t **target);
00121
00122
00123
00124
00125
00126
00127 isc_result_t
00128 dns_acl_any(isc_mem_t *mctx, dns_acl_t **target);
00129
00130
00131
00132
00133 isc_result_t
00134 dns_acl_none(isc_mem_t *mctx, dns_acl_t **target);
00135
00136
00137
00138
00139 isc_boolean_t
00140 dns_acl_isany(dns_acl_t *acl);
00141
00142
00143
00144
00145 isc_boolean_t
00146 dns_acl_isnone(dns_acl_t *acl);
00147
00148
00149
00150
00151 isc_result_t
00152 dns_acl_merge(dns_acl_t *dest, dns_acl_t *source, isc_boolean_t pos);
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 void
00164 dns_acl_attach(dns_acl_t *source, dns_acl_t **target);
00165
00166
00167
00168
00169
00170
00171
00172
00173 void
00174 dns_acl_detach(dns_acl_t **aclp);
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 isc_boolean_t
00187 dns_acl_isinsecure(const dns_acl_t *a);
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 isc_result_t
00198 dns_aclenv_init(isc_mem_t *mctx, dns_aclenv_t *env);
00199
00200
00201
00202
00203 void
00204 dns_aclenv_copy(dns_aclenv_t *t, dns_aclenv_t *s);
00205
00206 void
00207 dns_aclenv_destroy(dns_aclenv_t *env);
00208
00209 isc_result_t
00210 dns_acl_match(const isc_netaddr_t *reqaddr,
00211 const dns_name_t *reqsigner,
00212 const dns_acl_t *acl,
00213 const dns_aclenv_t *env,
00214 int *match,
00215 const dns_aclelement_t **matchelt);
00216
00217 isc_result_t
00218 dns_acl_match2(const isc_netaddr_t *reqaddr,
00219 const dns_name_t *reqsigner,
00220 const isc_netaddr_t *ecs,
00221 isc_uint8_t ecslen,
00222 isc_uint8_t *scope,
00223 const dns_acl_t *acl,
00224 const dns_aclenv_t *env,
00225 int *match,
00226 const dns_aclelement_t **matchelt);
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 isc_boolean_t
00259 dns_aclelement_match(const isc_netaddr_t *reqaddr,
00260 const dns_name_t *reqsigner,
00261 const dns_aclelement_t *e,
00262 const dns_aclenv_t *env,
00263 const dns_aclelement_t **matchelt);
00264
00265 isc_boolean_t
00266 dns_aclelement_match2(const isc_netaddr_t *reqaddr,
00267 const dns_name_t *reqsigner,
00268 const isc_netaddr_t *ecs,
00269 isc_uint8_t ecslen,
00270 isc_uint8_t *scope,
00271 const dns_aclelement_t *e,
00272 const dns_aclenv_t *env,
00273 const dns_aclelement_t **matchelt);
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 ISC_LANG_ENDDECLS
00285
00286 #endif