Finish PayPal IPN verification code.
authorWerner Koch <wk@gnupg.org>
Fri, 13 Jun 2014 12:39:47 +0000 (14:39 +0200)
committerWerner Koch <wk@gnupg.org>
Fri, 13 Jun 2014 12:39:47 +0000 (14:39 +0200)
* src/paypal-ipn.c (call_verify): Finish code.
(paypal_proc_ipn): Use another test mail address.
* src/util.c (parse_www_form_urlencoded): Change to not modify the
arg.

src/paypal-ipn.c
src/util.c
src/util.h

index b62f17e..77afbd3 100644 (file)
@@ -114,8 +114,8 @@ call_verify (int live, const char *request)
       goto leave;
     }
 
-  log_debug ("PayPal verification status '%s'\n", response);
-  err = 0;
+  /* log_debug ("PayPal verification status '%s'\n", response); */
+  err = !strcmp (response, "VERIFIED")? 0 : gpg_error (GPG_ERR_NOT_FOUND);
 
  leave:
   http_close (http, 0);
@@ -166,7 +166,8 @@ paypal_proc_ipn (unsigned int idno, keyvalue_t *dict)
 
   /* To avoid useless verification against Paypal we first check the
      mail address.  */
-  if (strcmp (keyvalue_get_string (form, "receiver_email"),"sales@g10code.com"))
+  if (strcmp (keyvalue_get_string (form, "receiver_email"),
+              "paypal-test@g10code.com"))
     {
       log_error ("ppipnhd %u: wrong receiver_email\n", idno);
       log_printval ("  mail=", keyvalue_get_string (form, "receiver_email"));
index 8c59ccb..0aa5398 100644 (file)
@@ -450,20 +450,28 @@ keyvalue_get_int (keyvalue_t list, const char *key)
 
 
 \f
-/* Parse the www-form-urlencoded data in STRING into a new dictionary
-   and store that dictionary at R_DICT.  On error store NULL at R_DICT
-   and return an error code.  Note that STRING will be modified on
+/* Parse the www-form-urlencoded DATA into a new dictionary and store
+   that dictionary at R_DICT.  On error store NULL at R_DICT and
+   return an error code.  Note that STRING will be modified on
    return. */
 gpg_error_t
-parse_www_form_urlencoded (keyvalue_t *r_dict, char *string)
+parse_www_form_urlencoded (keyvalue_t *r_dict, const char *data)
 {
   gpg_error_t err;
-  char *endp, *name, *value;
+  char *string, *endp, *name, *value;
   size_t n;
+  char *buffer = NULL;
   keyvalue_t dict = NULL;
 
   *r_dict = NULL;
 
+  string = buffer = xtrystrdup (data);
+  if (!string)
+    {
+      err = gpg_error_from_syserror ();
+      goto leave;
+    }
+
   do
     {
       endp = strchr (string, '&');
@@ -478,8 +486,8 @@ parse_www_form_urlencoded (keyvalue_t *r_dict, char *string)
       name[(n=percent_plus_unescape_inplace (name, 0))] = 0;
       if (!n || strlen (name) != n)
         {
-          keyvalue_release (dict);
-          return gpg_error (GPG_ERR_INV_VALUE); /* Nul in name or empty.  */
+          err = gpg_error (GPG_ERR_INV_VALUE); /* Nul in name or empty.  */
+          goto leave;
         }
 
       if (value)
@@ -487,17 +495,14 @@ parse_www_form_urlencoded (keyvalue_t *r_dict, char *string)
           value[(n=percent_plus_unescape_inplace (value, 0))] = 0;
           if (strlen (value) != n)
             {
-              keyvalue_release (dict);
-              return gpg_error (GPG_ERR_INV_VALUE); /* Nul in value.  */
+              err = gpg_error (GPG_ERR_INV_VALUE); /* Nul in value.  */
+              goto leave;
             }
         }
 
       err = keyvalue_put (&dict, name, value? value:"");
       if (err)
-        {
-          keyvalue_release (dict);
-          return err;
-        }
+        goto leave;
 
       if (endp)
         string = endp + 1;
@@ -505,7 +510,13 @@ parse_www_form_urlencoded (keyvalue_t *r_dict, char *string)
   while (endp);
 
   *r_dict = dict;
-  return 0;
+  dict = NULL;
+  err = 0;
+
+ leave:
+  keyvalue_release (dict);
+  xfree (buffer);
+  return err;
 }
 
 
index f369268..390b99a 100644 (file)
@@ -142,7 +142,7 @@ char *keyvalue_snatch (keyvalue_t list, const char *key);
 const char *keyvalue_get_string (keyvalue_t list, const char *key);
 int         keyvalue_get_int (keyvalue_t list, const char *key);
 
-gpg_error_t parse_www_form_urlencoded (keyvalue_t *r_dict, char *string);
+gpg_error_t parse_www_form_urlencoded (keyvalue_t *r_dict, const char *data);
 
 int zb32_index (int c);
 char *zb32_encode (const void *data, unsigned int databits);