From 86594973ff94a7cb2367589050e22373dca4af1d Mon Sep 17 00:00:00 2001 From: Livio Bieri Date: Tue, 7 Nov 2023 16:46:44 +0100 Subject: [PATCH 01/92] wip: adds a walking skeleton test for SSO Authorize callback --- server/vbv_lernwelt/sso/tests/__init__.py | 0 .../sso/tests/test_sso_authorize.py | 37 +++++++++++++++++++ server/vbv_lernwelt/sso/views.py | 4 ++ 3 files changed, 41 insertions(+) create mode 100644 server/vbv_lernwelt/sso/tests/__init__.py create mode 100644 server/vbv_lernwelt/sso/tests/test_sso_authorize.py diff --git a/server/vbv_lernwelt/sso/tests/__init__.py b/server/vbv_lernwelt/sso/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/sso/tests/test_sso_authorize.py b/server/vbv_lernwelt/sso/tests/test_sso_authorize.py new file mode 100644 index 00000000..19c9a275 --- /dev/null +++ b/server/vbv_lernwelt/sso/tests/test_sso_authorize.py @@ -0,0 +1,37 @@ +import uuid +from unittest.mock import patch + +from django.test import TestCase +from django.urls import reverse + +from vbv_lernwelt.core.models import User + + +class TestSSO(TestCase): + def test_walking_skeleton(self): + self.assertTrue(True) + + @patch("vbv_lernwelt.sso.views.oauth") + @patch("vbv_lernwelt.sso.views.decode_jwt") + def test_authorize_redirects_on_success(self, mock_decode_jwt, mock_oauth_service): + # GIVEN + email = "bobby@drop.table" + + mock_oauth_service.authorize_access_token.return_value = { + "id_token": "test_token" + } + + mock_decode_jwt.return_value = { + "emails": [email], + "oid": uuid.uuid4(), + "given_name": "Bobby", + "family_name": "Drop-Table", + } + + # WHEN + response = self.client.get(reverse("sso:authorize")) + + # THEN + self.assertTrue(User.objects.filter(email=email).exists()) + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, "/") diff --git a/server/vbv_lernwelt/sso/views.py b/server/vbv_lernwelt/sso/views.py index 957a1b8e..8915ae7f 100644 --- a/server/vbv_lernwelt/sso/views.py +++ b/server/vbv_lernwelt/sso/views.py @@ -22,6 +22,10 @@ def login(request): def authorize(request): + print("authorize") + print(oauth) + print(decode_jwt) + try: logger.debug(request, label="sso") token = getattr(oauth, settings.OAUTH["client_name"]).authorize_access_token( From 296ae32c9ac4c83f51e9cca342c5fdaa3a0d7757 Mon Sep 17 00:00:00 2001 From: Livio Bieri Date: Tue, 7 Nov 2023 16:50:55 +0100 Subject: [PATCH 02/92] wip: bootstrap payment app --- server/vbv_lernwelt/payment/__init__.py | 0 server/vbv_lernwelt/payment/admin.py | 3 +++ server/vbv_lernwelt/payment/apps.py | 6 ++++++ server/vbv_lernwelt/payment/migrations/__init__.py | 0 server/vbv_lernwelt/payment/models.py | 3 +++ server/vbv_lernwelt/payment/tests.py | 3 +++ server/vbv_lernwelt/payment/views.py | 3 +++ 7 files changed, 18 insertions(+) create mode 100644 server/vbv_lernwelt/payment/__init__.py create mode 100644 server/vbv_lernwelt/payment/admin.py create mode 100644 server/vbv_lernwelt/payment/apps.py create mode 100644 server/vbv_lernwelt/payment/migrations/__init__.py create mode 100644 server/vbv_lernwelt/payment/models.py create mode 100644 server/vbv_lernwelt/payment/tests.py create mode 100644 server/vbv_lernwelt/payment/views.py diff --git a/server/vbv_lernwelt/payment/__init__.py b/server/vbv_lernwelt/payment/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/payment/admin.py b/server/vbv_lernwelt/payment/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/server/vbv_lernwelt/payment/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/vbv_lernwelt/payment/apps.py b/server/vbv_lernwelt/payment/apps.py new file mode 100644 index 00000000..b4a45c3a --- /dev/null +++ b/server/vbv_lernwelt/payment/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PaymentConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'payment' diff --git a/server/vbv_lernwelt/payment/migrations/__init__.py b/server/vbv_lernwelt/payment/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/payment/models.py b/server/vbv_lernwelt/payment/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/server/vbv_lernwelt/payment/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/server/vbv_lernwelt/payment/tests.py b/server/vbv_lernwelt/payment/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/server/vbv_lernwelt/payment/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/vbv_lernwelt/payment/views.py b/server/vbv_lernwelt/payment/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/server/vbv_lernwelt/payment/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From 8e057458f281bfb8c6f075c87c4b4ccdaf07ba02 Mon Sep 17 00:00:00 2001 From: Livio Bieri Date: Tue, 7 Nov 2023 16:55:21 +0100 Subject: [PATCH 03/92] wip: adds datatrans proof of concept --- server/vbv_lernwelt/payment/README.md | 181 ++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 server/vbv_lernwelt/payment/README.md diff --git a/server/vbv_lernwelt/payment/README.md b/server/vbv_lernwelt/payment/README.md new file mode 100644 index 00000000..4c4d4202 --- /dev/null +++ b/server/vbv_lernwelt/payment/README.md @@ -0,0 +1,181 @@ +# Datatrans - Proof of Concept + +## Links + +- https://admin.sandbox.datatrans.com +- https://api-reference.datatrans.ch/#section/Idempotency +- https://docs.datatrans.ch/docs/redirect-lightbox#section-initializing-transactions + +## Code + +Simple example of the payment flow with Datatrans: + +```python + +from flask import Flask, request, render_template_string, jsonify, abort +import uuid +import hmac +import hashlib +import requests +import os + +app = Flask(__name__) + +if "HMAC_KEY" not in os.environ: + exit("Please set the HMAC_KEY environment variable.") + +if "BASIC_AUTH" not in os.environ: + exit("Please set the BASIC_AUTH environment variable.") + +# https://admin.sandbox.datatrans.com/MerchSecurAdmin.jsp +HMAC_KEY = os.environ["HMAC_KEY"] +BASIC_AUTH = os.environ["BASIC_AUTH"] +API_ENDPOINT = "https://api.sandbox.datatrans.com/v1/transactions" + +LIGHTBOX_PAGE = """ + + + + + + + + + +""" + +SUCCESS_PAGE = "

Payment Success

" +ERROR_PAGE = "

Payment Error

" +CANCEL_PAGE = "

Payment Cancelled

" + +# TODO: There is now way to test this locally, so we need to use ngrok (?) +BASE_URL = "https://89d3-2a02-21b4-9679-d800-ac5f-489-e9f6-694e.ngrok-free.app" + + +@app.route("/success", methods=["GET"]) +def success(): + return render_template_string(SUCCESS_PAGE) + + +@app.route("/error", methods=["GET"]) +def error(): + return render_template_string(ERROR_PAGE) + + +@app.route("/cancel", methods=["GET"]) +def cancel(): + return render_template_string(CANCEL_PAGE) + + +@app.route("/init_transaction", methods=["GET"]) +def init_transaction(): + # TODO + # for debugging, it might be handy to know the + # user who initiated the transaction + refno = uuid.uuid4().hex + + # TODO + # The language of user + language = "en" + + # Transaction payload + payload = { + "currency": "CHF", + "refno": refno, + "amount": 10_00, # 10 CHF + "autoSettle": True, + "language": language, + "redirect": { + "successUrl": f"{BASE_URL}/success", + "errorUrl": f"{BASE_URL}/error", + "cancelUrl": f"{BASE_URL}/cancel", + }, + "webhook": { + "url": f"{BASE_URL}/webhook", + }, + } + + # Headers + headers = { + "Authorization": f"Basic {BASIC_AUTH}", + "Content-Type": "application/json", + } + + # 1. USING LIGHTBOX + response = requests.post(API_ENDPOINT, json=payload, headers=headers) + + if response.ok: + transaction_id = response.json().get("transactionId") + return render_template_string(LIGHTBOX_PAGE, transaction_id=transaction_id) + else: + return ( + jsonify( + {"error": "Failed to initiate transaction", "details": response.text} + ), + response.status_code, + ) + + # 2. USING REDIRECT + # # Send POST request to Datatrans API + # response = requests.post(url, json=payload, headers=headers) + + # if response.ok: + # transaction_id = response.json().get('transactionId') + # payment_url = f'https://pay.sandbox.datatrans.com/v1/start/{transaction_id}' + # return redirect(payment_url) + # else: + # # Return error message + # return jsonify({"error": "Failed to initiate transaction", "details": response.text}), response.status_code + + +@app.route("/webhook", methods=["POST"]) +def webhook(): + """ + Checks the Datatrans-Signature header of the incoming request and validates the signature: + https://api-reference.datatrans.ch/#section/Webhook/Webhook-signing + """ + + hmac_key = HMAC_KEY + + def calculate_signature(key: str, timestamp: str, payload: str) -> str: + key_bytes = bytes.fromhex(key) + signing_data = f"{timestamp}{payload}".encode("utf-8") + hmac_obj = hmac.new(key_bytes, signing_data, hashlib.sha256) + return hmac_obj.hexdigest() + + # Header format: + # Datatrans-Signature: t={{timestamp}},s0={{signature}} + datatrans_signature = request.headers.get("Datatrans-Signature", "") + + try: + parts = datatrans_signature.split(",") + timestamp = parts[0].split("=")[1] + received_signature = parts[1].split("=")[1] + + calculated_signature = calculate_signature( + hmac_key, timestamp, request.data.decode("utf-8") + ) + + if calculated_signature == received_signature: + return "Signature validated.", 200 + else: + abort(400, "Invalid signature.") + except (IndexError, ValueError): + abort(400, "Invalid Datatrans-Signature header.") + + +if __name__ == "__main__": + app.run(debug=True, host="0.0.0.0", port=5500) + +``` From 193638f3ca5ed8eef6429dab651074a4808eb101 Mon Sep 17 00:00:00 2001 From: Livio Bieri Date: Wed, 8 Nov 2023 10:42:19 +0100 Subject: [PATCH 04/92] wip: update steps to reproduce for prod --- server/vbv_lernwelt/payment/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/vbv_lernwelt/payment/README.md b/server/vbv_lernwelt/payment/README.md index 4c4d4202..f7b59725 100644 --- a/server/vbv_lernwelt/payment/README.md +++ b/server/vbv_lernwelt/payment/README.md @@ -1,5 +1,10 @@ # Datatrans - Proof of Concept +## Setup manual steps + +- `HMAC_KEY`: https://admin.sandbox.datatrans.com/MerchSecurAdmin.jsp +- `BASIC_AUTH`: `echo -n "{merchantid}:{password}" | base64` (`merchantid`: `11xxxxxx`): https://admin.sandbox.datatrans.com/MenuDispatch.jsp?main=1&sub=4 + ## Links - https://admin.sandbox.datatrans.com From a39b1057803617fa8624db471369f48ef248e52c Mon Sep 17 00:00:00 2001 From: Reto Aebersold Date: Wed, 8 Nov 2023 12:04:40 +0100 Subject: [PATCH 05/92] feat: wizard POC --- client/src/App.vue | 7 +- client/src/pages/onboarding/OnboardUk.vue | 121 ++++++++++++++++++ client/src/pages/onboarding/README.md | 20 +++ client/src/router/index.ts | 9 ++ server/vbv_lernwelt/payment/apps.py | 4 +- .../vbv_lernwelt/static/icons/icon-globe.svg | 2 +- server/vbv_lernwelt/static/images/student.jpg | Bin 0 -> 107594 bytes 7 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 client/src/pages/onboarding/OnboardUk.vue create mode 100644 client/src/pages/onboarding/README.md create mode 100644 server/vbv_lernwelt/static/images/student.jpg diff --git a/client/src/App.vue b/client/src/App.vue index 1e6b0e63..5cbafefb 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -1,12 +1,12 @@ @@ -19,6 +19,9 @@ import { graphqlClient } from "@/graphql/client"; import eventBus from "@/utils/eventBus"; import { provideClient } from "@urql/vue"; import { onMounted, ref } from "vue"; +import { useRoute } from "vue-router"; + +const route = useRoute(); const componentKey = ref(1); diff --git a/client/src/pages/onboarding/OnboardUk.vue b/client/src/pages/onboarding/OnboardUk.vue new file mode 100644 index 00000000..e1847512 --- /dev/null +++ b/client/src/pages/onboarding/OnboardUk.vue @@ -0,0 +1,121 @@ + + + diff --git a/client/src/pages/onboarding/README.md b/client/src/pages/onboarding/README.md new file mode 100644 index 00000000..1138e281 --- /dev/null +++ b/client/src/pages/onboarding/README.md @@ -0,0 +1,20 @@ +# Onboarding flow + +## ÜK + +### Guard + +1. Call /me + +- User logged in -> redirect to / +- Anonymous user -> Set to /onboarding/uk/step1 + +## VV + +### Guard + +1. Call /shop/vv/state + - User logged in + - If already bought -> redirect to / + - If not bought -> redirect to /onboarding/vv/step1?state="success" + - Anonymous user -> Set to /onboarding/vv/step1 diff --git a/client/src/router/index.ts b/client/src/router/index.ts index a9bb8728..9e5dcb1c 100644 --- a/client/src/router/index.ts +++ b/client/src/router/index.ts @@ -229,6 +229,14 @@ const router = createRouter({ path: "/course/:courseSlug/appointments", component: () => import("@/pages/AppointmentsPage.vue"), }, + { + path: "/onboarding/uk", + component: () => import("@/pages/onboarding/OnboardUk.vue"), + meta: { + public: true, + hideChrome: true, + }, + }, { path: "/styleguide", component: () => import("../pages/StyleGuidePage.vue"), @@ -236,6 +244,7 @@ const router = createRouter({ public: true, }, }, + { path: "/:pathMatch(.*)*", component: () => import("../pages/404Page.vue"), diff --git a/server/vbv_lernwelt/payment/apps.py b/server/vbv_lernwelt/payment/apps.py index b4a45c3a..ab29d312 100644 --- a/server/vbv_lernwelt/payment/apps.py +++ b/server/vbv_lernwelt/payment/apps.py @@ -2,5 +2,5 @@ from django.apps import AppConfig class PaymentConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'payment' + default_auto_field = "django.db.models.BigAutoField" + name = "payment" diff --git a/server/vbv_lernwelt/static/icons/icon-globe.svg b/server/vbv_lernwelt/static/icons/icon-globe.svg index 0cdad129..f775822d 100644 --- a/server/vbv_lernwelt/static/icons/icon-globe.svg +++ b/server/vbv_lernwelt/static/icons/icon-globe.svg @@ -1,3 +1,3 @@ - + diff --git a/server/vbv_lernwelt/static/images/student.jpg b/server/vbv_lernwelt/static/images/student.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49033e39e92d0d934b3564af5c80fcf24a57c7f8 GIT binary patch literal 107594 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