353 |
char t[257]; /* user:pass = 127+1+127+1 = 257 */ |
char t[257]; /* user:pass = 127+1+127+1 = 257 */ |
354 |
|
|
355 |
free_if_alloc (proxy.base64_user); |
free_if_alloc (proxy.base64_user); |
356 |
proxy.base64_user = new char[4*strlen( proxy_user ) / 3 + 32]; |
proxy.base64_user = new char[4*strlen (proxy_user) / 3 + 32 + strlen (proxy_pass)]; |
357 |
if( !proxy.base64_user ) |
if (!proxy.base64_user) |
358 |
BUG (0); |
BUG (0); |
359 |
_snprintf (t, sizeof (t)-1, "%s:%s", proxy_user, proxy_pass); |
_snprintf (t, sizeof (t)-1, "%s:%s", proxy_user, proxy_pass); |
360 |
base64_encode (t, proxy.base64_user, 257); |
base64_encode (t, proxy.base64_user, 257); |
370 |
{ |
{ |
371 |
if (strlen (buf) < 7) |
if (strlen (buf) < 7) |
372 |
return -1; |
return -1; |
373 |
if( !strstr (buf, "ldap://") |
if (!strstr (buf, "ldap://") |
374 |
&& !strstr (buf, "http://") |
&& !strstr (buf, "http://") |
375 |
&& !strstr (buf, "finger://") |
&& !strstr (buf, "finger://") |
376 |
&& !strstr (buf, "hkp://")) |
&& !strstr (buf, "hkp://")) |
443 |
|
|
444 |
fp = fopen (conf, "rb"); |
fp = fopen (conf, "rb"); |
445 |
if (!fp) { |
if (!fp) { |
446 |
for( pos = 0; server_list[pos]; pos++ ) { |
for (pos = 0; server_list[pos]; pos++) { |
447 |
server[pos].used = 1; |
server[pos].used = 1; |
448 |
server[pos].name = (char *)server_list[pos]; |
server[pos].name = (char *)server_list[pos]; |
449 |
server[pos].proto = proto_from_URL( server_list[pos] ); |
server[pos].proto = proto_from_URL( server_list[pos] ); |
450 |
} |
} |
451 |
no_config=1; |
no_config=1; |
452 |
} |
} |
453 |
get_reg_proxy_prefs( &proxy.host, &proxy.port, &user, &pass ); |
get_reg_proxy_prefs (&proxy.host, &proxy.port, &user, &pass); |
454 |
if( user && pass ) |
if (user && pass) |
455 |
kserver_update_proxyuser( user, pass ); |
kserver_update_proxyuser (user, pass); |
456 |
else if( user && !pass || !user && pass ) { |
else if (user && !pass || !user && pass) { |
457 |
msg_box( NULL, _("Invalid proxy configuration." |
msg_box( NULL, _("Invalid proxy configuration." |
458 |
"You need to set a user and a password" |
"You need to set a user and a password" |
459 |
"to use proxy authentication!"), _("Proxy Error"), MB_ERR ); |
"to use proxy authentication!"), _("Proxy Error"), MB_ERR ); |
529 |
const char * |
const char * |
530 |
kserver_get_proxy (int * r_port) |
kserver_get_proxy (int * r_port) |
531 |
{ |
{ |
532 |
if (proxy.host) |
if (proxy.host) { |
|
{ |
|
533 |
if (r_port) |
if (r_port) |
534 |
*r_port = proxy.port; |
*r_port = proxy.port; |
535 |
return proxy.host; |
return proxy.host; |
539 |
|
|
540 |
|
|
541 |
const char * |
const char * |
542 |
kserver_get_proxy_info( int id ) |
kserver_get_proxy_info (int id) |
543 |
{ |
{ |
544 |
switch( id ) { |
switch (id) { |
545 |
case PROXY_USER: return proxy.user; |
case PROXY_USER: return proxy.user; |
546 |
case PROXY_PASS: return proxy.pass; |
case PROXY_PASS: return proxy.pass; |
547 |
} |
} |
581 |
if ((iaddr = inet_addr (host)) != INADDR_NONE) |
if ((iaddr = inet_addr (host)) != INADDR_NONE) |
582 |
memcpy (&sock.sin_addr, &iaddr, sizeof (iaddr)); |
memcpy (&sock.sin_addr, &iaddr, sizeof (iaddr)); |
583 |
else if ((hp = gethostbyname (host))) { |
else if ((hp = gethostbyname (host))) { |
584 |
if (hp->h_addrtype != AF_INET) |
if (hp->h_addrtype != AF_INET || hp->h_length != 4) { |
585 |
return WPTERR_WINSOCK_RESOLVE; |
log_f ("gethostbyname: unknown address type.\r\n"); |
|
else if (hp->h_length != 4) |
|
586 |
return WPTERR_WINSOCK_RESOLVE; |
return WPTERR_WINSOCK_RESOLVE; |
587 |
|
} |
588 |
memcpy (&sock.sin_addr, hp->h_addr, hp->h_length); |
memcpy (&sock.sin_addr, hp->h_addr, hp->h_length); |
589 |
} |
} |
590 |
else { |
else { |
599 |
if (rc == SOCKET_ERROR) { |
if (rc == SOCKET_ERROR) { |
600 |
if (debug) |
if (debug) |
601 |
log_f ("connect: failed.\r\n"); |
log_f ("connect: failed.\r\n"); |
602 |
closesocket(fd); |
closesocket (fd); |
603 |
return WPTERR_WINSOCK_CONNECT; |
return WPTERR_WINSOCK_CONNECT; |
604 |
} |
} |
605 |
|
|
606 |
if (conn_fd) |
if (conn_fd) |
607 |
*conn_fd = fd; |
*conn_fd = fd; |
608 |
WSASetLastError(0); |
WSASetLastError (0); |
609 |
return 0; |
return 0; |
610 |
} /* kserver_connect */ |
} /* kserver_connect */ |
611 |
|
|
697 |
} |
} |
698 |
free_if_alloc (enc_pubkey); |
free_if_alloc (enc_pubkey); |
699 |
if (debug) |
if (debug) |
700 |
log_f("%s\n", request); |
log_f ("%s\n", request); |
701 |
return request; |
return request; |
702 |
} /* kserver_send_request */ |
} /* kserver_send_request */ |
703 |
|
|
739 |
"GET /pks/lookup?op=get&search=%s HTTP/1.0\r\n\r\n", keyid); |
"GET /pks/lookup?op=get&search=%s HTTP/1.0\r\n\r\n", keyid); |
740 |
} |
} |
741 |
if (debug) |
if (debug) |
742 |
log_f ("%s\n", request); |
log_f ("%s\r\n", request); |
743 |
|
|
744 |
rc = sock_write (conn_fd, request, strlen (request)); |
rc = sock_write (conn_fd, request, strlen (request)); |
745 |
if (rc == SOCKET_ERROR) { |
if (rc == SOCKET_ERROR) { |
753 |
goto leave; |
goto leave; |
754 |
} |
} |
755 |
|
|
756 |
if( debug ) |
if (debug) |
757 |
log_f("%s\n", key); |
log_f("%s\r\n", key); |
758 |
|
rc = check_hkp_response (key, 1); |
759 |
rc = check_hkp_response( key, 1 ); |
if (rc) |
|
if( rc ) |
|
760 |
goto leave; |
goto leave; |
761 |
|
|
762 |
WSASetLastError( 0 ); |
WSASetLastError (0); |
763 |
|
|
764 |
leave: |
leave: |
765 |
closesocket( conn_fd ); |
closesocket (conn_fd); |
766 |
free_if_alloc( request ); |
free_if_alloc (request); |
767 |
return rc; |
return rc; |
768 |
} /* kserver_recvkey */ |
} /* kserver_recvkey */ |
769 |
|
|
785 |
goto leave; |
goto leave; |
786 |
|
|
787 |
request = kserver_send_request (hostname, port, pubkey, len); |
request = kserver_send_request (hostname, port, pubkey, len); |
788 |
if( request == NULL ) { |
if (request == NULL) { |
789 |
rc = WPTERR_GENERAL; |
rc = WPTERR_GENERAL; |
790 |
goto leave; |
goto leave; |
791 |
} |
} |
802 |
goto leave; |
goto leave; |
803 |
} |
} |
804 |
if (debug) |
if (debug) |
805 |
log_f("%s\n", log); |
log_f ("kserver_sendkey:\r\n%s\r\n", log); |
806 |
|
|
807 |
rc = check_hkp_response( log, 0 ); |
rc = check_hkp_response (log, 0); |
808 |
if( rc ) |
if( rc ) |
809 |
goto leave; |
goto leave; |
810 |
|
|
811 |
WSASetLastError( 0 ); |
WSASetLastError (0); |
812 |
|
|
813 |
leave: |
leave: |
814 |
closesocket( conn_fd ); |
closesocket (conn_fd); |
815 |
free_if_alloc( request ); |
free_if_alloc (request); |
816 |
return rc; |
return rc; |
817 |
} /* kserver_sendkey */ |
} /* kserver_sendkey */ |
818 |
|
|
821 |
kserver_search_init (const char * hostname, u16 port, const char * keyid, int * conn_fd) |
kserver_search_init (const char * hostname, u16 port, const char * keyid, int * conn_fd) |
822 |
{ |
{ |
823 |
int rc, sock_fd; |
int rc, sock_fd; |
824 |
|
int n=0; |
825 |
char * request = NULL; |
char * request = NULL; |
826 |
|
|
827 |
rc = kserver_connect (hostname, port, &sock_fd); |
rc = kserver_connect (hostname, port, &sock_fd); |
830 |
goto leave; |
goto leave; |
831 |
} |
} |
832 |
|
|
833 |
request = new char[300+1]; |
n=300; |
834 |
|
request = new char[n+1]; |
835 |
if (!request) |
if (!request) |
836 |
BUG (0); |
BUG (0); |
837 |
|
|
838 |
if (proxy.host && proxy.user) { |
if (proxy.host && proxy.user) { |
839 |
_snprintf (request, 300, |
_snprintf (request, n, |
840 |
"GET http://%s:%d/pks/lookup?op=index&search=%s HTTP/1.0\r\n" |
"GET http://%s:%d/pks/lookup?op=index&search=%s HTTP/1.0\r\n" |
841 |
"Proxy-Authorization: Basic %s\r\n\r\n", |
"Proxy-Authorization: Basic %s\r\n\r\n", |
842 |
skip_type_prefix (hostname), port, keyid, proxy.base64_user); |
skip_type_prefix (hostname), port, keyid, proxy.base64_user); |
843 |
} |
} |
844 |
else if (proxy.host) { |
else if (proxy.host) { |
845 |
_snprintf (request, 300, |
_snprintf (request, n, |
846 |
"GET http://%s:%d/pks/lookup?op=index&search=%s HTTP/1.0\r\n\r\n", |
"GET http://%s:%d/pks/lookup?op=index&search=%s HTTP/1.0\r\n\r\n", |
847 |
skip_type_prefix (hostname), port, keyid); |
skip_type_prefix (hostname), port, keyid); |
848 |
} |
} |
849 |
else { |
else { |
850 |
_snprintf (request, 300, |
_snprintf (request, n, |
851 |
"GET /pks/lookup?op=index&search=%s HTTP/1.0\r\n\r\n", keyid); |
"GET /pks/lookup?op=index&search=%s HTTP/1.0\r\n\r\n", keyid); |
852 |
} |
} |
853 |
|
|
854 |
if (debug) |
if (debug) |
855 |
log_f("%s\n", request); |
log_f ("kserver_search_init:\r\n%s\r\n", request); |
856 |
|
|
857 |
if (sock_write (sock_fd, request, strlen (request)) == SOCKET_ERROR) { |
if (sock_write (sock_fd, request, strlen (request)) == SOCKET_ERROR) { |
858 |
rc = WPTERR_GENERAL; |
rc = WPTERR_GENERAL; |
872 |
{ |
{ |
873 |
char buf[128]; |
char buf[128]; |
874 |
int n=0; |
int n=0; |
875 |
|
|
876 |
/* parse response 'HTTP/1.0 500 OK' */ |
/* parse response 'HTTP/1.0 500 OK' */ |
877 |
if (sock_getline (fd, buf, 127, &n)) |
if (sock_getline (fd, buf, 127, &n)) |
878 |
return WPTERR_KEYSERVER_NOTFOUND; |
return WPTERR_KEYSERVER_NOTFOUND; |
879 |
|
if (debug) |
880 |
|
log_f ("kserver_search_chkpresp: %s\r\n", buf); |
881 |
if (strncmp (buf, "HTTP/1.", 7)) |
if (strncmp (buf, "HTTP/1.", 7)) |
882 |
return WPTERR_KEYSERVER_NOTFOUND; |
return WPTERR_KEYSERVER_NOTFOUND; |
883 |
if (strncmp (buf+(8+1), "200", 3)) |
if (strncmp (buf+(8+1), "200", 3)) |
902 |
log_f ("%s\n", buf); |
log_f ("%s\n", buf); |
903 |
|
|
904 |
if (!strncmp (buf, "pub", 3)) { |
if (!strncmp (buf, "pub", 3)) { |
905 |
|
int revoked = strstr (buf, "KEY REVOKED") != NULL? 1 : 0; |
906 |
key->bits = atol (buf+3); |
key->bits = atol (buf+3); |
907 |
p = strchr (buf, '>'); |
p = strchr (buf, '>'); |
908 |
if (!p) |
if (!p) |
916 |
pos = p - buf + 5; |
pos = p - buf + 5; |
917 |
memcpy (key->date, buf + pos, 10); |
memcpy (key->date, buf + pos, 10); |
918 |
key->date[10] = '\0'; |
key->date[10] = '\0'; |
919 |
|
if (revoked) { |
920 |
|
strcpy (key->uid, "KEY REVOKED: not checked"); |
921 |
|
return 0; |
922 |
|
} |
923 |
pos += 10; |
pos += 10; |
924 |
p = buf + pos + 1; |
p = buf + pos + 1; |
925 |
while (p && *p != '>') |
while (p && *p != '>') |