From bd7c583c3eb3bb44d56c9de7cfafef97825265d2 Mon Sep 17 00:00:00 2001
From: poka <poka@p2p.legal>
Date: Wed, 20 Dec 2023 13:57:42 +0100
Subject: [PATCH] enh: improve signature errors

---
 lib/signature_verify.ts | 29 +++++++++++++++--------------
 lib/update_profile.ts   | 15 ++++++++-------
 2 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/lib/signature_verify.ts b/lib/signature_verify.ts
index 8bbbcdd..9b0c0af 100644
--- a/lib/signature_verify.ts
+++ b/lib/signature_verify.ts
@@ -1,26 +1,27 @@
 import { signatureVerify, base64Decode } from 'https://deno.land/x/polkadot@0.2.44/util-crypto/mod.ts';
 
-export async function verifySignature(address: string, signatureBase64: string, hash: string, playload: string): Promise<boolean> {
-    try {
-        const messageUint8Array = new TextEncoder().encode(hash);
-        const signature = base64Decode(signatureBase64);
-        const signedMessage = signatureVerify(messageUint8Array, signature, address)
+export enum SignatureResponse {
+    valid,
+    invalidHash,
+    invalidSignature
+}
 
+export async function verifySignature(address: string, signatureBase64: string, hash: string, playload: string): Promise<SignatureResponse> {
+    try {
         const hashVerify = await createHashedMessage(playload);
-
-        // console.log(playload)
-        // console.log(hash)
-        // console.log(hashVerify)
-
         if (hash != hashVerify) {
-            console.log('hash documents is invalid')
-            return false;
+            console.error('hash documents is invalid')
+            return SignatureResponse.invalidHash;
         }
 
-        return signedMessage.isValid;
+        const messageUint8Array = new TextEncoder().encode(hash);
+        const signature = base64Decode(signatureBase64);
+        const signedMessage = signatureVerify(messageUint8Array, signature, address)
+
+        return signedMessage.isValid ? SignatureResponse.valid : SignatureResponse.invalidSignature;
     } catch (error) {
         console.error('Signature verification failed:', error);
-        return false;
+        throw new Error(`Cannot verify signature`);
     }
 }
 
diff --git a/lib/update_profile.ts b/lib/update_profile.ts
index 5a9dac2..0f18472 100644
--- a/lib/update_profile.ts
+++ b/lib/update_profile.ts
@@ -1,6 +1,6 @@
 import { Context } from "https://deno.land/x/oak@v12.6.1/context.ts";
 import { Client } from "https://deno.land/x/postgres@v0.17.0/client.ts";
-import { verifySignature } from "./signature_verify.ts";
+import { SignatureResponse, verifySignature } from "./signature_verify.ts";
 import { convertBase64ToBytea } from "./utils.ts";
 
 export async function updateProfile(ctx: Context, client: Client) {
@@ -13,10 +13,11 @@ export async function updateProfile(ctx: Context, client: Client) {
 
       // Verify signature
       const playload = JSON.stringify({description, avatarBase64, geoloc, title, city, socials});
-      if (!await verifySignature(address, signature, hash, playload)) {
+      const signatureResult = await verifySignature(address, signature, hash, playload);
+      if (signatureResult != SignatureResponse.valid) {
         ctx.response.status = 401;
-        console.log('Invalid signature')
-        ctx.response.body = { success: false, message: 'Invalid signature' };
+        console.error('Invalid signature: ' + SignatureResponse[signatureResult])
+        ctx.response.body = { success: false, message: 'Invalid signature: '  + SignatureResponse[signatureResult]};
         return;
       }
       console.log('Signature is valid')
@@ -43,7 +44,7 @@ export async function updateProfile(ctx: Context, client: Client) {
             text: query,
             args: [address, description, avatarBytea, geoloc ? geoloc["latitude"] : null, geoloc ? geoloc["longitude"] : null, title, city, socialJson],
           });
-          console.log('User updated successfully');
+          console.log(`Profile ${address} has been updated`);
       } catch (error) {
           throw error;
       }
@@ -52,10 +53,10 @@ export async function updateProfile(ctx: Context, client: Client) {
       ctx.response.status = 200;
       ctx.response.body = {
             success: true,
-            message: "Profile has been updated"
+            message: `Profile ${address} has been updated`
       };
     } catch (error) {
-      console.error('Error updating user:', error);
+      console.error('Error updating profile:', error);
       ctx.response.status = 500;
       ctx.response.body = { success: false, message: 'Error updating user' };
     }
-- 
GitLab