1 /* 2 Unix SMB/CIFS implementation. 3 4 DNS Server 5 6 Copyright (C) Amitay Isaacs 2011 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20 */ 21 22 #ifndef __DNSSERVER_H__ 23 #define __DNSSERVER_H__ 24 25 #include "librpc/gen_ndr/dnsp.h" 26 #include "librpc/gen_ndr/dnsserver.h" 27 #include "param/param.h" 28 #include "ldb.h" 29 30 struct dnsserver_serverinfo { 31 uint32_t dwVersion; 32 uint8_t fBootMethod; 33 uint8_t fAdminConfigured; 34 uint8_t fAllowUpdate; 35 uint8_t fDsAvailable; 36 37 char * pszServerName; 38 char * pszDsContainer; 39 40 uint32_t dwDsForestVersion; 41 uint32_t dwDsDomainVersion; 42 uint32_t dwDsDsaVersion; 43 uint32_t fReadOnlyDC; 44 char * pszDomainName; 45 char * pszForestName; 46 char * pszDomainDirectoryPartition; 47 char * pszForestDirectoryPartition; 48 49 struct DNS_ADDR_ARRAY * aipServerAddrs; 50 struct DNS_ADDR_ARRAY * aipListenAddrs; 51 struct IP4_ARRAY * aipForwarders; 52 53 struct IP4_ARRAY * aipLogFilter; 54 char * pwszLogFilePath; 55 56 uint32_t dwLogLevel; 57 uint32_t dwDebugLevel; 58 uint32_t dwEventLogLevel; 59 uint32_t dwLogFileMaxSize; 60 61 uint32_t dwForwardTimeout; 62 uint32_t dwRpcProtocol; 63 uint32_t dwNameCheckFlag; 64 uint32_t cAddressAnswerLimit; 65 uint32_t dwRecursionRetry; 66 uint32_t dwRecursionTimeout; 67 uint32_t dwMaxCacheTtl; 68 uint32_t dwDsPollingInterval; 69 uint32_t dwLocalNetPriorityNetMask; 70 71 uint32_t dwScavengingInterval; 72 uint32_t dwDefaultRefreshInterval; 73 uint32_t dwDefaultNoRefreshInterval; 74 uint32_t dwLastScavengeTime; 75 76 uint8_t fAutoReverseZones; 77 uint8_t fAutoCacheUpdate; 78 79 uint8_t fRecurseAfterForwarding; 80 uint8_t fForwardDelegations; 81 uint8_t fNoRecursion; 82 uint8_t fSecureResponses; 83 84 uint8_t fRoundRobin; 85 uint8_t fLocalNetPriority; 86 87 uint8_t fBindSecondaries; 88 uint8_t fWriteAuthorityNs; 89 90 uint8_t fStrictFileParsing; 91 uint8_t fLooseWildcarding; 92 uint8_t fDefaultAgingState; 93 }; 94 95 struct dnsserver_zoneinfo { 96 uint8_t Version; 97 uint32_t Flags; 98 uint8_t dwZoneType; 99 uint8_t fReverse; 100 uint8_t fAllowUpdate; 101 uint8_t fPaused; 102 uint8_t fShutdown; 103 uint8_t fAutoCreated; 104 105 uint8_t fUseDatabase; 106 char * pszDataFile; 107 108 struct IP4_ARRAY * aipMasters; 109 110 uint32_t fSecureSecondaries; 111 uint32_t fNotifyLevel; 112 struct IP4_ARRAY * aipSecondaries; 113 struct IP4_ARRAY * aipNotify; 114 115 uint32_t fUseWins; 116 uint32_t fUseNbstat; 117 118 uint32_t fAging; 119 uint32_t dwNoRefreshInterval; 120 uint32_t dwRefreshInterval; 121 uint32_t dwAvailForScavengeTime; 122 struct IP4_ARRAY * aipScavengeServers; 123 124 uint32_t dwForwarderTimeout; 125 uint32_t fForwarderSlave; 126 127 struct IP4_ARRAY * aipLocalMasters; 128 129 char * pwszZoneDn; 130 131 uint32_t dwLastSuccessfulSoaCheck; 132 uint32_t dwLastSuccessfulXfr; 133 134 uint32_t fQueuedForBackgroundLoad; 135 uint32_t fBackgroundLoadInProgress; 136 uint8_t fReadOnlyZone; 137 138 uint32_t dwLastXfrAttempt; 139 uint32_t dwLastXfrResult; 140 }; 141 142 143 struct dnsserver_partition { 144 struct dnsserver_partition *prev, *next; 145 struct ldb_dn *partition_dn; 146 const char *pszDpFqdn; 147 uint32_t dwDpFlags; 148 bool is_forest; 149 int zones_count; 150 }; 151 152 153 struct dnsserver_partition_info { 154 const char *pszCrDn; 155 uint32_t dwState; 156 uint32_t dwReplicaCount; 157 struct DNS_RPC_DP_REPLICA **ReplicaArray; 158 }; 159 160 161 struct dnsserver_zone { 162 struct dnsserver_zone *prev, *next; 163 struct dnsserver_partition *partition; 164 const char *name; 165 struct ldb_dn *zone_dn; 166 struct dnsserver_zoneinfo *zoneinfo; 167 struct dnsp_DnsProperty *tmp_props; 168 int32_t num_props; 169 }; 170 171 172 struct dns_tree { 173 const char *name; 174 int level; 175 unsigned int num_children; 176 struct dns_tree **children; 177 void *data; 178 }; 179 180 /* Data structure manipulation functions from dnsdata.c */ 181 182 struct IP4_ARRAY *ip4_array_copy(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4); 183 struct DNS_ADDR_ARRAY *ip4_array_to_dns_addr_array(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4); 184 struct IP4_ARRAY *dns_addr_array_to_ip4_array(TALLOC_CTX *mem_ctx, 185 struct DNS_ADDR_ARRAY *ip); 186 struct DNS_ADDR_ARRAY *dns_addr_array_copy(TALLOC_CTX *mem_ctx, struct DNS_ADDR_ARRAY *addr); 187 188 int dns_split_name_components(TALLOC_CTX *mem_ctx, const char *name, char ***components); 189 char *dns_split_node_name(TALLOC_CTX *mem_ctx, const char *node_name, const char *zone_name); 190 191 int dns_name_compare(struct ldb_message * const *m1, struct ldb_message * const *m2, 192 const char *search_name); 193 bool dns_record_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2); 194 195 void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp, 196 struct DNS_RPC_RECORD *dns); 197 WERROR dns_to_dnsp_convert(TALLOC_CTX *mem_ctx, struct DNS_RPC_RECORD *dns, 198 struct dnsp_DnssrvRpcRecord **out_dnsp, 199 bool check_name); 200 201 struct dns_tree *dns_build_tree(TALLOC_CTX *mem_ctx, const char *name, struct ldb_result *res); 202 WERROR dns_fill_records_array(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z, 203 enum dns_record_type record_type, 204 unsigned int select_flag, const char *zone_name, 205 struct ldb_message *msg, int num_children, 206 struct DNS_RPC_RECORDS_ARRAY *recs, 207 char ***add_names, int *add_count); 208 209 210 /* Utility functions from dnsutils.c */ 211 212 struct dnsserver_serverinfo *dnsserver_init_serverinfo(TALLOC_CTX *mem_ctx, 213 struct loadparm_context *lp_ctx, 214 struct ldb_context *samdb); 215 struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone, 216 struct dnsserver_serverinfo *serverinfo); 217 struct dnsserver_zone *dnsserver_find_zone(struct dnsserver_zone *zones, 218 const char *zone_name); 219 struct ldb_dn *dnsserver_name_to_dn(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z, 220 const char *name); 221 uint32_t dnsserver_zone_to_request_filter(const char *zone); 222 223 /* Database functions from dnsdb.c */ 224 225 struct dnsserver_partition *dnsserver_db_enumerate_partitions(TALLOC_CTX *mem_ctx, 226 struct dnsserver_serverinfo *serverinfo, 227 struct ldb_context *samdb); 228 struct dnsserver_zone *dnsserver_db_enumerate_zones(TALLOC_CTX *mem_ctx, 229 struct ldb_context *samdb, 230 struct dnsserver_partition *p); 231 struct dnsserver_partition_info *dnsserver_db_partition_info(TALLOC_CTX *mem_ctx, 232 struct ldb_context *samdb, 233 struct dnsserver_partition *p); 234 WERROR dnsserver_db_add_empty_node(TALLOC_CTX *mem_ctx, 235 struct ldb_context *samdb, 236 struct dnsserver_zone *z, 237 const char *node_name); 238 WERROR dnsserver_db_add_record(TALLOC_CTX *mem_ctx, 239 struct ldb_context *samdb, 240 struct dnsserver_zone *z, 241 const char *node_name, 242 struct DNS_RPC_RECORD *add_record); 243 WERROR dnsserver_db_update_record(TALLOC_CTX *mem_ctx, 244 struct ldb_context *samdb, 245 struct dnsserver_zone *z, 246 const char *node_name, 247 struct DNS_RPC_RECORD *add_record, 248 struct DNS_RPC_RECORD *del_record); 249 WERROR dnsserver_db_do_reset_dword(struct ldb_context *samdb, 250 struct dnsserver_zone *z, 251 struct DNS_RPC_NAME_AND_PARAM *n_p); 252 WERROR dnsserver_db_delete_record(TALLOC_CTX *mem_ctx, 253 struct ldb_context *samdb, 254 struct dnsserver_zone *z, 255 const char *node_name, 256 struct DNS_RPC_RECORD *del_record); 257 WERROR dnsserver_db_create_zone(struct ldb_context *samdb, 258 struct dnsserver_partition *partitions, 259 struct dnsserver_zone *z, 260 struct loadparm_context *lp_ctx); 261 WERROR dnsserver_db_delete_zone(struct ldb_context *samdb, 262 struct dnsserver_zone *z); 263 264 #endif /* __DNSSERVER_H__ */ 265