66264feb46071ce3fbb379091bb2956087ee329d
[ira/wip.git] / source4 / rpc_server / common / server_info.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    common server info functions
5
6    Copyright (C) Stefan (metze) Metzmacher 2004
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 #include "includes.h"
23 #include "librpc/gen_ndr/ndr_srvsvc.h"
24 #include "rpc_server/dcerpc_server.h"
25 #include "dsdb/samdb/samdb.h"
26 #include "auth/auth.h"
27 #include "param/param.h"
28 #include "rpc_server/common/common.h"
29
30 /* 
31     Here are common server info functions used by some dcerpc server interfaces
32 */
33
34 /* This hardcoded value should go into a ldb database! */
35 enum srvsvc_PlatformId dcesrv_common_get_platform_id(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
36 {
37         enum srvsvc_PlatformId id;
38
39         id = lp_parm_int(dce_ctx->lp_ctx, NULL, "server_info", "platform_id", PLATFORM_ID_NT);
40
41         return id;
42 }
43
44 const char *dcesrv_common_get_server_name(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx, const char *server_unc)
45 {
46         const char *p = server_unc;
47
48         /* if there's no string return our NETBIOS name */
49         if (!p) {
50                 return talloc_strdup(mem_ctx, lp_netbios_name(dce_ctx->lp_ctx));
51         }
52
53         /* if there're '\\\\' in front remove them otherwise just pass the string */
54         if (p[0] == '\\' && p[1] == '\\') {
55                 p += 2;
56         }
57
58         return talloc_strdup(mem_ctx, p);
59 }
60
61
62 /* This hardcoded value should go into a ldb database! */
63 uint32_t dcesrv_common_get_server_type(TALLOC_CTX *mem_ctx, struct tevent_context *event_ctx, struct dcesrv_context *dce_ctx)
64 {
65         int default_server_announce = 0;
66         default_server_announce |= SV_TYPE_WORKSTATION;
67         default_server_announce |= SV_TYPE_SERVER;
68         default_server_announce |= SV_TYPE_SERVER_UNIX;
69
70         switch (lp_announce_as(dce_ctx->lp_ctx)) {
71                 case ANNOUNCE_AS_NT_SERVER:
72                         default_server_announce |= SV_TYPE_SERVER_NT;
73                         /* fall through... */
74                 case ANNOUNCE_AS_NT_WORKSTATION:
75                         default_server_announce |= SV_TYPE_NT;
76                         break;
77                 case ANNOUNCE_AS_WIN95:
78                         default_server_announce |= SV_TYPE_WIN95_PLUS;
79                         break;
80                 case ANNOUNCE_AS_WFW:
81                         default_server_announce |= SV_TYPE_WFW;
82                         break;
83                 default:
84                         break;
85         }
86
87         switch (lp_server_role(dce_ctx->lp_ctx)) {
88                 case ROLE_DOMAIN_MEMBER:
89                         default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
90                         break;
91                 case ROLE_DOMAIN_CONTROLLER:
92                 {
93                         struct ldb_context *samctx;
94                         TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
95                         if (!tmp_ctx) {
96                                 break;
97                         }
98                         /* open main ldb */
99                         samctx = samdb_connect(tmp_ctx, event_ctx, dce_ctx->lp_ctx, anonymous_session(tmp_ctx, event_ctx, dce_ctx->lp_ctx));
100                         if (samctx == NULL) {
101                                 DEBUG(2,("Unable to open samdb in determining server announce flags\n"));
102                         } else {
103                                 /* Determine if we are the pdc */
104                                 bool is_pdc = samdb_is_pdc(samctx);
105                                 if (is_pdc) {
106                                         default_server_announce |= SV_TYPE_DOMAIN_CTRL;
107                                 } else {
108                                         default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
109                                 }
110                         }
111                         /* Close it */
112                         talloc_free(tmp_ctx);
113                         break;
114                 }
115                 case ROLE_STANDALONE:
116                 default:
117                         break;
118         }
119         if (lp_time_server(dce_ctx->lp_ctx))
120                 default_server_announce |= SV_TYPE_TIME_SOURCE;
121
122         if (lp_host_msdfs(dce_ctx->lp_ctx))
123                 default_server_announce |= SV_TYPE_DFS_SERVER;
124
125
126 #if 0
127         { 
128                 /* TODO: announce us as print server when we are a print server */
129                 bool is_print_server = false;
130                 if (is_print_server) {
131                         default_server_announce |= SV_TYPE_PRINTQ_SERVER;
132                 }
133         }
134 #endif
135         return default_server_announce;
136 }
137
138 /* This hardcoded value should go into a ldb database! */
139 const char *dcesrv_common_get_lan_root(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
140 {
141         return talloc_strdup(mem_ctx, "");
142 }
143
144 /* This hardcoded value should go into a ldb database! */
145 uint32_t dcesrv_common_get_users(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
146 {
147         return -1;
148 }
149
150 /* This hardcoded value should go into a ldb database! */
151 uint32_t dcesrv_common_get_disc(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
152 {
153         return 15;
154 }
155
156 /* This hardcoded value should go into a ldb database! */
157 uint32_t dcesrv_common_get_hidden(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
158 {
159         return 0;
160 }
161
162 /* This hardcoded value should go into a ldb database! */
163 uint32_t dcesrv_common_get_announce(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
164 {
165         return 240;
166 }
167
168 /* This hardcoded value should go into a ldb database! */
169 uint32_t dcesrv_common_get_anndelta(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
170 {
171         return 3000;
172 }
173
174 /* This hardcoded value should go into a ldb database! */
175 uint32_t dcesrv_common_get_licenses(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
176 {
177         return 0;
178 }
179
180 /* This hardcoded value should go into a ldb database! */
181 const char *dcesrv_common_get_userpath(TALLOC_CTX *mem_ctx, struct dcesrv_context *dce_ctx)
182 {
183         return talloc_strdup(mem_ctx, "c:\\");
184 }
185
186 #define INVALID_SHARE_NAME_CHARS " \"*+,./:;<=>?[\\]|"
187
188 bool dcesrv_common_validate_share_name(TALLOC_CTX *mem_ctx, const char *share_name)
189 {
190         if (strpbrk(share_name, INVALID_SHARE_NAME_CHARS)) {
191                 return false;
192         }
193
194         return true;
195 }