anastasis

Credential backup and recovery protocol and service
Log | Files | Refs | Submodules | README | LICENSE

testing_api_cmd_policy_lookup.c (6215B)


      1 /*
      2   This file is part of Anastasis
      3   Copyright (C) 2020 Anastasis SARL
      4 
      5   Anastasis is free software; you can redistribute it and/or modify it under the
      6   terms of the GNU General Public License as published by the Free Software
      7   Foundation; either version 3, or (at your option) any later version.
      8 
      9   Anastasis is distributed in the hope that it will be useful, but WITHOUT ANY
     10   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11   A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     12 
     13   You should have received a copy of the GNU General Public License along with
     14   Anastasis; see the file COPYING.GPL.  If not, see <http://www.gnu.org/licenses/>
     15 */
     16 /**
     17  * @file testing/testing_api_cmd_policy_lookup.c
     18  * @brief command to execute the anastasis backend service.
     19  * @author Dennis Neufeld
     20  * @author Dominik Meister
     21  */
     22 
     23 #include "platform.h"
     24 struct PolicyLookupState;
     25 #define ANASTASIS_POLICY_LOOKUP_RESULT_CLOSURE struct PolicyLookupState
     26 #include "anastasis_testing_lib.h"
     27 #include <taler/taler_util.h>
     28 #include <taler/taler_testing_lib.h>
     29 
     30 
     31 /**
     32  * State for a "policy lookup" CMD.
     33  */
     34 struct PolicyLookupState
     35 {
     36   /**
     37    * The interpreter state.
     38    */
     39   struct TALER_TESTING_Interpreter *is;
     40 
     41   /**
     42    * Eddsa Publickey.
     43    */
     44   struct ANASTASIS_CRYPTO_AccountPublicKeyP anastasis_pub;
     45 
     46   /**
     47    * Hash of the upload (all zeros if there was no upload).
     48    */
     49   const struct GNUNET_HashCode *upload_hash;
     50 
     51   /**
     52    * URL of the anastasis backend.
     53    */
     54   const char *anastasis_url;
     55 
     56   /**
     57    * Expected status code.
     58    */
     59   unsigned int http_status;
     60 
     61   /**
     62    * Reference to upload command we expect to lookup.
     63    */
     64   const char *upload_reference;
     65 
     66   /**
     67    * The /policy GET operation handle.
     68    */
     69   struct ANASTASIS_PolicyLookupOperation *plo;
     70 };
     71 
     72 
     73 /**
     74  * Function called with the results of a #ANASTASIS_policy_lookup().
     75  *
     76  * @param pls closure
     77  * @param dd details about the lookup operation
     78  */
     79 static void
     80 policy_lookup_cb (struct PolicyLookupState *pls,
     81                   const struct ANASTASIS_DownloadDetails *dd)
     82 {
     83   pls->plo = NULL;
     84   if (dd->http_status != pls->http_status)
     85   {
     86     TALER_TESTING_unexpected_status (pls->is,
     87                                      dd->http_status,
     88                                      pls->http_status);
     89     return;
     90   }
     91   if (NULL != pls->upload_reference)
     92   {
     93     if ( (MHD_HTTP_OK == dd->http_status) &&
     94          (0 != GNUNET_memcmp (&dd->details.ok.curr_policy_hash,
     95                               pls->upload_hash)) )
     96     {
     97       GNUNET_break (0);
     98       TALER_TESTING_interpreter_fail (pls->is);
     99       return;
    100     }
    101   }
    102   TALER_TESTING_interpreter_next (pls->is);
    103 }
    104 
    105 
    106 /**
    107  * Run a "policy lookup" CMD.
    108  *
    109  * @param cls closure.
    110  * @param cmd command currently being run.
    111  * @param is interpreter state.
    112  */
    113 static void
    114 policy_lookup_run (void *cls,
    115                    const struct TALER_TESTING_Command *cmd,
    116                    struct TALER_TESTING_Interpreter *is)
    117 {
    118   struct PolicyLookupState *pls = cls;
    119 
    120   pls->is = is;
    121   if (NULL != pls->upload_reference)
    122   {
    123     const struct TALER_TESTING_Command *upload_cmd;
    124     const struct ANASTASIS_CRYPTO_AccountPublicKeyP *anastasis_pub;
    125 
    126     upload_cmd = TALER_TESTING_interpreter_lookup_command
    127                    (is,
    128                    pls->upload_reference);
    129     if (NULL == upload_cmd)
    130     {
    131       GNUNET_break (0);
    132       TALER_TESTING_interpreter_fail (pls->is);
    133       return;
    134     }
    135     if (GNUNET_OK !=
    136         ANASTASIS_TESTING_get_trait_hash (upload_cmd,
    137                                           &pls->upload_hash))
    138     {
    139       GNUNET_break (0);
    140       TALER_TESTING_interpreter_fail (pls->is);
    141       return;
    142     }
    143     if (GNUNET_OK !=
    144         ANASTASIS_TESTING_get_trait_account_pub (upload_cmd,
    145                                                  &anastasis_pub))
    146     {
    147       GNUNET_break (0);
    148       TALER_TESTING_interpreter_fail (pls->is);
    149       return;
    150     }
    151     pls->anastasis_pub = *anastasis_pub;
    152   }
    153   pls->plo = ANASTASIS_policy_lookup (
    154     TALER_TESTING_interpreter_get_context (is),
    155     pls->anastasis_url,
    156     &pls->anastasis_pub,
    157     &policy_lookup_cb,
    158     pls);
    159   if (NULL == pls->plo)
    160   {
    161     GNUNET_break (0);
    162     TALER_TESTING_interpreter_fail (pls->is);
    163     return;
    164   }
    165 }
    166 
    167 
    168 /**
    169  * Free the state of a "policy lookup" CMD, and possibly
    170  * cancel it if it did not complete.
    171  *
    172  * @param cls closure.
    173  * @param cmd command being freed.
    174  */
    175 static void
    176 policy_lookup_cleanup (void *cls,
    177                        const struct TALER_TESTING_Command *cmd)
    178 {
    179   struct PolicyLookupState *pls = cls;
    180 
    181   if (NULL != pls->plo)
    182   {
    183     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
    184                 "Command '%s' did not complete (policy lookup)\n",
    185                 cmd->label);
    186     ANASTASIS_policy_lookup_cancel (pls->plo);
    187     pls->plo = NULL;
    188   }
    189   GNUNET_free (pls);
    190 }
    191 
    192 
    193 struct TALER_TESTING_Command
    194 ANASTASIS_TESTING_cmd_policy_lookup (const char *label,
    195                                      const char *anastasis_url,
    196                                      unsigned int http_status,
    197                                      const char *upload_ref)
    198 {
    199   struct PolicyLookupState *pls;
    200 
    201   GNUNET_assert (NULL != upload_ref);
    202   pls = GNUNET_new (struct PolicyLookupState);
    203   pls->http_status = http_status;
    204   pls->anastasis_url = anastasis_url;
    205   pls->upload_reference = upload_ref;
    206   {
    207     struct TALER_TESTING_Command cmd = {
    208       .cls = pls,
    209       .label = label,
    210       .run = &policy_lookup_run,
    211       .cleanup = &policy_lookup_cleanup
    212     };
    213 
    214     return cmd;
    215   }
    216 }
    217 
    218 
    219 struct TALER_TESTING_Command
    220 ANASTASIS_TESTING_cmd_policy_nx (const char *label,
    221                                  const char *anastasis_url)
    222 {
    223   struct PolicyLookupState *pls;
    224   struct GNUNET_CRYPTO_EddsaPrivateKey priv;
    225 
    226   pls = GNUNET_new (struct PolicyLookupState);
    227   pls->http_status = MHD_HTTP_NOT_FOUND;
    228   pls->anastasis_url = anastasis_url;
    229   GNUNET_CRYPTO_eddsa_key_create (&priv);
    230   GNUNET_CRYPTO_eddsa_key_get_public (&priv,
    231                                       &pls->anastasis_pub.pub);
    232   {
    233     struct TALER_TESTING_Command cmd = {
    234       .cls = pls,
    235       .label = label,
    236       .run = &policy_lookup_run,
    237       .cleanup = &policy_lookup_cleanup
    238     };
    239 
    240     return cmd;
    241   }
    242 }