From d0a0fa429d4651710ed951a3c11af0219e408964 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 13 Jul 2021 11:44:16 +0200 Subject: [PATCH] Adapt CLI to new commands --- server/tools/cli.ts | 31 +++++++++++++---------- server/tools/peertube-auth.ts | 6 ++--- server/tools/peertube-get-access-token.ts | 10 +++++--- server/tools/peertube-import-videos.ts | 12 ++++----- server/tools/peertube-plugins.ts | 18 ++++++------- server/tools/peertube-redundancy.ts | 14 +++++----- server/tools/peertube-upload.ts | 9 +++---- shared/extra-utils/users/login-command.ts | 7 +++-- 8 files changed, 55 insertions(+), 52 deletions(-) diff --git a/server/tools/cli.ts b/server/tools/cli.ts index 0528859a4..3e0e03b97 100644 --- a/server/tools/cli.ts +++ b/server/tools/cli.ts @@ -3,12 +3,10 @@ import { Netrc } from 'netrc-parser' import { join } from 'path' import { createLogger, format, transports } from 'winston' import { assignCommands, ServerInfo } from '@shared/extra-utils' -import { getAccessToken } from '@shared/extra-utils/users/login' import { getMyUserInformation } from '@shared/extra-utils/users/users' import { User, UserRole } from '@shared/models' -import { root } from '../../shared/extra-utils/miscs/miscs' import { VideoPrivacy } from '../../shared/models/videos' -import { getAppNumber, isTestInstance } from '../helpers/core-utils' +import { getAppNumber, isTestInstance, root } from '../helpers/core-utils' let configName = 'PeerTube/CLI' if (isTestInstance()) configName += `-${getAppNumber()}` @@ -17,9 +15,9 @@ const config = require('application-config')(configName) const version = require('../../../package.json').version -async function getAdminTokenOrDie (url: string, username: string, password: string) { - const accessToken = await getAccessToken(url, username, password) - const resMe = await getMyUserInformation(url, accessToken) +async function getAdminTokenOrDie (server: ServerInfo, username: string, password: string) { + const accessToken = await server.loginCommand.getAccessToken(username, password) + const resMe = await getMyUserInformation(server.url, accessToken) const me: User = resMe.body if (me.role !== UserRole.ADMINISTRATOR) { @@ -30,10 +28,6 @@ async function getAdminTokenOrDie (url: string, username: string, password: stri return accessToken } -async function getAccessTokenOrDie (url: string, username: string, password: string) { - return getAccessToken(url, username, password) -} - interface Settings { remotes: any[] default: number @@ -187,13 +181,22 @@ function getServerCredentials (program: Command) { }) } -function buildServer (url: string, accessToken?: string): ServerInfo { - const server = { url, accessToken, internalServerNumber: undefined } +function buildServer (url: string): ServerInfo { + const server = { url, internalServerNumber: undefined } assignCommands(server) return server } +async function assignToken (server: ServerInfo, username: string, password: string) { + const bodyClient = await server.loginCommand.getClient() + const client = { id: bodyClient.client_id, secret: bodyClient.client_secret } + + const body = await server.loginCommand.login({ client, user: { username, password } }) + + server.accessToken = body.access_token +} + function getLogger (logLevel = 'info') { const logLevels = { 0: 0, @@ -241,6 +244,6 @@ export { buildVideoAttributesFromCommander, getAdminTokenOrDie, - getAccessTokenOrDie, - buildServer + buildServer, + assignToken } diff --git a/server/tools/peertube-auth.ts b/server/tools/peertube-auth.ts index 1934e7986..b9f4ef4f8 100644 --- a/server/tools/peertube-auth.ts +++ b/server/tools/peertube-auth.ts @@ -5,9 +5,8 @@ registerTSPaths() import { OptionValues, program } from 'commander' import * as prompt from 'prompt' -import { getNetrc, getSettings, writeSettings } from './cli' +import { assignToken, buildServer, getNetrc, getSettings, writeSettings } from './cli' import { isUserUsernameValid } from '../helpers/custom-validators/users' -import { getAccessToken } from '../../shared/extra-utils' import * as CliTable3 from 'cli-table3' async function delInstance (url: string) { @@ -97,7 +96,8 @@ program // @see https://github.com/Chocobozzz/PeerTube/issues/3520 result.url = stripExtraneousFromPeerTubeUrl(result.url) - await getAccessToken(result.url, result.username, result.password) + const server = buildServer(result.url) + await assignToken(server, result.username, result.password) } catch (err) { console.error(err.message) process.exit(-1) diff --git a/server/tools/peertube-get-access-token.ts b/server/tools/peertube-get-access-token.ts index 5868d0548..a67de9180 100644 --- a/server/tools/peertube-get-access-token.ts +++ b/server/tools/peertube-get-access-token.ts @@ -2,7 +2,7 @@ import { registerTSPaths } from '../helpers/register-ts-paths' registerTSPaths() import { program } from 'commander' -import { getAccessToken } from '../../shared/extra-utils' +import { assignToken, buildServer } from './cli' program .option('-u, --url ', 'Server url') @@ -24,9 +24,11 @@ if ( process.exit(-1) } -getAccessToken(options.url, options.username, options.password) - .then(accessToken => { - console.log(accessToken) +const server = buildServer(options.url) + +assignToken(server, options.username, options.password) + .then(() => { + console.log(server.accessToken) process.exit(0) }) .catch(err => { diff --git a/server/tools/peertube-import-videos.ts b/server/tools/peertube-import-videos.ts index a546a8dbe..0a4d6fa6e 100644 --- a/server/tools/peertube-import-videos.ts +++ b/server/tools/peertube-import-videos.ts @@ -14,10 +14,10 @@ import { sha256 } from '../helpers/core-utils' import { doRequestAndSaveToFile } from '../helpers/requests' import { CONSTRAINTS_FIELDS } from '../initializers/constants' import { + assignToken, buildCommonVideoOptions, buildServer, buildVideoAttributesFromCommander, - getAccessTokenOrDie, getLogger, getServerCredentials } from './cli' @@ -232,8 +232,8 @@ async function uploadVideoOnPeerTube (parameters: { tags } - let accessToken = await getAccessTokenOrDie(url, username, password) - const server = buildServer(url, accessToken) + const server = buildServer(url) + await assignToken(server, username, password) const videoAttributes = await buildVideoAttributesFromCommander(server, program, defaultAttributes) @@ -247,14 +247,14 @@ async function uploadVideoOnPeerTube (parameters: { log.info('\nUploading on PeerTube video "%s".', videoAttributes.name) try { - await uploadVideo(url, accessToken, videoAttributes) + await uploadVideo(url, server.accessToken, videoAttributes) } catch (err) { if (err.message.indexOf('401') !== -1) { log.info('Got 401 Unauthorized, token may have expired, renewing token and retry.') - accessToken = await getAccessTokenOrDie(url, username, password) + server.accessToken = await server.loginCommand.getAccessToken(username, password) - await uploadVideo(url, accessToken, videoAttributes) + await uploadVideo(url, server.accessToken, videoAttributes) } else { exitError(err.message) } diff --git a/server/tools/peertube-plugins.ts b/server/tools/peertube-plugins.ts index 63541bf2c..22a09b779 100644 --- a/server/tools/peertube-plugins.ts +++ b/server/tools/peertube-plugins.ts @@ -4,7 +4,7 @@ import { registerTSPaths } from '../helpers/register-ts-paths' registerTSPaths() import { program, Command, OptionValues } from 'commander' -import { buildServer, getAdminTokenOrDie, getServerCredentials } from './cli' +import { assignToken, buildServer, getServerCredentials } from './cli' import { PluginType } from '../../shared/models' import { isAbsolute } from 'path' import * as CliTable3 from 'cli-table3' @@ -62,8 +62,8 @@ program.parse(process.argv) async function pluginsListCLI (command: Command, options: OptionValues) { const { url, username, password } = await getServerCredentials(command) - const token = await getAdminTokenOrDie(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) let pluginType: PluginType if (options.onlyThemes) pluginType = PluginType.THEME @@ -105,8 +105,8 @@ async function installPluginCLI (command: Command, options: OptionValues) { } const { url, username, password } = await getServerCredentials(command) - const token = await getAdminTokenOrDie(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) try { await server.pluginsCommand.install({ npmName: options.npmName, path: options.path }) @@ -132,8 +132,8 @@ async function updatePluginCLI (command: Command, options: OptionValues) { } const { url, username, password } = await getServerCredentials(command) - const token = await getAdminTokenOrDie(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) try { await server.pluginsCommand.update({ npmName: options.npmName, path: options.path }) @@ -154,8 +154,8 @@ async function uninstallPluginCLI (command: Command, options: OptionValues) { } const { url, username, password } = await getServerCredentials(command) - const token = await getAdminTokenOrDie(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) try { await server.pluginsCommand.uninstall({ npmName: options.npmName }) diff --git a/server/tools/peertube-redundancy.ts b/server/tools/peertube-redundancy.ts index 76d633f9e..0f6b3086c 100644 --- a/server/tools/peertube-redundancy.ts +++ b/server/tools/peertube-redundancy.ts @@ -8,7 +8,7 @@ import { URL } from 'url' import validator from 'validator' import { HttpStatusCode } from '@shared/core-utils/miscs/http-error-codes' import { VideoRedundanciesTarget } from '@shared/models' -import { buildServer, getAdminTokenOrDie, getServerCredentials } from './cli' +import { assignToken, buildServer, getServerCredentials } from './cli' import bytes = require('bytes') @@ -60,8 +60,8 @@ program.parse(process.argv) async function listRedundanciesCLI (target: VideoRedundanciesTarget) { const { url, username, password } = await getServerCredentials(program) - const token = await getAdminTokenOrDie(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) const { data } = await server.redundancyCommand.listVideos({ start: 0, count: 100, sort: 'name', target }) @@ -104,8 +104,8 @@ async function listRedundanciesCLI (target: VideoRedundanciesTarget) { async function addRedundancyCLI (options: { video: number }, command: Command) { const { url, username, password } = await getServerCredentials(command) - const token = await getAdminTokenOrDie(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) if (!options.video || validator.isInt('' + options.video) === false) { console.error('You need to specify the video id to duplicate and it should be a number.\n') @@ -134,8 +134,8 @@ async function addRedundancyCLI (options: { video: number }, command: Command) { async function removeRedundancyCLI (options: { video: number }, command: Command) { const { url, username, password } = await getServerCredentials(command) - const token = await getAdminTokenOrDie(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) if (!options.video || validator.isInt('' + options.video) === false) { console.error('You need to specify the video id to remove from your redundancies.\n') diff --git a/server/tools/peertube-upload.ts b/server/tools/peertube-upload.ts index d1c5348d1..c94b05857 100644 --- a/server/tools/peertube-upload.ts +++ b/server/tools/peertube-upload.ts @@ -4,9 +4,8 @@ registerTSPaths() import { program } from 'commander' import { access, constants } from 'fs-extra' import { isAbsolute } from 'path' -import { getAccessToken } from '../../shared/extra-utils' import { uploadVideo } from '../../shared/extra-utils/' -import { buildCommonVideoOptions, buildServer, buildVideoAttributesFromCommander, getServerCredentials } from './cli' +import { assignToken, buildCommonVideoOptions, buildServer, buildVideoAttributesFromCommander, getServerCredentials } from './cli' let command = program .name('upload') @@ -46,8 +45,8 @@ getServerCredentials(command) .catch(err => console.error(err)) async function run (url: string, username: string, password: string) { - const token = await getAccessToken(url, username, password) - const server = buildServer(url, token) + const server = buildServer(url) + await assignToken(server, username, password) await access(options.file, constants.F_OK) @@ -62,7 +61,7 @@ async function run (url: string, username: string, password: string) { }) try { - await uploadVideo(url, token, videoAttributes) + await uploadVideo(url, server.accessToken, videoAttributes) console.log(`Video ${options.videoName} uploaded.`) process.exit(0) } catch (err) { diff --git a/shared/extra-utils/users/login-command.ts b/shared/extra-utils/users/login-command.ts index 97efcb766..8af3531f9 100644 --- a/shared/extra-utils/users/login-command.ts +++ b/shared/extra-utils/users/login-command.ts @@ -1,4 +1,3 @@ -import { PeerTubeRequestError } from '@server/helpers/requests' import { HttpStatusCode } from '@shared/core-utils' import { PeerTubeProblemDocument } from '@shared/models' import { unwrapBody } from '../requests' @@ -34,8 +33,8 @@ export class LoginCommand extends AbstractCommand { })) } - getAccessToken (user?: { username: string, password: string }): Promise - getAccessToken (username: string, password: string): Promise + getAccessToken (arg1?: { username: string, password: string }): Promise + getAccessToken (arg1: string, password: string): Promise async getAccessToken (arg1?: { username: string, password: string } | string, password?: string) { let user: { username: string, password: string } @@ -48,7 +47,7 @@ export class LoginCommand extends AbstractCommand { return body.access_token } catch (err) { - throw new Error('Cannot authenticate. Please check your username/password.') + throw new Error(`Cannot authenticate. Please check your username/password. (${err})`) } }