Skip to content

Commit 43a8090

Browse files
committed
refactor: add registry profile entry interface and add public keys to it
1 parent e151e2e commit 43a8090

File tree

13 files changed

+174
-97
lines changed

13 files changed

+174
-97
lines changed

.vscode/settings.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"editor.defaultFormatter": "esbenp.prettier-vscode",
3+
"[javascript]": {
4+
"editor.defaultFormatter": "esbenp.prettier-vscode",
5+
"editor.formatOnSave": true
6+
},
7+
"[typescript]": {
8+
"editor.defaultFormatter": "esbenp.prettier-vscode",
9+
"editor.formatOnSave": true
10+
},
11+
"[typescriptreact]": {
12+
"editor.defaultFormatter": "esbenp.prettier-vscode",
13+
"editor.formatOnSave": true
14+
}
15+
}

src/lib/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ sequenceDiagram
77
EnsMailLib->>EnsMailLib: createKeys()
88
EnsMailLib->>+MetaMask: personal_sign
99
MetaMask-->>-EnsMailLib: signature
10-
EnsMailLib->>+ DeliveryService: POST submitPublicKeys()
10+
EnsMailLib->>+ DeliveryService: POST submitProfileRegistryEntry()
1111
DeliveryService->> DeliveryService: checkSignature()
1212
DeliveryService-->>- EnsMailLib: token
1313
EnsMailLib-->>-UI: Messages

src/lib/account/Account.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ export interface Keys {
1919
storageEncryptionKey: string;
2020
}
2121

22+
export interface ProfileRegistryEntry {
23+
publicKeys: PublicKeys;
24+
}
25+
2226
export interface PublicKeys {
2327
publicKey: string;
2428
publicMessagingKey: string;
@@ -39,9 +43,12 @@ export interface Account {
3943
export async function getContacts(
4044
connection: Connection,
4145
deliveryServiceToken: string,
42-
getPublicKeys: (
46+
getProfileRegistryEntry: (
4347
contact: string,
44-
) => Promise<{ publicKeys: PublicKeys | undefined; signature: string }>,
48+
) => Promise<
49+
| { profileRegistryEntry: ProfileRegistryEntry; signature: string }
50+
| undefined
51+
>,
4552
getPendingConversations: (
4653
connection: Connection,
4754
userDb: UserDB,
@@ -87,7 +94,9 @@ export async function getContacts(
8794
)
8895
.map(async (address) => ({
8996
address,
90-
publicKeys: (await getPublicKeys(address)).publicKeys,
97+
publicKeys: (
98+
await getProfileRegistryEntry(address)
99+
)?.profileRegistryEntry.publicKeys,
91100
})),
92101
);
93102
}

src/lib/delivery/Keys.ts

+23-27
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import { formatAddress } from '../external-apis/InjectedWeb3API';
44
import { log } from '../shared/log';
55
import { Session } from './Session';
66
import { v4 as uuidv4 } from 'uuid';
7+
import { ProfileRegistryEntry } from '../account/Account';
78

8-
export function submitPublicKeys(
9+
export function submitProfileRegistryEntry(
910
sessions: Map<string, Session>,
1011
accountAddress: string,
11-
publicKeys: PublicKeys,
12+
profileRegistryEntry: ProfileRegistryEntry,
1213
signature: string,
1314
pendingConversations: Map<string, Set<string>>,
1415
send: (socketId: string) => void,
@@ -17,21 +18,19 @@ export function submitPublicKeys(
1718
const account = formatAddress(accountAddress);
1819

1920
const recoveredAddress = ethers.utils.recoverAddress(
20-
ethers.utils.hashMessage(
21-
publicKeys.publicKey +
22-
publicKeys.publicMessagingKey +
23-
publicKeys.publicSigningKey,
24-
),
21+
ethers.utils.hashMessage(JSON.stringify(profileRegistryEntry)),
2522
signature,
2623
);
2724

2825
if (formatAddress(recoveredAddress) === account) {
29-
const session = sessions.has(account)
30-
? (sessions.get(account) as Session)
31-
: { account };
32-
session.keys = publicKeys;
33-
session.token = uuidv4();
34-
session.pubKeySignature = signature;
26+
const session: Session = {
27+
...(sessions.has(account) ? sessions.get(account)! : {}),
28+
account,
29+
profileRegistryEntry: profileRegistryEntry,
30+
token: uuidv4(),
31+
profileRegistryEntrySignature: signature,
32+
};
33+
3534
sessions.set(account, session);
3635
const pending = pendingConversations.get(account);
3736
if (pending) {
@@ -46,29 +45,26 @@ export function submitPublicKeys(
4645
}
4746
return session.token;
4847
} else {
48+
log(`- Invalid signature`);
4949
throw Error('Signature invalid.');
5050
}
5151
}
5252

53-
export function getPublicKeys(
53+
export function getProfileRegistryEntry(
5454
sessions: Map<string, Session>,
5555
accountAddress: string,
56-
): Partial<{ publicKeys: PublicKeys | undefined; signature: string }> {
57-
log(`[getPublicKeys] for account ${accountAddress}`);
56+
):
57+
| { profileRegistryEntry: ProfileRegistryEntry; signature: string }
58+
| undefined {
59+
log(`[getProfileRegistryEntry] for account ${accountAddress}`);
5860
const account = formatAddress(accountAddress);
59-
60-
if (sessions.get(account)?.keys) {
61+
const session = sessions.get(account);
62+
if (session) {
6163
return {
62-
publicKeys: {
63-
publicMessagingKey:
64-
sessions.get(account)?.keys!.publicMessagingKey!,
65-
publicSigningKey:
66-
sessions.get(account)?.keys!.publicSigningKey!,
67-
publicKey: sessions.get(account)?.keys!.publicKey!,
68-
},
69-
signature: sessions.get(account)?.pubKeySignature,
64+
profileRegistryEntry: session.profileRegistryEntry,
65+
signature: session.profileRegistryEntrySignature,
7066
};
7167
} else {
72-
return {};
68+
return;
7369
}
7470
}

src/lib/delivery/Session.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { PublicKeys } from '../account/Account';
1+
import { ProfileRegistryEntry } from '../account/Account';
22
import { formatAddress } from '../external-apis/InjectedWeb3API';
33
import { log } from '../shared/log';
44

55
export interface Session {
66
account: string;
7-
pubKeySignature?: string;
8-
token?: string;
7+
profileRegistryEntrySignature: string;
8+
token: string;
99
ttl?: undefined;
1010
socketId?: string;
11-
keys?: PublicKeys;
11+
profileRegistryEntry: ProfileRegistryEntry;
1212
}
1313

1414
export function checkToken(

src/lib/delivery/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ export {
66
createPendingEntry,
77
} from './Messages';
88
export type { Session } from './Session';
9-
export { submitPublicKeys, getPublicKeys } from './Keys';
9+
export { submitProfileRegistryEntry, getProfileRegistryEntry } from './Keys';

src/lib/external-apis/BackendAPI.ts

+43-16
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import axios from 'axios';
22
import { log } from '../shared/log';
33
import { EncryptionEnvelop, Envelop } from '../messaging/Messaging';
44
import { Connection } from '../web3-provider/Web3Provider';
5-
import { PublicKeys } from '../account/Account';
5+
import { PublicKeys, ProfileRegistryEntry } from '../account/Account';
66
import { UserDB } from '..';
7+
import { datacatalog } from 'googleapis/build/src/apis/datacatalog';
78

89
const DELIVERY_SERVICE =
910
(process.env.REACT_APP_BACKEND as string) + '/deliveryService';
@@ -17,21 +18,26 @@ function createJsonRpcRequest(method: string, params: any, id = 1) {
1718
};
1819
}
1920

20-
export async function submitPublicKeys(
21+
export async function submitProfileRegistryEntry(
2122
accountAddress: string,
22-
publicKeys: PublicKeys,
23+
profileRegistryEntry: ProfileRegistryEntry,
2324
signature: string,
2425
): Promise<string> {
25-
return (
26+
const request = (
2627
await axios.post(
2728
DELIVERY_SERVICE,
28-
createJsonRpcRequest('submitPublicKeys', {
29+
createJsonRpcRequest('submitProfileRegistryEntry', {
2930
accountAddress: accountAddress,
30-
publicKeys,
31+
profileRegistryEntry,
3132
signature,
3233
}),
3334
)
34-
).data.result;
35+
).data;
36+
if (request.error) {
37+
throw Error('submitProfileRegistryEntry failed.');
38+
}
39+
40+
return request.result;
3541
}
3642

3743
export async function submitMessage(
@@ -82,7 +88,7 @@ export async function getNewMessages(
8288
userDb: UserDB,
8389
contactAddress: string,
8490
): Promise<EncryptionEnvelop[]> {
85-
return (
91+
const request = (
8692
await axios.post(
8793
DELIVERY_SERVICE,
8894
createJsonRpcRequest('getMessages', {
@@ -91,33 +97,54 @@ export async function getNewMessages(
9197
token: userDb.deliveryServiceToken,
9298
}),
9399
)
94-
).data.result.messages;
100+
).data;
101+
102+
if (request.error) {
103+
throw Error('getNewMessages failed.');
104+
}
105+
106+
return request.result.messages;
95107
}
96108

97109
export async function getPendingConversations(
98110
connection: Connection,
99111
userDb: UserDB,
100112
): Promise<string[]> {
101-
return (
113+
const request = (
102114
await axios.post(
103115
DELIVERY_SERVICE,
104116
createJsonRpcRequest('getPendingConversations', {
105117
accountAddress: connection.account!.address,
106118
token: userDb.deliveryServiceToken,
107119
}),
108120
)
109-
).data.result.pendingConversations;
121+
).data;
122+
123+
if (request.error) {
124+
throw Error('getPendingConversations failed.');
125+
}
126+
127+
return request.result.pendingConversations;
110128
}
111129

112-
export async function getPublicKeys(
130+
export async function getProfileRegistryEntry(
113131
contact: string,
114-
): Promise<{ publicKeys: PublicKeys | undefined; signature: string }> {
115-
return (
132+
): Promise<
133+
| { profileRegistryEntry: ProfileRegistryEntry; signature: string }
134+
| undefined
135+
> {
136+
const request = (
116137
await axios.post(
117138
DELIVERY_SERVICE,
118-
createJsonRpcRequest('getPublicKeys', {
139+
createJsonRpcRequest('getProfileRegistryEntry', {
119140
accountAddress: contact,
120141
}),
121142
)
122-
).data.result;
143+
).data;
144+
145+
if (request.error) {
146+
throw Error('getProfileRegistryEntry failed.');
147+
}
148+
149+
return request.result;
123150
}

src/lib/index.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ import * as Storage from './storage';
1010
import { StorageEnvelopContainer, UserDB } from './storage';
1111

1212
export type { Connection } from './web3-provider/Web3Provider';
13-
export type { Account, PublicKeys, Keys } from './account/Account';
13+
export type {
14+
Account,
15+
PublicKeys,
16+
Keys,
17+
ProfileRegistryEntry,
18+
} from './account/Account';
1419
export type {
1520
Message,
1621
EncryptionEnvelop,
@@ -47,7 +52,7 @@ export function connectAccount(provider: ethers.providers.JsonRpcProvider) {
4752
return SignIn.connectAccount(
4853
provider,
4954
Web3Api.requestAccounts,
50-
BackendAPI.getPublicKeys,
55+
BackendAPI.getProfileRegistryEntry,
5156
);
5257
}
5358

@@ -89,7 +94,7 @@ export async function signIn(
8994
return SignIn.signIn(
9095
connection,
9196
Web3Api.prersonalSign,
92-
BackendAPI.submitPublicKeys,
97+
BackendAPI.submitProfileRegistryEntry,
9398
Account.createKeys,
9499
Web3Api.getPublicKey,
95100
dataFile,
@@ -144,7 +149,7 @@ export async function getContacts(
144149
return Account.getContacts(
145150
connection,
146151
deliveryServiceToken,
147-
BackendAPI.getPublicKeys,
152+
BackendAPI.getProfileRegistryEntry,
148153
BackendAPI.getPendingConversations,
149154
Web3Api.resolveName,
150155
userDb,

src/lib/signin/Connect.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
import { ethers } from 'ethers';
2-
import { PublicKeys } from '../account/Account';
2+
import { ProfileRegistryEntry } from '../account/Account';
33
import { ConnectionState } from '../web3-provider/Web3Provider';
44

55
export async function connectAccount(
66
provider: ethers.providers.JsonRpcProvider,
77
requestAccounts: (
88
provider: ethers.providers.JsonRpcProvider,
99
) => Promise<string>,
10-
getPublicKeys: (
10+
getProfileRegistryEntry: (
1111
contact: string,
12-
) => Promise<{ publicKeys: PublicKeys | undefined; signature: string }>,
12+
) => Promise<
13+
| { profileRegistryEntry: ProfileRegistryEntry; signature: string }
14+
| undefined
15+
>,
1316
): Promise<{
1417
account?: string;
1518
connectionState: ConnectionState;
1619
existingAccount: boolean;
1720
}> {
1821
try {
1922
const account = await requestAccounts(provider);
20-
2123
return {
2224
account,
23-
existingAccount: (await getPublicKeys(account))?.publicKeys
25+
existingAccount: (await getProfileRegistryEntry(account))
26+
?.profileRegistryEntry.publicKeys
2427
? true
2528
: false,
2629
connectionState: ConnectionState.CollectingSignInData,

0 commit comments

Comments
 (0)