Merge branch 'master' into bug/deprecate-rsa-encryption

This commit is contained in:
Emad Kheir 2021-10-15 09:37:29 +01:00 committed by GitHub
commit c35ffef345
20 changed files with 435 additions and 135 deletions

View file

@ -19,4 +19,4 @@ TORRENT_SEED_TOKEN=jibberish
# "default" or "hosting" # "default" or "hosting"
DEPLOYMENT_TYPE=hosting DEPLOYMENT_TYPE=hosting
# allow to create a user with unlocked lnd # allow to create a user with unlocked lnd
ALLOW_UNLOCKED_LND="true" ALLOW_UNLOCKED_LND=false

View file

@ -1 +1,2 @@
*.ts *.ts
/public/*.min.js

View file

@ -19,7 +19,19 @@ jobs:
repo: ['shocknet/Wizard'] repo: ['shocknet/Wizard']
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Repository Dispatch - name: 🛎️ Checkout
uses: actions/checkout@v2.3.1
with:
persist-credentials: false
ref: ${{ github.ref }}
- name: ⚙️ Install Dependencies
run: yarn install
- name: 📝 Run Tests
run: yarn test
- name: 📯 Repository Dispatch
uses: peter-evans/repository-dispatch@v1 uses: peter-evans/repository-dispatch@v1
with: with:
token: ${{ secrets.REPO_ACCESS_TOKEN }} token: ${{ secrets.REPO_ACCESS_TOKEN }}

View file

@ -0,0 +1,17 @@
version: "3.8"
networks:
default:
external: true
name: 2_default
services:
web:
image: shockwallet/api:latest
command: -c -h 0.0.0.0 -l polar-n2-alice:10009 -m /root/.lnd/data/chain/bitcoin/regtest/admin.macaroon -d /root/.lnd/tls.cert
restart: on-failure
stop_grace_period: 1m
ports:
- 9835:9835
volumes:
- C:\Users\boufn\.polar\networks\2\volumes\lnd\alice:/root/.lnd
environment:
TRUSTED_KEYS: 'false'

View file

@ -25,6 +25,10 @@
axe: false axe: false
}) })
setInterval(() => {
console.log('peers', Object.keys(gun.back('opt').peers))
},5000)
user = gun.user() user = gun.user()
node = gun.get('foo').get('bar') node = gun.get('foo').get('bar')

View file

@ -1,6 +1,6 @@
{ {
"name": "shockapi", "name": "shockapi",
"version": "2021.9.8", "version": "2021.9.19",
"description": "", "description": "",
"main": "src/server.js", "main": "src/server.js",
"scripts": { "scripts": {

78
public/localHomepage.html Normal file
View file

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="/qrCodeGenerator"></script>
</head>
<body>
<p id="errorContainer"></p>
<div>
<h3>Tunnel</h3>
<p id="tunnelState"></p>
</div>
<div>
<h3>Access Secret</h3>
<p id="accessSecretState"></p>
</div>
<div id="qrcode"></div>
<script>
fetch(`${window.location.origin}/api/accessInfo`)
.then(res => res.json())
.then(j => {
console.log(j)
if(j.field){
document.querySelector('#errorContainer').innerHTML ='there was an error, unable to load access information, reason: '+ j.message
return
}
const tunnelUrl = handleTunnelInfo(j)
const accessCode = handleAccessCode(j)
const baseUrl = tunnelUrl ? tunnelUrl : window.location.host
const finalUrl = accessCode ? `${accessCode}#${baseUrl}` : baseUrl
new QRCode(document.getElementById("qrcode"), finalUrl);
})
.catch(e => {
console.log(e.message)
})
const handleTunnelInfo = (res) => {
const tunnelState = document.querySelector("#tunnelState")
if(res.tunnelDisabled){
tunnelState.innerHTML = 'The tunnel service is disabled'
return
}
if(res.relayNotFound) {
tunnelState.innerHTML = 'The tunnel service seems broken'
return
}
tunnelState.innerHTML = `Tunnel URL: ${res.relayId}@${res.relayUrl}`
return `${res.relayId}@${res.relayUrl}`
}
const handleAccessCode = (res) => {
const accessSecretState = document.querySelector("#accessSecretState")
if(res.accessSecretDisabled){
accessSecretState.innerHTML = 'The access secret is disabled'
return
}
if(res.accessCodeNotFound){
accessSecretState.innerHTML = 'The access secret seems broken'
return
}
if(res.accessCodeUsed){
accessSecretState.innerHTML = 'The access secret was already used'
return
}
accessSecretState.innerHTML = `Access Secret: ${res.accessCode}`
return res.accessCode
}
</script>
</body>
</html>

1
public/qrcode.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -14,7 +14,6 @@ require('gun/lib/open')
require('gun/lib/load') require('gun/lib/load')
//@ts-ignore //@ts-ignore
const { encryptedEmit, encryptedOn } = require('../../../utils/ECC/socket') const { encryptedEmit, encryptedOn } = require('../../../utils/ECC/socket')
const Key = require('../contact-api/key')
/** @type {import('../contact-api/SimpleGUN').ISEA} */ /** @type {import('../contact-api/SimpleGUN').ISEA} */
// @ts-ignore // @ts-ignore
@ -328,29 +327,6 @@ const authenticate = async (alias, pass, __user) => {
// clock skew // clock skew
await new Promise(res => setTimeout(res, 2000)) await new Promise(res => setTimeout(res, 2000))
await /** @type {Promise<void>} */ (new Promise((res, rej) => {
_user.get(Key.FOLLOWS).put(
{
unused: null
},
ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(
new Error(
`Error initializing follows: ${JSON.stringify(
ack.err,
null,
4
)}`
)
)
} else {
res()
}
}
)
}))
return ack.sea.pub return ack.sea.pub
} else { } else {
throw new Error('Unknown error.') throw new Error('Unknown error.')
@ -367,29 +343,6 @@ const authenticate = async (alias, pass, __user) => {
// clock skew // clock skew
await new Promise(res => setTimeout(res, 2000)) await new Promise(res => setTimeout(res, 2000))
await /** @type {Promise<void>} */ (new Promise((res, rej) => {
_user.get(Key.FOLLOWS).put(
{
unused: null
},
ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(
new Error(
`Error initializing follows: ${JSON.stringify(
ack.err,
null,
4
)}`
)
)
} else {
res()
}
}
)
}))
// move this to a subscription; implement off() ? todo // move this to a subscription; implement off() ? todo
API.Jobs.onOrders(_user, gun, mySEA) API.Jobs.onOrders(_user, gun, mySEA)
API.Jobs.lastSeenNode(_user) API.Jobs.lastSeenNode(_user)
@ -424,29 +377,6 @@ const authenticate = async (alias, pass, __user) => {
await new Promise(res => setTimeout(res, 5000)) await new Promise(res => setTimeout(res, 5000))
await /** @type {Promise<void>} */ (new Promise((res, rej) => {
_user.get(Key.FOLLOWS).put(
{
unused: null
},
ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(
new Error(
`Error initializing follows: ${JSON.stringify(
ack.err,
null,
4
)}`
)
)
} else {
res()
}
}
)
}))
API.Jobs.onOrders(_user, gun, mySEA) API.Jobs.onOrders(_user, gun, mySEA)
API.Jobs.lastSeenNode(_user) API.Jobs.lastSeenNode(_user)
@ -588,17 +518,7 @@ const register = async (alias, pass) => {
// don't work // don't work
instantiateGun() instantiateGun()
return authenticate(alias, pass).then(async pub => { return authenticate(alias, pass)
await API.Actions.setDisplayName('anon' + pub.slice(0, 8), user)
await API.Actions.generateHandshakeAddress()
await API.Actions.generateOrderAddress(user)
await API.Actions.initWall()
await API.Actions.setBio('A little bit about myself.', user)
await API.Actions.setDefaultSeedProvider('', user)
await API.Actions.setSeedServiceData('', user)
await API.Actions.setCurrentStreamInfo('', user)
return pub
})
} }
module.exports = { module.exports = {

View file

@ -58,7 +58,11 @@ const authenticate = (user, pass, userNode) =>
} }
userNode.auth(user, pass, ack => { userNode.auth(user, pass, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else if (!userNode.is) { } else if (!userNode.is) {
reject(new Error('authentication failed')) reject(new Error('authentication failed'))
@ -81,7 +85,11 @@ const blacklist = (publicKey, user) =>
} }
user.get(Key.BLACKLIST).set(publicKey, ack => { user.get(Key.BLACKLIST).set(publicKey, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -100,7 +108,11 @@ const generateHandshakeAddress = async () => {
await /** @type {Promise<void>} */ (new Promise((res, rej) => { await /** @type {Promise<void>} */ (new Promise((res, rej) => {
user.get(Key.CURRENT_HANDSHAKE_ADDRESS).put(address, ack => { user.get(Key.CURRENT_HANDSHAKE_ADDRESS).put(address, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -113,7 +125,11 @@ const generateHandshakeAddress = async () => {
.get(Key.HANDSHAKE_NODES) .get(Key.HANDSHAKE_NODES)
.get(address) .get(address)
.put({ unused: 0 }, ack => { .put({ unused: 0 }, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -150,7 +166,11 @@ const setAvatar = (avatar, user) =>
.get(Key.PROFILE_BINARY) .get(Key.PROFILE_BINARY)
.get(Key.AVATAR) .get(Key.AVATAR)
.put(avatar, ack => { .put(avatar, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -183,7 +203,11 @@ const setDisplayName = (displayName, user) =>
.get(Key.PROFILE) .get(Key.PROFILE)
.get(Key.DISPLAY_NAME) .get(Key.DISPLAY_NAME)
.put(displayName, ack => { .put(displayName, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -210,7 +234,11 @@ const setDefaultSeedProvider = (encryptedSeedProvider, user) =>
user user
.get('preferencesSeedServiceProvider') .get('preferencesSeedServiceProvider')
.put(encryptedSeedProvider, ack => { .put(encryptedSeedProvider, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -235,7 +263,11 @@ const setSeedServiceData = (encryptedSeedServiceData, user) =>
user user
.get('preferencesSeedServiceData') .get('preferencesSeedServiceData')
.put(encryptedSeedServiceData, ack => { .put(encryptedSeedServiceData, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -258,7 +290,11 @@ const setCurrentStreamInfo = (encryptedCurrentStreamInfo, user) =>
throw new TypeError() throw new TypeError()
} }
user.get('currentStreamInfo').put(encryptedCurrentStreamInfo, ack => { user.get('currentStreamInfo').put(encryptedCurrentStreamInfo, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -368,7 +404,11 @@ const sendSpontaneousPayment = async (
.get(currOrderAddress) .get(currOrderAddress)
//@ts-ignore //@ts-ignore
.set(order, ack => { .set(order, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej( rej(
new Error( new Error(
`Error writing order to order node: ${currOrderAddress} for pub: ${to}: ${ack.err}` `Error writing order to order node: ${currOrderAddress} for pub: ${to}: ${ack.err}`
@ -589,7 +629,11 @@ const generateOrderAddress = user =>
const address = uuidv1() const address = uuidv1()
user.get(Key.CURRENT_ORDER_ADDRESS).put(address, ack => { user.get(Key.CURRENT_ORDER_ADDRESS).put(address, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -622,7 +666,11 @@ const setBio = (bio, user) =>
} }
user.get(Key.BIO).put(bio, ack => { user.get(Key.BIO).put(bio, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -635,7 +683,11 @@ const setBio = (bio, user) =>
.get(Key.PROFILE) .get(Key.PROFILE)
.get(Key.BIO) .get(Key.BIO)
.put(bio, ack => { .put(bio, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
reject(new Error(ack.err)) reject(new Error(ack.err))
} else { } else {
resolve() resolve()
@ -664,7 +716,11 @@ const saveSeedBackup = async (mnemonicPhrase, user, SEA) => {
return new Promise((res, rej) => { return new Promise((res, rej) => {
user.get(Key.SEED_BACKUP).put(encryptedSeed, ack => { user.get(Key.SEED_BACKUP).put(encryptedSeed, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -687,7 +743,11 @@ const saveChannelsBackup = async (backups, user, SEA) => {
const encryptBackups = await SEA.encrypt(backups, mySecret) const encryptBackups = await SEA.encrypt(backups, mySecret)
return new Promise((res, rej) => { return new Promise((res, rej) => {
user.get(Key.CHANNELS_BACKUP).put(encryptBackups, ack => { user.get(Key.CHANNELS_BACKUP).put(encryptBackups, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -705,7 +765,11 @@ const setLastSeenApp = () =>
.getUser() .getUser()
.get(Key.LAST_SEEN_APP) .get(Key.LAST_SEEN_APP)
.put(Date.now(), ack => { .put(Date.now(), ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -719,7 +783,11 @@ const setLastSeenApp = () =>
.get(Key.PROFILE) .get(Key.PROFILE)
.get(Key.LAST_SEEN_APP) .get(Key.LAST_SEEN_APP)
.put(Date.now(), ack => { .put(Date.now(), ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -771,7 +839,11 @@ const createPostNew = async (tags, title, content) => {
// @ts-expect-error // @ts-expect-error
newPost, newPost,
ack => { ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res(_n._.get) res(_n._.get)
@ -798,7 +870,11 @@ const deletePost = async (postId, page) => {
.get(Key.POSTS) .get(Key.POSTS)
.get(postId) .get(postId)
.put(null, ack => { .put(null, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -827,7 +903,11 @@ const follow = async (publicKey, isPrivate) => {
.get(publicKey) .get(publicKey)
// @ts-ignore // @ts-ignore
.put(newFollow, ack => { .put(newFollow, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -847,7 +927,11 @@ const unfollow = publicKey =>
.get(Key.FOLLOWS) .get(Key.FOLLOWS)
.get(publicKey) .get(publicKey)
.put(null, ack => { .put(null, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -870,7 +954,11 @@ const initWall = async () => {
.get(Key.WALL) .get(Key.WALL)
.get(Key.NUM_OF_PAGES) .get(Key.NUM_OF_PAGES)
.put(0, ack => { .put(0, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -891,7 +979,11 @@ const initWall = async () => {
unused: null unused: null
}, },
ack => { ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -909,7 +1001,11 @@ const initWall = async () => {
.get('0') .get('0')
.get(Key.COUNT) .get(Key.COUNT)
.put(0, ack => { .put(0, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()

View file

@ -42,7 +42,11 @@ const lastSeenNode = user => {
} }
gotLatestUserAck = false gotLatestUserAck = false
user.get(Key.LAST_SEEN_NODE).put(Date.now(), ack => { user.get(Key.LAST_SEEN_NODE).put(Date.now(), ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
logger.error(`Error inside lastSeenNode user job: ${ack.err}`) logger.error(`Error inside lastSeenNode user job: ${ack.err}`)
} }
gotLatestUserAck = true gotLatestUserAck = true
@ -61,7 +65,11 @@ const lastSeenNode = user => {
.get(Key.PROFILE) .get(Key.PROFILE)
.get(Key.LAST_SEEN_NODE) .get(Key.LAST_SEEN_NODE)
.put(Date.now(), ack => { .put(Date.now(), ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
logger.error(`Error inside lastSeenNode profile job: ${ack.err}`) logger.error(`Error inside lastSeenNode profile job: ${ack.err}`)
} }
gotLatestProfileAck = true gotLatestProfileAck = true

View file

@ -229,7 +229,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
.get(orderID) .get(orderID)
// @ts-expect-error // @ts-expect-error
.put(orderResponse, ack => { .put(orderResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej( rej(
new Error( new Error(
`Error saving encrypted invoice to order to response usergraph: ${ack}` `Error saving encrypted invoice to order to response usergraph: ${ack}`
@ -290,7 +294,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
.get(Key.ORDER_TO_RESPONSE) .get(Key.ORDER_TO_RESPONSE)
.get(ackNode) .get(ackNode)
.put(ordResponse, ack => { .put(ordResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej( rej(
new Error( new Error(
`Error saving encrypted orderAck to order to response usergraph: ${ack}` `Error saving encrypted orderAck to order to response usergraph: ${ack}`
@ -378,7 +386,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
.get(Key.ORDER_TO_RESPONSE) .get(Key.ORDER_TO_RESPONSE)
.get(ackNode) .get(ackNode)
.put(ordResponse, ack => { .put(ordResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej( rej(
new Error( new Error(
`Error saving encrypted orderAck to order to response usergraph: ${ack}` `Error saving encrypted orderAck to order to response usergraph: ${ack}`
@ -425,7 +437,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
.get(Key.ORDER_TO_RESPONSE) .get(Key.ORDER_TO_RESPONSE)
.get(ackNode) .get(ackNode)
.put(serviceResponse, ack => { .put(serviceResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej( rej(
new Error( new Error(
`Error saving encrypted orderAck to order to response usergraph: ${ack}` `Error saving encrypted orderAck to order to response usergraph: ${ack}`
@ -489,7 +505,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
.get(orderID) .get(orderID)
// @ts-expect-error // @ts-expect-error
.put(orderResponse, ack => { .put(orderResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
logger.error( logger.error(
`Error saving encrypted invoice to order to response usergraph: ${ack}` `Error saving encrypted invoice to order to response usergraph: ${ack}`
) )
@ -516,7 +536,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
.get(orderID) .get(orderID)
// @ts-expect-error // @ts-expect-error
.put(orderResponse, ack => { .put(orderResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
logger.error( logger.error(
`Error saving encrypted invoice to order to response usergraph: ${ack}` `Error saving encrypted invoice to order to response usergraph: ${ack}`
) )

View file

@ -20,7 +20,11 @@ const promisify = node => {
pnode.put = data => pnode.put = data =>
new Promise((res, rej) => { new Promise((res, rej) => {
oldPut(data, ack => { oldPut(data, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()
@ -31,7 +35,11 @@ const promisify = node => {
pnode.set = data => pnode.set = data =>
new Promise((res, rej) => { new Promise((res, rej) => {
oldSet(data, ack => { oldSet(data, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res() res()

View file

@ -205,7 +205,11 @@ const put = async (rawPath, value) => {
} /* is primitive */ else { } /* is primitive */ else {
await makePromise((res, rej) => { await makePromise((res, rej) => {
node.put(/** @type {ValidDataValue} */ (theValue), ack => { node.put(/** @type {ValidDataValue} */ (theValue), ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
if (typeof ack.err === 'string') { if (typeof ack.err === 'string') {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
@ -290,7 +294,11 @@ async function set(rawPath, value) {
const id = await makePromise((res, rej) => { const id = await makePromise((res, rej) => {
const subNode = node.set(theValue, ack => { const subNode = node.set(theValue, ack => {
if (ack.err && typeof ack.err !== 'number') { if (
ack.err &&
typeof ack.err !== 'number' &&
typeof ack.err !== 'object'
) {
rej(new Error(ack.err)) rej(new Error(ack.err))
} else { } else {
res(subNode._.get) res(subNode._.get)

12
services/initializer.js Normal file
View file

@ -0,0 +1,12 @@
const API = require('./gunDB/contact-api')
module.exports.InitUserData = async (user) => {
await API.Actions.setDisplayName('anon' + user._.sea.pub.slice(0, 8), user)
await API.Actions.generateHandshakeAddress()
await API.Actions.generateOrderAddress(user)
await API.Actions.initWall()
await API.Actions.setBio('A little bit about myself.', user)
await API.Actions.setDefaultSeedProvider('', user)
await API.Actions.setSeedServiceData('', user)
await API.Actions.setCurrentStreamInfo('', user)
}

View file

@ -201,7 +201,7 @@ const AddTmpChainOrder = async (address, orderInfo) => {
.get(Key.TMP_CHAIN_COORDINATE) .get(Key.TMP_CHAIN_COORDINATE)
.get(addressSHA256) .get(addressSHA256)
.put(encryptedOrderString, ack => { .put(encryptedOrderString, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') {
rej( rej(
new Error( new Error(
`Error saving tmp chain coordinate order to user-graph: ${ack}` `Error saving tmp chain coordinate order to user-graph: ${ack}`
@ -268,7 +268,7 @@ const clearTmpChainOrder = async (address) => {
.get(Key.TMP_CHAIN_COORDINATE) .get(Key.TMP_CHAIN_COORDINATE)
.get(addressSHA256) .get(addressSHA256)
.put(null, ack => { .put(null, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') {
rej( rej(
new Error( new Error(
`Error nulling tmp chain coordinate order to user-graph: ${ack}` `Error nulling tmp chain coordinate order to user-graph: ${ack}`
@ -370,7 +370,7 @@ class SchemaManager {
.get(Key.COORDINATES) .get(Key.COORDINATES)
.get(coordinateSHA256) .get(coordinateSHA256)
.put(encryptedOrderString, ack => { .put(encryptedOrderString, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') {
logger.info(ack) logger.info(ack)
rej( rej(
new Error( new Error(

View file

@ -37,6 +37,7 @@ const Key = require('../services/gunDB/contact-api/key')
const { startedStream, endStream } = require('../services/streams') const { startedStream, endStream } = require('../services/streams')
const channelRequest = require('../utils/lightningServices/channelRequests') const channelRequest = require('../utils/lightningServices/channelRequests')
const TipsForwarder = require('../services/tipsCallback') const TipsForwarder = require('../services/tipsCallback')
const UserInitializer = require('../services/initializer')
const DEFAULT_MAX_NUM_ROUTES_TO_QUERY = 10 const DEFAULT_MAX_NUM_ROUTES_TO_QUERY = 10
const SESSION_ID = uuid() const SESSION_ID = uuid()
@ -268,7 +269,21 @@ module.exports = async (
}) })
app.use(async (req, res, next) => { app.use(async (req, res, next) => {
if (unprotectedRoutes[req.method][req.path]) { if (!req.method) {
logger.error(
'No req.method in unprotected routes middleware.',
'req.path:',
req.path
)
next()
} else if (!req.path) {
logger.error(
'No req.path in unprotected routes middleware.',
'req.method:',
req.method
)
next()
} else if (unprotectedRoutes[req.method][req.path]) {
next() next()
} else { } else {
try { try {
@ -2569,7 +2584,7 @@ module.exports = async (
//this is for OBS notifications, not wired with UI. //this is for OBS notifications, not wired with UI.
ap.get('/api/subscribeStream', (req, res) => { ap.get('/api/subscribeStream', (req, res) => {
try { try {
res.sendFile(path.join(__dirname, '/index.html')) res.sendFile(path.join(__dirname, '../public/obsOverlay.html'))
} catch (e) { } catch (e) {
logger.error(e) logger.error(e)
res.status(500).json({ res.status(500).json({
@ -2625,6 +2640,98 @@ module.exports = async (
}) })
} }
}) })
ap.get('/', (req, res) => {
try {
res.sendFile(path.join(__dirname, '../public/localHomepage.html'))
} catch (e) {
logger.error(e)
res.status(500).json({
errorMessage: e.message
})
}
})
ap.get('/qrCodeGenerator', (req, res) => {
console.log('qrrerrr')
try {
res.sendFile(path.join(__dirname, '../public/qrcode.min.js'))
} catch (e) {
logger.error(e)
res.status(500).json({
errorMessage: e.message
})
}
})
ap.get('/api/accessInfo', async (req, res) => {
if (req.ip !== '127.0.0.1') {
res.json({
field: 'origin',
message: 'invalid origin, cant serve access info'
})
return
}
try {
const [relayId, relayUrl, accessSecret] = await Promise.all([
Storage.getItem('relay/id'),
Storage.getItem('relay/url'),
Storage.getItem('FirstAccessSecret')
])
const response = {}
if (config.cliArgs.tunnel) {
if (!relayId || !relayUrl) {
response.relayNotFound = true
} else {
response.relayId = relayId
response.relayUrl = relayUrl
}
} else {
response.tunnelDisabled = true
}
if (process.env.ALLOW_UNLOCKED_LND !== 'true') {
response.accessSecretDisabled = true
return res.json(response)
}
if (!accessSecret) {
response.accessCodeNotFound = true
res.json(response)
return
}
const codeUsed = await Storage.getItem(
`UnlockedAccessSecrets/${accessSecret}`
)
if (codeUsed !== false) {
response.accessCodeUsed = true
return res.json(response)
}
response.accessCode = accessSecret
res.json(response)
} catch (e) {
logger.error(e)
res.status(500).json({
errorMessage: e.message
})
}
})
ap.post('/api/initUserInformation', async (req, res) => {
try {
const user = require('../services/gunDB/Mediator').getUser()
await UserInitializer.InitUserData(user)
} catch (err) {
logger.error(err)
res
.status(
err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500
)
.json({
errorMessage: err.message
})
}
})
} catch (err) { } catch (err) {
logger.warn('Unhandled rejection:', err) logger.warn('Unhandled rejection:', err)
} }

View file

@ -344,7 +344,8 @@ const server = program => {
app, app,
{ {
...defaults, ...defaults,
lndAddress: program.lndAddress lndAddress: program.lndAddress,
cliArgs: program
}, },
Sockets, Sockets,
{ {
@ -403,15 +404,15 @@ const server = program => {
} }
if(process.env.ALLOW_UNLOCKED_LND === 'true'){ if(process.env.ALLOW_UNLOCKED_LND === 'true'){
const codes = await Storage.valuesWithKeyMatch( const codes = await Storage.valuesWithKeyMatch(/^UnlockedAccessSecrets\//u)
/^UnlockedAccessSecrets\//u
)
if(codes.length === 0){ if(codes.length === 0){
const code = ECC.generateRandomString(12) const code = ECC.generateRandomString(12)
await Storage.setItem(`UnlockedAccessSecrets/${code}`, false) await Storage.setItem(`UnlockedAccessSecrets/${code}`, false)
logger.info('the access code is:' + code) await Storage.setItem(`FirstAccessSecret`, code)
} else if (codes.length === 1 || codes[0] === false) { logger.info("the access code is:"+code)
logger.info('the access code is:' + codes[0]) } else if(codes.length === 1 && codes[0] === false){
const firstCode = await Storage.getItem("FirstAccessSecret")
logger.info("the access code is:"+firstCode)
} }
} }
serverInstance.listen(serverPort, serverHost) serverInstance.listen(serverPort, serverHost)

View file

@ -12,6 +12,9 @@ module.exports = {
// //
"/api/gun/auth": true, "/api/gun/auth": true,
"/api/subscribeStream":true, "/api/subscribeStream":true,
"/":true,
"/api/accessInfo":true,
"/qrCodeGenerator":true,
}, },
POST: { POST: {
"/api/lnd/connect": true, "/api/lnd/connect": true,
@ -33,5 +36,5 @@ module.exports = {
PUT: {}, PUT: {},
DELETE: {} DELETE: {}
}, },
nonEncryptedRoutes: ['/api/security/exchangeKeys', "/api/encryption/exchange", '/healthz', '/ping', '/tunnel/status', '/api/lnd/wallet/status', '/api/gun/auth',"/api/subscribeStream"] nonEncryptedRoutes: ['/api/security/exchangeKeys', "/api/encryption/exchange", '/healthz', '/ping', '/tunnel/status', '/api/lnd/wallet/status', '/api/gun/auth',"/api/subscribeStream", "/", "/api/accessInfo","/qrCodeGenerator"]
} }