149 lines
4.3 KiB
JavaScript
149 lines
4.3 KiB
JavaScript
import test from 'brittle'
|
|
import b4a from 'b4a'
|
|
import Hyperdrive from 'hyperdrive'
|
|
import Corestore from 'corestore'
|
|
import { mkdirSync, rmSync } from 'node:fs'
|
|
import path from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
import { createVfs } from './lib/vfs.js'
|
|
import { createBareOsIpc } from './lib/bare-os-ipc.js'
|
|
import {
|
|
bareHolesailManagedPersistentSeedLooksValid,
|
|
bareHolesailManagedReadState,
|
|
bareHolesailManagedWriteState
|
|
} from './lib/bare-holesail-managed.js'
|
|
import {
|
|
bareOsSshHolesailConnectionId,
|
|
ensureBareOsSshHolesailTunnel
|
|
} from './lib/bare-os-ssh-holesail.js'
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
|
|
function testCorestoreDir(name) {
|
|
const dir = path.join(
|
|
__dirname,
|
|
'.test-data',
|
|
name + '-' + process.pid + '-' + Math.random().toString(36).slice(2)
|
|
)
|
|
mkdirSync(path.dirname(dir), { recursive: true })
|
|
return dir
|
|
}
|
|
|
|
function testCtx(drive, personal, env = {}) {
|
|
const shellEnv = {
|
|
HOME: '/home/user',
|
|
PATH: '/bin',
|
|
USER: 'user',
|
|
UID: '1000',
|
|
GID: '1000',
|
|
PWD: '/home/user',
|
|
BARE_OS_EXIT_STATUS: '0',
|
|
BARE_OS_SSH_LISTEN_PORT: '0',
|
|
...env
|
|
}
|
|
const bareOsIpc = createBareOsIpc()
|
|
const vfs = createVfs(drive, personal, shellEnv, null, { bareOsIpc })
|
|
return {
|
|
drive,
|
|
personalDrive: personal,
|
|
vfs,
|
|
bareOsIpc,
|
|
env: shellEnv,
|
|
console,
|
|
b4a
|
|
}
|
|
}
|
|
|
|
test('ensureBareOsSshHolesailTunnel persists managed server entry (2222 / 127.0.0.1)', async (t) => {
|
|
const dir = testCorestoreDir('sshhs')
|
|
const store = new Corestore(dir)
|
|
const sys = new Hyperdrive(store)
|
|
const personal = new Hyperdrive(store.namespace('psshhs'))
|
|
await sys.ready()
|
|
await personal.ready()
|
|
const ctx = testCtx(sys, personal, {
|
|
USER: 'guest',
|
|
HOME: '/home/guest',
|
|
UID: '65534',
|
|
GID: '65534',
|
|
PWD: '/home/guest'
|
|
})
|
|
const p = 2222
|
|
const h = '127.0.0.1'
|
|
const id = bareOsSshHolesailConnectionId(p)
|
|
const empty = { version: 1, connections: {} }
|
|
await bareHolesailManagedWriteState(
|
|
ctx,
|
|
/** @type {Record<string, string | undefined>} */ (ctx.env),
|
|
empty
|
|
)
|
|
await ensureBareOsSshHolesailTunnel(ctx, ctx.env, p, h)
|
|
const { state } = await bareHolesailManagedReadState(
|
|
ctx,
|
|
/** @type {Record<string, string | undefined>} */ (ctx.env)
|
|
)
|
|
const row = state.connections[id]
|
|
t.ok(row && /** @type {{ server?: boolean }} */ (row).server === true)
|
|
t.is(/** @type {{ port?: number }} */ (row).port, p)
|
|
t.is(/** @type {{ host?: string }} */ (row).host, h)
|
|
const seedStr = /** @type {{ seed?: string }} */ (row).seed
|
|
t.ok(seedStr && bareHolesailManagedPersistentSeedLooksValid(seedStr))
|
|
await store.close()
|
|
rmSync(dir, { recursive: true, force: true })
|
|
})
|
|
|
|
test('ensureBareOsSshHolesailTunnel preserves hs key and migrates seed like www', async (t) => {
|
|
const dir = testCorestoreDir('sshhskey')
|
|
const store = new Corestore(dir)
|
|
const sys = new Hyperdrive(store)
|
|
const personal = new Hyperdrive(store.namespace('psshsk'))
|
|
await sys.ready()
|
|
await personal.ready()
|
|
const ctx = testCtx(sys, personal, {
|
|
USER: 'guest',
|
|
HOME: '/home/guest',
|
|
UID: '65534',
|
|
GID: '65534',
|
|
PWD: '/home/guest'
|
|
})
|
|
const p = 2222
|
|
const h = '127.0.0.1'
|
|
const id = bareOsSshHolesailConnectionId(p)
|
|
const keepKey = 'hs://0000keepthiskey000000000000000000000000000000000000000000'
|
|
await bareHolesailManagedWriteState(
|
|
ctx,
|
|
/** @type {Record<string, string | undefined>} */ (ctx.env),
|
|
{
|
|
version: 1,
|
|
connections: {
|
|
[id]: {
|
|
server: true,
|
|
port: 19999,
|
|
host: '0.0.0.0',
|
|
enabled: true,
|
|
key: keepKey
|
|
}
|
|
}
|
|
}
|
|
)
|
|
await ensureBareOsSshHolesailTunnel(ctx, ctx.env, p, h)
|
|
const { state } = await bareHolesailManagedReadState(
|
|
ctx,
|
|
/** @type {Record<string, string | undefined>} */ (ctx.env)
|
|
)
|
|
const row = /** @type {{ port?: number, host?: string, key?: string }} */ (
|
|
state.connections[id]
|
|
)
|
|
t.is(row.port, p)
|
|
t.is(row.host, h)
|
|
t.is(row.key, keepKey)
|
|
const migratedSeed = /** @type {{ seed?: string }} */ (row).seed
|
|
t.ok(migratedSeed && bareHolesailManagedPersistentSeedLooksValid(migratedSeed))
|
|
t.is(
|
|
migratedSeed,
|
|
'keepthiskey000000000000000000000000000000000000000000'.toLowerCase()
|
|
)
|
|
await store.close()
|
|
rmSync(dir, { recursive: true, force: true })
|
|
})
|