Line data Source code
1 : /*
2 : Linux DNS client library implementation
3 :
4 : Copyright (C) 2006 Krishna Ganugapati <krishnag@centeris.com>
5 : Copyright (C) 2006 Gerald Carter <jerry@samba.org>
6 :
7 : ** NOTE! The following LGPL license applies to the libaddns
8 : ** library. This does NOT imply that all of Samba is released
9 : ** under the LGPL
10 :
11 : This library is free software; you can redistribute it and/or
12 : modify it under the terms of the GNU Lesser General Public
13 : License as published by the Free Software Foundation; either
14 : version 2.1 of the License, or (at your option) any later version.
15 :
16 : This library is distributed in the hope that it will be useful,
17 : but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 : Lesser General Public License for more details.
20 :
21 : You should have received a copy of the GNU Lesser General Public
22 : License along with this library; if not, see <http://www.gnu.org/licenses/>.
23 : */
24 :
25 : #include "includes.h"
26 : #include "librpc/ndr/libndr.h"
27 : #include "librpc/gen_ndr/ndr_misc.h"
28 :
29 : #include "dns.h"
30 : #include <ctype.h>
31 :
32 :
33 2440 : static DNS_ERROR LabelList( TALLOC_CTX *mem_ctx,
34 : const char *name,
35 : struct dns_domain_label **presult )
36 : {
37 : struct dns_domain_label *result;
38 : const char *dot;
39 :
40 21260 : for (dot = name; *dot != '\0'; dot += 1) {
41 20585 : char c = *dot;
42 :
43 20585 : if (c == '.')
44 1765 : break;
45 :
46 27924 : if (c == '-') continue;
47 18276 : if ((c >= 'a') && (c <= 'z')) continue;
48 2930 : if ((c >= 'A') && (c <= 'Z')) continue;
49 2930 : if ((c >= '0') && (c <= '9')) continue;
50 :
51 0 : return ERROR_DNS_INVALID_NAME;
52 : }
53 :
54 2440 : if ((dot - name) > 63) {
55 : /*
56 : * DNS labels can only be 63 chars long
57 : */
58 0 : return ERROR_DNS_INVALID_NAME;
59 : }
60 :
61 2440 : if (!(result = talloc_zero(mem_ctx, struct dns_domain_label))) {
62 0 : return ERROR_DNS_NO_MEMORY;
63 : }
64 :
65 2440 : if (*dot == '\0') {
66 : /*
67 : * No dot around, so this is the last component
68 : */
69 :
70 675 : if (!(result->label = talloc_strdup(result, name))) {
71 0 : TALLOC_FREE(result);
72 0 : return ERROR_DNS_NO_MEMORY;
73 : }
74 675 : result->len = strlen(result->label);
75 675 : *presult = result;
76 675 : return ERROR_DNS_SUCCESS;
77 : }
78 :
79 1765 : if (dot[1] == '.') {
80 : /*
81 : * Two dots in a row, reject
82 : */
83 :
84 0 : TALLOC_FREE(result);
85 0 : return ERROR_DNS_INVALID_NAME;
86 : }
87 :
88 1765 : if (dot[1] != '\0') {
89 : /*
90 : * Something follows, get the rest
91 : */
92 :
93 1765 : DNS_ERROR err = LabelList(result, dot+1, &result->next);
94 :
95 1765 : if (!ERR_DNS_IS_OK(err)) {
96 0 : TALLOC_FREE(result);
97 0 : return err;
98 : }
99 : }
100 :
101 1765 : result->len = (dot - name);
102 :
103 1765 : if (!(result->label = talloc_strndup(result, name, result->len))) {
104 0 : TALLOC_FREE(result);
105 0 : return ERROR_DNS_NO_MEMORY;
106 : }
107 :
108 1765 : *presult = result;
109 1765 : return ERROR_DNS_SUCCESS;
110 : }
111 :
112 675 : DNS_ERROR dns_domain_name_from_string( TALLOC_CTX *mem_ctx,
113 : const char *pszDomainName,
114 : struct dns_domain_name **presult )
115 : {
116 : struct dns_domain_name *result;
117 : DNS_ERROR err;
118 :
119 675 : if (!(result = talloc(mem_ctx, struct dns_domain_name))) {
120 0 : return ERROR_DNS_NO_MEMORY;
121 : }
122 :
123 675 : err = LabelList( result, pszDomainName, &result->pLabelList );
124 675 : if (!ERR_DNS_IS_OK(err)) {
125 0 : TALLOC_FREE(result);
126 0 : return err;
127 : }
128 :
129 675 : *presult = result;
130 675 : return ERROR_DNS_SUCCESS;
131 : }
132 :
133 : /*********************************************************************
134 : *********************************************************************/
135 :
136 34 : char *dns_generate_keyname( TALLOC_CTX *mem_ctx )
137 : {
138 34 : char *result = NULL;
139 : #if defined(HAVE_KRB5)
140 :
141 : struct GUID guid;
142 :
143 34 : guid = GUID_random();
144 34 : result = GUID_string(mem_ctx, &guid);
145 :
146 : #endif
147 :
148 34 : return result;
149 : }
|