112 uint8_t *token =
nullptr;
115 if (fgets(buf,
sizeof(buf) - 1, stdin) ==
nullptr) {
120 "%s| %s: fgets() failed! dying..... errno=%d (%s)\n",
124 fprintf(stdout,
"BH input error\n");
127 fprintf(stdout,
"BH input error\n");
130 c = strchr(buf,
'\n');
135 fprintf(stderr,
"%s| %s: Got '%s' from squid (length: %zu).\n",
139 fprintf(stderr,
"%s| %s: Oversized message\n",
LogTime(),
141 fprintf(stdout,
"BH Oversized message\n");
145 if (buf[0] ==
'\0') {
147 fprintf(stderr,
"%s| %s: Invalid request\n",
LogTime(),
149 fprintf(stdout,
"BH Invalid request\n");
152 if (strlen(buf) < 2) {
154 fprintf(stderr,
"%s| %s: Invalid request [%s]\n",
LogTime(),
156 fprintf(stdout,
"BH Invalid request\n");
159 if (!strncmp(buf,
"QQ", 2)) {
160 fprintf(stdout,
"BH quit command\n");
164 if (strncmp(buf,
"YR", 2) && strncmp(buf,
"KK", 2)) {
166 fprintf(stderr,
"%s| %s: Invalid request [%s]\n",
LogTime(),
168 fprintf(stdout,
"BH Invalid request\n");
171 if (strlen(buf) <= 3) {
173 fprintf(stderr,
"%s| %s: Invalid negotiate request [%s]\n",
175 fprintf(stdout,
"BH Invalid negotiate request\n");
180 fprintf(stderr,
"%s| %s: Decode '%s' (decoded length: %zu).\n",
184 if (!(token =
static_cast<uint8_t *
>(
xmalloc(length+1)))) {
185 fprintf(stderr,
"%s| %s: Error allocating memory for token\n",
LogTime(),
PROGRAM);
195 fprintf(stderr,
"%s| %s: Invalid base64 token [%s]\n",
LogTime(),
PROGRAM, buf+3);
196 fprintf(stdout,
"BH Invalid negotiate request token\n");
201 token[dstLen] =
'\0';
203 if ((
static_cast<size_t>(length) >=
sizeof(
ntlmProtocol) + 1) &&
206 fprintf(stderr,
"%s| %s: received type %d NTLM token\n",
209 fprintf(FDNIN,
"%s\n",buf);
210 if (fgets(tbuff,
sizeof(tbuff) - 1, FDNOUT) ==
nullptr) {
212 if (ferror(FDNOUT)) {
214 "fgets() failed! dying..... errno=%d (%s)\n",
215 ferror(FDNOUT),
strerror(ferror(FDNOUT)));
218 fprintf(stderr,
"%s| %s: Error reading NTLM helper response\n",
223 if (!strchr(tbuff,
'\n')) {
224 fprintf(stderr,
"%s| %s: Oversized NTLM helper response\n",
235 if (strlen(tbuff) >= 3 && (!strncmp(tbuff,
"AF ",3) || !strncmp(tbuff,
"NA ",3))) {
236 strncpy(buff,tbuff,3);
238 for (
unsigned int i=2; i<=strlen(tbuff); ++i)
239 buff[i+2] = tbuff[i];
245 fprintf(stderr,
"%s| %s: received Kerberos token\n",
248 fprintf(FDKIN,
"%s\n",buf);
249 if (fgets(buff,
sizeof(buff) - 1, FDKOUT) ==
nullptr) {
251 if (ferror(FDKOUT)) {
253 "fgets() failed! dying..... errno=%d (%s)\n",
254 ferror(FDKOUT),
strerror(ferror(FDKOUT)));
257 fprintf(stderr,
"%s| %s: Error reading Kerberos helper response\n",
262 if (!strchr(buff,
'\n')) {
263 fprintf(stderr,
"%s| %s: Oversized Kerberos helper response\n",
268 buff[
sizeof(buff)-1] =
'\0';
269 fprintf(stdout,
"%s",buff);
271 fprintf(stderr,
"%s| %s: Return '%s'\n",
280main(
int argc,
char *
const argv[])
282 int nstart = 0, kstart = 0;
283 int nend = 0, kend = 0;
284 char **nargs, **kargs;
291 setbuf(stdout,
nullptr);
292 setbuf(stdin,
nullptr);
294 if (argc ==1 || !strncasecmp(argv[1],
"-h",2)) {
300 if (!strncasecmp(argv[1],
"-d",2)) {
305 for (
int i=j; i<argc; ++i) {
306 if (!strncasecmp(argv[i],
"--ntlm",6))
308 if (!strncasecmp(argv[i],
"--kerberos",10))
311 if (nstart > kstart) {
318 if (nstart == 0 || kstart == 0 || kend-kstart <= 0 || nend-nstart <= 0 ) {
324 fprintf(stderr,
"%s| %s: Starting version %s\n",
LogTime(),
PROGRAM,
327 if ((nargs = (
char **)
xmalloc((nend-nstart+1)*
sizeof(
char *))) ==
nullptr) {
328 fprintf(stderr,
"%s| %s: Error allocating memory for ntlm helper\n",
LogTime(),
PROGRAM);
331 memcpy(nargs,argv+nstart+1,(nend-nstart)*
sizeof(
char *));
332 nargs[nend-nstart]=
nullptr;
335 for (
int i=0; i<nend-nstart; ++i)
336 fprintf(stderr,
"%s ", nargs[i]);
337 fprintf(stderr,
"\n");
339 if ((kargs = (
char **)
xmalloc((kend-kstart+1)*
sizeof(
char *))) ==
nullptr) {
340 fprintf(stderr,
"%s| %s: Error allocating memory for kerberos helper\n",
LogTime(),
PROGRAM);
343 memcpy(kargs,argv+kstart+1,(kend-kstart)*
sizeof(
char *));
344 kargs[kend-kstart]=
nullptr;
346 fprintf(stderr,
"%s| %s: Kerberos command: ",
LogTime(),
PROGRAM);
347 for (
int i=0; i<kend-kstart; ++i)
348 fprintf(stderr,
"%s ", kargs[i]);
349 fprintf(stderr,
"\n");
356 if (pipe(pkin) < 0) {
357 fprintf(stderr,
"%s| %s: Could not assign streams for pkin\n",
LogTime(),
PROGRAM);
360 if (pipe(pkout) < 0) {
361 fprintf(stderr,
"%s| %s: Could not assign streams for pkout\n",
LogTime(),
PROGRAM);
365 if (( fpid = fork()) < 0 ) {
366 fprintf(stderr,
"%s| %s: Failed first fork\n",
LogTime(),
PROGRAM);
374 dup2(pkin[0],STDIN_FILENO);
378 dup2(pkout[1],STDOUT_FILENO);
381 setbuf(stdin,
nullptr);
382 setbuf(stdout,
nullptr);
384 execv(kargs[0], kargs);
392 if (pipe(pnin) < 0) {
393 fprintf(stderr,
"%s| %s: Could not assign streams for pnin\n",
LogTime(),
PROGRAM);
396 if (pipe(pnout) < 0) {
397 fprintf(stderr,
"%s| %s: Could not assign streams for pnout\n",
LogTime(),
PROGRAM);
401 if (( fpid = fork()) < 0 ) {
402 fprintf(stderr,
"%s| %s: Failed second fork\n",
LogTime(),
PROGRAM);
410 dup2(pnin[0],STDIN_FILENO);
414 dup2(pnout[1],STDOUT_FILENO);
417 setbuf(stdin,
nullptr);
418 setbuf(stdout,
nullptr);
420 execv(nargs[0], nargs);
428 FILE *FDKIN=fdopen(pkin[1],
"w");
429 FILE *FDKOUT=fdopen(pkout[0],
"r");
431 FILE *FDNIN=fdopen(pnin[1],
"w");
432 FILE *FDNOUT=fdopen(pnout[0],
"r");
434 if (!FDKIN || !FDKOUT || !FDNIN || !FDNOUT) {
435 fprintf(stderr,
"%s| %s: Could not assign streams for FDKIN/FDKOUT/FDNIN/FDNOUT\n",
LogTime(),
PROGRAM);
436 closeFds(FDKIN, FDKOUT, FDNIN, FDNOUT);
440 setbuf(FDKIN,
nullptr);
441 setbuf(FDKOUT,
nullptr);
442 setbuf(FDNIN,
nullptr);
443 setbuf(FDNOUT,
nullptr);
446 closeFds(FDKIN, FDKOUT, FDNIN, FDNOUT);