X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftools%2Fpeertube-auth.ts;h=051156d6682396352953e46c0dca577b3ca97321;hb=424aeb12bd16f5d6763dfa2860d113cc93876405;hp=33438811eed2037e35314f6052e1c2209d2afdc7;hpb=8704acf49efc770d73bf07c10468ed8c74d28a83;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tools/peertube-auth.ts b/server/tools/peertube-auth.ts index 33438811e..051156d66 100644 --- a/server/tools/peertube-auth.ts +++ b/server/tools/peertube-auth.ts @@ -1,42 +1,53 @@ -import * as program from 'commander' -import * as prompt from 'prompt' -const Table = require('cli-table') -import { getSettings, writeSettings, netrc } from './cli' -import { isHostValid } from '../helpers/custom-validators/servers' +import CliTable3 from 'cli-table3' +import { OptionValues, program } from 'commander' import { isUserUsernameValid } from '../helpers/custom-validators/users' +import { assignToken, buildServer, getNetrc, getSettings, writeSettings } from './cli' -function delInstance (url: string) { - return new Promise((res, rej): void => { - getSettings() - .then(async (settings) => { - settings.remotes.splice(settings.remotes.indexOf(url)) - await writeSettings(settings) - delete netrc.machines[url] - netrc.save() - res() - }) - .catch(err => rej(err)) - }) +import prompt = require('prompt') + +async function delInstance (url: string) { + const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ]) + + const index = settings.remotes.indexOf(url) + settings.remotes.splice(index) + + if (settings.default === index) settings.default = -1 + + await writeSettings(settings) + + delete netrc.machines[url] + + await netrc.save() } -async function setInstance (url: string, username: string, password: string) { - return new Promise((res, rej): void => { - getSettings() - .then(async settings => { - if (settings.remotes.indexOf(url) === -1) { - settings.remotes.push(url) - } - await writeSettings(settings) - netrc.machines[url] = { login: username, password } - netrc.save() - res() - }) - .catch(err => rej(err)) - }) +async function setInstance (url: string, username: string, password: string, isDefault: boolean) { + const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ]) + + if (settings.remotes.includes(url) === false) { + settings.remotes.push(url) + } + + if (isDefault || settings.remotes.length === 1) { + settings.default = settings.remotes.length - 1 + } + + await writeSettings(settings) + + netrc.machines[url] = { login: username, password } + await netrc.save() } function isURLaPeerTubeInstance (url: string) { - return isHostValid(url) || (url.includes('localhost')) + return url.startsWith('http://') || url.startsWith('https://') +} + +function stripExtraneousFromPeerTubeUrl (url: string) { + // Get everything before the 3rd /. + const urlLength = url.includes('/', 8) + ? url.indexOf('/', 8) + : url.length + + return url.substring(0, urlLength) } program @@ -50,7 +61,8 @@ program .option('-U, --username ', 'Username') .option('-p, --password ', 'Password') .option('--default', 'add the entry as the new default') - .action(options => { + .action((options: OptionValues) => { + /* eslint-disable no-import-assign */ prompt.override = options prompt.start() prompt.get({ @@ -58,6 +70,7 @@ program url: { description: 'instance url', conform: (value) => isURLaPeerTubeInstance(value), + message: 'It should be an URL (https://peertube.example.com)', required: true }, username: { @@ -71,67 +84,85 @@ program required: true } } - }, (_, result) => { - setInstance(result.url, result.username, result.password) + }, async (_, result) => { + + // Check credentials + try { + // Strip out everything after the domain:port. + // See https://github.com/Chocobozzz/PeerTube/issues/3520 + result.url = stripExtraneousFromPeerTubeUrl(result.url) + + const server = buildServer(result.url) + await assignToken(server, result.username, result.password) + } catch (err) { + console.error(err.message) + process.exit(-1) + } + + await setInstance(result.url, result.username, result.password, options.default) + + process.exit(0) }) }) program .command('del ') .description('unregisters a remote instance') - .action((url) => { - delInstance(url) + .action(async url => { + await delInstance(url) + + process.exit(0) }) program .command('list') .description('lists registered remote instances') - .action(() => { - getSettings() - .then(settings => { - const table = new Table({ - head: ['instance', 'login'], - colWidths: [30, 30] - }) - netrc.loadSync() - settings.remotes.forEach(element => { - table.push([ - element, - netrc.machines[element].login - ]) - }) - - console.log(table.toString()) - }) + .action(async () => { + const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ]) + + const table = new CliTable3({ + head: [ 'instance', 'login' ], + colWidths: [ 30, 30 ] + }) as any + + settings.remotes.forEach(element => { + if (!netrc.machines[element]) return + + table.push([ + element, + netrc.machines[element].login + ]) + }) + + console.log(table.toString()) + + process.exit(0) }) program .command('set-default ') .description('set an existing entry as default') - .action((url) => { - getSettings() - .then(settings => { - const instanceExists = settings.remotes.indexOf(url) !== -1 - - if (instanceExists) { - settings.default = settings.remotes.indexOf(url) - writeSettings(settings) - } else { - console.log(' is not a registered instance.') - process.exit(-1) - } - }) + .action(async url => { + const settings = await getSettings() + const instanceExists = settings.remotes.includes(url) + + if (instanceExists) { + settings.default = settings.remotes.indexOf(url) + await writeSettings(settings) + + process.exit(0) + } else { + console.log(' is not a registered instance.') + process.exit(-1) + } }) -program.on('--help', function () { - console.log(' Examples:') - console.log() - console.log(' $ peertube add -u peertube.cpy.re -U "PEERTUBE_USER" --password "PEERTUBE_PASSWORD"') - console.log(' $ peertube add -u peertube.cpy.re -U root') - console.log(' $ peertube list') - console.log(' $ peertube del peertube.cpy.re') - console.log() -}) +program.addHelpText('after', '\n\n Examples:\n\n' + + ' $ peertube auth add -u https://peertube.cpy.re -U "PEERTUBE_USER" --password "PEERTUBE_PASSWORD"\n' + + ' $ peertube auth add -u https://peertube.cpy.re -U root\n' + + ' $ peertube auth list\n' + + ' $ peertube auth del https://peertube.cpy.re\n' +) if (!process.argv.slice(2).length) { program.outputHelp()