2024-12-09 11:58:50 -08:00
// FIXME: Update this file to be type safe and remove this and next line
// @ts-strict-ignore
2021-04-23 21:04:11 +02:00
import * as chalk from "chalk" ;
2024-01-31 17:17:04 -05:00
import { program , Command , OptionValues } from "commander" ;
2024-11-19 13:59:59 +01:00
import { firstValueFrom } from "rxjs" ;
2018-05-14 11:15:54 -04:00
2023-02-06 16:53:37 -05:00
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status" ;
2018-05-14 23:16:59 -04:00
2023-02-06 16:53:37 -05:00
import { LockCommand } from "./auth/commands/lock.command" ;
import { LoginCommand } from "./auth/commands/login.command" ;
import { LogoutCommand } from "./auth/commands/logout.command" ;
import { UnlockCommand } from "./auth/commands/unlock.command" ;
2024-05-27 11:03:23 +10:00
import { BaseProgram } from "./base-program" ;
2022-03-03 18:24:41 +01:00
import { CompletionCommand } from "./commands/completion.command" ;
2018-05-14 23:40:11 -04:00
import { EncodeCommand } from "./commands/encode.command" ;
2020-06-17 01:43:30 +01:00
import { StatusCommand } from "./commands/status.command" ;
2022-11-18 13:20:19 +01:00
import { UpdateCommand } from "./commands/update.command" ;
import { Response } from "./models/response" ;
import { MessageResponse } from "./models/response/message.response" ;
2024-06-17 11:00:19 -04:00
import { ConfigCommand } from "./platform/commands/config.command" ;
2023-03-10 21:39:46 +01:00
import { GenerateCommand } from "./tools/generate.command" ;
2018-08-06 09:38:17 -04:00
import { CliUtils } from "./utils" ;
2023-01-31 16:08:37 -05:00
import { SyncCommand } from "./vault/sync.command" ;
2018-05-14 14:54:19 -04:00
2018-08-06 09:38:17 -04:00
const writeLn = CliUtils . writeLn ;
2018-05-16 14:47:03 -04:00
2024-05-27 11:03:23 +10:00
export class Program extends BaseProgram {
2021-04-12 10:13:00 -05:00
async register() {
2018-05-14 11:15:54 -04:00
program
2018-05-18 11:24:49 -04:00
. option ( "--pretty" , "Format output. JSON is tabbed with two spaces." )
. option ( "--raw" , "Return raw output instead of a descriptive message." )
2018-05-17 16:40:43 -04:00
. option ( "--response" , "Return a JSON formatted version of response output." )
2021-05-26 21:16:25 +10:00
. option ( "--cleanexit" , "Exit with a success exit code (0) unless an error is thrown." )
. option ( "--quiet" , "Don't return anything to stdout." )
2019-10-21 16:04:51 -04:00
. option ( "--nointeraction" , "Do not prompt for interactive user input." )
. option ( "--session <session>" , "Pass session key instead of reading from env." )
2024-05-16 00:09:24 +10:00
. version (
await this . serviceContainer . platformUtilsService . getApplicationVersion ( ) ,
"-v, --version" ,
) ;
2021-12-20 18:04:00 +01:00
2021-02-03 22:51:59 -06:00
program . on ( "option:pretty" , ( ) = > {
2018-05-15 22:10:24 -04:00
process . env . BW_PRETTY = "true" ;
} ) ;
2021-12-20 18:04:00 +01:00
2018-05-16 14:47:03 -04:00
program . on ( "option:raw" , ( ) = > {
2018-06-20 14:42:21 -04:00
process . env . BW_RAW = "true" ;
2018-05-16 14:47:03 -04:00
} ) ;
2021-12-20 18:04:00 +01:00
2018-05-16 14:47:03 -04:00
program . on ( "option:quiet" , ( ) = > {
2018-05-16 21:38:45 -04:00
process . env . BW_QUIET = "true" ;
} ) ;
2021-12-20 18:04:00 +01:00
2019-09-03 17:03:02 +02:00
program . on ( "option:response" , ( ) = > {
2021-02-03 11:44:33 -06:00
process . env . BW_RESPONSE = "true" ;
2018-05-16 14:47:03 -04:00
} ) ;
2021-12-20 18:04:00 +01:00
2021-02-03 11:44:33 -06:00
program . on ( "option:cleanexit" , ( ) = > {
process . env . BW_CLEANEXIT = "true" ;
2021-12-20 18:04:00 +01:00
} ) ;
2019-01-15 11:46:58 -05:00
program . on ( "option:nointeraction" , ( ) = > {
process . env . BW_NOINTERACTION = "true" ;
} ) ;
2021-12-20 18:04:00 +01:00
2024-09-09 10:03:30 -04:00
program . on ( "option:session" , ( key ) = > {
2018-05-18 11:24:49 -04:00
process . env . BW_SESSION = key ;
2018-05-16 23:23:12 -04:00
} ) ;
2021-12-20 18:04:00 +01:00
2021-02-03 11:44:33 -06:00
program . on ( "command:*" , ( ) = > {
2019-04-19 17:38:02 -04:00
writeLn ( chalk . redBright ( "Invalid command: " + program . args . join ( " " ) ) , false , true ) ;
2021-02-03 11:44:33 -06:00
writeLn ( "See --help for a list of available commands." , true , true ) ;
2019-04-19 17:38:02 -04:00
process . exitCode = 1 ;
2018-05-14 11:15:54 -04:00
} ) ;
2021-12-20 18:04:00 +01:00
2018-05-16 23:23:12 -04:00
program . on ( "--help" , ( ) = > {
2024-06-06 09:40:51 +02:00
writeLn (
chalk . yellowBright (
"\n Tip: Managing and retrieving secrets for dev environments is easier with Bitwarden Secrets Manager. Learn more under https://bitwarden.com/products/secrets-manager/" ,
) ,
) ;
2018-05-16 23:23:12 -04:00
writeLn ( "\n Examples:" ) ;
writeLn ( "" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw login" ) ;
writeLn ( " bw lock" ) ;
2019-03-18 10:33:43 -04:00
writeLn ( " bw unlock myPassword321" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " bw list --help" ) ;
writeLn ( " bw list items --search google" ) ;
writeLn ( " bw get item 99ee88d2-6046-4ea7-92c2-acac464b1412" ) ;
2018-05-16 21:38:45 -04:00
writeLn ( " bw get password google.com" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( ' echo \'{"name":"My Folder"}\' | bw encode' ) ;
writeLn ( " bw create folder eyJuYW1lIjoiTXkgRm9sZGVyIn0K" ) ;
2021-11-10 04:00:16 +10:00
writeLn (
" bw edit folder c7c7b60b-9c61-40f2-8ccd-36c49595ed72 eyJuYW1lIjoiTXkgRm9sZGVyMiJ9Cg==" ,
2021-12-20 18:04:00 +01:00
) ;
2021-11-10 04:00:16 +10:00
writeLn ( " bw delete item 99ee88d2-6046-4ea7-92c2-acac464b1412" ) ;
writeLn ( " bw generate -lusn --length 18" ) ;
2020-04-03 09:47:45 -05:00
writeLn ( " bw config server https://bitwarden.example.com" ) ;
2018-05-18 11:24:49 -04:00
writeLn ( " bw send -f ./file.ext" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( ' bw send "text to send"' ) ;
2018-05-17 16:40:43 -04:00
writeLn ( ' echo "text to send" | bw send' ) ;
2018-05-16 23:23:12 -04:00
writeLn (
2018-05-18 11:24:49 -04:00
" bw receive https://vault.bitwarden.com/#/send/rg3iuoS_Akm2gqy6ADRHmg/Ht7dYjsqjmgqUM3rjzZDSQ" ,
) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" , true ) ;
2018-05-16 23:23:12 -04:00
} ) ;
2021-12-20 18:04:00 +01:00
2024-11-19 13:59:59 +01:00
program
. command ( "sdk-version" )
. description ( "Print the SDK version." )
. action ( async ( ) = > {
const sdkVersion = await firstValueFrom ( this . serviceContainer . sdkService . version $ ) ;
writeLn ( sdkVersion , true ) ;
} ) ;
2021-12-20 18:04:00 +01:00
program
2019-04-19 17:41:15 -04:00
. command ( "login [email] [password]" )
. description ( "Log into a user account." )
. option ( "--method <method>" , "Two-step login method." )
. option ( "--code <code>" , "Two-step login code." )
2025-05-13 10:58:48 -04:00
. option (
"--sso [identifier]" ,
"Log in with Single-Sign On with optional organization identifier." ,
)
2019-04-19 17:38:02 -04:00
. option ( "--apikey" , "Log in with an Api Key." )
2021-07-02 22:04:07 +02:00
. option ( "--passwordenv <passwordenv>" , "Environment variable storing your password" )
. option (
2018-05-16 10:25:25 -04:00
"--passwordfile <passwordfile>" ,
2019-04-19 17:38:02 -04:00
"Path to a file containing your password as its first line" ,
2018-05-14 11:15:54 -04:00
)
2018-05-16 13:53:12 -04:00
. option ( "--check" , "Check login status." , async ( ) = > {
2024-05-16 00:09:24 +10:00
const authed = await this . serviceContainer . stateService . getIsAuthenticated ( ) ;
2018-05-14 14:54:19 -04:00
if ( authed ) {
const res = new MessageResponse ( "You are logged in!" , null ) ;
2018-05-16 10:25:25 -04:00
this . processResponse ( Response . success ( res ) , true ) ;
2018-05-14 11:15:54 -04:00
}
2018-10-08 22:57:36 -04:00
this . processResponse ( Response . error ( "You are not logged in." ) , true ) ;
} )
2018-05-16 23:23:12 -04:00
. on ( "--help" , ( ) = > {
writeLn ( "\n Notes:" ) ;
writeLn ( "" ) ;
writeLn ( " See docs for valid `method` enum values." ) ;
writeLn ( "" ) ;
writeLn ( " Pass `--raw` option to only return the session key." ) ;
writeLn ( "" ) ;
writeLn ( " Examples:" ) ;
writeLn ( "" ) ;
writeLn ( " bw login" ) ;
2018-10-08 22:57:36 -04:00
writeLn ( " bw login john@example.com myPassword321 --raw" ) ;
writeLn ( " bw login john@example.com myPassword321 --method 1 --code 249213" ) ;
writeLn ( " bw login --sso" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" , true ) ;
2018-05-16 23:23:12 -04:00
} )
2024-01-31 17:17:04 -05:00
. action ( async ( email : string , password : string , options : OptionValues ) = > {
2018-05-16 23:23:12 -04:00
if ( ! options . check ) {
await this . exitIfAuthed ( ) ;
2018-05-14 17:13:57 -04:00
const command = new LoginCommand (
2024-05-16 00:09:24 +10:00
this . serviceContainer . loginStrategyService ,
this . serviceContainer . authService ,
this . serviceContainer . apiService ,
2025-03-12 11:33:44 -07:00
this . serviceContainer . masterPasswordApiService ,
2024-05-16 00:09:24 +10:00
this . serviceContainer . cryptoFunctionService ,
this . serviceContainer . environmentService ,
this . serviceContainer . passwordGenerationService ,
this . serviceContainer . passwordStrengthService ,
this . serviceContainer . platformUtilsService ,
2024-05-16 18:21:00 -04:00
this . serviceContainer . accountService ,
2024-10-24 19:41:30 +02:00
this . serviceContainer . keyService ,
2024-05-16 00:09:24 +10:00
this . serviceContainer . policyService ,
this . serviceContainer . twoFactorService ,
this . serviceContainer . syncService ,
this . serviceContainer . keyConnectorService ,
this . serviceContainer . policyApiService ,
this . serviceContainer . organizationService ,
async ( ) = > await this . serviceContainer . logout ( ) ,
this . serviceContainer . kdfConfigService ,
2025-02-21 17:09:50 -05:00
this . serviceContainer . ssoUrlService ,
2025-05-08 11:24:52 -05:00
this . serviceContainer . masterPasswordService ,
2018-05-17 00:07:44 -04:00
) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( email , password , options ) ;
2023-05-03 14:15:32 -04:00
this . processResponse ( response , true ) ;
2021-12-20 18:04:00 +01:00
}
2018-05-17 00:07:44 -04:00
} ) ;
2021-12-20 18:04:00 +01:00
2018-05-16 10:25:25 -04:00
program
. command ( "logout" )
2018-05-22 14:49:20 -04:00
. description ( "Log out of the current user account." )
. on ( "--help" , ( ) = > {
2018-05-16 23:23:12 -04:00
writeLn ( "\n Examples:" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
2018-05-22 14:49:20 -04:00
writeLn ( " bw logout" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" , true ) ;
2020-05-26 19:17:41 +06:00
} )
2021-02-03 11:44:33 -06:00
. action ( async ( cmd ) = > {
2020-05-26 19:17:41 +06:00
await this . exitIfNotAuthed ( ) ;
const command = new LogoutCommand (
2024-05-16 00:09:24 +10:00
this . serviceContainer . authService ,
this . serviceContainer . i18nService ,
async ( ) = > await this . serviceContainer . logout ( ) ,
2021-12-20 18:04:00 +01:00
) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( ) ;
2020-05-26 19:17:41 +06:00
this . processResponse ( response ) ;
2020-05-26 09:34:44 -04:00
} ) ;
2021-12-20 18:04:00 +01:00
2020-06-17 01:43:30 +01:00
program
. command ( "lock" )
2020-06-17 11:01:34 -04:00
. description ( "Lock the vault and destroy active session keys." )
. on ( "--help" , ( ) = > {
writeLn ( "\n Examples:" ) ;
writeLn ( "" ) ;
writeLn ( " bw lock" ) ;
2020-06-17 01:43:30 +01:00
writeLn ( "" , true ) ;
} )
2021-02-03 11:44:33 -06:00
. action ( async ( cmd ) = > {
2024-08-26 17:44:08 -07:00
const userId = await this . exitIfNotAuthed ( ) ;
2018-05-14 14:54:19 -04:00
2024-08-26 17:44:08 -07:00
if ( await this . serviceContainer . keyConnectorService . getUsesKeyConnector ( userId ) ) {
2019-03-16 11:27:27 -04:00
const logoutCommand = new LogoutCommand (
2024-05-16 00:09:24 +10:00
this . serviceContainer . authService ,
this . serviceContainer . i18nService ,
async ( ) = > await this . serviceContainer . logout ( ) ,
2021-12-20 18:04:00 +01:00
) ;
2019-03-16 11:27:27 -04:00
await logoutCommand . run ( ) ;
this . processResponse (
Response . error (
"You cannot lock your vault because you are using Key Connector. " +
"To protect your vault, you have been logged out." ,
2021-12-20 18:04:00 +01:00
) ,
2019-03-16 11:27:27 -04:00
true ,
) ;
return ;
2018-05-15 12:44:10 -04:00
}
2018-05-15 22:10:24 -04:00
2024-05-16 00:09:24 +10:00
const command = new LockCommand ( this . serviceContainer . vaultTimeoutService ) ;
2022-01-19 10:45:14 -05:00
const response = await command . run ( ) ;
2019-10-21 16:04:51 -04:00
this . processResponse ( response ) ;
2021-11-16 19:42:30 +10:00
} ) ;
2021-12-20 18:04:00 +01:00
program
2021-11-16 19:42:30 +10:00
. command ( "unlock [password]" )
. description ( "Unlock the vault and return a new session key." )
. on ( "--help" , ( ) = > {
2018-05-16 23:23:12 -04:00
writeLn ( "\n Notes:" ) ;
writeLn ( "" ) ;
2021-11-16 19:42:30 +10:00
writeLn ( " After unlocking, any previous session keys will no longer be valid." ) ;
2018-05-16 23:23:12 -04:00
writeLn ( "" ) ;
2021-11-16 19:42:30 +10:00
writeLn ( " Pass `--raw` option to only return the session key." ) ;
2018-05-16 23:23:12 -04:00
writeLn ( "" ) ;
writeLn ( " Examples:" ) ;
writeLn ( "" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw unlock" ) ;
2021-11-16 19:42:30 +10:00
writeLn ( " bw unlock myPassword321" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw unlock myPassword321 --raw" ) ;
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2021-11-16 19:42:30 +10:00
. option ( "--check" , "Check lock status." , async ( ) = > {
2022-05-16 11:58:36 +10:00
await this . exitIfNotAuthed ( ) ;
2024-05-16 00:09:24 +10:00
const authStatus = await this . serviceContainer . authService . getAuthStatus ( ) ;
2022-05-16 11:58:36 +10:00
if ( authStatus === AuthenticationStatus . Unlocked ) {
2021-11-16 19:42:30 +10:00
const res = new MessageResponse ( "Vault is unlocked!" , null ) ;
2019-10-21 16:04:51 -04:00
this . processResponse ( Response . success ( res ) , true ) ;
2022-05-16 11:58:36 +10:00
} else {
this . processResponse ( Response . error ( "Vault is locked." ) , true ) ;
2018-05-15 22:10:24 -04:00
}
2021-12-20 18:04:00 +01:00
} )
2021-02-03 11:44:33 -06:00
. option ( "--passwordenv <passwordenv>" , "Environment variable storing your password" )
2021-12-20 18:04:00 +01:00
. option (
2021-07-02 22:04:07 +02:00
"--passwordfile <passwordfile>" ,
"Path to a file containing your password as its first line" ,
2021-12-20 18:04:00 +01:00
)
2018-05-16 10:25:25 -04:00
. action ( async ( password , cmd ) = > {
2019-04-19 17:38:02 -04:00
if ( ! cmd . check ) {
await this . exitIfNotAuthed ( ) ;
const command = new UnlockCommand (
2024-05-16 00:09:24 +10:00
this . serviceContainer . accountService ,
this . serviceContainer . masterPasswordService ,
2024-10-24 19:41:30 +02:00
this . serviceContainer . keyService ,
2024-06-14 16:06:55 -04:00
this . serviceContainer . userVerificationService ,
2024-05-16 00:09:24 +10:00
this . serviceContainer . cryptoFunctionService ,
this . serviceContainer . logService ,
this . serviceContainer . keyConnectorService ,
this . serviceContainer . environmentService ,
this . serviceContainer . organizationApiService ,
async ( ) = > await this . serviceContainer . logout ( ) ,
2025-05-19 14:58:51 +02:00
this . serviceContainer . i18nService ,
2021-12-20 18:04:00 +01:00
) ;
2018-05-16 10:25:25 -04:00
const response = await command . run ( password , cmd ) ;
2018-05-16 13:53:12 -04:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
}
} ) ;
program
2018-05-14 11:15:54 -04:00
. command ( "sync" )
2018-05-18 11:24:49 -04:00
. description ( "Pull the latest vault data from server." )
2018-05-14 11:15:54 -04:00
. option ( "-f, --force" , "Force a full sync." )
2018-05-18 11:24:49 -04:00
. option ( "--last" , "Get the last sync date." )
2018-05-16 23:23:12 -04:00
. on ( "--help" , ( ) = > {
writeLn ( "\n Examples:" ) ;
writeLn ( "" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw sync" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " bw sync -f" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw sync --last" ) ;
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2018-05-16 10:25:25 -04:00
. action ( async ( cmd ) = > {
2022-08-16 23:27:05 +02:00
await this . exitIfNotAuthed ( ) ;
2024-05-16 00:09:24 +10:00
const command = new SyncCommand ( this . serviceContainer . syncService ) ;
2018-05-16 10:25:25 -04:00
const response = await command . run ( cmd ) ;
2018-05-16 13:53:12 -04:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
} ) ;
program
2018-05-16 13:53:12 -04:00
. command ( "generate" )
2018-10-08 22:57:36 -04:00
. description ( "Generate a password/passphrase." )
2018-05-16 13:53:12 -04:00
. option ( "-u, --uppercase" , "Include uppercase characters." )
. option ( "-l, --lowercase" , "Include lowercase characters." )
. option ( "-n, --number" , "Include numeric characters." )
. option ( "-s, --special" , "Include special characters." )
2018-10-08 22:57:36 -04:00
. option ( "-p, --passphrase" , "Generate a passphrase." )
2018-05-16 13:53:12 -04:00
. option ( "--length <length>" , "Length of the password." )
2018-10-08 22:57:36 -04:00
. option ( "--words <words>" , "Number of words." )
2023-09-04 21:01:16 +01:00
. option ( "--minNumber <count>" , "Minimum number of numeric characters." )
. option ( "--minSpecial <count>" , "Minimum number of special characters." )
2018-10-08 22:57:36 -04:00
. option ( "--separator <separator>" , "Word separator." )
2021-09-30 01:09:32 +10:00
. option ( "-c, --capitalize" , "Title case passphrase." )
. option ( "--includeNumber" , "Passphrase includes number." )
2023-09-04 21:01:16 +01:00
. option ( "--ambiguous" , "Avoid ambiguous characters." )
2018-05-17 00:07:44 -04:00
. on ( "--help" , ( ) = > {
2018-05-16 23:23:12 -04:00
writeLn ( "\n Notes:" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " Default options are `-uln --length 14`." ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " Minimum `length` is 5." ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
2018-10-08 22:57:36 -04:00
writeLn ( " Minimum `words` is 3." ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " Examples:" ) ;
2018-05-17 00:07:44 -04:00
writeLn ( "" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw generate" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " bw generate -u -l --length 18" ) ;
writeLn ( " bw generate -ulns --length 25" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw generate -ul" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " bw generate -p --separator _" ) ;
2018-10-08 22:57:36 -04:00
writeLn ( " bw generate -p --words 5 --separator space" ) ;
2024-02-09 08:07:53 -08:00
writeLn ( " bw generate -p --words 5 --separator empty" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2021-02-03 11:44:33 -06:00
. action ( async ( options ) = > {
2022-02-15 00:29:44 +10:00
const command = new GenerateCommand (
2024-05-16 00:09:24 +10:00
this . serviceContainer . passwordGenerationService ,
this . serviceContainer . stateService ,
2022-02-15 00:29:44 +10:00
) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( options ) ;
2018-05-22 14:49:20 -04:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
} ) ;
program
2018-05-14 17:13:57 -04:00
. command ( "encode" )
2018-05-16 23:23:12 -04:00
. description ( "Base 64 encode stdin." )
2018-05-17 00:07:44 -04:00
. on ( "--help" , ( ) = > {
2018-05-16 23:23:12 -04:00
writeLn ( "\n Notes:" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " Use to create `encodedJson` for `create` and `edit` commands." ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
2018-05-17 00:07:44 -04:00
writeLn ( " Examples:" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( "" ) ;
writeLn ( ' echo \'{"name":"My Folder"}\' | bw encode' ) ;
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2021-02-03 11:44:33 -06:00
. action ( async ( ) = > {
2018-05-16 13:53:12 -04:00
const command = new EncodeCommand ( ) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( ) ;
2018-05-22 14:49:20 -04:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
} ) ;
program
2019-10-10 21:23:56 -04:00
. command ( "config <setting> [value]" )
2018-05-18 11:24:49 -04:00
. description ( "Configure CLI settings." )
2021-12-20 18:04:00 +01:00
. option (
2020-04-14 13:04:19 -04:00
"--web-vault <url>" ,
"Provides a custom web vault URL that differs from the base URL." ,
2021-12-20 18:04:00 +01:00
)
2020-04-14 13:04:19 -04:00
. option ( "--api <url>" , "Provides a custom API URL that differs from the base URL." )
. option ( "--identity <url>" , "Provides a custom identity URL that differs from the base URL." )
2021-12-20 18:04:00 +01:00
. option (
2020-04-14 13:04:19 -04:00
"--icons <url>" ,
"Provides a custom icons service URL that differs from the base URL." ,
2021-12-20 18:04:00 +01:00
)
. option (
2020-04-14 13:04:19 -04:00
"--notifications <url>" ,
"Provides a custom notifications URL that differs from the base URL." ,
2021-12-20 18:04:00 +01:00
)
2020-04-14 13:04:19 -04:00
. option ( "--events <url>" , "Provides a custom events URL that differs from the base URL." )
2021-11-10 04:00:16 +10:00
. option ( "--key-connector <url>" , "Provides the URL for your Key Connector server." )
2020-05-26 19:17:41 +06:00
. on ( "--help" , ( ) = > {
2018-05-17 00:07:44 -04:00
writeLn ( "\n Settings:" ) ;
2020-05-26 19:17:41 +06:00
writeLn ( "" ) ;
2019-04-04 00:45:39 -04:00
writeLn ( " server - On-premises hosted installation URL." ) ;
2020-05-26 09:34:44 -04:00
writeLn ( "" ) ;
2020-05-26 19:17:41 +06:00
writeLn ( " Examples:" ) ;
writeLn ( "" ) ;
2020-04-14 13:04:19 -04:00
writeLn ( " bw config server" ) ;
2018-05-17 00:07:44 -04:00
writeLn ( " bw config server https://bw.company.com" ) ;
2019-09-03 17:03:02 +02:00
writeLn ( " bw config server bitwarden.com" ) ;
2021-12-20 18:04:00 +01:00
writeLn (
2020-04-14 13:04:19 -04:00
" bw config server --api http://localhost:4000 --identity http://localhost:33656" ,
2021-12-20 18:04:00 +01:00
) ;
2020-05-26 19:17:41 +06:00
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2021-02-03 11:44:33 -06:00
. action ( async ( setting , value , options ) = > {
2024-06-17 11:00:19 -04:00
const command = new ConfigCommand (
this . serviceContainer . environmentService ,
this . serviceContainer . accountService ,
) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( setting , value , options ) ;
2018-05-22 14:49:20 -04:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
} ) ;
program
2019-03-18 10:33:43 -04:00
. command ( "update" )
2018-05-16 10:25:25 -04:00
. description ( "Check for updates." )
2020-06-17 01:43:30 +01:00
. on ( "--help" , ( ) = > {
2020-05-26 19:17:41 +06:00
writeLn ( "\n Notes:" ) ;
2020-06-17 01:43:30 +01:00
writeLn ( "" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " Returns the URL to download the newest version of this CLI tool." ) ;
2020-06-17 01:43:30 +01:00
writeLn ( "" ) ;
2018-05-22 14:49:20 -04:00
writeLn ( " Use the `--raw` option to return only the download URL for the update." ) ;
2020-06-17 01:43:30 +01:00
writeLn ( "" ) ;
2020-05-26 19:17:41 +06:00
writeLn ( " Examples:" ) ;
2020-06-17 01:43:30 +01:00
writeLn ( "" ) ;
2018-05-18 11:14:47 -04:00
writeLn ( " bw update" ) ;
2018-05-16 23:23:12 -04:00
writeLn ( " bw update --raw" ) ;
2020-05-26 19:17:41 +06:00
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2021-02-03 11:44:33 -06:00
. action ( async ( ) = > {
2024-12-10 15:36:14 +01:00
const command = new UpdateCommand (
this . serviceContainer . platformUtilsService ,
this . serviceContainer . apiService ,
) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( ) ;
2020-06-17 01:43:30 +01:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
} ) ;
program
2020-05-26 19:17:41 +06:00
. command ( "completion" )
. description ( "Generate shell completions." )
. option ( "--shell <shell>" , "Shell to generate completions for." )
2020-06-17 01:43:30 +01:00
. on ( "--help" , ( ) = > {
2020-05-26 19:17:41 +06:00
writeLn ( "\n Notes:" ) ;
2020-06-17 11:01:34 -04:00
writeLn ( "" ) ;
2020-05-26 09:34:44 -04:00
writeLn ( " Valid shells are `zsh`." ) ;
2020-06-17 11:01:34 -04:00
writeLn ( "" ) ;
2020-05-26 19:17:41 +06:00
writeLn ( " Examples:" ) ;
2020-06-17 11:01:34 -04:00
writeLn ( "" ) ;
2020-05-26 19:17:41 +06:00
writeLn ( " bw completion --shell zsh" ) ;
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2024-01-31 17:17:04 -05:00
. action ( async ( options : OptionValues , cmd : Command ) = > {
2018-05-16 13:53:12 -04:00
const command = new CompletionCommand ( ) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( options ) ;
2021-11-16 19:42:30 +10:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
} ) ;
program
2020-06-17 01:43:30 +01:00
. command ( "status" )
. description ( "Show server, last sync, user information, and vault status." )
. on ( "--help" , ( ) = > {
2020-06-17 11:01:34 -04:00
writeLn ( "" ) ;
writeLn ( "" ) ;
2020-06-17 01:43:30 +01:00
writeLn ( " Example return value:" ) ;
2020-06-17 11:01:34 -04:00
writeLn ( "" ) ;
2020-06-17 01:43:30 +01:00
writeLn ( " {" ) ;
writeLn ( ' "serverUrl": "https://bitwarden.example.com",' ) ;
writeLn ( ' "lastSync": "2020-06-16T06:33:51.419Z",' ) ;
writeLn ( ' "userEmail": "user@example.com,' ) ;
writeLn ( ' "userId": "00000000-0000-0000-0000-000000000000",' ) ;
writeLn ( ' "status": "locked"' ) ;
writeLn ( " }" ) ;
2020-06-17 11:01:34 -04:00
writeLn ( "" ) ;
writeLn ( " Notes:" ) ;
writeLn ( "" ) ;
writeLn ( " `status` is one of:" ) ;
writeLn ( " - `unauthenticated` when you are not logged in" ) ;
writeLn ( " - `locked` when you are logged in and the vault is locked" ) ;
writeLn ( " - `unlocked` when you are logged in and the vault is unlocked" ) ;
2020-05-26 19:17:41 +06:00
writeLn ( "" , true ) ;
2021-12-20 18:04:00 +01:00
} )
2021-02-03 11:44:33 -06:00
. action ( async ( ) = > {
2020-06-17 01:43:30 +01:00
const command = new StatusCommand (
2024-05-16 00:09:24 +10:00
this . serviceContainer . environmentService ,
this . serviceContainer . syncService ,
2024-05-16 18:21:00 -04:00
this . serviceContainer . accountService ,
2024-05-16 00:09:24 +10:00
this . serviceContainer . authService ,
2021-12-20 18:04:00 +01:00
) ;
2021-02-03 11:44:33 -06:00
const response = await command . run ( ) ;
2021-11-16 19:42:30 +10:00
this . processResponse ( response ) ;
2021-12-20 18:04:00 +01:00
} ) ;
}
2018-05-14 11:15:54 -04:00
}