/[winpt]/trunk/Src/wptKeyserver.cpp
ViewVC logotype

Diff of /trunk/Src/wptKeyserver.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2 by twoaday, Mon Jan 31 11:02:21 2005 UTC revision 13 by twoaday, Mon Apr 25 07:15:30 2005 UTC
# Line 115  check_hkp_response (const char *resp, in Line 115  check_hkp_response (const char *resp, in
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")
# Line 158  sock_getline (int fd, char *buf, int buf Line 159  sock_getline (int fd, char *buf, int buf
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 */
# Line 352  kserver_update_proxyuser (const char *pr Line 353  kserver_update_proxyuser (const char *pr
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);
# Line 369  check_URL (const char * buf) Line 370  check_URL (const char * buf)
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://"))
# Line 442  kserver_load_conf (const char * conf) Line 443  kserver_load_conf (const char * conf)
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 );
# Line 528  kserver_load_conf (const char * conf) Line 529  kserver_load_conf (const char * conf)
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;
# Line 539  kserver_get_proxy (int * r_port) Line 539  kserver_get_proxy (int * r_port)
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      }      }
# Line 581  kserver_connect (const char *hostname, u Line 581  kserver_connect (const char *hostname, u
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 {
# Line 599  kserver_connect (const char *hostname, u Line 599  kserver_connect (const char *hostname, u
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    
# Line 697  kserver_send_request (const char *hostna Line 697  kserver_send_request (const char *hostna
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    
# Line 739  kserver_recvkey (const char *hostname, u Line 739  kserver_recvkey (const char *hostname, u
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) {
# Line 753  kserver_recvkey (const char *hostname, u Line 753  kserver_recvkey (const char *hostname, u
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    
# Line 786  kserver_sendkey (const char *hostname, u Line 785  kserver_sendkey (const char *hostname, u
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      }      }
# Line 803  kserver_sendkey (const char *hostname, u Line 802  kserver_sendkey (const char *hostname, u
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    
# Line 822  int Line 821  int
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);
# Line 830  kserver_search_init (const char * hostna Line 830  kserver_search_init (const char * hostna
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;
# Line 870  int Line 871  int
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 (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      i = 8+1;      if (strncmp (buf+(8+1), "200", 3))
     if (strncmp (buf+i, "200", 3))  
884          return WPTERR_KEYSERVER_NOTFOUND;          return WPTERR_KEYSERVER_NOTFOUND;
885      return 0;      return 0;
886  } /* kserver_search_chkresp */  } /* kserver_search_chkresp */
# Line 888  int Line 890  int
890  kserver_search (int fd, keyserver_key * key)  kserver_search (int fd, keyserver_key * key)
891  {  {
892      char buf[1024], *p;      char buf[1024], *p;
893      int uid_len, nbytes, pos = 0;      int uidlen, nbytes, pos = 0;
894            
895      if (debug)      if (debug)
896          log_f ("keyserver_search:\n");          log_f ("keyserver_search:\n");
897            
898      if (sock_getline (fd, buf, sizeof (buf), &nbytes))          if (sock_getline (fd, buf, sizeof (buf) - 1, &nbytes))
899          return WPTERR_GENERAL;          return WPTERR_GENERAL;
900            
901      if (debug)      if (debug)
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)
909              pos = p-buf+1;              goto fail;
910          memcpy (key->keyid, buf+pos, 8);          pos = p - buf + 1;
911            memcpy (key->keyid, buf + pos, 8);
912          key->keyid[8] = '\0';          key->keyid[8] = '\0';
913          p = strstr (buf, "</a>");          p = strstr (buf, "</a>");
914          if (p)          if (!p)
915              pos = p-buf+5;              goto fail;
916          memcpy (key->date, buf+pos, 10);          pos = p - buf + 5;
917            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 != '>')
926              p++;              p++;
927          p++;          p++;
928          uid_len = strlen (p) - 10;          uidlen = strlen (p) - 10;
929          memcpy (key->uid, p, uid_len);          memcpy (key->uid, p, uidlen);
930          key->uid[uid_len] = '\0';          key->uid[uidlen] = '\0';
931          strcat (key->uid, ">");          strcat (key->uid, ">");
932          p = strchr (key->uid, '&');          p = strchr (key->uid, '&');
933          if (p) {          if (p) {
934              key->uid[(p-key->uid)] = '<';              key->uid[(p-key->uid)] = '<';
935              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);
936          }          }
937            return 0;
938      }      }
939      else {  
940          key->bits = 0;  fail:
941          memset (key, 0, sizeof *key);      key->bits = 0;
942      }      memset (key, 0, sizeof *key);
       
943      return 0;      return 0;
944  } /* kserver_search */  } /* kserver_search */
945    

Legend:
Removed from v.2  
changed lines
  Added in v.13

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26