345 lines
9 KiB
Text
345 lines
9 KiB
Text
$NetBSD: patch-ad,v 1.1.1.1 2005/03/04 19:04:20 oht Exp $
|
|
--- src/http.c.orig 2004-12-21 16:46:14.000000000 +0100
|
|
+++ src/http.c 2005-03-04 19:22:02.000000000 +0100
|
|
@@ -38,7 +38,6 @@
|
|
#include <errno.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
-
|
|
#include "http.h"
|
|
#include "log.h"
|
|
|
|
@@ -57,17 +56,80 @@
|
|
* socket descriptior.
|
|
*/
|
|
|
|
+ char * xtrprxsrv (char * proxyenv, char * p1)
|
|
+{
|
|
+ char *p2;
|
|
+ p1 = strchr (proxyenv,':');
|
|
+ p1++;
|
|
+ p1++;
|
|
+ p1++;
|
|
+ p2 = strrchr (proxyenv,':');
|
|
+ *(p2)= '\0';
|
|
+ return (p1);
|
|
+}
|
|
+
|
|
+ int xtrprxprt (char * proxyenv)
|
|
+{
|
|
+ char *p1;
|
|
+ char *p2;
|
|
+ p1 = strrchr (proxyenv,':');
|
|
+ p1++;
|
|
+ p2 = strrchr (proxyenv,'/');
|
|
+ *(p2)= '\0';
|
|
+ return(atoi(p1));
|
|
+}
|
|
+ char * xtrprxprtcl (char * proxyenv, char * p1)
|
|
+{
|
|
+ char *p2;
|
|
+ p2 = strchr (proxyenv,':');
|
|
+ *(p2)= '\0';
|
|
+ return (p1);
|
|
+}
|
|
+char chk_proxy (char *name, int verbose)
|
|
+{
|
|
+ char prtclstring[250];
|
|
+ char * proxprot = NULL;
|
|
+ char * proxyenv = getenv("no_proxy");
|
|
+ if ( proxyenv != NULL)
|
|
+ {
|
|
+ if ((strncmp(proxyenv, name ,sizeof(name)))==0)
|
|
+ {
|
|
+ DEBUG ("noprox=name \n ");
|
|
+ return 0;
|
|
+ }
|
|
+ }
|
|
+ proxyenv = getenv("http_proxy");
|
|
+ if ( proxyenv == NULL)
|
|
+ return 0;
|
|
+ proxprot = prtclstring;
|
|
+ strlcpy (prtclstring, proxyenv, sizeof (prtclstring));
|
|
+
|
|
+ proxprot = xtrprxprtcl(proxprot , proxprot );
|
|
+ if ((strncmp( proxprot, "http" ,sizeof(proxprot)))!=0)
|
|
+ {
|
|
+ DEBUG ("no http \n ");
|
|
+ return 0;
|
|
+ }
|
|
+ return 1;
|
|
+}
|
|
+
|
|
+
|
|
static int
|
|
http_open_server (char *name, short port, int verbose)
|
|
{
|
|
int result, sockfd;
|
|
+ int proxport;
|
|
struct hostent *he;
|
|
struct sockaddr_in address;
|
|
-
|
|
+ char proxy = 1;
|
|
/* Try to find the login host */
|
|
he = gethostbyname (name);
|
|
+ DEBUG (_("h_name= %s"),he->h_name);
|
|
+
|
|
if (he == NULL)
|
|
{
|
|
+ if ((he = gethostbyname(name)) == NULL)
|
|
+ {
|
|
ERROR (_("DNS lookup of login server %s failed to resolve to an IP#"), name);
|
|
ERROR (_("Try the commands nslookup, host or dig for more details."));
|
|
ERROR (_("gethostbyname() returns: %s"), strerror (errno));
|
|
@@ -75,6 +137,41 @@
|
|
}
|
|
else
|
|
{
|
|
+ result =1;
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if ( chk_proxy (name, verbose))
|
|
+ {
|
|
+ char srvstring[250];
|
|
+ char prtclstring[250];
|
|
+ char *proxyenv= NULL;
|
|
+ char * proxserv= NULL;
|
|
+ proxy = 1;
|
|
+ proxyenv = getenv("http_proxy");
|
|
+ DEBUG (_("proxyenv: %s "), proxyenv);
|
|
+ proxserv = srvstring;
|
|
+ strlcpy (srvstring,proxyenv , sizeof (srvstring));
|
|
+ strlcpy (prtclstring, proxyenv, sizeof (prtclstring));
|
|
+ proxserv= xtrprxsrv (proxserv, proxserv );
|
|
+ DEBUG (_("proxserv : %s "),proxserv );
|
|
+ proxport= xtrprxprt (proxyenv );
|
|
+ DEBUG (_("proxyport : %d "),proxport );
|
|
+ he = gethostbyname(proxserv);
|
|
+ DEBUG (_("proxserv h_name= %s port = %d "),he->h_name, proxport );
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ proxy = 0;
|
|
+ he = gethostbyname(name);
|
|
+ }
|
|
+
|
|
+
|
|
+ result =1;
|
|
+ }
|
|
+ if ( result > 0 )
|
|
+ {
|
|
/* Setup a socket */
|
|
sockfd = socket (PF_INET, SOCK_STREAM, 0);
|
|
if (-1 == sockfd)
|
|
@@ -86,7 +183,11 @@
|
|
{
|
|
/* Setup address to connecto to ... */
|
|
address.sin_family = PF_INET;
|
|
+ if (proxy)
|
|
+ address.sin_port = htons (proxport);
|
|
+ else
|
|
address.sin_port = htons (port);
|
|
+
|
|
address.sin_addr = *((struct in_addr *) he->h_addr);
|
|
memset (&(address.sin_zero), 0, sizeof (address.sin_zero));
|
|
|
|
@@ -95,8 +196,14 @@
|
|
if (-1 == result)
|
|
{
|
|
close (sockfd);
|
|
- ERROR (_("Failed to connect to login server (%s): %s"),
|
|
- name, strerror (errno));
|
|
+ if (proxy )
|
|
+ {
|
|
+ ERROR (_("Failed to connect to proxy server (%s): %s"),name, strerror (errno));
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ ERROR (_("Failed to connect to login server (%s): %s"), name, strerror (errno));
|
|
+ }
|
|
}
|
|
else
|
|
{
|
|
@@ -169,10 +276,20 @@
|
|
}
|
|
|
|
/* Register and get login page */
|
|
+ if ( chk_proxy (config->login_server , verbose))
|
|
+ {
|
|
+ snprintf (config->send_msg,sizeof(config->send_msg),PRX_PRLGN_MSG,
|
|
+ config->login_server, config->server_port, config->init_page,
|
|
+ config->login_server,
|
|
+ config->login_server);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
sprintf (config->send_msg, PRELOGIN_MSG,
|
|
config->init_page,
|
|
config->login_server,
|
|
config->login_server);
|
|
+ }
|
|
|
|
DEBUG (config->send_msg);
|
|
|
|
@@ -254,9 +371,13 @@
|
|
|
|
static int __http_internet_login (config_data_t *config, int verbose)
|
|
{
|
|
- int result = 0, length;
|
|
+ int result = 0;
|
|
+ size_t length;
|
|
char *login_string, *temp;
|
|
-
|
|
+ char tmpstr1[512];
|
|
+ char tmpstr2[512];
|
|
+ login_string = tmpstr1;
|
|
+ temp = tmpstr2;
|
|
/* Clear the read string to make sure we don't rely on previous results. */
|
|
config->get_msg [0] = 0;
|
|
config->logged_in = 0;
|
|
@@ -278,8 +399,8 @@
|
|
+ strlen (config->password_key) + strlen (config->password)
|
|
+ strlen (config->login_string_footer) + strlen ("Plus approximately 10%");
|
|
|
|
- temp = (char *) alloca (length);
|
|
- if (!temp)
|
|
+
|
|
+ if (!length)
|
|
{
|
|
close (config->sockfd);
|
|
ERROR (_("Failed to allocate memory (%d bytes): %s"),
|
|
@@ -289,20 +410,20 @@
|
|
|
|
if (config->login_string_header)
|
|
{
|
|
- result = sprintf (temp, "%s&", config->login_string_header);
|
|
+ result = snprintf (temp, sizeof (tmpstr2), "%s&",config->login_string_header);
|
|
}
|
|
|
|
- result += sprintf (&temp[result], "%s=%s&%s=%s",
|
|
+ result += snprintf (&temp[result],sizeof (tmpstr2), "%s=%s&%s=%s",
|
|
config->username_key,
|
|
config->username,
|
|
config->password_key,
|
|
config->password);
|
|
|
|
- if (config->login_string_footer) result += sprintf (&temp[result], "&%s", config->login_string_footer);
|
|
+ if (config->login_string_footer)
|
|
+ result += snprintf (&temp[result], sizeof (tmpstr2), "&%s", config->login_string_footer);
|
|
|
|
DEBUG (_("Login string: %s"), temp);
|
|
|
|
- login_string = (char *) alloca (length);
|
|
if (!login_string)
|
|
{
|
|
close (config->sockfd);
|
|
@@ -313,23 +434,40 @@
|
|
/* Encode the the login string. No spaces! */
|
|
{
|
|
int i;
|
|
-
|
|
- length = strlen (temp) + 1;
|
|
+ length = strlen (temp);
|
|
for (i = 0; i < length; i++)
|
|
{
|
|
- if (' ' == temp [i]) login_string [i] = '+';
|
|
- else login_string [i] = temp [i];
|
|
+ if (' ' == temp [i])
|
|
+ login_string [i] = '+';
|
|
+ else
|
|
+ login_string [i] = temp [i];
|
|
}
|
|
}
|
|
|
|
+
|
|
/* Paste it all into the login template */
|
|
+ if ( chk_proxy (config->login_server , verbose))
|
|
+ {
|
|
+ snprintf (config->send_msg,sizeof (config->send_msg), PRX_LGN_MSG ,
|
|
+ config->login_server, config->server_port, config->login_page,
|
|
+ config->login_server,
|
|
+ getenv ("OSTYPE"),
|
|
+ config->login_server,config->server_port, config->init_page,
|
|
+ (int) length,
|
|
+ login_string );
|
|
+ }
|
|
+ else
|
|
+ {
|
|
sprintf (config->send_msg, LOGIN_MSG,
|
|
config->login_page,
|
|
config->login_server,
|
|
config->login_server,
|
|
config->init_page,
|
|
- length,
|
|
+ (int) length,
|
|
login_string);
|
|
+ }
|
|
+ DEBUG (_("login_string= : %s"), login_string);
|
|
+ strlcat (config->send_msg ,login_string,sizeof (config->send_msg));
|
|
|
|
/* Send login string to server */
|
|
DEBUG (config->send_msg);
|
|
@@ -409,6 +547,10 @@
|
|
LOG (_("%s(): Start %s with --verbose --debug to see whole reply."), __FUNCTION__, PACKAGE_NAME);
|
|
}
|
|
}
|
|
+ else if (config->logged_in == 1)
|
|
+ {
|
|
+ ERROR(_("SUCCESSFUL LOGIN"));
|
|
+ }
|
|
|
|
return result;
|
|
}
|
|
@@ -444,10 +586,20 @@
|
|
}
|
|
|
|
/* Send logout request */
|
|
+ if ( chk_proxy (config->login_server, verbose))
|
|
+ {
|
|
+ snprintf (config->send_msg, sizeof (config->send_msg),
|
|
+ PRX_LGT_MSG, config->login_server,config->server_port,config->logout_page,
|
|
+ config->login_server,config->server_port, config->init_page,
|
|
+ config->login_server);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
sprintf (config->send_msg,
|
|
LOGOUT_MSG,
|
|
config->logout_page, config->login_server,
|
|
config->init_page, config->login_server);
|
|
+ }
|
|
|
|
DEBUG (config->send_msg);
|
|
|
|
@@ -460,6 +612,9 @@
|
|
|
|
return -1;
|
|
}
|
|
+ DEBUG (config->send_msg);
|
|
+ result = send (config->sockfd, config->send_msg, strlen (config->send_msg), 0);
|
|
+
|
|
|
|
LOG (_("Waiting for logout reply, 5 second timeout ..."));
|
|
result = http_poll_read (config->sockfd, 5);
|
|
@@ -491,11 +646,12 @@
|
|
close (config->sockfd);
|
|
ERROR(_("LOGOUT FAILED"));
|
|
config->logged_in = 0;
|
|
-
|
|
+ DEBUG (_("config->get_msg 0:%s \n "),config->get_msg);
|
|
+ DEBUG (_("config->logged_out_string 0:%s \n "), config->logged_out_string );
|
|
return -1;
|
|
}
|
|
|
|
- LOG (_("SUCCESSFUL LOGOUT"));
|
|
+ ERROR (_("SUCCESSFUL LOGOUT"));
|
|
|
|
/* Make sure to close the connection before leaving. */
|
|
close (config->sockfd);
|
|
@@ -629,3 +785,4 @@
|
|
* indent-tabs-mode: nil;
|
|
* End:
|
|
*/
|
|
+
|