115 |
char *p, * end; |
char *p, * end; |
116 |
|
|
117 |
ec = recv ? WPTERR_WINSOCK_RECVKEY : WPTERR_WINSOCK_SENDKEY; |
ec = recv ? WPTERR_WINSOCK_RECVKEY : WPTERR_WINSOCK_SENDKEY; |
118 |
if (!strstr (resp, "HTTP/1.0 200 OK")) /* http error */ |
if (!strstr (resp, "HTTP/1.0 200 OK") && |
119 |
|
!strstr (resp, "HTTP/1.1 200 OK")) /* http error */ |
120 |
return ec; |
return ec; |
121 |
if (strstr (resp, "Public Key Server -- Error") |
if (strstr (resp, "Public Key Server -- Error") |
122 |
|| strstr (resp, "Public Key Server -- Error") |
|| strstr (resp, "Public Key Server -- Error") |
159 |
|
|
160 |
|
|
161 |
static int |
static int |
162 |
sock_select( int fd ) |
sock_select (int fd) |
163 |
{ |
{ |
164 |
FD_SET rfd; |
FD_SET rfd; |
165 |
timeval tv = {1, 0}; |
timeval tv = {1, 0}; |
166 |
|
|
167 |
FD_ZERO( &rfd ); |
FD_ZERO (&rfd); |
168 |
FD_SET( fd, &rfd ); |
FD_SET (fd, &rfd); |
169 |
if( select( fd + 1, &rfd, NULL, NULL, &tv ) == SOCKET_ERROR ) |
if (select (fd + 1, &rfd, NULL, NULL, &tv) == SOCKET_ERROR) |
170 |
return SOCKET_ERROR; |
return SOCKET_ERROR; |
171 |
if( FD_ISSET( fd, &rfd ) ) |
if (FD_ISSET (fd, &rfd)) |
172 |
return 1; |
return 1; |
173 |
return 0; |
return 0; |
174 |
} /* sock_select */ |
} /* sock_select */ |
871 |
kserver_search_chkresp (int fd) |
kserver_search_chkresp (int fd) |
872 |
{ |
{ |
873 |
char buf[128]; |
char buf[128]; |
874 |
int n=0, i=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 (strncmp (buf, "HTTP/1.", 7)) |
if (strncmp (buf, "HTTP/1.", 7)) |
880 |
return WPTERR_KEYSERVER_NOTFOUND; |
return WPTERR_KEYSERVER_NOTFOUND; |
881 |
i = 8+1; |
if (strncmp (buf+(8+1), "200", 3)) |
|
if (strncmp (buf+i, "200", 3)) |
|
882 |
return WPTERR_KEYSERVER_NOTFOUND; |
return WPTERR_KEYSERVER_NOTFOUND; |
883 |
return 0; |
return 0; |
884 |
} /* kserver_search_chkresp */ |
} /* kserver_search_chkresp */ |
888 |
kserver_search (int fd, keyserver_key * key) |
kserver_search (int fd, keyserver_key * key) |
889 |
{ |
{ |
890 |
char buf[1024], *p; |
char buf[1024], *p; |
891 |
int uid_len, nbytes, pos = 0; |
int uidlen, nbytes, pos = 0; |
892 |
|
|
893 |
if (debug) |
if (debug) |
894 |
log_f ("keyserver_search:\n"); |
log_f ("keyserver_search:\n"); |
895 |
|
|
896 |
if (sock_getline (fd, buf, sizeof (buf), &nbytes)) |
if (sock_getline (fd, buf, sizeof (buf) - 1, &nbytes)) |
897 |
return WPTERR_GENERAL; |
return WPTERR_GENERAL; |
898 |
|
|
899 |
if (debug) |
if (debug) |
902 |
if (!strncmp (buf, "pub", 3)) { |
if (!strncmp (buf, "pub", 3)) { |
903 |
key->bits = atol (buf+3); |
key->bits = atol (buf+3); |
904 |
p = strchr (buf, '>'); |
p = strchr (buf, '>'); |
905 |
if (p) |
if (!p) |
906 |
pos = p-buf+1; |
goto fail; |
907 |
memcpy (key->keyid, buf+pos, 8); |
pos = p - buf + 1; |
908 |
|
memcpy (key->keyid, buf + pos, 8); |
909 |
key->keyid[8] = '\0'; |
key->keyid[8] = '\0'; |
910 |
p = strstr (buf, "</a>"); |
p = strstr (buf, "</a>"); |
911 |
if (p) |
if (!p) |
912 |
pos = p-buf+5; |
goto fail; |
913 |
memcpy (key->date, buf+pos, 10); |
pos = p - buf + 5; |
914 |
|
memcpy (key->date, buf + pos, 10); |
915 |
key->date[10] = '\0'; |
key->date[10] = '\0'; |
916 |
pos += 10; |
pos += 10; |
917 |
p = buf+pos+1; |
p = buf + pos + 1; |
918 |
while (p && *p != '>') |
while (p && *p != '>') |
919 |
p++; |
p++; |
920 |
p++; |
p++; |
921 |
uid_len = strlen (p) - 10; |
uidlen = strlen (p) - 10; |
922 |
memcpy (key->uid, p, uid_len); |
memcpy (key->uid, p, uidlen); |
923 |
key->uid[uid_len] = '\0'; |
key->uid[uidlen] = '\0'; |
924 |
strcat (key->uid, ">"); |
strcat (key->uid, ">"); |
925 |
p = strchr (key->uid, '&'); |
p = strchr (key->uid, '&'); |
926 |
if (p) { |
if (p) { |
927 |
key->uid[(p-key->uid)] = '<'; |
key->uid[(p-key->uid)] = '<'; |
928 |
memmove (key->uid+(p-key->uid)+1, key->uid+(p-key->uid)+4, strlen (key->uid)-3); |
memmove (key->uid+(p-key->uid)+1, key->uid+(p-key->uid)+4, strlen (key->uid)-3); |
929 |
} |
} |
930 |
|
return 0; |
931 |
} |
} |
932 |
else { |
|
933 |
key->bits = 0; |
fail: |
934 |
memset (key, 0, sizeof *key); |
key->bits = 0; |
935 |
} |
memset (key, 0, sizeof *key); |
|
|
|
936 |
return 0; |
return 0; |
937 |
} /* kserver_search */ |
} /* kserver_search */ |
938 |
|
|