]>
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"
57 #define NMB_BROADCAST 2
60 const char *name
; /* domain name */
61 const char *sname
; /* match this with user input */
62 const char *passthrough
; /* pass-through authentication */
63 const char *nmbaddr
; /* name service address */
64 int nmbcast
; /* broadcast or unicast */
65 char *authshare
; /* share name of auth file */
66 const char *authfile
; /* pathname of auth file */
67 struct SMBDOMAIN
*next
; /* linked list */
70 struct SMBDOMAIN
*firstdom
= NULL
;
71 struct SMBDOMAIN
*lastdom
= NULL
;
74 * escape the backslash character, since it has a special meaning
75 * to the read command of the bourne shell.
79 print_esc(FILE * p
, char *s
)
81 char buf
[HELPER_INPUT_BUFFER
];
85 for (t
= s
; *t
!= '\0'; ++t
) {
86 if (i
> HELPER_INPUT_BUFFER
-2) {
100 (void) fputs(buf
, p
);
105 main(int argc
, char *argv
[])
108 char buf
[HELPER_INPUT_BUFFER
];
109 struct SMBDOMAIN
*dom
;
117 /* make standard output line buffered */
118 if (setvbuf(stdout
, NULL
, _IOLBF
, 0) != 0)
121 /* parse command line arguments */
122 for (i
= 1; i
< argc
; ++i
) {
123 if (strcmp(argv
[i
], "-d") == 0) {
127 /* the next options require an argument */
131 if (strcmp(argv
[i
], "-W") == 0) {
132 if ((dom
= (struct SMBDOMAIN
*) malloc(sizeof(struct SMBDOMAIN
))) == NULL
)
135 dom
->name
= dom
->sname
= argv
[++i
];
136 dom
->passthrough
= "";
138 dom
->nmbcast
= NMB_BROADCAST
;
139 dom
->authshare
= (char *)"NETLOGON";
140 dom
->authfile
= "proxyauth";
143 /* append to linked list */
152 if (strcmp(argv
[i
], "-w") == 0) {
154 lastdom
->sname
= argv
[++i
];
157 if (strcmp(argv
[i
], "-P") == 0) {
159 lastdom
->passthrough
= argv
[++i
];
162 if (strcmp(argv
[i
], "-B") == 0) {
163 if (lastdom
!= NULL
) {
164 lastdom
->nmbaddr
= argv
[++i
];
165 lastdom
->nmbcast
= NMB_BROADCAST
;
169 if (strcmp(argv
[i
], "-U") == 0) {
170 if (lastdom
!= NULL
) {
171 lastdom
->nmbaddr
= argv
[++i
];
172 lastdom
->nmbcast
= NMB_UNICAST
;
176 if (strcmp(argv
[i
], "-S") == 0) {
177 if (lastdom
!= NULL
) {
178 if ((lastdom
->authshare
= xstrdup(argv
[++i
])) == NULL
)
181 /* convert backslashes to forward slashes */
182 for (s
= lastdom
->authshare
; *s
!= '\0'; ++s
)
186 /* strip leading forward slash from share name */
187 if (*lastdom
->authshare
== '/')
188 ++lastdom
->authshare
;
190 if ((s
= strchr(lastdom
->authshare
, '/')) != NULL
) {
192 lastdom
->authfile
= s
+ 1;
199 shcmd
= debug_enabled
? HELPERSCRIPT
: HELPERSCRIPT
" > /dev/null 2>&1";
201 while (fgets(buf
, HELPER_INPUT_BUFFER
, stdin
) != NULL
) {
203 if ((s
= strchr(buf
, '\n')) == NULL
)
207 if ((s
= strchr(buf
, ' ')) == NULL
) {
217 rfc1738_unescape(user
);
218 rfc1738_unescape(pass
);
220 if ((s
= strchr(user
, '\\')) != NULL
) {
225 /* match domname with linked list */
226 if (domname
!= NULL
&& strlen(domname
) > 0) {
227 for (dom
= firstdom
; dom
!= NULL
; dom
= dom
->next
)
228 if (strcasecmp(dom
->sname
, domname
) == 0)
237 if ((p
= popen(shcmd
, "w")) == NULL
) {
241 (void) fprintf(p
, "%s\n", dom
->name
);
242 (void) fprintf(p
, "%s\n", dom
->passthrough
);
243 (void) fprintf(p
, "%s\n", dom
->nmbaddr
);
244 (void) fprintf(p
, "%d\n", dom
->nmbcast
);
245 (void) fprintf(p
, "%s\n", dom
->authshare
);
246 (void) fprintf(p
, "%s\n", dom
->authfile
);
247 (void) fprintf(p
, "%s\n", user
);
248 /* the password can contain special characters */
250 (void) fputc('\n', p
);