]>
git.ipfire.org Git - thirdparty/squid.git/blob - helpers/basic_auth/SMB/basic_smb_auth.cc
2 * basic_smb_auth - SMB proxy authentication module
3 * Copyright (C) 1998 Richard Huveneers <richard@hekkihek.hacom.nl>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * SQUID Web Proxy Cache http://www.squid-cache.org/
18 * ----------------------------------------------------------
20 * Squid is the result of efforts by numerous individuals from
21 * the Internet community; see the CONTRIBUTORS file for full
22 * details. Many organizations have provided support for Squid's
23 * development; see the SPONSORS file for full details. Squid is
24 * Copyrighted (C) 2001 by the Regents of the University of
25 * California; see the COPYRIGHT file for full details. Squid
26 * incorporates software developed and/or copyrighted by other
27 * sources; see the CREDITS file for full details.
29 * This program is free software; you can redistribute it and/or modify
30 * it under the terms of the GNU General Public License as published by
31 * the Free Software Foundation; either version 2 of the License, or
32 * (at your option) any later version.
34 * This program is distributed in the hope that it will be useful,
35 * but WITHOUT ANY WARRANTY; without even the implied warranty of
36 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
37 * GNU General Public License for more details.
39 * You should have received a copy of the GNU General Public License
40 * along with this program; if not, write to the Free Software
41 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
44 #include "helpers/defines.h"
56 #define NMB_BROADCAST 2
59 const char *name
; /* domain name */
60 const char *sname
; /* match this with user input */
61 const char *passthrough
; /* pass-through authentication */
62 const char *nmbaddr
; /* name service address */
63 int nmbcast
; /* broadcast or unicast */
64 char *authshare
; /* share name of auth file */
65 const char *authfile
; /* pathname of auth file */
66 struct SMBDOMAIN
*next
; /* linked list */
69 struct SMBDOMAIN
*firstdom
= NULL
;
70 struct SMBDOMAIN
*lastdom
= NULL
;
73 * escape the backslash character, since it has a special meaning
74 * to the read command of the bourne shell.
78 print_esc(FILE * p
, char *s
)
80 char buf
[HELPER_INPUT_BUFFER
];
84 for (t
= s
; *t
!= '\0'; ++t
) {
86 * NP: The shell escaping permits 'i' to jump up to 2 octets per loop,
87 * so ensure we have at least 3 free.
89 if (i
> HELPER_INPUT_BUFFER
-3) {
103 (void) fputs(buf
, p
);
108 main(int argc
, char *argv
[])
111 char buf
[HELPER_INPUT_BUFFER
];
112 struct SMBDOMAIN
*dom
;
120 /* make standard output line buffered */
121 if (setvbuf(stdout
, NULL
, _IOLBF
, 0) != 0)
124 /* parse command line arguments */
125 for (i
= 1; i
< argc
; ++i
) {
126 if (strcmp(argv
[i
], "-d") == 0) {
130 /* the next options require an argument */
134 if (strcmp(argv
[i
], "-W") == 0) {
135 if ((dom
= (struct SMBDOMAIN
*) malloc(sizeof(struct SMBDOMAIN
))) == NULL
)
138 dom
->name
= dom
->sname
= argv
[++i
];
139 dom
->passthrough
= "";
141 dom
->nmbcast
= NMB_BROADCAST
;
142 dom
->authshare
= (char *)"NETLOGON";
143 dom
->authfile
= "proxyauth";
146 /* append to linked list */
155 if (strcmp(argv
[i
], "-w") == 0) {
157 lastdom
->sname
= argv
[++i
];
160 if (strcmp(argv
[i
], "-P") == 0) {
162 lastdom
->passthrough
= argv
[++i
];
165 if (strcmp(argv
[i
], "-B") == 0) {
166 if (lastdom
!= NULL
) {
167 lastdom
->nmbaddr
= argv
[++i
];
168 lastdom
->nmbcast
= NMB_BROADCAST
;
172 if (strcmp(argv
[i
], "-U") == 0) {
173 if (lastdom
!= NULL
) {
174 lastdom
->nmbaddr
= argv
[++i
];
175 lastdom
->nmbcast
= NMB_UNICAST
;
179 if (strcmp(argv
[i
], "-S") == 0) {
180 if (lastdom
!= NULL
) {
181 if ((lastdom
->authshare
= xstrdup(argv
[++i
])) == NULL
)
184 /* convert backslashes to forward slashes */
185 for (s
= lastdom
->authshare
; *s
!= '\0'; ++s
)
189 /* strip leading forward slash from share name */
190 if (*lastdom
->authshare
== '/')
191 ++lastdom
->authshare
;
193 if ((s
= strchr(lastdom
->authshare
, '/')) != NULL
) {
195 lastdom
->authfile
= s
+ 1;
202 shcmd
= debug_enabled
? HELPERSCRIPT
: HELPERSCRIPT
" > /dev/null 2>&1";
204 while (fgets(buf
, HELPER_INPUT_BUFFER
, stdin
) != NULL
) {
206 if ((s
= strchr(buf
, '\n')) == NULL
)
210 if ((s
= strchr(buf
, ' ')) == NULL
) {
220 rfc1738_unescape(user
);
221 rfc1738_unescape(pass
);
223 if ((s
= strchr(user
, '\\')) != NULL
) {
228 /* match domname with linked list */
229 if (domname
!= NULL
&& strlen(domname
) > 0) {
230 for (dom
= firstdom
; dom
!= NULL
; dom
= dom
->next
)
231 if (strcasecmp(dom
->sname
, domname
) == 0)
240 if ((p
= popen(shcmd
, "w")) == NULL
) {
244 (void) fprintf(p
, "%s\n", dom
->name
);
245 (void) fprintf(p
, "%s\n", dom
->passthrough
);
246 (void) fprintf(p
, "%s\n", dom
->nmbaddr
);
247 (void) fprintf(p
, "%d\n", dom
->nmbcast
);
248 (void) fprintf(p
, "%s\n", dom
->authshare
);
249 (void) fprintf(p
, "%s\n", dom
->authfile
);
250 (void) fprintf(p
, "%s\n", user
);
251 /* the password can contain special characters */
253 (void) fputc('\n', p
);