Merge branch 'master' into bug/deprecate-rsa-encryption
This commit is contained in:
commit
c35ffef345
20 changed files with 435 additions and 135 deletions
|
|
@ -19,4 +19,4 @@ TORRENT_SEED_TOKEN=jibberish
|
|||
# "default" or "hosting"
|
||||
DEPLOYMENT_TYPE=hosting
|
||||
# allow to create a user with unlocked lnd
|
||||
ALLOW_UNLOCKED_LND="true"
|
||||
ALLOW_UNLOCKED_LND=false
|
||||
|
|
@ -1 +1,2 @@
|
|||
*.ts
|
||||
/public/*.min.js
|
||||
14
.github/workflows/main.yml
vendored
14
.github/workflows/main.yml
vendored
|
|
@ -19,7 +19,19 @@ jobs:
|
|||
repo: ['shocknet/Wizard']
|
||||
runs-on: ubuntu-latest
|
||||
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
|
||||
with:
|
||||
token: ${{ secrets.REPO_ACCESS_TOKEN }}
|
||||
|
|
|
|||
17
composers/windows-2network-alice/docker-compose.yml
Normal file
17
composers/windows-2network-alice/docker-compose.yml
Normal 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'
|
||||
|
|
@ -25,6 +25,10 @@
|
|||
axe: false
|
||||
})
|
||||
|
||||
setInterval(() => {
|
||||
console.log('peers', Object.keys(gun.back('opt').peers))
|
||||
},5000)
|
||||
|
||||
user = gun.user()
|
||||
|
||||
node = gun.get('foo').get('bar')
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "shockapi",
|
||||
"version": "2021.9.8",
|
||||
"version": "2021.9.19",
|
||||
"description": "",
|
||||
"main": "src/server.js",
|
||||
"scripts": {
|
||||
|
|
|
|||
78
public/localHomepage.html
Normal file
78
public/localHomepage.html
Normal 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
1
public/qrcode.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -14,7 +14,6 @@ require('gun/lib/open')
|
|||
require('gun/lib/load')
|
||||
//@ts-ignore
|
||||
const { encryptedEmit, encryptedOn } = require('../../../utils/ECC/socket')
|
||||
const Key = require('../contact-api/key')
|
||||
|
||||
/** @type {import('../contact-api/SimpleGUN').ISEA} */
|
||||
// @ts-ignore
|
||||
|
|
@ -328,29 +327,6 @@ const authenticate = async (alias, pass, __user) => {
|
|||
// clock skew
|
||||
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
|
||||
} else {
|
||||
throw new Error('Unknown error.')
|
||||
|
|
@ -367,29 +343,6 @@ const authenticate = async (alias, pass, __user) => {
|
|||
// clock skew
|
||||
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
|
||||
API.Jobs.onOrders(_user, gun, mySEA)
|
||||
API.Jobs.lastSeenNode(_user)
|
||||
|
|
@ -424,29 +377,6 @@ const authenticate = async (alias, pass, __user) => {
|
|||
|
||||
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.lastSeenNode(_user)
|
||||
|
||||
|
|
@ -588,17 +518,7 @@ const register = async (alias, pass) => {
|
|||
// don't work
|
||||
instantiateGun()
|
||||
|
||||
return authenticate(alias, pass).then(async pub => {
|
||||
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
|
||||
})
|
||||
return authenticate(alias, pass)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
|
|
|||
|
|
@ -58,7 +58,11 @@ const authenticate = (user, pass, userNode) =>
|
|||
}
|
||||
|
||||
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))
|
||||
} else if (!userNode.is) {
|
||||
reject(new Error('authentication failed'))
|
||||
|
|
@ -81,7 +85,11 @@ const blacklist = (publicKey, user) =>
|
|||
}
|
||||
|
||||
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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -100,7 +108,11 @@ const generateHandshakeAddress = async () => {
|
|||
|
||||
await /** @type {Promise<void>} */ (new Promise((res, rej) => {
|
||||
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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -113,7 +125,11 @@ const generateHandshakeAddress = async () => {
|
|||
.get(Key.HANDSHAKE_NODES)
|
||||
.get(address)
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -150,7 +166,11 @@ const setAvatar = (avatar, user) =>
|
|||
.get(Key.PROFILE_BINARY)
|
||||
.get(Key.AVATAR)
|
||||
.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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -183,7 +203,11 @@ const setDisplayName = (displayName, user) =>
|
|||
.get(Key.PROFILE)
|
||||
.get(Key.DISPLAY_NAME)
|
||||
.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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -210,7 +234,11 @@ const setDefaultSeedProvider = (encryptedSeedProvider, user) =>
|
|||
user
|
||||
.get('preferencesSeedServiceProvider')
|
||||
.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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -235,7 +263,11 @@ const setSeedServiceData = (encryptedSeedServiceData, user) =>
|
|||
user
|
||||
.get('preferencesSeedServiceData')
|
||||
.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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -258,7 +290,11 @@ const setCurrentStreamInfo = (encryptedCurrentStreamInfo, user) =>
|
|||
throw new TypeError()
|
||||
}
|
||||
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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -368,7 +404,11 @@ const sendSpontaneousPayment = async (
|
|||
.get(currOrderAddress)
|
||||
//@ts-ignore
|
||||
.set(order, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
rej(
|
||||
new Error(
|
||||
`Error writing order to order node: ${currOrderAddress} for pub: ${to}: ${ack.err}`
|
||||
|
|
@ -589,7 +629,11 @@ const generateOrderAddress = user =>
|
|||
const address = uuidv1()
|
||||
|
||||
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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -622,7 +666,11 @@ const setBio = (bio, user) =>
|
|||
}
|
||||
|
||||
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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -635,7 +683,11 @@ const setBio = (bio, user) =>
|
|||
.get(Key.PROFILE)
|
||||
.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))
|
||||
} else {
|
||||
resolve()
|
||||
|
|
@ -664,7 +716,11 @@ const saveSeedBackup = async (mnemonicPhrase, user, SEA) => {
|
|||
|
||||
return new Promise((res, rej) => {
|
||||
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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -687,7 +743,11 @@ const saveChannelsBackup = async (backups, user, SEA) => {
|
|||
const encryptBackups = await SEA.encrypt(backups, mySecret)
|
||||
return new Promise((res, rej) => {
|
||||
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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -705,7 +765,11 @@ const setLastSeenApp = () =>
|
|||
.getUser()
|
||||
.get(Key.LAST_SEEN_APP)
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -719,7 +783,11 @@ const setLastSeenApp = () =>
|
|||
.get(Key.PROFILE)
|
||||
.get(Key.LAST_SEEN_APP)
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -771,7 +839,11 @@ const createPostNew = async (tags, title, content) => {
|
|||
// @ts-expect-error
|
||||
newPost,
|
||||
ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
rej(new Error(ack.err))
|
||||
} else {
|
||||
res(_n._.get)
|
||||
|
|
@ -798,7 +870,11 @@ const deletePost = async (postId, page) => {
|
|||
.get(Key.POSTS)
|
||||
.get(postId)
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -827,7 +903,11 @@ const follow = async (publicKey, isPrivate) => {
|
|||
.get(publicKey)
|
||||
// @ts-ignore
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -847,7 +927,11 @@ const unfollow = publicKey =>
|
|||
.get(Key.FOLLOWS)
|
||||
.get(publicKey)
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -870,7 +954,11 @@ const initWall = async () => {
|
|||
.get(Key.WALL)
|
||||
.get(Key.NUM_OF_PAGES)
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -891,7 +979,11 @@ const initWall = async () => {
|
|||
unused: 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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -909,7 +1001,11 @@ const initWall = async () => {
|
|||
.get('0')
|
||||
.get(Key.COUNT)
|
||||
.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))
|
||||
} else {
|
||||
res()
|
||||
|
|
|
|||
|
|
@ -42,7 +42,11 @@ const lastSeenNode = user => {
|
|||
}
|
||||
gotLatestUserAck = false
|
||||
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}`)
|
||||
}
|
||||
gotLatestUserAck = true
|
||||
|
|
@ -61,7 +65,11 @@ const lastSeenNode = user => {
|
|||
.get(Key.PROFILE)
|
||||
.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 profile job: ${ack.err}`)
|
||||
}
|
||||
gotLatestProfileAck = true
|
||||
|
|
|
|||
|
|
@ -229,7 +229,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
|
|||
.get(orderID)
|
||||
// @ts-expect-error
|
||||
.put(orderResponse, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
rej(
|
||||
new Error(
|
||||
`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(ackNode)
|
||||
.put(ordResponse, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
rej(
|
||||
new Error(
|
||||
`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(ackNode)
|
||||
.put(ordResponse, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
rej(
|
||||
new Error(
|
||||
`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(ackNode)
|
||||
.put(serviceResponse, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
rej(
|
||||
new Error(
|
||||
`Error saving encrypted orderAck to order to response usergraph: ${ack}`
|
||||
|
|
@ -489,7 +505,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
|
|||
.get(orderID)
|
||||
// @ts-expect-error
|
||||
.put(orderResponse, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
logger.error(
|
||||
`Error saving encrypted invoice to order to response usergraph: ${ack}`
|
||||
)
|
||||
|
|
@ -516,7 +536,11 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
|
|||
.get(orderID)
|
||||
// @ts-expect-error
|
||||
.put(orderResponse, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (
|
||||
ack.err &&
|
||||
typeof ack.err !== 'number' &&
|
||||
typeof ack.err !== 'object'
|
||||
) {
|
||||
logger.error(
|
||||
`Error saving encrypted invoice to order to response usergraph: ${ack}`
|
||||
)
|
||||
|
|
|
|||
|
|
@ -20,7 +20,11 @@ const promisify = node => {
|
|||
pnode.put = data =>
|
||||
new Promise((res, rej) => {
|
||||
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))
|
||||
} else {
|
||||
res()
|
||||
|
|
@ -31,7 +35,11 @@ const promisify = node => {
|
|||
pnode.set = data =>
|
||||
new Promise((res, rej) => {
|
||||
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))
|
||||
} else {
|
||||
res()
|
||||
|
|
|
|||
|
|
@ -205,7 +205,11 @@ const put = async (rawPath, value) => {
|
|||
} /* is primitive */ else {
|
||||
await makePromise((res, rej) => {
|
||||
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') {
|
||||
rej(new Error(ack.err))
|
||||
} else {
|
||||
|
|
@ -290,7 +294,11 @@ async function set(rawPath, value) {
|
|||
|
||||
const id = await makePromise((res, rej) => {
|
||||
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))
|
||||
} else {
|
||||
res(subNode._.get)
|
||||
|
|
|
|||
12
services/initializer.js
Normal file
12
services/initializer.js
Normal 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)
|
||||
}
|
||||
|
|
@ -201,7 +201,7 @@ const AddTmpChainOrder = async (address, orderInfo) => {
|
|||
.get(Key.TMP_CHAIN_COORDINATE)
|
||||
.get(addressSHA256)
|
||||
.put(encryptedOrderString, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') {
|
||||
rej(
|
||||
new Error(
|
||||
`Error saving tmp chain coordinate order to user-graph: ${ack}`
|
||||
|
|
@ -268,7 +268,7 @@ const clearTmpChainOrder = async (address) => {
|
|||
.get(Key.TMP_CHAIN_COORDINATE)
|
||||
.get(addressSHA256)
|
||||
.put(null, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') {
|
||||
rej(
|
||||
new Error(
|
||||
`Error nulling tmp chain coordinate order to user-graph: ${ack}`
|
||||
|
|
@ -370,7 +370,7 @@ class SchemaManager {
|
|||
.get(Key.COORDINATES)
|
||||
.get(coordinateSHA256)
|
||||
.put(encryptedOrderString, ack => {
|
||||
if (ack.err && typeof ack.err !== 'number') {
|
||||
if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') {
|
||||
logger.info(ack)
|
||||
rej(
|
||||
new Error(
|
||||
|
|
|
|||
111
src/routes.js
111
src/routes.js
|
|
@ -37,6 +37,7 @@ const Key = require('../services/gunDB/contact-api/key')
|
|||
const { startedStream, endStream } = require('../services/streams')
|
||||
const channelRequest = require('../utils/lightningServices/channelRequests')
|
||||
const TipsForwarder = require('../services/tipsCallback')
|
||||
const UserInitializer = require('../services/initializer')
|
||||
|
||||
const DEFAULT_MAX_NUM_ROUTES_TO_QUERY = 10
|
||||
const SESSION_ID = uuid()
|
||||
|
|
@ -268,7 +269,21 @@ module.exports = async (
|
|||
})
|
||||
|
||||
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()
|
||||
} else {
|
||||
try {
|
||||
|
|
@ -2569,7 +2584,7 @@ module.exports = async (
|
|||
//this is for OBS notifications, not wired with UI.
|
||||
ap.get('/api/subscribeStream', (req, res) => {
|
||||
try {
|
||||
res.sendFile(path.join(__dirname, '/index.html'))
|
||||
res.sendFile(path.join(__dirname, '../public/obsOverlay.html'))
|
||||
} catch (e) {
|
||||
logger.error(e)
|
||||
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) {
|
||||
logger.warn('Unhandled rejection:', err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -344,7 +344,8 @@ const server = program => {
|
|||
app,
|
||||
{
|
||||
...defaults,
|
||||
lndAddress: program.lndAddress
|
||||
lndAddress: program.lndAddress,
|
||||
cliArgs: program
|
||||
},
|
||||
Sockets,
|
||||
{
|
||||
|
|
@ -403,15 +404,15 @@ const server = program => {
|
|||
}
|
||||
|
||||
if(process.env.ALLOW_UNLOCKED_LND === 'true'){
|
||||
const codes = await Storage.valuesWithKeyMatch(
|
||||
/^UnlockedAccessSecrets\//u
|
||||
)
|
||||
const codes = await Storage.valuesWithKeyMatch(/^UnlockedAccessSecrets\//u)
|
||||
if(codes.length === 0){
|
||||
const code = ECC.generateRandomString(12)
|
||||
await Storage.setItem(`UnlockedAccessSecrets/${code}`, false)
|
||||
logger.info('the access code is:' + code)
|
||||
} else if (codes.length === 1 || codes[0] === false) {
|
||||
logger.info('the access code is:' + codes[0])
|
||||
await Storage.setItem(`FirstAccessSecret`, code)
|
||||
logger.info("the access code is:"+code)
|
||||
} 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)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@ module.exports = {
|
|||
//
|
||||
"/api/gun/auth": true,
|
||||
"/api/subscribeStream":true,
|
||||
"/":true,
|
||||
"/api/accessInfo":true,
|
||||
"/qrCodeGenerator":true,
|
||||
},
|
||||
POST: {
|
||||
"/api/lnd/connect": true,
|
||||
|
|
@ -33,5 +36,5 @@ module.exports = {
|
|||
PUT: {},
|
||||
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"]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue