Skip to content

Commit

Permalink
Merge branch 'billboard-devconnect' of https://github.com/corpus-io/dm3
Browse files Browse the repository at this point in the history
… into billboard-devconnect
  • Loading branch information
AlexNi245 committed Nov 8, 2023
2 parents 0e54de3 + 6c6b728 commit 2473971
Show file tree
Hide file tree
Showing 16 changed files with 134 additions and 31 deletions.
4 changes: 3 additions & 1 deletion .github/workflows/deploy-billboard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
env:
TARGET_HOST: ${{ secrets.STAGING_HOST_BILLBOARD }}
run: |
echo "REACT_APP_ADDR_ENS_SUBDOMAIN=.beta-addr.dm3.eth" >> ./.env.react
echo "REACT_APP_ADDR_ENS_SUBDOMAIN=.bb-addr.dm3.eth" >> ./.env.react
echo "REACT_APP_BACKEND=http://${{ secrets.STAGING_HOST_BILLBOARD }}/api" >> ./.env.react
echo "REACT_APP_DEFAULT_DELIVERY_SERVICE=beta-ds.dm3.eth" >> ./.env.react
echo "REACT_APP_DEFAULT_SERVICE=http://${{ secrets.STAGING_HOST_BILLBOARD }}/api" >> ./.env.react
Expand All @@ -41,6 +41,7 @@ jobs:
echo "REACT_APP_BRANCH=${{ env.branch }}" >> ./.env.react
echo "REACT_APP_BUILD_TIME=${{ env.now }}" >> ./.env.react
cat ./.env.react >> ./.env
echo "BILLBOARD_SIGNER_PRIVATE_KEY=${{ secrets.BILLBOARD_SIGNER_PRIVATE_KEY }}" >> ./.env
echo "RESOLVER_ADDR=0xae6646c22D8eE6479eE0a39Bf63B9bD9e57bAD9d" >> ./.env
echo "SIGNING_PUBLIC_KEY=${{ secrets.SIGNING_PUBLIC_KEY }}" >> ./.env
echo "SIGNING_PRIVATE_KEY=${{ secrets.SIGNING_PRIVATE_KEY }}" >> ./.env
Expand All @@ -51,6 +52,7 @@ jobs:
echo "RPC=${{ secrets.STAGING_RPC }}" >> ./.env
echo "BILLBOARD_PRIVATE_KEY=${{ secrets.BILLBOARD_PRIVATE_KEY}}" >> ./.env
echo "interceptor=${{ secrets.INTERCEPTOR}}" >> ./.env
echo "DISABLE_SESSION_CHECK='true'" >> ./.env
envsubst '${SSL_CERTIFICATE_BASE_LOC} ${TLS_CERTIFICATE_LOCATION} ${TARGET_HOST}' < ./docker/nginx.conf > ./nginx.conf
cat ./.env
- name: Build docker image
Expand Down
2 changes: 1 addition & 1 deletion docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM --platform=linux/amd64 node:18-alpine
WORKDIR /app
COPY . .
RUN apk add --update python3 make g++\
RUN apk add --update python3 make g++ curl\
&& rm -rf /var/cache/apk/*
RUN yarn install
RUN yarn build
28 changes: 20 additions & 8 deletions docker/billboard/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ services:
image: nginx:latest
restart: always
depends_on:
- offchain-resolver
- billboard-client
- backend
- ccip-resolver
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
Expand All @@ -25,6 +26,7 @@ services:
SIGNING_PRIVATE_KEY: ${SIGNING_PRIVATE_KEY}
ENCRYPTION_PUBLIC_KEY: ${ENCRYPTION_PUBLIC_KEY}
ENCRYPTION_PRIVATE_KEY: ${ENCRYPTION_PRIVATE_KEY}
DISABLE_SESSION_CHECK: ${DISABLE_SESSION_CHECK}
RPC: ${RPC}
PORT: 8081
LOG_LEVEL: 'debug'
Expand All @@ -33,13 +35,17 @@ services:
image: dm3-backend
command: yarn workspace dm3-billboard-client start
depends_on:
- db
- ccip-resolver
db:
condition: service_started
ccip-resolver:
condition: service_started
offchain-resolver:
condition: service_healthy
environment:
PORT: 8082
PORT: 8083
time: 0
privateKey: ${BILLBOARD_PRIVATE_KEY}
ensNames: '["billboard1.eth"]'
ensNames: '["billboard1.bb.dm3.eth"]'
mediators: '[]'
REDIS_URL: redis://db:6379
RPC: ${RPC}
Expand All @@ -65,6 +71,11 @@ services:
DATABASE_URL: postgresql://postgres:example@offchain-resolver-db:5432
PORT: 8082
LOG_LEVEL: 'debug'
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8082/0x26139b2349282de5ee2bd9c7a53171a28d6a6c84/0xf8c30f63000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001c0a62696c6c626f617264310762622d7573657203646d3303657468000000000000000000000000000000000000000000000000000000000000000000000000243b3b57de8d7fcfd6548aae2cdb5851741139459856caadb3b9ad3d27872ae921b2348a7d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014bcd6de065fd7e889e3ec86aa2d2780d7553ab3cc000000000000000000000000"]
interval: 30s
timeout: 10s
retries: 5

# web:
# image: dm3-backend
Expand All @@ -85,13 +96,14 @@ services:
image: dm3org/ccip-resolver:v0.2.7
restart: always
depends_on:
- offchain-resolver
offchain-resolver:
condition: service_healthy
environment:
SIGNER_PRIVATE_KEY: ${SIGNER_PRIVATE_KEY}
SIGNER_PRIVATE_KEY: ${BILLBOARD_SIGNER_PRIVATE_KEY}
LOG_LEVEL: debug
CONFIG: |
{
"0xae6646c22d8ee6479ee0a39bf63b9bd9e57bad9d": {
"0x26139b2349282de5ee2bd9c7a53171a28d6a6c84": {
"type": "signing",
"handlerUrl": "http://offchain-resolver:8082"
}
Expand Down
12 changes: 12 additions & 0 deletions docker/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,18 @@ http {
proxy_redirect off;
}

location /bb-client {
rewrite ^/bb-client(.*)$ $1 break;
limit_req zone=standardlimit burst=50;
proxy_pass http://billboard-client:8083;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_redirect off;
}

location /socket.io {
proxy_pass http://backend:8081/socket.io;
proxy_http_version 1.1;
Expand Down
1 change: 1 addition & 0 deletions packages/backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Profile from './profile';
import RpcProxy from './rpc/rpc-proxy';
import Storage from './storage';
import { logInfo } from 'dm3-lib-shared';
import 'dotenv/config';

import {
errorHandler,
Expand Down
6 changes: 6 additions & 0 deletions packages/backend/src/profile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ export default () => {
method: 'POST',
url: req.url,
ensName,
disableSessionCheck:
process.env.DISABLE_SESSION_CHECK === 'true',
});

const data = await submitUserProfile(
Expand All @@ -69,6 +71,10 @@ export default () => {

res.json(data);
} catch (e) {
global.logger.warn({
message: 'POST profile',
error: JSON.stringify(e),
});
res.status(400).send({
message: `Couldn't store profile`,
error: JSON.stringify(e),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const getDeliveryServiceWSClient = (
return Promise.all(
deliveryServices.map(async (ds) => {
const client = await new Promise<Socket>((res, rej) => {
const c = io(ds.url, {
const c = io(ds.url.replace('/api', ''), {
auth: {
account: { ensName },
token: ds.token,
Expand Down
17 changes: 15 additions & 2 deletions packages/cli/profile/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
/* eslint-disable no-console */
import { Command, program } from 'commander';
import { getStorageKeyCreationMessage, createStorageKey } from 'dm3-lib-crypto';
import { createProfileKeys, UserProfile } from 'dm3-lib-profile';
import {
createProfileKeys,
getProfileCreationMessage,
SignedUserProfile,
UserProfile,
} from 'dm3-lib-profile';
import { ethers } from 'ethers';
import { getSanitizedWallet } from '../sanitizer/getSanitizedWallet';
import { stringify } from 'dm3-lib-shared';

const newProfile = async (program: Command) => {
const { profilePk, deliveryService } = program.opts();
Expand Down Expand Up @@ -47,7 +53,14 @@ const newProfile = async (program: Command) => {
);
}

console.log(profile);
const profileCreationMessage = getProfileCreationMessage(
stringify(profile),
);

const profileSig = await profileWallet.signMessage(profileCreationMessage);
const signedProfile: SignedUserProfile = { profile, signature: profileSig };

console.log(signedProfile);
};

export { newProfile };
10 changes: 7 additions & 3 deletions packages/lib/delivery/src/UserProfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,35 +38,39 @@ export async function submitUserProfile(
send: (socketId: string) => void,
): Promise<string> {
const account = normalizeEnsName(ensName);
console.log('1', account, signedUserProfile);

Check failure on line 41 in packages/lib/delivery/src/UserProfile.ts

View workflow job for this annotation

GitHub Actions / code-quality

Unexpected console statement

if (!(await checkUserProfile(provider, signedUserProfile, account))) {
throw Error('Signature invalid.');
}
//TODO: remvoe DISABLE_SESSION_CHECK
console.log('2', process.env.DISABLE_SESSION_CHECK);

Check failure on line 46 in packages/lib/delivery/src/UserProfile.ts

View workflow job for this annotation

GitHub Actions / code-quality

Unexpected console statement
//TODO: remvoe DISABLE_SESSION_CHECK
// DISABLE_SESSION_CHECK is a special solution for ETH Prague
if (
process.env.DISABLE_SESSION_CHECK !== 'true' &&
(await getSession(account))
) {
throw Error('Profile exists already');
}
console.log('3');

Check failure on line 55 in packages/lib/delivery/src/UserProfile.ts

View workflow job for this annotation

GitHub Actions / code-quality

Unexpected console statement
const session: Session = {
account,
signedUserProfile,
token: uuidv4(),
createdAt: new Date().getTime(),
profileExtension: getDefaultProfileExtension(),
};
console.log('4', session);

Check failure on line 63 in packages/lib/delivery/src/UserProfile.ts

View workflow job for this annotation

GitHub Actions / code-quality

Unexpected console statement

await setSession(account.toLocaleLowerCase(), session);

console.log('5');

Check failure on line 66 in packages/lib/delivery/src/UserProfile.ts

View workflow job for this annotation

GitHub Actions / code-quality

Unexpected console statement
await handlePendingConversations(
account,
getSession,
getPendingConversations,
send,
);

console.log('6');

Check failure on line 73 in packages/lib/delivery/src/UserProfile.ts

View workflow job for this annotation

GitHub Actions / code-quality

Unexpected console statement
return session.token;
}

Expand Down
16 changes: 12 additions & 4 deletions packages/offchain-resolver/src/http/profile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,19 @@ export function profile(web3Provider: ethers.providers.BaseProvider) {
error: 'address has already claimed a subdomain',
});
}
global.logger.debug({
message: 'nameP setAlias',
hotAddr: hotAddr + '.bb-addr.dm3.eth',
alias: `${address}.bb-user.dm3.eth`,
});

await req.app.locals.db.removeAlias(
`${address}.bb-user.dm3.eth`,
);

await req.app.locals.db.setUserProfile(
`${address}.user.ethprague.dm3.eth`,
signedUserProfile,
hotAddr,
await req.app.locals.db.setAlias(
hotAddr + '.bb-addr.dm3.eth',
`${address}.bb-user.dm3.eth`,
);

return res.sendStatus(200);
Expand Down
1 change: 1 addition & 0 deletions packages/offchain-resolver/src/persistance/IDatabase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface IDatabase {
address: string,
): Promise<boolean>;
removeUserProfile(ensName: string): Promise<boolean>;
removeAlias(alias: string): Promise<boolean>;
setAlias(name: string, alias: string): Promise<boolean>;
getProfileContainerForAlias(
alias: string,
Expand Down
1 change: 1 addition & 0 deletions packages/offchain-resolver/src/persistance/getDatabase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export async function getDatabase(
Profile.getProfileContainerForAlias(prismaClient),
getProfileAliasByAddress:
Profile.getProfileAliasByAddress(prismaClient),
removeAlias: Profile.removeAlias(prismaClient),
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ export type ProfileContainer = {

export function getProfileContainer(db: PrismaClient) {
return async (name: string) => {
global.logger.debug({
message: 'getProfileContainer call',
nameHash: ethers.utils.namehash(name),
name,
});
const profileContainer = await db.profileContainer.findUnique({
where: {
nameHash: ethers.utils.namehash(name),
Expand All @@ -31,15 +36,15 @@ export function getProfileContainer(db: PrismaClient) {
}
: null;
global.logger.debug({
message: 'getProfileContainer',
message: 'getProfileContainer found',
nameHash: ethers.utils.namehash(name),
profileContainerResult,
});

return profileContainerResult;
} else {
global.logger.debug({
message: 'getProfileContainer',
message: 'getProfileContainer not found',
nameHash: ethers.utils.namehash(name),
});
// try to find an alias which equlas name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ export { setAlias } from './setAlias';
export { getProfileContainerForAlias } from './getProfileContainerForAlias';
export { setUserProfile } from './setUserProfile';
export { getProfileAliasByAddress } from './getProfileAliasByAddress';
export { removeAlias } from './removeAlias';
32 changes: 32 additions & 0 deletions packages/offchain-resolver/src/persistance/profile/removeAlias.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { PrismaClient } from '@prisma/client';
import { normalizeEnsName } from 'dm3-lib-profile';

/**
*
* @param {Redis} redis - Redis client
* @param {string} alias - ENS alias name
* @returns {Promise<boolean>} - A promise that resolves to true if the profile is removed, false otherwise
*/
export function removeAlias(db: PrismaClient) {
return async (alias: string) => {
try {
const normalizedAlias = normalizeEnsName(alias);

await db.alias.delete({
where: {
alias: normalizedAlias,
},
});

global.logger.debug({
message: 'removeAlias',

alias: normalizedAlias,
});

return true;
} catch (e) {
return false;
}
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,31 @@ export function setUserProfile(db: PrismaClient) {
const nameHash = ethers.utils.namehash(name);

try {
const id = uuidv4();
global.logger.debug({
message: 'pre setUserProfile',
id,
nameHash,
profile: JSON.stringify(profile),
address: formatAddress(address),
ensName: normalizeEnsName(name),
});
await db.profileContainer.create({
data: {
id: uuidv4(),
id,
nameHash,
profile: JSON.stringify(profile),
address: formatAddress(address),
ensName: normalizeEnsName(name),
},
});
global.logger.debug({
message: 'setUserProfile',
id: uuidv4(),
nameHash,
profile: JSON.stringify(profile),
address: formatAddress(address),
ensName: normalizeEnsName(name),
});

return true;
} catch (e) {
global.logger.warn({
message: `setUserProfile error`,
error: JSON.stringify(e),
});
return false;
}
};
Expand Down

0 comments on commit 2473971

Please sign in to comment.