+/*
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
/*
* basic_smb_auth - SMB proxy authentication module
* Copyright (C) 1998 Richard Huveneers <richard@hekkihek.hacom.nl>
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * SQUID Web Proxy Cache http://www.squid-cache.org/
- * ----------------------------------------------------------
- *
- * Squid is the result of efforts by numerous individuals from
- * the Internet community; see the CONTRIBUTORS file for full
- * details. Many organizations have provided support for Squid's
- * development; see the SPONSORS file for full details. Squid is
- * Copyrighted (C) 2001 by the Regents of the University of
- * California; see the COPYRIGHT file for full details. Squid
- * incorporates software developed and/or copyrighted by other
- * sources; see the CREDITS file for full details.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
*/
-#include "config.h"
+
+#include "squid.h"
+#include "helpers/defines.h"
#include "rfc1738.h"
#include "util.h"
-#if HAVE_STDIO_H
-#include <stdio.h>
-#endif
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#if HAVE_STRING_H
-#include <string.h>
-#endif
+#include <cstring>
-
-#define BUFSIZE 256
-#define NMB_UNICAST 1
-#define NMB_BROADCAST 2
+#define NMB_UNICAST 1
+#define NMB_BROADCAST 2
struct SMBDOMAIN {
- const char *name; /* domain name */
- const char *sname; /* match this with user input */
- const char *passthrough; /* pass-through authentication */
- const char *nmbaddr; /* name service address */
- int nmbcast; /* broadcast or unicast */
- char *authshare; /* share name of auth file */
- const char *authfile; /* pathname of auth file */
- struct SMBDOMAIN *next; /* linked list */
+ const char *name; /* domain name */
+ const char *sname; /* match this with user input */
+ const char *passthrough; /* pass-through authentication */
+ const char *nmbaddr; /* name service address */
+ int nmbcast; /* broadcast or unicast */
+ char *authshare; /* share name of auth file */
+ const char *authfile; /* pathname of auth file */
+ struct SMBDOMAIN *next; /* linked list */
};
struct SMBDOMAIN *firstdom = NULL;
void
print_esc(FILE * p, char *s)
{
- char buf[256];
+ char buf[HELPER_INPUT_BUFFER];
char *t;
int i = 0;
- for (t = s; *t != '\0'; t++) {
- if (i > 250) {
+ for (t = s; *t != '\0'; ++t) {
+ /*
+ * NP: The shell escaping permits 'i' to jump up to 2 octets per loop,
+ * so ensure we have at least 3 free.
+ */
+ if (i > HELPER_INPUT_BUFFER-3) {
buf[i] = '\0';
(void) fputs(buf, p);
i = 0;
if (*t == '\\')
buf[i++] = '\\';
- buf[i++] = *t;
+ buf[i] = *t;
+ ++i;
}
if (i > 0) {
main(int argc, char *argv[])
{
int i;
- char buf[BUFSIZE];
+ char buf[HELPER_INPUT_BUFFER];
struct SMBDOMAIN *dom;
char *s;
char *user;
char *pass;
char *domname;
FILE *p;
- int debug = 0;
const char *shcmd;
/* make standard output line buffered */
return 1;
/* parse command line arguments */
- for (i = 1; i < argc; i++) {
+ for (i = 1; i < argc; ++i) {
if (strcmp(argv[i], "-d") == 0) {
- debug = 1;
+ debug_enabled = 1;
continue;
}
/* the next options require an argument */
}
if (strcmp(argv[i], "-S") == 0) {
if (lastdom != NULL) {
- if ((lastdom->authshare = strdup(argv[++i])) == NULL)
+ if ((lastdom->authshare = xstrdup(argv[++i])) == NULL)
return 1;
/* convert backslashes to forward slashes */
- for (s = lastdom->authshare; *s != '\0'; s++)
+ for (s = lastdom->authshare; *s != '\0'; ++s)
if (*s == '\\')
*s = '/';
/* strip leading forward slash from share name */
if (*lastdom->authshare == '/')
- lastdom->authshare++;
+ ++lastdom->authshare;
if ((s = strchr(lastdom->authshare, '/')) != NULL) {
*s = '\0';
}
}
- shcmd = debug ? HELPERSCRIPT : HELPERSCRIPT " > /dev/null 2>&1";
-
- /* pass to helper script */
- if (putenv((char *)"SAMBAPREFIX=" SAMBAPREFIX) != 0)
- return 1;
+ shcmd = debug_enabled ? HELPERSCRIPT : HELPERSCRIPT " > /dev/null 2>&1";
- while (1) {
- if (fgets(buf, BUFSIZE, stdin) == NULL)
- break;
+ while (fgets(buf, HELPER_INPUT_BUFFER, stdin) != NULL) {
if ((s = strchr(buf, '\n')) == NULL)
continue;
*s = '\0';
if ((s = strchr(buf, ' ')) == NULL) {
- (void) printf("ERR\n");
+ SEND_ERR("");
continue;
}
*s = '\0';
dom = firstdom;
if (dom == NULL) {
- (void) printf("ERR\n");
+ SEND_ERR("");
continue;
}
if ((p = popen(shcmd, "w")) == NULL) {
- (void) printf("ERR\n");
+ SEND_ERR("");
continue;
}
(void) fprintf(p, "%s\n", dom->name);
(void) fflush(p);
if (pclose(p) == 0)
- (void) printf("OK\n");
+ SEND_OK("");
else
- (void) printf("ERR\n");
-
- } /* while (1) */
+ SEND_ERR("");
+ } /* while (1) */
return 0;
}
+