]>
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"
51 #define NMB_BROADCAST 2
54 const char *name
; /* domain name */
55 const char *sname
; /* match this with user input */
56 const char *passthrough
; /* pass-through authentication */
57 const char *nmbaddr
; /* name service address */
58 int nmbcast
; /* broadcast or unicast */
59 char *authshare
; /* share name of auth file */
60 const char *authfile
; /* pathname of auth file */
61 struct SMBDOMAIN
*next
; /* linked list */
64 struct SMBDOMAIN
*firstdom
= NULL
;
65 struct SMBDOMAIN
*lastdom
= NULL
;
68 * escape the backslash character, since it has a special meaning
69 * to the read command of the bourne shell.
73 print_esc(FILE * p
, char *s
)
75 char buf
[HELPER_INPUT_BUFFER
];
79 for (t
= s
; *t
!= '\0'; ++t
) {
81 * NP: The shell escaping permits 'i' to jump up to 2 octets per loop,
82 * so ensure we have at least 3 free.
84 if (i
> HELPER_INPUT_BUFFER
-3) {
103 main(int argc
, char *argv
[])
106 char buf
[HELPER_INPUT_BUFFER
];
107 struct SMBDOMAIN
*dom
;
115 /* make standard output line buffered */
116 if (setvbuf(stdout
, NULL
, _IOLBF
, 0) != 0)
119 /* parse command line arguments */
120 for (i
= 1; i
< argc
; ++i
) {
121 if (strcmp(argv
[i
], "-d") == 0) {
125 /* the next options require an argument */
129 if (strcmp(argv
[i
], "-W") == 0) {
130 if ((dom
= (struct SMBDOMAIN
*) malloc(sizeof(struct SMBDOMAIN
))) == NULL
)
133 dom
->name
= dom
->sname
= argv
[++i
];
134 dom
->passthrough
= "";
136 dom
->nmbcast
= NMB_BROADCAST
;
137 dom
->authshare
= (char *)"NETLOGON";
138 dom
->authfile
= "proxyauth";
141 /* append to linked list */
150 if (strcmp(argv
[i
], "-w") == 0) {
152 lastdom
->sname
= argv
[++i
];
155 if (strcmp(argv
[i
], "-P") == 0) {
157 lastdom
->passthrough
= argv
[++i
];
160 if (strcmp(argv
[i
], "-B") == 0) {
161 if (lastdom
!= NULL
) {
162 lastdom
->nmbaddr
= argv
[++i
];
163 lastdom
->nmbcast
= NMB_BROADCAST
;
167 if (strcmp(argv
[i
], "-U") == 0) {
168 if (lastdom
!= NULL
) {
169 lastdom
->nmbaddr
= argv
[++i
];
170 lastdom
->nmbcast
= NMB_UNICAST
;
174 if (strcmp(argv
[i
], "-S") == 0) {
175 if (lastdom
!= NULL
) {
176 if ((lastdom
->authshare
= xstrdup(argv
[++i
])) == NULL
)
179 /* convert backslashes to forward slashes */
180 for (s
= lastdom
->authshare
; *s
!= '\0'; ++s
)
184 /* strip leading forward slash from share name */
185 if (*lastdom
->authshare
== '/')
186 ++lastdom
->authshare
;
188 if ((s
= strchr(lastdom
->authshare
, '/')) != NULL
) {
190 lastdom
->authfile
= s
+ 1;
197 shcmd
= debug_enabled
? HELPERSCRIPT
: HELPERSCRIPT
" > /dev/null 2>&1";
199 while (fgets(buf
, HELPER_INPUT_BUFFER
, stdin
) != NULL
) {
201 if ((s
= strchr(buf
, '\n')) == NULL
)
205 if ((s
= strchr(buf
, ' ')) == NULL
) {
215 rfc1738_unescape(user
);
216 rfc1738_unescape(pass
);
218 if ((s
= strchr(user
, '\\')) != NULL
) {
223 /* match domname with linked list */
224 if (domname
!= NULL
&& strlen(domname
) > 0) {
225 for (dom
= firstdom
; dom
!= NULL
; dom
= dom
->next
)
226 if (strcasecmp(dom
->sname
, domname
) == 0)
235 if ((p
= popen(shcmd
, "w")) == NULL
) {
239 (void) fprintf(p
, "%s\n", dom
->name
);
240 (void) fprintf(p
, "%s\n", dom
->passthrough
);
241 (void) fprintf(p
, "%s\n", dom
->nmbaddr
);
242 (void) fprintf(p
, "%d\n", dom
->nmbcast
);
243 (void) fprintf(p
, "%s\n", dom
->authshare
);
244 (void) fprintf(p
, "%s\n", dom
->authfile
);
245 (void) fprintf(p
, "%s\n", user
);
246 /* the password can contain special characters */
248 (void) fputc('\n', p
);