5c5333a98fb694f994d5706892b1da625e45d3a3
[packages.git] / net / samba3 / patches / 130-owrt_smbpasswd.patch
1 --- a/source/Makefile.in
2 +++ b/source/Makefile.in
3 @@ -538,10 +538,7 @@ TESTPARM_OBJ = utils/testparm.o \
4  
5  PASSWD_UTIL_OBJ = utils/passwd_util.o
6  
7 -SMBPASSWD_OBJ = utils/smbpasswd.o $(PASSWD_UTIL_OBJ) $(PASSCHANGE_OBJ) \
8 -               $(PARAM_OBJ) $(SECRETS_OBJ) $(LIBSMB_OBJ) $(PASSDB_OBJ) \
9 -               $(GROUPDB_OBJ) $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \
10 -               $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(RPC_PARSE_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ)
11 +SMBPASSWD_OBJ = utils/owrt_smbpasswd.o lib/md4.o
12  
13  PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) \
14                 $(LIBSAMBA_OBJ) $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) \
15 --- /dev/null
16 +++ b/source/utils/owrt_smbpasswd.c
17 @@ -0,0 +1,195 @@
18 +/*
19 + * Copyright (C) John Crispin <blogic@openwrt.org>
20 + *
21 + * This program is free software; you can redistribute it and/or modify it
22 + * under the terms of the GNU General Public License as published by the
23 + * Free Software Foundation; either version 2 of the License, or (at your
24 + * option) any later version.
25 + * 
26 + * This program is distributed in the hope that it will be useful, but WITHOUT
27 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
28 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
29 + * more details.
30 + * 
31 + * You should have received a copy of the GNU General Public License along with
32 + * this program; if not, write to the Free Software Foundation, Inc., 675
33 + * Mass Ave, Cambridge, MA 02139, USA.  */
34 +
35 +#include "includes.h"
36 +#include <endian.h>
37 +
38 +void E_md4hash(const char *passwd, uchar p16[16])
39 +{
40 +       int len;
41 +       smb_ucs2_t wpwd[129];
42 +       int i;
43 +
44 +       len = strlen(passwd);
45 +       for (i = 0; i < len; i++) {
46 +#if __BYTE_ORDER == __LITTLE_ENDIAN
47 +               wpwd[i] = (unsigned char)passwd[i];
48 +#else
49 +               wpwd[i] = (unsigned char)passwd[i] << 8;
50 +#endif
51 +       }
52 +       wpwd[i] = 0;
53 +
54 +       len = len * sizeof(int16);
55 +       mdfour(p16, (unsigned char *)wpwd, len);
56 +       ZERO_STRUCT(wpwd);
57 +}
58 +
59 +/* returns -1 if user is not present in /etc/passwd*/
60 +int find_uid_for_user(char *user)
61 +{
62 +       char t[256];
63 +       FILE *fp = fopen("/etc/passwd", "r");
64 +       int ret = -1;
65 +
66 +       if(!fp)
67 +       {
68 +               printf("failed to open /etc/passwd");
69 +               goto out;
70 +       }
71 +
72 +       while(!feof(fp))
73 +       {
74 +               if(fgets(t, 255, fp))
75 +               {
76 +                       char *p1, *p2;
77 +                       p1 = strchr(t, ':');
78 +                       if(p1 && (p1 - t == strlen(user)) && (strncmp(t, user, strlen(user))) == 0)
79 +                       {
80 +                               p1 = strchr(t, ':');
81 +                               if(!p1)
82 +                                       goto out;
83 +                               p2 = strchr(++p1, ':');
84 +                               if(!p2)
85 +                                       goto out;
86 +                               p1 = strchr(++p2, ':');
87 +                               if(!p1)
88 +                                       goto out;
89 +                               *p1 = '\0';
90 +                               ret = atoi(p2);
91 +                               goto out;
92 +                       }
93 +               }
94 +       }
95 +       printf("No valid user found in /etc/passwd\n");
96 +
97 +out:
98 +       if(fp)
99 +               fclose(fp);
100 +       return ret;
101 +}
102 +
103 +void insert_user_in_smbpasswd(char *user, char *line)
104 +{
105 +       char t[256];
106 +       FILE *fp = fopen("/etc/samba/smbpasswd", "r+");
107 +
108 +       if(!fp)
109 +       {
110 +               printf("failed to open /etc/samba/smbpasswd");
111 +               goto out;
112 +       }
113 +
114 +       while(!feof(fp))
115 +       {
116 +               if(fgets(t, 255, fp))
117 +               {
118 +                       char *p;
119 +                       p = strchr(t, ':');
120 +                       if(p && (p - t == strlen(user)) && (strncmp(t, user, strlen(user))) == 0)
121 +                       {
122 +                               fseek(fp, -strlen(line), SEEK_CUR);
123 +                               break;
124 +                       }
125 +               }
126 +       }
127 +
128 +       fprintf(fp, line);
129 +
130 +out:
131 +       if(fp)
132 +               fclose(fp);
133 +}
134 +
135 +void delete_user_from_smbpasswd(char *user)
136 +{
137 +       char t[256];
138 +       FILE *fp = fopen("/etc/samba/smbpasswd", "r+");
139 +
140 +       if(!fp)
141 +       {
142 +               printf("failed to open /etc/samba/smbpasswd");
143 +               goto out;
144 +       }
145 +
146 +       while(!feof(fp))
147 +       {
148 +               if(fgets(t, 255, fp))
149 +               {
150 +                       char *p;
151 +                       p = strchr(t, ':');
152 +                       if(p && (p - t == strlen(user)) && (strncmp(t, user, strlen(user))) == 0)
153 +                       {
154 +                               fpos_t r_pos, w_pos;
155 +                               char t2[256];
156 +                               fgetpos(fp, &r_pos);
157 +                               w_pos = r_pos;
158 +                               w_pos.__pos -= strlen(t);
159 +                               while(fgets(t2, 256, fp))
160 +                               {
161 +                                       fsetpos(fp, &w_pos);
162 +                                       fputs(t2, fp);
163 +                                       r_pos.__pos += strlen(t2);
164 +                                       w_pos.__pos += strlen(t2);
165 +                                       fsetpos(fp, &r_pos);
166 +                               }
167 +                               ftruncate(fileno(fp), w_pos.__pos);
168 +                               break;
169 +                       }
170 +               }
171 +       }
172 +
173 +out:
174 +       if(fp)
175 +               fclose(fp);
176 +}
177 +
178 +int main(int argc, char **argv)
179 +{
180 +       unsigned uid;
181 +       uchar new_nt_p16[NT_HASH_LEN];
182 +       int g;
183 +       int smbpasswd_present;
184 +       char smbpasswd_line[256];
185 +       char *s;
186 +
187 +       if(argc != 3)
188 +       {
189 +               printf("usage for openwrt_smbpasswd - \n\t%s USERNAME PASSWD\n\t%s -del USERNAME\n", argv[0], argv[0]);
190 +               exit(1);
191 +       }
192 +       if(strcmp(argv[1], "-del") == 0)
193 +       {
194 +               printf("deleting user %s\n", argv[2]);
195 +               delete_user_from_smbpasswd(argv[2]);
196 +               return 0;
197 +       }
198 +       uid = find_uid_for_user(argv[1]);
199 +       if(uid == -1)
200 +               exit(2);
201 +
202 +       E_md4hash(argv[2], new_nt_p16);
203 +       s = smbpasswd_line;
204 +       s += snprintf(s, 256 - (s - smbpasswd_line), "%s:%u:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:", argv[1], uid);
205 +       for(g = 0; g < 16; g++)
206 +               s += snprintf(s, 256 - (s - smbpasswd_line), "%02X", new_nt_p16[g]);
207 +       snprintf(s, 256 - (s - smbpasswd_line), ":[U          ]:LCT-00000001:\n");
208 +
209 +       insert_user_in_smbpasswd(argv[1], smbpasswd_line);
210 +
211 +       return 0;
212 +}