r25026: Move param/param.h out of includes.h
[samba.git] / source4 / nbt_server / dgram / ntlogon.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    NBT datagram ntlogon server
5
6    Copyright (C) Andrew Tridgell        2005
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 "nbt_server/nbt_server.h"
24 #include "lib/socket/socket.h"
25 #include "librpc/gen_ndr/ndr_nbt.h"
26 #include "param/param.h"
27
28 /*
29   reply to a SAM LOGON request
30  */
31 static void nbtd_ntlogon_sam_logon(struct dgram_mailslot_handler *dgmslot, 
32                                    struct nbtd_interface *iface,
33                                    struct nbt_dgram_packet *packet,
34                                    const struct socket_address *src,
35                                    struct nbt_ntlogon_packet *ntlogon)
36 {
37         struct nbt_name *name = &packet->data.msg.dest_name;
38         struct nbtd_interface *reply_iface = nbtd_find_reply_iface(iface, src->addr, False);
39         struct nbt_ntlogon_packet reply;
40         struct nbt_ntlogon_sam_logon_reply *logon;
41
42         /* only answer sam logon requests on the PDC or LOGON names */
43         if (name->type != NBT_NAME_PDC && name->type != NBT_NAME_LOGON) {
44                 return;
45         }
46
47         /* setup a SAM LOGON reply */
48         ZERO_STRUCT(reply);
49         reply.command = NTLOGON_SAM_LOGON_REPLY;
50         logon = &reply.req.reply;
51
52         logon->server           = talloc_asprintf(packet, "\\\\%s", lp_netbios_name());
53         logon->user_name        = ntlogon->req.logon.user_name;
54         logon->domain           = lp_workgroup();
55         logon->nt_version       = 1;
56         logon->lmnt_token       = 0xFFFF;
57         logon->lm20_token       = 0xFFFF;
58
59         packet->data.msg.dest_name.type = 0;
60
61         dgram_mailslot_ntlogon_reply(reply_iface->dgmsock, 
62                                      packet, 
63                                      ntlogon->req.logon.mailslot_name,
64                                      &reply);
65 }
66
67 /*
68   handle incoming ntlogon mailslot requests
69 */
70 void nbtd_mailslot_ntlogon_handler(struct dgram_mailslot_handler *dgmslot, 
71                                    struct nbt_dgram_packet *packet, 
72                                    struct socket_address *src)
73 {
74         NTSTATUS status = NT_STATUS_NO_MEMORY;
75         struct nbtd_interface *iface = 
76                 talloc_get_type(dgmslot->private, struct nbtd_interface);
77         struct nbt_ntlogon_packet *ntlogon = 
78                 talloc(dgmslot, struct nbt_ntlogon_packet);
79         struct nbtd_iface_name *iname;
80         struct nbt_name *name = &packet->data.msg.dest_name;
81
82         if (ntlogon == NULL) goto failed;
83
84         /*
85           see if the we are listening on the destination netbios name
86         */
87         iname = nbtd_find_iname(iface, name, 0);
88         if (iname == NULL) {
89                 status = NT_STATUS_BAD_NETWORK_NAME;
90                 goto failed;
91         }
92
93         DEBUG(2,("ntlogon request to %s from %s:%d\n", 
94                  nbt_name_string(ntlogon, name), src->addr, src->port));
95         status = dgram_mailslot_ntlogon_parse(dgmslot, ntlogon, packet, ntlogon);
96         if (!NT_STATUS_IS_OK(status)) goto failed;
97
98         NDR_PRINT_DEBUG(nbt_ntlogon_packet, ntlogon);
99
100         switch (ntlogon->command) {
101         case NTLOGON_SAM_LOGON:
102                 nbtd_ntlogon_sam_logon(dgmslot, iface, packet, src, ntlogon);
103                 break;
104         default:
105                 DEBUG(2,("unknown ntlogon op %d from %s:%d\n", 
106                          ntlogon->command, src->addr, src->port));
107                 break;
108         }
109
110         talloc_free(ntlogon);
111         return;
112
113 failed:
114         DEBUG(2,("nbtd ntlogon handler failed from %s:%d to %s - %s\n",
115                  src->addr, src->port, nbt_name_string(ntlogon, name),
116                  nt_errstr(status)));
117         talloc_free(ntlogon);
118 }