mirror of
https://github.com/kind-0/nsecbunkerd.git
synced 2025-03-17 13:22:54 +01:00
create_account work
This commit is contained in:
parent
80a8651305
commit
0a5682d1e4
CONFIGURATION.mdpackage.json
prisma
src
templates
36
CONFIGURATION.md
Normal file
36
CONFIGURATION.md
Normal file
@ -0,0 +1,36 @@
|
||||
# Configuration
|
||||
|
||||
nsecbunker.json is a JSON that stores the configuration of the bunker.
|
||||
|
||||
## Properties
|
||||
|
||||
All properties are optional unless otherwise specified.
|
||||
|
||||
`admin.adminRelays`: Relays where the bunker will listen to for admin commands, including for the ability to create new users.
|
||||
|
||||
`admin.key`: Private key of the bunker. This is used only for communicating with bunker. It's automatically generated.
|
||||
|
||||
`admin.npubs`: Npubs that are allowed to administrate the bunker.
|
||||
|
||||
`database`: URI of the database.
|
||||
|
||||
`logs`: Path where the logs will be stored.
|
||||
|
||||
`verbose`: If true, the bunker will log all messages.
|
||||
|
||||
`version`: Version of the bunker. This is automatically generated.
|
||||
|
||||
`nostr.relays`: Relays where the bunker will listen to for NIP-46 requests.
|
||||
|
||||
### OAuth-like flow properties
|
||||
|
||||
`baseUrl`: URL where the bunker can be accessed for OAuth-like authentication. This should be a URL where the bunker can be widely reached.
|
||||
|
||||
`authPort`: The port where the bunker will listen for OAuth-like authentication. You should setup a reverse proxy from your main server to this port.
|
||||
|
||||
`domains`: Domains that are allowed to create new users from. When a `create_account` is issued the NIP-05 (nostr address) issued should use one of these domains.
|
||||
|
||||
`domains.$domain.nip05`: The file pointing to the domain's NIP-05 file.
|
||||
|
||||
`keys`: Keys are stored in this object. Encrypted keys are stored as `keys.$keyId.iv` + `keys.$keyId.data`. Unecrypted (recoverable) keys are stored as `keys.$keyId.key`.
|
||||
|
@ -38,7 +38,7 @@
|
||||
"@fastify/view": "^8.2.0",
|
||||
"@inquirer/password": "^1.1.2",
|
||||
"@inquirer/prompts": "^1.2.3",
|
||||
"@nostr-dev-kit/ndk": "^2.2.0",
|
||||
"@nostr-dev-kit/ndk": "^2.3.0",
|
||||
"@prisma/client": "^5.4.1",
|
||||
"@scure/base": "^1.1.1",
|
||||
"@types/yargs": "^17.0.24",
|
||||
|
@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "Request" ADD COLUMN "result" TEXT;
|
33
prisma/migrations/20231218135715_key/migration.sql
Normal file
33
prisma/migrations/20231218135715_key/migration.sql
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- You are about to drop the column `result` on the `Request` table. All the data in the column will be lost.
|
||||
|
||||
*/
|
||||
-- CreateTable
|
||||
CREATE TABLE "Key" (
|
||||
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"keyName" TEXT NOT NULL,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deletedAt" DATETIME,
|
||||
"pubkey" TEXT NOT NULL
|
||||
);
|
||||
|
||||
-- RedefineTables
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE "new_Request" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"keyName" TEXT,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"requestId" TEXT NOT NULL,
|
||||
"remotePubkey" TEXT NOT NULL,
|
||||
"method" TEXT NOT NULL,
|
||||
"params" TEXT,
|
||||
"allowed" BOOLEAN
|
||||
);
|
||||
INSERT INTO "new_Request" ("allowed", "createdAt", "id", "keyName", "method", "params", "remotePubkey", "requestId") SELECT "allowed", "createdAt", "id", "keyName", "method", "params", "remotePubkey", "requestId" FROM "Request";
|
||||
DROP TABLE "Request";
|
||||
ALTER TABLE "new_Request" RENAME TO "Request";
|
||||
PRAGMA foreign_key_check;
|
||||
PRAGMA foreign_keys=ON;
|
8
prisma/migrations/20231218140114_/migration.sql
Normal file
8
prisma/migrations/20231218140114_/migration.sql
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- A unique constraint covering the columns `[keyName]` on the table `Key` will be added. If there are existing duplicate values, this will fail.
|
||||
|
||||
*/
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Key_keyName_key" ON "Key"("keyName");
|
@ -34,6 +34,15 @@ model KeyUser {
|
||||
@@unique([keyName, userPubkey], name: "unique_key_user")
|
||||
}
|
||||
|
||||
model Key {
|
||||
id Int @id @default(autoincrement())
|
||||
keyName String @unique
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @default(now()) @updatedAt
|
||||
deletedAt DateTime?
|
||||
pubkey String
|
||||
}
|
||||
|
||||
model SigningCondition {
|
||||
id Int @id @default(autoincrement())
|
||||
method String?
|
||||
|
@ -14,14 +14,14 @@ if (!command) {
|
||||
console.log(`\t<command>: command to run (ping, sign)`);
|
||||
console.log(`\t<remote-npub>: npub that should be published as`);
|
||||
console.log(`\t<content>: event JSON to sign (no need for pubkey or id fields) | or kind:1 content string to sign`);
|
||||
console.log('\t--dont-publish: do not publish the event to the relay');
|
||||
console.log('\t--debug: enable debug mode');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
async function createNDK(): Promise<NDK> {
|
||||
const ndk = new NDK({
|
||||
explicitRelayUrls: ['wss://relay.nsecbunker.com', 'wss://relay.damus.io', 'wss://nos.lol'],
|
||||
explicitRelayUrls: ['wss://relay.nsecbunker.com'],
|
||||
enableOutboxModel: false
|
||||
});
|
||||
if (debug) {
|
||||
ndk.pool.on('connect', () => console.log('✅ connected'));
|
||||
@ -114,18 +114,11 @@ function loadPrivateKey(): string | undefined {
|
||||
try {
|
||||
await event.sign();
|
||||
if (debug) {
|
||||
console.log({
|
||||
event: event.rawEvent(),
|
||||
signature: event.sig,
|
||||
});
|
||||
console.log(event.rawEvent());
|
||||
} else {
|
||||
console.log(event.sig);
|
||||
}
|
||||
|
||||
if (!dontPublish) {
|
||||
await event.publish();
|
||||
}
|
||||
|
||||
process.exit(0);
|
||||
} catch(e) {
|
||||
console.log('sign error', e);
|
||||
|
@ -76,7 +76,6 @@ async function startKey(key: string, keyData: KeyData, verbose: boolean): Promis
|
||||
|
||||
if (verbose) {
|
||||
console.log(`Starting ${key}...`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
rl.close();
|
||||
|
@ -28,8 +28,7 @@ const defaultConfig: IConfig = {
|
||||
nostr: {
|
||||
relays: [
|
||||
'wss://relay.damus.io',
|
||||
"wss://relay.nsecbunker.com",
|
||||
"wss://nos.lol"
|
||||
"wss://relay.nsecbunker.com"
|
||||
]
|
||||
},
|
||||
authPort: 3000,
|
||||
|
@ -6,12 +6,9 @@ import { IConfig, getCurrentConfig, saveCurrentConfig } from "../../../config";
|
||||
import { readFileSync, writeFileSync } from "fs";
|
||||
import { allowAllRequestsFromKey } from "../../lib/acl";
|
||||
import { requestAuthorization } from "../../authorize";
|
||||
import prisma from "../../../db";
|
||||
|
||||
export async function validate(currentConfig, email: string, username: string, domain: string) {
|
||||
if (!email) {
|
||||
throw new Error('email is required');
|
||||
}
|
||||
|
||||
if (!username) {
|
||||
throw new Error('username is required');
|
||||
}
|
||||
@ -41,6 +38,9 @@ async function getCurrentNip05File(currentConfig: any, domain: string) {
|
||||
async function addNip05(currentConfig: IConfig, username: string, domain: string, pubkey: Hexpubkey) {
|
||||
const currentNip05s = await getCurrentNip05File(currentConfig, domain);
|
||||
currentNip05s.names[username] = pubkey;
|
||||
currentNip05s.relays ??= {};
|
||||
currentNip05s.nip46Relays ??= {};
|
||||
currentNip05s.nip46Relays[username] = currentConfig.nostr.relays;
|
||||
|
||||
// save file
|
||||
const nip05File = currentConfig.domains![domain].nip05;
|
||||
@ -97,6 +97,8 @@ export async function createAccountReal(admin: AdminInterface, req: NDKRpcReques
|
||||
|
||||
await admin.loadNsec!(keyName, nsec);
|
||||
|
||||
await prisma.key.create({ data: { keyName, pubkey: generatedUser.pubkey } });
|
||||
|
||||
// Immediately grant access to the creator key
|
||||
await grantPermissions(req, keyName);
|
||||
|
||||
|
@ -45,7 +45,7 @@ class AdminInterface {
|
||||
|
||||
constructor(opts: IAdminOpts, configFile: string) {
|
||||
this.configFile = configFile;
|
||||
this.npubs = opts.npubs;
|
||||
this.npubs = opts.npubs||[];
|
||||
this.ndk = new NDK({
|
||||
explicitRelayUrls: opts.adminRelays,
|
||||
signer: new NDKPrivateKeySigner(opts.key),
|
||||
@ -83,7 +83,7 @@ class AdminInterface {
|
||||
});
|
||||
await blastrNdk.connect(2500);
|
||||
|
||||
for (const npub of this.npubs) {
|
||||
for (const npub of this.npubs||[]) {
|
||||
dmUser(blastrNdk, npub, `nsecBunker has started; use ${connectionString} to connect to it and unlock your key(s)`);
|
||||
}
|
||||
}
|
||||
|
@ -54,10 +54,9 @@ async function createRecord(
|
||||
let params: string | undefined;
|
||||
|
||||
if (param?.rawEvent) {
|
||||
console.log("Treating as NDKEvent", typeof param);
|
||||
params = JSON.stringify(param.rawEvent());
|
||||
const e = param as NDKEvent;
|
||||
params = JSON.stringify(e.rawEvent());
|
||||
} else if (param) {
|
||||
console.log("Treating as string", typeof param);
|
||||
params = param.toString();
|
||||
}
|
||||
|
||||
@ -100,20 +99,16 @@ export function urlAuthFlow(
|
||||
where: { id: request.id }
|
||||
});
|
||||
|
||||
console.log('record', record);
|
||||
|
||||
if (!record) {
|
||||
clearInterval(checkingInterval);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`request ${request.id} = ${request.allowed}`);
|
||||
|
||||
if (record.allowed !== undefined && record.allowed !== null) {
|
||||
clearInterval(checkingInterval);
|
||||
resolve(!!record.allowed);
|
||||
}
|
||||
}, 1000);
|
||||
}, 100);
|
||||
}
|
||||
|
||||
function generatePendingAuthUrl(baseUrl: string, request: Request): string {
|
||||
|
@ -3,7 +3,7 @@ import prisma from '../../db.js';
|
||||
import type {FastifyInstance} from "fastify";
|
||||
|
||||
export class Backend extends NDKNip46Backend {
|
||||
public baseUrl: string;
|
||||
public baseUrl?: string;
|
||||
public fastify: FastifyInstance;
|
||||
|
||||
constructor(
|
||||
|
@ -2,12 +2,13 @@ import { NDKNip46Backend } from "@nostr-dev-kit/ndk";
|
||||
import { IEventHandlingStrategy } from '@nostr-dev-kit/ndk';
|
||||
|
||||
export default class PublishEventHandlingStrategy implements IEventHandlingStrategy {
|
||||
async handle(backend: NDKNip46Backend, remotePubkey: string, params: string[]): Promise<string|undefined> {
|
||||
async handle(backend: NDKNip46Backend, id: string, remotePubkey: string, params: string[]): Promise<string|undefined> {
|
||||
const event = await backend.signEvent(remotePubkey, params);
|
||||
if (!event) return undefined;
|
||||
|
||||
backend.ndk.publish(event);
|
||||
console.log('Publishing event', event);
|
||||
await event.publish();
|
||||
|
||||
return JSON.stringify(await event.toNostrEvent());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -49,8 +49,6 @@ export async function setupSkeletonProfile(key: NDKPrivateKeySigner, profile?: N
|
||||
} as NostrEvent);
|
||||
await event.sign(key);
|
||||
|
||||
console.log(`trying to publish profile`, event.rawEvent());
|
||||
|
||||
const t = await event.publish();
|
||||
console.log(t);
|
||||
|
||||
@ -62,6 +60,7 @@ export async function setupSkeletonProfile(key: NDKPrivateKeySigner, profile?: N
|
||||
pubkey: user.pubkey,
|
||||
} as NostrEvent);
|
||||
await event.sign(key);
|
||||
console.log(`trying to publish profile`, event.rawEvent());
|
||||
await event.publish();
|
||||
|
||||
const relays = new NDKEvent(ndk, {
|
||||
|
@ -248,7 +248,7 @@ class Daemon {
|
||||
this.fastify.post('/register/:id', processRegistrationWebHandler);
|
||||
|
||||
setTimeout(async () => {
|
||||
console.log('🔑 Starting keys', this.config.keys);
|
||||
console.log('🔑 Starting keys', Object.keys(this.config.keys));
|
||||
for (const [name, nsec] of Object.entries(this.config.keys)) {
|
||||
await this.startKey(name, nsec);
|
||||
}
|
||||
|
@ -8,6 +8,9 @@ export async function authorizeRequestWebHandler(request, reply) {
|
||||
});
|
||||
const reqCookies = request.cookies;
|
||||
|
||||
const url = new URL(request.url, `http://${request.headers.host}`);
|
||||
const callbackUrl = url.searchParams.get("callbackUrl");
|
||||
|
||||
const method = record.method;
|
||||
let email: string | undefined;
|
||||
let username: string | undefined;
|
||||
@ -22,15 +25,14 @@ export async function authorizeRequestWebHandler(request, reply) {
|
||||
domain = payload.domain;
|
||||
nip05 = `${username}@${domain}`;
|
||||
|
||||
return reply.view("/templates/createAccount.handlebar", { record, email, username, domain, nip05 });
|
||||
return reply.view("/templates/createAccount.handlebar", { record, email, username, domain, nip05, callbackUrl });
|
||||
} else {
|
||||
return reply.view("/templates/authorizeRequest.handlebar", { record, email, username, domain, nip05 });
|
||||
return reply.view("/templates/authorizeRequest.handlebar", { record, email, username, domain, nip05, callbackUrl });
|
||||
}
|
||||
// return record;
|
||||
}
|
||||
|
||||
export async function processRequestWebHandler(request, reply) {
|
||||
console.log(request);
|
||||
const record = await prisma.request.findUnique({
|
||||
where: { id: request.params.id }
|
||||
});
|
||||
@ -74,7 +76,7 @@ export async function processRegistrationWebHandler(request, reply) {
|
||||
});
|
||||
|
||||
if (!record || record.allowed) {
|
||||
return;
|
||||
return { ok: false, error: "Request not found or already processed" };
|
||||
}
|
||||
|
||||
await prisma.request.update({
|
||||
@ -82,9 +84,38 @@ export async function processRegistrationWebHandler(request, reply) {
|
||||
data: { allowed: true }
|
||||
});
|
||||
|
||||
const body = request.body;
|
||||
let createdPubkey: string | undefined;
|
||||
|
||||
console.log({body});
|
||||
// here I need to wait for the account
|
||||
createdPubkey = await new Promise((resolve) => {
|
||||
const interval = setInterval(async () => {
|
||||
const keyName = record.keyName;
|
||||
const keyRecord = await prisma.key.findUnique({ where: { keyName } });
|
||||
|
||||
if (keyRecord) {
|
||||
console.log(keyRecord);
|
||||
clearInterval(interval);
|
||||
resolve(keyRecord.pubkey);
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
|
||||
const body = request.body;
|
||||
const callbackUrlString = body.callbackUrl;
|
||||
let callbackUrl: string | undefined;
|
||||
|
||||
if (callbackUrlString) {
|
||||
const u = new URL(callbackUrlString);
|
||||
|
||||
if (createdPubkey) {
|
||||
u.searchParams.append("pubkey", createdPubkey);
|
||||
callbackUrl = u.toString();
|
||||
}
|
||||
}
|
||||
|
||||
// const url = new URL(callbackUrl);
|
||||
|
||||
// add to url a query param with the user's pubkey
|
||||
|
||||
await allowAllRequestsFromKey(
|
||||
record.remotePubkey,
|
||||
@ -94,5 +125,12 @@ export async function processRegistrationWebHandler(request, reply) {
|
||||
undefined,
|
||||
);
|
||||
|
||||
return { ok: true };
|
||||
// redirect to login page
|
||||
if (callbackUrl) {
|
||||
return reply
|
||||
.view("/templates/redirect.handlebar", { callbackUrl })
|
||||
.redirect(callbackUrl);
|
||||
}
|
||||
|
||||
return reply.view("/templates/redirect.handlebar", { callbackUrl });
|
||||
}
|
@ -14,7 +14,7 @@ export async function dmUser(ndk: NDK, recipient: NDKUser | string, content: str
|
||||
await event.encrypt(targetUser);
|
||||
await event.sign();
|
||||
try {
|
||||
event.publish();
|
||||
await event.publish();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
@ -1,72 +0,0 @@
|
||||
import readline from 'readline';
|
||||
|
||||
export interface IAskYNquestionOpts {
|
||||
timeoutLength?: number;
|
||||
yes: any;
|
||||
no: any;
|
||||
always?: any;
|
||||
never?: any;
|
||||
response?: any;
|
||||
timeout?: any;
|
||||
}
|
||||
|
||||
export async function askYNquestion(
|
||||
question: string,
|
||||
opts: IAskYNquestionOpts
|
||||
) {
|
||||
const rl = readline.createInterface({
|
||||
input: process.stdin,
|
||||
output: process.stdout
|
||||
});
|
||||
let timeout: NodeJS.Timeout | undefined;
|
||||
|
||||
if (opts.timeoutLength) {
|
||||
timeout = setTimeout(() => {
|
||||
rl.close();
|
||||
opts.timeout && opts.timeout();
|
||||
}, opts.timeoutLength);
|
||||
}
|
||||
|
||||
const prompts = ['y', 'n'];
|
||||
|
||||
if (opts.always) prompts.push('always');
|
||||
if (opts.never) prompts.push('never');
|
||||
|
||||
question += ` (${prompts.join('/')}) `;
|
||||
|
||||
rl.question(question, (answer) => {
|
||||
timeout && clearTimeout(timeout);
|
||||
|
||||
switch (answer) {
|
||||
case 'y':
|
||||
case 'Y':
|
||||
opts.yes();
|
||||
opts.response && opts.response(answer);
|
||||
break;
|
||||
case 'n':
|
||||
case 'N':
|
||||
opts.no();
|
||||
opts.response && opts.response(answer);
|
||||
break;
|
||||
case 'always':
|
||||
case 'a':
|
||||
opts.yes();
|
||||
opts.always();
|
||||
opts.response && opts.response(answer);
|
||||
break;
|
||||
case 'never':
|
||||
opts.no();
|
||||
opts.never();
|
||||
opts.response && opts.response(answer);
|
||||
break;
|
||||
default:
|
||||
console.log('Invalid answer');
|
||||
askYNquestion(question, opts);
|
||||
break;
|
||||
}
|
||||
|
||||
rl.close();
|
||||
});
|
||||
|
||||
return rl;
|
||||
}
|
@ -56,14 +56,6 @@
|
||||
</head>
|
||||
<body class="flex flex-col items-center justify-center min-h-screen min-w-screen px-10">
|
||||
<div class="flex justify-center mb-6">
|
||||
<svg width="82" height="24" viewBox="0 0 82 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M77.5636 23.9999C76.6117 23.9999 75.8794 23.7803 75.3668 23.3409C74.8725 22.9015 74.6254 22.4073 74.6254 21.8581C74.6254 21.3821 74.7993 20.9702 75.1471 20.6224C75.495 20.2746 76.0076 20.1006 76.6849 20.1006C76.9229 20.1006 77.1975 20.1281 77.5087 20.183C77.8382 20.2196 78.0853 20.2471 78.2501 20.2654C78.2318 19.7894 78.122 19.3409 77.9206 18.9199C77.7375 18.4988 77.4995 18.0961 77.2066 17.7116C76.9137 17.3089 76.6391 16.9611 76.3828 16.6682C75.8153 17.7482 75.2478 18.6453 74.6803 19.3592C74.1311 20.0732 73.527 20.7505 72.868 21.3913C72.5385 21.7208 72.1906 21.8855 71.8245 21.8855C71.5316 21.8855 71.2936 21.7848 71.1105 21.5835C70.9275 21.3638 70.8359 21.0983 70.8359 20.7871C70.8359 20.421 70.9641 20.0823 71.2204 19.7711L71.5774 19.3318C72.5842 18.0869 73.3439 17.0617 73.8565 16.2563C74.186 15.7254 74.5156 15.0938 74.8451 14.3615C75.1929 13.6293 75.6414 12.6315 76.1906 11.3684C76.5384 10.5629 77.2616 10.1602 78.36 10.1602C78.8725 10.1602 79.2295 10.2059 79.4309 10.2975C79.6323 10.389 79.7329 10.5354 79.7329 10.7368C79.7329 10.8467 79.6963 11.0206 79.6231 11.2586C79.5499 11.4965 79.4492 11.7345 79.321 11.9725C78.9915 12.6315 78.8268 13.1899 78.8268 13.6476C78.8268 13.9222 78.9183 14.2242 79.1014 14.5537C79.3027 14.8833 79.6048 15.2952 80.0075 15.7894C80.5934 16.5583 81.0327 17.2173 81.3256 17.7665C81.6368 18.2974 81.7924 18.8833 81.7924 19.524C81.7924 20.2929 81.6094 21.0251 81.2432 21.7208C80.8954 22.3981 80.4011 22.9473 79.7604 23.3684C79.1197 23.7894 78.3874 23.9999 77.5636 23.9999Z" fill="black"/>
|
||||
<path d="M60.7829 23.396C60.0873 23.396 59.593 23.0299 59.3001 22.2976C59.0255 21.5654 58.8882 20.3937 58.8882 18.7828C58.8882 16.4029 59.2269 14.142 59.9042 12.0002C60.069 11.4693 60.3344 11.0848 60.7005 10.8468C61.085 10.5905 61.6159 10.4624 62.2932 10.4624C62.6593 10.4624 62.9156 10.5082 63.0621 10.5997C63.2085 10.6912 63.2818 10.8651 63.2818 11.1214C63.2818 11.4143 63.1445 12.0734 62.8699 13.0986C62.6868 13.8308 62.5403 14.4715 62.4305 15.0207C62.3207 15.5699 62.2291 16.2473 62.1559 17.0528C62.76 15.4784 63.4374 14.1969 64.1879 13.2084C64.9385 12.2198 65.6708 11.515 66.3847 11.094C67.117 10.6729 67.7852 10.4624 68.3893 10.4624C69.5792 10.4624 70.1742 11.0574 70.1742 12.2473C70.1742 12.9613 69.9728 14.2519 69.5701 16.1191C69.2223 17.7118 69.0483 18.7644 69.0483 19.277C69.0483 20.0093 69.3138 20.3754 69.8447 20.3754C70.2108 20.3754 70.641 20.1557 71.1353 19.7164C71.6479 19.2587 72.3252 18.5265 73.1673 17.5196C73.387 17.2633 73.6341 17.1352 73.9087 17.1352C74.1467 17.1352 74.3298 17.245 74.4579 17.4647C74.6044 17.6844 74.6776 17.9864 74.6776 18.3709C74.6776 19.1031 74.5037 19.6706 74.1559 20.0734C73.3687 21.0436 72.5174 21.84 71.6021 22.4624C70.7051 23.0848 69.6799 23.396 68.5266 23.396C67.593 23.396 66.8882 23.1306 66.4122 22.5997C65.9362 22.0505 65.6982 21.2633 65.6982 20.2381C65.6982 19.7255 65.8264 18.8102 66.0827 17.4921C66.3207 16.3388 66.4397 15.5425 66.4397 15.1031C66.4397 14.8102 66.339 14.6638 66.1376 14.6638C65.8996 14.6638 65.5609 14.975 65.1216 15.5974C64.7005 16.2015 64.2612 17.007 63.8035 18.0139C63.3641 19.0207 63.0072 20.0825 62.7326 21.1992C62.5312 22.0596 62.2932 22.6454 62.0186 22.9567C61.7623 23.2496 61.3504 23.396 60.7829 23.396Z" fill="black"/>
|
||||
<path d="M49.3117 23.3958C48.1767 23.3958 47.2705 22.9839 46.5932 22.1601C45.9158 21.3363 45.5771 20.2562 45.5771 18.9198C45.5771 17.4553 45.9158 16.0731 46.5932 14.7733C47.2705 13.4553 48.1675 12.4026 49.2842 11.6155C50.4192 10.81 51.6183 10.4072 52.8815 10.4072C53.2842 10.4072 53.5497 10.4896 53.6778 10.6544C53.8243 10.8008 53.9433 11.0754 54.0348 11.4782C54.4192 11.4049 54.822 11.3683 55.243 11.3683C56.1401 11.3683 56.5886 11.6887 56.5886 12.3294C56.5886 12.7139 56.4513 13.6292 56.1767 15.0754C55.7556 17.1807 55.5451 18.6452 55.5451 19.469C55.5451 19.7436 55.6092 19.9633 55.7373 20.128C55.8838 20.2928 56.0668 20.3752 56.2865 20.3752C56.6343 20.3752 57.0554 20.1555 57.5497 19.7161C58.0439 19.2585 58.7121 18.5262 59.5542 17.5193C59.7739 17.263 60.0211 17.1349 60.2957 17.1349C60.5336 17.1349 60.7167 17.2447 60.8449 17.4644C60.9913 17.6841 61.0645 17.9862 61.0645 18.3706C61.0645 19.1029 60.8906 19.6704 60.5428 20.0731C59.7922 21.0067 58.9959 21.7939 58.1538 22.4347C57.3117 23.0754 56.497 23.3958 55.7098 23.3958C55.1057 23.3958 54.5474 23.1944 54.0348 22.7916C53.5405 22.3706 53.1652 21.8031 52.9089 21.0891C51.957 22.6269 50.7579 23.3958 49.3117 23.3958ZM50.3003 20.6223C50.703 20.6223 51.0874 20.3843 51.4536 19.9083C51.8197 19.4324 52.0851 18.8008 52.2499 18.0136L53.2659 12.961C52.497 12.9793 51.7831 13.2722 51.124 13.8397C50.4833 14.3889 49.9707 15.1212 49.5863 16.0365C49.2019 16.9518 49.0096 17.9221 49.0096 18.9473C49.0096 19.5148 49.1195 19.9358 49.3392 20.2104C49.5771 20.485 49.8975 20.6223 50.3003 20.6223Z" fill="black"/>
|
||||
<path d="M36.4133 23.3958C35.2782 23.3958 34.3721 22.9839 33.6947 22.1601C33.0174 21.3363 32.6787 20.2562 32.6787 18.9198C32.6787 17.4553 33.0174 16.0731 33.6947 14.7733C34.3721 13.4553 35.2691 12.4026 36.3858 11.6155C37.5208 10.81 38.7199 10.4072 39.983 10.4072C40.3858 10.4072 40.6512 10.4896 40.7794 10.6544C40.9258 10.8008 41.0448 11.0754 41.1364 11.4782C41.5208 11.4049 41.9235 11.3683 42.3446 11.3683C43.2416 11.3683 43.6901 11.6887 43.6901 12.3294C43.6901 12.7139 43.5528 13.6292 43.2782 15.0754C42.8572 17.1807 42.6467 18.6452 42.6467 19.469C42.6467 19.7436 42.7107 19.9633 42.8389 20.128C42.9853 20.2928 43.1684 20.3752 43.3881 20.3752C43.7359 20.3752 44.1569 20.1555 44.6512 19.7161C45.1455 19.2585 45.8137 18.5262 46.6558 17.5193C46.8755 17.263 47.1226 17.1349 47.3972 17.1349C47.6352 17.1349 47.8183 17.2447 47.9464 17.4644C48.0929 17.6841 48.1661 17.9862 48.1661 18.3706C48.1661 19.1029 47.9922 19.6704 47.6444 20.0731C46.8938 21.0067 46.0974 21.7939 45.2553 22.4347C44.4132 23.0754 43.5986 23.3958 42.8114 23.3958C42.2073 23.3958 41.6489 23.1944 41.1364 22.7916C40.6421 22.3706 40.2668 21.8031 40.0105 21.0891C39.0586 22.6269 37.8595 23.3958 36.4133 23.3958ZM37.4018 20.6223C37.8046 20.6223 38.189 20.3843 38.5551 19.9083C38.9213 19.4324 39.1867 18.8008 39.3515 18.0136L40.3675 12.961C39.5986 12.9793 38.8846 13.2722 38.2256 13.8397C37.5849 14.3889 37.0723 15.1212 36.6879 16.0365C36.3034 16.9518 36.1112 17.9221 36.1112 18.9473C36.1112 19.5148 36.221 19.9358 36.4407 20.2104C36.6787 20.485 36.9991 20.6223 37.4018 20.6223Z" fill="black"/>
|
||||
<path d="M23.5148 23.3958C22.3798 23.3958 21.4736 22.9839 20.7963 22.1601C20.1189 21.3363 19.7803 20.2562 19.7803 18.9198C19.7803 17.4553 20.1189 16.0731 20.7963 14.7733C21.4736 13.4553 22.3707 12.4026 23.4874 11.6155C24.6224 10.81 25.8214 10.4072 27.0846 10.4072C27.4873 10.4072 27.7528 10.4896 27.8809 10.6544C28.0274 10.8008 28.1464 11.0754 28.2379 11.4782C28.6224 11.4049 29.0251 11.3683 29.4462 11.3683C30.3432 11.3683 30.7917 11.6887 30.7917 12.3294C30.7917 12.7139 30.6544 13.6292 30.3798 15.0754C29.9587 17.1807 29.7482 18.6452 29.7482 19.469C29.7482 19.7436 29.8123 19.9633 29.9404 20.128C30.0869 20.2928 30.27 20.3752 30.4896 20.3752C30.8375 20.3752 31.2585 20.1555 31.7528 19.7161C32.2471 19.2585 32.9153 18.5262 33.7574 17.5193C33.977 17.263 34.2242 17.1349 34.4988 17.1349C34.7368 17.1349 34.9198 17.2447 35.048 17.4644C35.1944 17.6841 35.2677 17.9862 35.2677 18.3706C35.2677 19.1029 35.0937 19.6704 34.7459 20.0731C33.9953 21.0067 33.199 21.7939 32.3569 22.4347C31.5148 23.0754 30.7002 23.3958 29.913 23.3958C29.3089 23.3958 28.7505 23.1944 28.2379 22.7916C27.7436 22.3706 27.3684 21.8031 27.1121 21.0891C26.1601 22.6269 24.961 23.3958 23.5148 23.3958ZM24.5034 20.6223C24.9061 20.6223 25.2906 20.3843 25.6567 19.9083C26.0228 19.4324 26.2883 18.8008 26.453 18.0136L27.469 12.961C26.7002 12.9793 25.9862 13.2722 25.3272 13.8397C24.6864 14.3889 24.1739 15.1212 23.7894 16.0365C23.405 16.9518 23.2128 17.9221 23.2128 18.9473C23.2128 19.5148 23.3226 19.9358 23.5423 20.2104C23.7803 20.485 24.1006 20.6223 24.5034 20.6223Z" fill="black"/>
|
||||
<path d="M24.5924 0.494279C25.105 0.567505 25.4528 0.723112 25.6359 0.961098C25.8372 1.19908 25.9379 1.5103 25.9379 1.89473C25.9379 3.15789 25.2606 3.7437 23.9059 3.65217L22.9448 3.56979C21.8647 3.47825 20.7846 3.40503 19.7045 3.35011C18.6428 3.29519 17.526 3.26773 16.3544 3.26773H15.1187C14.8991 5.9771 14.6702 8.4485 14.4322 10.6819L19.1553 10.5995C19.8327 10.5995 20.2812 10.7185 20.5009 10.9565C20.7389 11.1945 20.8579 11.5149 20.8579 11.9176C20.8579 12.54 20.6748 13.0343 20.3087 13.4004C19.9425 13.7483 19.4208 13.9222 18.7434 13.9222H14.0478L13.883 15.1029C13.4986 18.1235 12.6748 20.2746 11.4116 21.556C10.1668 22.8375 8.44598 23.4782 6.24919 23.4782C5.00434 23.4782 3.86017 23.2128 2.8167 22.6819C1.77322 22.1327 1.00434 21.4736 0.510067 20.7048C0.308694 20.3936 0.208008 20.0183 0.208008 19.5789C0.208008 19.1396 0.308694 18.7551 0.510067 18.4256C0.729746 18.0961 0.995192 17.9313 1.3064 17.9313C1.52608 17.9313 1.73661 18.0045 1.93798 18.151C2.15766 18.2974 2.43226 18.5812 2.76178 19.0023C3.64049 20.1556 4.72974 20.7322 6.02951 20.7322C7.07298 20.7322 7.94255 20.3112 8.6382 19.4691C9.35215 18.6087 9.80982 17.2631 10.0112 15.4325L10.1759 13.9222H8.85787C8.43682 13.9222 8.07069 13.8032 7.75948 13.5652C7.46657 13.3272 7.32012 12.9885 7.32012 12.5492C7.32012 11.9817 7.46657 11.5515 7.75948 11.2586C8.05239 10.9473 8.48259 10.7917 9.05009 10.7917C9.56268 10.7917 10.0661 10.7826 10.5604 10.7643C10.7801 8.75056 11.0181 6.30662 11.2743 3.43249C9.29723 3.61555 7.90593 3.93592 7.10044 4.39359C6.29495 4.85125 5.89221 5.52859 5.89221 6.42562C5.89221 7.04804 6.07527 7.64301 6.4414 8.21051C6.55124 8.37527 6.60616 8.54003 6.60616 8.70479C6.60616 9.03431 6.4231 9.32721 6.05697 9.58351C5.69083 9.82149 5.27894 9.94048 4.82127 9.94048C4.32699 9.94048 3.90594 9.79403 3.55812 9.50113C3.33844 9.31806 3.12791 8.94277 2.92654 8.37527C2.72517 7.80777 2.62448 7.17619 2.62448 6.48054C2.62448 4.21052 3.78695 2.56293 6.11189 1.53776C8.45513 0.512586 11.8693 0 16.3544 0C19.4665 0 22.2125 0.16476 24.5924 0.494279Z" fill="black"/>
|
||||
</svg>
|
||||
</div>
|
||||
<h1 class="text-center text-2xl font-semibold">Do you want to allow this client to use account
|
||||
<br/>
|
||||
|
@ -29,42 +29,42 @@
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body class="p-2">
|
||||
<div class="flex justify-center mb-6">
|
||||
<svg width="82" height="24" viewBox="0 0 82 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M77.5636 23.9999C76.6117 23.9999 75.8794 23.7803 75.3668 23.3409C74.8725 22.9015 74.6254 22.4073 74.6254 21.8581C74.6254 21.3821 74.7993 20.9702 75.1471 20.6224C75.495 20.2746 76.0076 20.1006 76.6849 20.1006C76.9229 20.1006 77.1975 20.1281 77.5087 20.183C77.8382 20.2196 78.0853 20.2471 78.2501 20.2654C78.2318 19.7894 78.122 19.3409 77.9206 18.9199C77.7375 18.4988 77.4995 18.0961 77.2066 17.7116C76.9137 17.3089 76.6391 16.9611 76.3828 16.6682C75.8153 17.7482 75.2478 18.6453 74.6803 19.3592C74.1311 20.0732 73.527 20.7505 72.868 21.3913C72.5385 21.7208 72.1906 21.8855 71.8245 21.8855C71.5316 21.8855 71.2936 21.7848 71.1105 21.5835C70.9275 21.3638 70.8359 21.0983 70.8359 20.7871C70.8359 20.421 70.9641 20.0823 71.2204 19.7711L71.5774 19.3318C72.5842 18.0869 73.3439 17.0617 73.8565 16.2563C74.186 15.7254 74.5156 15.0938 74.8451 14.3615C75.1929 13.6293 75.6414 12.6315 76.1906 11.3684C76.5384 10.5629 77.2616 10.1602 78.36 10.1602C78.8725 10.1602 79.2295 10.2059 79.4309 10.2975C79.6323 10.389 79.7329 10.5354 79.7329 10.7368C79.7329 10.8467 79.6963 11.0206 79.6231 11.2586C79.5499 11.4965 79.4492 11.7345 79.321 11.9725C78.9915 12.6315 78.8268 13.1899 78.8268 13.6476C78.8268 13.9222 78.9183 14.2242 79.1014 14.5537C79.3027 14.8833 79.6048 15.2952 80.0075 15.7894C80.5934 16.5583 81.0327 17.2173 81.3256 17.7665C81.6368 18.2974 81.7924 18.8833 81.7924 19.524C81.7924 20.2929 81.6094 21.0251 81.2432 21.7208C80.8954 22.3981 80.4011 22.9473 79.7604 23.3684C79.1197 23.7894 78.3874 23.9999 77.5636 23.9999Z" fill="black"/>
|
||||
<path d="M60.7829 23.396C60.0873 23.396 59.593 23.0299 59.3001 22.2976C59.0255 21.5654 58.8882 20.3937 58.8882 18.7828C58.8882 16.4029 59.2269 14.142 59.9042 12.0002C60.069 11.4693 60.3344 11.0848 60.7005 10.8468C61.085 10.5905 61.6159 10.4624 62.2932 10.4624C62.6593 10.4624 62.9156 10.5082 63.0621 10.5997C63.2085 10.6912 63.2818 10.8651 63.2818 11.1214C63.2818 11.4143 63.1445 12.0734 62.8699 13.0986C62.6868 13.8308 62.5403 14.4715 62.4305 15.0207C62.3207 15.5699 62.2291 16.2473 62.1559 17.0528C62.76 15.4784 63.4374 14.1969 64.1879 13.2084C64.9385 12.2198 65.6708 11.515 66.3847 11.094C67.117 10.6729 67.7852 10.4624 68.3893 10.4624C69.5792 10.4624 70.1742 11.0574 70.1742 12.2473C70.1742 12.9613 69.9728 14.2519 69.5701 16.1191C69.2223 17.7118 69.0483 18.7644 69.0483 19.277C69.0483 20.0093 69.3138 20.3754 69.8447 20.3754C70.2108 20.3754 70.641 20.1557 71.1353 19.7164C71.6479 19.2587 72.3252 18.5265 73.1673 17.5196C73.387 17.2633 73.6341 17.1352 73.9087 17.1352C74.1467 17.1352 74.3298 17.245 74.4579 17.4647C74.6044 17.6844 74.6776 17.9864 74.6776 18.3709C74.6776 19.1031 74.5037 19.6706 74.1559 20.0734C73.3687 21.0436 72.5174 21.84 71.6021 22.4624C70.7051 23.0848 69.6799 23.396 68.5266 23.396C67.593 23.396 66.8882 23.1306 66.4122 22.5997C65.9362 22.0505 65.6982 21.2633 65.6982 20.2381C65.6982 19.7255 65.8264 18.8102 66.0827 17.4921C66.3207 16.3388 66.4397 15.5425 66.4397 15.1031C66.4397 14.8102 66.339 14.6638 66.1376 14.6638C65.8996 14.6638 65.5609 14.975 65.1216 15.5974C64.7005 16.2015 64.2612 17.007 63.8035 18.0139C63.3641 19.0207 63.0072 20.0825 62.7326 21.1992C62.5312 22.0596 62.2932 22.6454 62.0186 22.9567C61.7623 23.2496 61.3504 23.396 60.7829 23.396Z" fill="black"/>
|
||||
<path d="M49.3117 23.3958C48.1767 23.3958 47.2705 22.9839 46.5932 22.1601C45.9158 21.3363 45.5771 20.2562 45.5771 18.9198C45.5771 17.4553 45.9158 16.0731 46.5932 14.7733C47.2705 13.4553 48.1675 12.4026 49.2842 11.6155C50.4192 10.81 51.6183 10.4072 52.8815 10.4072C53.2842 10.4072 53.5497 10.4896 53.6778 10.6544C53.8243 10.8008 53.9433 11.0754 54.0348 11.4782C54.4192 11.4049 54.822 11.3683 55.243 11.3683C56.1401 11.3683 56.5886 11.6887 56.5886 12.3294C56.5886 12.7139 56.4513 13.6292 56.1767 15.0754C55.7556 17.1807 55.5451 18.6452 55.5451 19.469C55.5451 19.7436 55.6092 19.9633 55.7373 20.128C55.8838 20.2928 56.0668 20.3752 56.2865 20.3752C56.6343 20.3752 57.0554 20.1555 57.5497 19.7161C58.0439 19.2585 58.7121 18.5262 59.5542 17.5193C59.7739 17.263 60.0211 17.1349 60.2957 17.1349C60.5336 17.1349 60.7167 17.2447 60.8449 17.4644C60.9913 17.6841 61.0645 17.9862 61.0645 18.3706C61.0645 19.1029 60.8906 19.6704 60.5428 20.0731C59.7922 21.0067 58.9959 21.7939 58.1538 22.4347C57.3117 23.0754 56.497 23.3958 55.7098 23.3958C55.1057 23.3958 54.5474 23.1944 54.0348 22.7916C53.5405 22.3706 53.1652 21.8031 52.9089 21.0891C51.957 22.6269 50.7579 23.3958 49.3117 23.3958ZM50.3003 20.6223C50.703 20.6223 51.0874 20.3843 51.4536 19.9083C51.8197 19.4324 52.0851 18.8008 52.2499 18.0136L53.2659 12.961C52.497 12.9793 51.7831 13.2722 51.124 13.8397C50.4833 14.3889 49.9707 15.1212 49.5863 16.0365C49.2019 16.9518 49.0096 17.9221 49.0096 18.9473C49.0096 19.5148 49.1195 19.9358 49.3392 20.2104C49.5771 20.485 49.8975 20.6223 50.3003 20.6223Z" fill="black"/>
|
||||
<path d="M36.4133 23.3958C35.2782 23.3958 34.3721 22.9839 33.6947 22.1601C33.0174 21.3363 32.6787 20.2562 32.6787 18.9198C32.6787 17.4553 33.0174 16.0731 33.6947 14.7733C34.3721 13.4553 35.2691 12.4026 36.3858 11.6155C37.5208 10.81 38.7199 10.4072 39.983 10.4072C40.3858 10.4072 40.6512 10.4896 40.7794 10.6544C40.9258 10.8008 41.0448 11.0754 41.1364 11.4782C41.5208 11.4049 41.9235 11.3683 42.3446 11.3683C43.2416 11.3683 43.6901 11.6887 43.6901 12.3294C43.6901 12.7139 43.5528 13.6292 43.2782 15.0754C42.8572 17.1807 42.6467 18.6452 42.6467 19.469C42.6467 19.7436 42.7107 19.9633 42.8389 20.128C42.9853 20.2928 43.1684 20.3752 43.3881 20.3752C43.7359 20.3752 44.1569 20.1555 44.6512 19.7161C45.1455 19.2585 45.8137 18.5262 46.6558 17.5193C46.8755 17.263 47.1226 17.1349 47.3972 17.1349C47.6352 17.1349 47.8183 17.2447 47.9464 17.4644C48.0929 17.6841 48.1661 17.9862 48.1661 18.3706C48.1661 19.1029 47.9922 19.6704 47.6444 20.0731C46.8938 21.0067 46.0974 21.7939 45.2553 22.4347C44.4132 23.0754 43.5986 23.3958 42.8114 23.3958C42.2073 23.3958 41.6489 23.1944 41.1364 22.7916C40.6421 22.3706 40.2668 21.8031 40.0105 21.0891C39.0586 22.6269 37.8595 23.3958 36.4133 23.3958ZM37.4018 20.6223C37.8046 20.6223 38.189 20.3843 38.5551 19.9083C38.9213 19.4324 39.1867 18.8008 39.3515 18.0136L40.3675 12.961C39.5986 12.9793 38.8846 13.2722 38.2256 13.8397C37.5849 14.3889 37.0723 15.1212 36.6879 16.0365C36.3034 16.9518 36.1112 17.9221 36.1112 18.9473C36.1112 19.5148 36.221 19.9358 36.4407 20.2104C36.6787 20.485 36.9991 20.6223 37.4018 20.6223Z" fill="black"/>
|
||||
<path d="M23.5148 23.3958C22.3798 23.3958 21.4736 22.9839 20.7963 22.1601C20.1189 21.3363 19.7803 20.2562 19.7803 18.9198C19.7803 17.4553 20.1189 16.0731 20.7963 14.7733C21.4736 13.4553 22.3707 12.4026 23.4874 11.6155C24.6224 10.81 25.8214 10.4072 27.0846 10.4072C27.4873 10.4072 27.7528 10.4896 27.8809 10.6544C28.0274 10.8008 28.1464 11.0754 28.2379 11.4782C28.6224 11.4049 29.0251 11.3683 29.4462 11.3683C30.3432 11.3683 30.7917 11.6887 30.7917 12.3294C30.7917 12.7139 30.6544 13.6292 30.3798 15.0754C29.9587 17.1807 29.7482 18.6452 29.7482 19.469C29.7482 19.7436 29.8123 19.9633 29.9404 20.128C30.0869 20.2928 30.27 20.3752 30.4896 20.3752C30.8375 20.3752 31.2585 20.1555 31.7528 19.7161C32.2471 19.2585 32.9153 18.5262 33.7574 17.5193C33.977 17.263 34.2242 17.1349 34.4988 17.1349C34.7368 17.1349 34.9198 17.2447 35.048 17.4644C35.1944 17.6841 35.2677 17.9862 35.2677 18.3706C35.2677 19.1029 35.0937 19.6704 34.7459 20.0731C33.9953 21.0067 33.199 21.7939 32.3569 22.4347C31.5148 23.0754 30.7002 23.3958 29.913 23.3958C29.3089 23.3958 28.7505 23.1944 28.2379 22.7916C27.7436 22.3706 27.3684 21.8031 27.1121 21.0891C26.1601 22.6269 24.961 23.3958 23.5148 23.3958ZM24.5034 20.6223C24.9061 20.6223 25.2906 20.3843 25.6567 19.9083C26.0228 19.4324 26.2883 18.8008 26.453 18.0136L27.469 12.961C26.7002 12.9793 25.9862 13.2722 25.3272 13.8397C24.6864 14.3889 24.1739 15.1212 23.7894 16.0365C23.405 16.9518 23.2128 17.9221 23.2128 18.9473C23.2128 19.5148 23.3226 19.9358 23.5423 20.2104C23.7803 20.485 24.1006 20.6223 24.5034 20.6223Z" fill="black"/>
|
||||
<path d="M24.5924 0.494279C25.105 0.567505 25.4528 0.723112 25.6359 0.961098C25.8372 1.19908 25.9379 1.5103 25.9379 1.89473C25.9379 3.15789 25.2606 3.7437 23.9059 3.65217L22.9448 3.56979C21.8647 3.47825 20.7846 3.40503 19.7045 3.35011C18.6428 3.29519 17.526 3.26773 16.3544 3.26773H15.1187C14.8991 5.9771 14.6702 8.4485 14.4322 10.6819L19.1553 10.5995C19.8327 10.5995 20.2812 10.7185 20.5009 10.9565C20.7389 11.1945 20.8579 11.5149 20.8579 11.9176C20.8579 12.54 20.6748 13.0343 20.3087 13.4004C19.9425 13.7483 19.4208 13.9222 18.7434 13.9222H14.0478L13.883 15.1029C13.4986 18.1235 12.6748 20.2746 11.4116 21.556C10.1668 22.8375 8.44598 23.4782 6.24919 23.4782C5.00434 23.4782 3.86017 23.2128 2.8167 22.6819C1.77322 22.1327 1.00434 21.4736 0.510067 20.7048C0.308694 20.3936 0.208008 20.0183 0.208008 19.5789C0.208008 19.1396 0.308694 18.7551 0.510067 18.4256C0.729746 18.0961 0.995192 17.9313 1.3064 17.9313C1.52608 17.9313 1.73661 18.0045 1.93798 18.151C2.15766 18.2974 2.43226 18.5812 2.76178 19.0023C3.64049 20.1556 4.72974 20.7322 6.02951 20.7322C7.07298 20.7322 7.94255 20.3112 8.6382 19.4691C9.35215 18.6087 9.80982 17.2631 10.0112 15.4325L10.1759 13.9222H8.85787C8.43682 13.9222 8.07069 13.8032 7.75948 13.5652C7.46657 13.3272 7.32012 12.9885 7.32012 12.5492C7.32012 11.9817 7.46657 11.5515 7.75948 11.2586C8.05239 10.9473 8.48259 10.7917 9.05009 10.7917C9.56268 10.7917 10.0661 10.7826 10.5604 10.7643C10.7801 8.75056 11.0181 6.30662 11.2743 3.43249C9.29723 3.61555 7.90593 3.93592 7.10044 4.39359C6.29495 4.85125 5.89221 5.52859 5.89221 6.42562C5.89221 7.04804 6.07527 7.64301 6.4414 8.21051C6.55124 8.37527 6.60616 8.54003 6.60616 8.70479C6.60616 9.03431 6.4231 9.32721 6.05697 9.58351C5.69083 9.82149 5.27894 9.94048 4.82127 9.94048C4.32699 9.94048 3.90594 9.79403 3.55812 9.50113C3.33844 9.31806 3.12791 8.94277 2.92654 8.37527C2.72517 7.80777 2.62448 7.17619 2.62448 6.48054C2.62448 4.21052 3.78695 2.56293 6.11189 1.53776C8.45513 0.512586 11.8693 0 16.3544 0C19.4665 0 22.2125 0.16476 24.5924 0.494279Z" fill="black"/>
|
||||
</svg>
|
||||
<body class="p-2 flex flex-col justify-center items-center min-h-screen">
|
||||
<div class="max-w-lg">
|
||||
<div class="flex justify-center mb-6">
|
||||
<h1 class="text-4xl font-black text-center text-primary w-full">
|
||||
<svg id="_8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 927.56 361.95" class="w-full px-20"><defs><style>.cls-1{fill:none;}.cls-2{fill:#662482;}</style></defs><path class="cls-1" d="m72.63,0h782.3c40.09,0,72.63,32.54,72.63,72.63v216.69c0,40.09-32.54,72.63-72.63,72.63H72.63c-40.09,0-72.63-32.54-72.63-72.63V72.63C0,32.54,32.54,0,72.63,0Z"/><path class="cls-2" d="m857.69,133.61c-16.21.9-29.75,5.48-39.96,13.54-3.97,3.13-9.76.57-9.76-4.49v-.88c0-3.27-2.65-5.92-5.92-5.92h-33.11c-3.27,0-5.92,2.65-5.92,5.92v150.46c0,3.27,2.65,5.92,5.92,5.92h35.22c3.27,0,5.92-2.65,5.92-5.92v-70.7c0-31.07,17.2-45.25,43.14-45.25,1.51,0,2.91.05,4.32.13,3.39.2,6.24-2.51,6.24-5.91v-30.98c0-3.34-2.76-6.11-6.09-5.92Z"/><path class="cls-2" d="m728.78,263.61c-1.24-3.25-4.94-4.53-8.13-3.14-4.09,1.79-8.71,2.72-13.34,2.72-12.67,0-20.21-7.54-20.21-21.42v-96.41c0-3.24,2.62-5.86,5.86-5.86h28.7c3.24,0,5.86-2.62,5.86-5.86v-24.48c0-3.24-2.62-5.86-5.86-5.86h-28.7c-3.24,0-5.86-2.62-5.86-5.86v-27.8c0-3.24-2.62-5.86-5.86-5.86h-35.34c-3.24,0-5.86,2.62-5.86,5.86v27.8c0,3.24-2.62,5.86-5.86,5.86h-13.31c-3.24,0-5.86,2.62-5.86,5.86v24.48c0,3.24,2.62,5.86,5.86,5.86h13.31c3.24,0,5.86,2.62,5.86,5.86v97.01c0,38.62,22.33,58.23,60.64,58.23,12.38,0,24.54-2.42,33.84-7.47,2.62-1.42,3.8-4.54,2.74-7.32l-8.48-22.21Z"/><path class="cls-2" d="m504.8,184.13c0-8.45,9.05-15.09,30.17-15.09,13.14,0,27.23,2.39,41.43,9.27,2.95,1.43,6.49.32,7.88-2.65l10.73-22.9c1.4-2.98.11-6.5-2.86-7.91-15.41-7.32-37.26-11.4-57.19-11.4-47.37,0-75.12,21.72-75.12,52.49,0,64.87,98.05,37.71,98.05,64.26,0,9.05-8.14,14.79-29.87,14.79-17.58,0-36.81-4.94-51.05-12.54-2.99-1.6-6.68-.35-8.1,2.73l-10.7,23.04c-1.33,2.86-.22,6.24,2.55,7.74,15.73,8.5,40.73,14.63,65.48,14.63,48.57,0,76.63-21.42,76.63-51.59,0-63.96-98.05-37.11-98.05-64.86Z"/><path class="cls-2" d="m351.26,133.45c-51.59,0-89.3,34.69-89.3,83.57s37.71,83.57,89.3,83.57,89-34.69,89-83.57-37.41-83.57-89-83.57Zm42.94,109.73c-6.48,24.4-31.8,38.86-56.55,32.29-24.75-6.57-39.57-31.68-33.09-56.08,6.48-24.4,39.62-68.32,64.37-61.74,24.75,6.57,31.75,61.14,25.27,85.54Z"/><path class="cls-2" d="m162.43,133.45c-17.1,0-32.38,4.55-44.29,13.07-3.95,2.83-9.41.12-9.41-4.74,0-3.27-2.65-5.92-5.92-5.92h-33.11c-3.27,0-5.92,2.65-5.92,5.92v150.46c0,3.27,2.65,5.92,5.92,5.92h35.22c3.23,0,5.84-2.6,5.9-5.82v-8.76c0-65.62-34.67-114.78-.38-121.3,31.37-5.98,66.98-3.09,67.4,21.06.04,2.09.32,8.34,8.99,11.75,5.18,2.04,13.16,2.75,23.65,2.48,0,0,9.51-.76,9.51,8.94,0,12.06-21.29,11.21-21.29,11.21-7.05.33-23.65-1.61-33.11,1.23-5.01,1.51-9.36,4.35-12.01,9.55-4.41,8.65-6.51,27.67-6.84,47.54v16.2c0,3.27,2.65,5.92,5.92,5.92h71.12c3.27,0,5.92-2.65,5.92-5.92v-87c0-49.47-28.96-71.8-67.28-71.8Z"/><path class="cls-2" d="m166.12,187.59c0-7-5.67-12.67-12.67-12.67s-12.67,5.68-12.67,12.67,5.67,12.68,12.67,12.68,12.67-5.68,12.67-12.68Z"/><path class="cls-2" d="m229.71,205.25v87c0,3.27-2.65,5.92-5.92,5.92h-71.12c-3.27,0-5.92-2.65-5.92-5.92v-16.2c.33-19.87,2.43-38.89,6.84-47.54,2.65-5.2,7-8.04,12.01-9.55,9.46-2.84,26.06-.9,33.11-1.23,0,0,21.29.85,21.29-11.21,0-9.7-9.51-8.94-9.51-8.94-10.49.27-18.47-.44-23.65-2.48-8.67-3.41-8.95-9.66-8.99-11.75-.42-24.15-36.03-27.04-67.4-21.06-34.29,6.53.38,55.68.38,121.3v8.76c-.06,3.22-2.67,5.82-5.9,5.82h-35.22c-3.27,0-5.92-2.65-5.92-5.92v-150.46c0-3.27,2.65-5.92,5.92-5.92h33.11c3.27,0,5.92,2.65,5.92,5.92,0,4.86,5.46,7.57,9.41,4.74,11.91-8.53,27.19-13.07,44.29-13.07,38.31,0,67.28,22.33,67.28,71.8Zm-63.59-17.66c0-7-5.67-12.67-12.67-12.67s-12.67,5.68-12.67,12.67,5.67,12.68,12.67,12.68,12.67-5.68,12.67-12.68Z"/></svg>
|
||||
Welcome to Nostr!
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<form action="/register/{{record.id}}" method="POST" class="flex flex-col gap-2">
|
||||
<label>
|
||||
<span>Recovery Email</span>
|
||||
<input type="email" name="email" value="{{email}}" required class="w-full px-4 py-3 bg-white rounded-lg shadow border border-neutral-200 justify-start items-center gap-2 inline-flex" />
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Username</span>
|
||||
<div class="flex flex-row gap-2 items-center relative">
|
||||
<input type="text" name="username" value="{{username}}" class="w-full px-4 py-3 bg-white rounded-lg shadow border border-neutral-200 justify-start items-center gap-2 inline-flex pr-[50%]" />
|
||||
<span class="text-gray-500 text-sm absolute right-4">
|
||||
@{{domain}}
|
||||
</span>
|
||||
|
||||
</div>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Password</span>
|
||||
<input type="password" name="password" placeholder="Enter a Password" class="w-full px-4 py-3 bg-white rounded-lg rounded-b-none shadow border border-neutral-200 justify-start items-center gap-2 inline-flex" />
|
||||
<input type="password" name="password" placeholder="Password confirmation" class="w-full px-4 py-3 bg-white rounded-lg rounded-t-none shadow border border-neutral-200 justify-start items-center gap-2 inline-flex" />
|
||||
</label>
|
||||
|
||||
<input type="hidden" name="callbackUrl" value="{{callbackUrl}}" />
|
||||
|
||||
<button type="submit" class="px-6 py-3 bg-black font-bold rounded-lg justify-center items-center gap-2 inline-flex text-white text-base font-semibold mt-6">Sign Up</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<form action="/register/{{record.id}}" method="POST" class="flex flex-col gap-2">
|
||||
<label>
|
||||
<span>Recovery Email</span>
|
||||
<input type="email" name="email" value="{{email}}" class="w-full px-4 py-3 bg-white rounded-full shadow border border-neutral-200 justify-start items-center gap-2 inline-flex" />
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Username</span>
|
||||
<div class="flex flex-row gap-2 items-center relative">
|
||||
<input type="text" name="username" value="{{username}}" class="w-full px-4 py-3 bg-white rounded-full shadow border border-neutral-200 justify-start items-center gap-2 inline-flex pr-[50%]" />
|
||||
<span class="text-gray-500 text-sm absolute right-4">
|
||||
@{{domain}}
|
||||
</span>
|
||||
|
||||
</div>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<span>Password</span>
|
||||
<input type="password" name="password" class="w-full px-4 py-3 bg-white rounded-full shadow border border-neutral-200 justify-start items-center gap-2 inline-flex" />
|
||||
<input type="password" name="password" class="w-full px-4 py-3 bg-white rounded-full shadow border border-neutral-200 justify-start items-center gap-2 inline-flex" />
|
||||
</label>
|
||||
|
||||
<button type="submit" class="px-6 py-3 bg-black font-bold rounded-full justify-center items-center gap-2 inline-flex text-white text-base font-semibold mt-6">Sign Up</button>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
77
templates/redirect.handlebar
Normal file
77
templates/redirect.handlebar
Normal file
@ -0,0 +1,77 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="preconnect" href="https://rsms.me/" />
|
||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
|
||||
<style>
|
||||
html {
|
||||
font-family: Inter;
|
||||
:root {
|
||||
font-family: "Inter", sans-serif;
|
||||
}
|
||||
@supports (font-variation-settings: normal) {
|
||||
:root {
|
||||
font-family: "Inter var", sans-serif;
|
||||
}
|
||||
}
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
label > span {
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body class="p-2 flex flex-col justify-center items-center min-h-screen">
|
||||
<div class="max-w-lg">
|
||||
<div class="flex justify-center mb-6">
|
||||
<h1 class="text-4xl font-black text-center text-primary w-full">
|
||||
<svg id="_8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 927.56 361.95" class="w-full px-20"><defs><style>.cls-1{fill:none;}.cls-2{fill:#662482;}</style></defs><path class="cls-1" d="m72.63,0h782.3c40.09,0,72.63,32.54,72.63,72.63v216.69c0,40.09-32.54,72.63-72.63,72.63H72.63c-40.09,0-72.63-32.54-72.63-72.63V72.63C0,32.54,32.54,0,72.63,0Z"/><path class="cls-2" d="m857.69,133.61c-16.21.9-29.75,5.48-39.96,13.54-3.97,3.13-9.76.57-9.76-4.49v-.88c0-3.27-2.65-5.92-5.92-5.92h-33.11c-3.27,0-5.92,2.65-5.92,5.92v150.46c0,3.27,2.65,5.92,5.92,5.92h35.22c3.27,0,5.92-2.65,5.92-5.92v-70.7c0-31.07,17.2-45.25,43.14-45.25,1.51,0,2.91.05,4.32.13,3.39.2,6.24-2.51,6.24-5.91v-30.98c0-3.34-2.76-6.11-6.09-5.92Z"/><path class="cls-2" d="m728.78,263.61c-1.24-3.25-4.94-4.53-8.13-3.14-4.09,1.79-8.71,2.72-13.34,2.72-12.67,0-20.21-7.54-20.21-21.42v-96.41c0-3.24,2.62-5.86,5.86-5.86h28.7c3.24,0,5.86-2.62,5.86-5.86v-24.48c0-3.24-2.62-5.86-5.86-5.86h-28.7c-3.24,0-5.86-2.62-5.86-5.86v-27.8c0-3.24-2.62-5.86-5.86-5.86h-35.34c-3.24,0-5.86,2.62-5.86,5.86v27.8c0,3.24-2.62,5.86-5.86,5.86h-13.31c-3.24,0-5.86,2.62-5.86,5.86v24.48c0,3.24,2.62,5.86,5.86,5.86h13.31c3.24,0,5.86,2.62,5.86,5.86v97.01c0,38.62,22.33,58.23,60.64,58.23,12.38,0,24.54-2.42,33.84-7.47,2.62-1.42,3.8-4.54,2.74-7.32l-8.48-22.21Z"/><path class="cls-2" d="m504.8,184.13c0-8.45,9.05-15.09,30.17-15.09,13.14,0,27.23,2.39,41.43,9.27,2.95,1.43,6.49.32,7.88-2.65l10.73-22.9c1.4-2.98.11-6.5-2.86-7.91-15.41-7.32-37.26-11.4-57.19-11.4-47.37,0-75.12,21.72-75.12,52.49,0,64.87,98.05,37.71,98.05,64.26,0,9.05-8.14,14.79-29.87,14.79-17.58,0-36.81-4.94-51.05-12.54-2.99-1.6-6.68-.35-8.1,2.73l-10.7,23.04c-1.33,2.86-.22,6.24,2.55,7.74,15.73,8.5,40.73,14.63,65.48,14.63,48.57,0,76.63-21.42,76.63-51.59,0-63.96-98.05-37.11-98.05-64.86Z"/><path class="cls-2" d="m351.26,133.45c-51.59,0-89.3,34.69-89.3,83.57s37.71,83.57,89.3,83.57,89-34.69,89-83.57-37.41-83.57-89-83.57Zm42.94,109.73c-6.48,24.4-31.8,38.86-56.55,32.29-24.75-6.57-39.57-31.68-33.09-56.08,6.48-24.4,39.62-68.32,64.37-61.74,24.75,6.57,31.75,61.14,25.27,85.54Z"/><path class="cls-2" d="m162.43,133.45c-17.1,0-32.38,4.55-44.29,13.07-3.95,2.83-9.41.12-9.41-4.74,0-3.27-2.65-5.92-5.92-5.92h-33.11c-3.27,0-5.92,2.65-5.92,5.92v150.46c0,3.27,2.65,5.92,5.92,5.92h35.22c3.23,0,5.84-2.6,5.9-5.82v-8.76c0-65.62-34.67-114.78-.38-121.3,31.37-5.98,66.98-3.09,67.4,21.06.04,2.09.32,8.34,8.99,11.75,5.18,2.04,13.16,2.75,23.65,2.48,0,0,9.51-.76,9.51,8.94,0,12.06-21.29,11.21-21.29,11.21-7.05.33-23.65-1.61-33.11,1.23-5.01,1.51-9.36,4.35-12.01,9.55-4.41,8.65-6.51,27.67-6.84,47.54v16.2c0,3.27,2.65,5.92,5.92,5.92h71.12c3.27,0,5.92-2.65,5.92-5.92v-87c0-49.47-28.96-71.8-67.28-71.8Z"/><path class="cls-2" d="m166.12,187.59c0-7-5.67-12.67-12.67-12.67s-12.67,5.68-12.67,12.67,5.67,12.68,12.67,12.68,12.67-5.68,12.67-12.68Z"/><path class="cls-2" d="m229.71,205.25v87c0,3.27-2.65,5.92-5.92,5.92h-71.12c-3.27,0-5.92-2.65-5.92-5.92v-16.2c.33-19.87,2.43-38.89,6.84-47.54,2.65-5.2,7-8.04,12.01-9.55,9.46-2.84,26.06-.9,33.11-1.23,0,0,21.29.85,21.29-11.21,0-9.7-9.51-8.94-9.51-8.94-10.49.27-18.47-.44-23.65-2.48-8.67-3.41-8.95-9.66-8.99-11.75-.42-24.15-36.03-27.04-67.4-21.06-34.29,6.53.38,55.68.38,121.3v8.76c-.06,3.22-2.67,5.82-5.9,5.82h-35.22c-3.27,0-5.92-2.65-5.92-5.92v-150.46c0-3.27,2.65-5.92,5.92-5.92h33.11c3.27,0,5.92,2.65,5.92,5.92,0,4.86,5.46,7.57,9.41,4.74,11.91-8.53,27.19-13.07,44.29-13.07,38.31,0,67.28,22.33,67.28,71.8Zm-63.59-17.66c0-7-5.67-12.67-12.67-12.67s-12.67,5.68-12.67,12.67,5.67,12.68,12.67,12.68,12.67-5.68,12.67-12.68Z"/></svg>
|
||||
Welcome to Nostr!
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<div class="text-xl font-semibold py-10">
|
||||
{{#if callbackUrl}}
|
||||
<div class="flex justify-center mb-6">
|
||||
<p class="text-center text-gray-600">
|
||||
You are being redirected to <span class="font-bold">{{callbackUrl}}</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-center mb-6">
|
||||
<p class="text-center text-gray-600">
|
||||
If you are not redirected automatically, follow this <a href="{{callbackUrl}}" class="text-primary">link</a>
|
||||
</p>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="flex justify-center mb-6">
|
||||
<p class="text-center text-gray-600">
|
||||
You can close this window now.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<button class="bg-primary text-white rounded px-4 py-2" onclick="window.close()">
|
||||
Close
|
||||
</button>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// If callbackUrl is not provided, close the window
|
||||
if (!"{{callbackUrl}}") {
|
||||
} else {
|
||||
// If callbackUrl is provided, redirect to it
|
||||
window.location.href = "{{callbackUrl}}";
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
x
Reference in New Issue
Block a user