diff options
Diffstat (limited to 'src/exchangedb')
| -rw-r--r-- | src/exchangedb/exchange-0001-part.sql | 66 | ||||
| -rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 18 | 
2 files changed, 84 insertions, 0 deletions
| diff --git a/src/exchangedb/exchange-0001-part.sql b/src/exchangedb/exchange-0001-part.sql index 52a16cd9..0b99e25f 100644 --- a/src/exchangedb/exchange-0001-part.sql +++ b/src/exchangedb/exchange-0001-part.sql @@ -3092,6 +3092,8 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_merge(    IN in_reserve_pub BYTEA,    OUT out_no_partner BOOLEAN,    OUT out_no_balance BOOLEAN, +  OUT out_no_kyc BOOLEAN, +  OUT out_no_reserve BOOLEAN,    OUT out_conflict BOOLEAN)  LANGUAGE plpgsql  AS $$ @@ -3121,6 +3123,8 @@ ELSE    THEN      out_no_partner=TRUE;      out_conflict=FALSE; +    out_no_kyc=FALSE; +    out_no_reserve=FALSE;      RETURN;    END IF;  END IF; @@ -3144,6 +3148,8 @@ IF NOT FOUND  THEN    out_no_balance=TRUE;    out_conflict=FALSE; +  out_no_kyc=FALSE; +  out_no_reserve=FALSE;    RETURN;  END IF;  out_no_balance=FALSE; @@ -3176,17 +3182,49 @@ THEN    THEN       -- Purse was merged, but to some other reserve. Not allowed.       out_conflict=TRUE; +     out_no_kyc=FALSE; +     out_no_reserve=FALSE;       RETURN;    END IF;    -- "success"    out_conflict=FALSE; +  out_no_kyc=FALSE; +  out_no_reserve=FALSE;    RETURN;  END IF;  out_conflict=FALSE;  ASSERT NOT my_finished, 'internal invariant failed'; +IF in_partner_url IS NULL +THEN +  -- Need to do KYC check. +  SELECT NOT kyc_passed +    INTO out_no_kyc +    FROM reserves +   WHERE reserve_pub=in_reserve_pub; + +  IF NOT FOUND +  THEN +    out_no_kyc=TRUE; +    out_no_reserve=TRUE; +    RETURN; +  END IF; +  out_no_reserve=FALSE; + +  IF (out_no_kyc) +  THEN +    RETURN; +  END IF; +ELSE +  -- KYC is not our responsibility +  out_no_reserve=FALSE; +  out_no_kyc=FALSE; +END IF; + + +  -- Store account merge signature.  INSERT INTO account_merges    (reserve_pub @@ -3248,6 +3286,8 @@ CREATE OR REPLACE FUNCTION exchange_do_reserve_purse(    IN in_purse_fee_frac INT4,    IN in_reserve_pub BYTEA,    OUT out_no_funds BOOLEAN, +  OUT out_no_kyc BOOLEAN, +  OUT out_no_reserve BOOLEAN,    OUT out_conflict BOOLEAN)  LANGUAGE plpgsql  AS $$ @@ -3281,16 +3321,40 @@ THEN    THEN       -- Purse was merged, but to some other reserve. Not allowed.       out_conflict=TRUE; +     out_no_kyc=FALSE; +     out_no_reserve=FALSE; +     out_no_funds=FALSE;       RETURN;    END IF;    -- "success"    out_conflict=FALSE;    out_no_funds=FALSE; +  out_no_kyc=FALSE; +  out_no_reserve=FALSE;    RETURN;  END IF;  out_conflict=FALSE; +SELECT NOT kyc_passed +  INTO out_no_kyc +  FROM reserves + WHERE reserve_pub=in_reserve_pub; + +IF NOT FOUND +THEN +  out_no_kyc=TRUE; +  out_no_reserve=TRUE; +  out_no_funds=TRUE; +  RETURN; +END IF; +out_no_reserve=FALSE; + +IF (out_no_kyc) +THEN +  out_no_funds=FALSE; +  RETURN; +END IF;  IF (in_reserve_quota)  THEN @@ -3303,6 +3367,7 @@ THEN    IF NOT FOUND    THEN      out_no_funds=TRUE; +    RETURN;    END IF;  ELSE    --  UPDATE reserves balance (and check if balance is enough to pay the fee) @@ -3328,6 +3393,7 @@ ELSE    IF NOT FOUND    THEN      out_no_funds=TRUE; +    RETURN;    END IF;  END IF; diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index 3a269c6d..01869d59 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -3973,6 +3973,8 @@ prepare_statements (struct PostgresClosure *pg)        "SELECT"        " out_no_partner AS no_partner"        ",out_no_balance AS no_balance" +      ",out_no_kyc AS no_kyc" +      ",out_no_reserve AS no_reserve"        ",out_conflict AS conflict"        " FROM exchange_do_purse_merge"        "  ($1, $2, $3, $4, $5, $6);", @@ -3982,6 +3984,8 @@ prepare_statements (struct PostgresClosure *pg)        "call_reserve_purse",        "SELECT"        " out_no_funds AS insufficient_funds" +      ",out_no_reserve AS no_reserve" +      ",out_no_kyc AS no_kyc"        ",out_conflict AS conflict"        " FROM exchange_do_reserve_purse"        "  ($1, $2, $3, $4, $5, $6, $7, $8);", @@ -14490,6 +14494,8 @@ postgres_get_purse_deposit (   * @param reserve_pub public key of the reserve to credit   * @param[out] no_partner set to true if @a partner_url is unknown   * @param[out] no_balance set to true if the @a purse_pub is not paid up yet + * @param[out] no_reserve set to true if the @a reserve_pub is not known + * @param[out] no_kyc set to true if the @a reserve_pub lacks KYC   * @param[out] in_conflict set to true if @a purse_pub was merged into a different reserve already    * @return transaction status code   */ @@ -14504,6 +14510,8 @@ postgres_do_purse_merge (    const struct TALER_ReservePublicKeyP *reserve_pub,    bool *no_partner,    bool *no_balance, +  bool *no_reserve, +  bool *no_kyc,    bool *in_conflict)  {    struct PostgresClosure *pg = cls; @@ -14523,6 +14531,10 @@ postgres_do_purse_merge (                                  no_partner),      GNUNET_PQ_result_spec_bool ("no_balance",                                  no_balance), +    GNUNET_PQ_result_spec_bool ("no_kyc", +                                no_kyc), +    GNUNET_PQ_result_spec_bool ("no_reserve", +                                no_reserve),      GNUNET_PQ_result_spec_bool ("conflict",                                  in_conflict),      GNUNET_PQ_result_spec_end @@ -14561,6 +14573,8 @@ postgres_do_reserve_purse (    const struct TALER_Amount *purse_fee,    const struct TALER_ReservePublicKeyP *reserve_pub,    bool *in_conflict, +  bool *no_reserve, +  bool *no_kyc,    bool *insufficient_funds)  {    struct PostgresClosure *pg = cls; @@ -14582,6 +14596,10 @@ postgres_do_reserve_purse (                                  insufficient_funds),      GNUNET_PQ_result_spec_bool ("conflict",                                  in_conflict), +    GNUNET_PQ_result_spec_bool ("no_kyc", +                                no_kyc), +    GNUNET_PQ_result_spec_bool ("no_reserve", +                                no_reserve),      GNUNET_PQ_result_spec_end    }; | 
