summaryrefslogtreecommitdiff
path: root/packages/anastasis-core
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2021-11-08 15:51:39 +0100
committerFlorian Dold <florian@dold.me>2021-11-08 15:52:21 +0100
commit8da58bd4943cc0dc407acd62a168412301b07717 (patch)
tree5d3953d03ae26782f8fa79f8c5c5042618a4d28f /packages/anastasis-core
parent6d7fffc24233ad1005dde89247d387a7090626f6 (diff)
downloadwallet-core-8da58bd4943cc0dc407acd62a168412301b07717.tar.gz
wallet-core-8da58bd4943cc0dc407acd62a168412301b07717.tar.bz2
wallet-core-8da58bd4943cc0dc407acd62a168412301b07717.zip
anastasis-core: fix policy suggestion and add test case
Diffstat (limited to 'packages/anastasis-core')
-rw-r--r--packages/anastasis-core/src/anastasis-data.ts9
-rw-r--r--packages/anastasis-core/src/policy-suggestion.test.ts44
-rw-r--r--packages/anastasis-core/src/policy-suggestion.ts25
3 files changed, 72 insertions, 6 deletions
diff --git a/packages/anastasis-core/src/anastasis-data.ts b/packages/anastasis-core/src/anastasis-data.ts
index 4946e9dfd..e24cdc8a4 100644
--- a/packages/anastasis-core/src/anastasis-data.ts
+++ b/packages/anastasis-core/src/anastasis-data.ts
@@ -1,6 +1,7 @@
// This file is auto-generated, do not modify.
// Generated from v0.2.0-4-g61ea83c on Tue, 05 Oct 2021 10:40:32 +0200
// To re-generate, run contrib/gen-ts.sh from the main anastasis code base.
+// XXX: Modified for demo, allowing demo providers for EUR
export const anastasisData = {
providersList: {
@@ -16,6 +17,14 @@ export const anastasisData = {
currency: "KUDOS",
},
{
+ url: "https://anastasis.demo.taler.net/",
+ currency: "EUR",
+ },
+ {
+ url: "https://kudos.demo.anastasis.lu/",
+ currency: "EUR",
+ },
+ {
url: "http://localhost:8086/",
currency: "TESTKUDOS",
},
diff --git a/packages/anastasis-core/src/policy-suggestion.test.ts b/packages/anastasis-core/src/policy-suggestion.test.ts
new file mode 100644
index 000000000..6370825da
--- /dev/null
+++ b/packages/anastasis-core/src/policy-suggestion.test.ts
@@ -0,0 +1,44 @@
+import { j2s } from "@gnu-taler/taler-util";
+import test from "ava";
+import { ProviderInfo, suggestPolicies } from "./policy-suggestion.js";
+
+test("policy suggestion", async (t) => {
+ const methods = [
+ {
+ challenge: "XXX",
+ instructions: "SMS to 123",
+ type: "sms",
+ },
+ {
+ challenge: "XXX",
+ instructions: "What is the meaning of life?",
+ type: "question",
+ },
+ {
+ challenge: "XXX",
+ instructions: "email to foo@bar.com",
+ type: "email",
+ },
+ ];
+ const providers: ProviderInfo[] = [
+ {
+ methodCost: {
+ sms: "KUDOS:1",
+ },
+ url: "prov1",
+ },
+ {
+ methodCost: {
+ question: "KUDOS:1",
+ },
+ url: "prov2",
+ },
+ ];
+ const res1 = suggestPolicies(methods, providers);
+ t.assert(res1.policies.length === 1);
+ const res2 = suggestPolicies([...methods].reverse(), providers);
+ t.assert(res2.policies.length === 1);
+
+ const res3 = suggestPolicies(methods, [...providers].reverse());
+ t.assert(res3.policies.length === 1);
+});
diff --git a/packages/anastasis-core/src/policy-suggestion.ts b/packages/anastasis-core/src/policy-suggestion.ts
index 7eb6c21cc..2c25caaa4 100644
--- a/packages/anastasis-core/src/policy-suggestion.ts
+++ b/packages/anastasis-core/src/policy-suggestion.ts
@@ -84,9 +84,16 @@ function assignProviders(
for (const provSel of providerSelections) {
// First, check if selection is even possible with the methods offered
let possible = true;
- for (const methIndex in provSel) {
- const provIndex = provSel[methIndex];
+ for (const methSelIndex in provSel) {
+ const provIndex = provSel[methSelIndex];
+ if (typeof provIndex !== "number") {
+ throw Error("invariant failed");
+ }
+ const methIndex = methodSelection[methSelIndex];
const meth = methods[methIndex];
+ if (!meth) {
+ throw Error("invariant failed");
+ }
const prov = providers[provIndex];
if (!prov.methodCost[meth.type]) {
possible = false;
@@ -96,7 +103,6 @@ function assignProviders(
if (!possible) {
continue;
}
-
// Evaluate diversity, always prefer policies
// that increase diversity.
const providerSet = new Set<string>();
@@ -163,10 +169,19 @@ function assignProviders(
/**
* A provider selection maps a method selection index to a provider index.
+ *
+ * I.e. "PSEL[i] = x" means that provider with index "x" should be used
+ * for method with index "MSEL[i]"
*/
type ProviderSelection = number[];
/**
+ * A method selection "MSEL[j] = y" means that policy method j
+ * should use method y.
+ */
+type MethodSelection = number[];
+
+/**
* Compute provider mappings.
* Enumerates all n-combinations with repetition of m providers.
*/
@@ -184,7 +199,7 @@ function enumerateProviderMappings(
}
for (let j = start; j < m; j++) {
a[i] = j;
- sel(i + 1, j);
+ sel(i + 1, 0);
if (limit && selections.length >= limit) {
break;
}
@@ -199,8 +214,6 @@ interface PolicySelectionResult {
policy_providers: PolicyProvider[];
}
-type MethodSelection = number[];
-
/**
* Compute method selections.
* Enumerates all n-combinations without repetition of m methods.