Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
584 changes: 33 additions & 551 deletions KeeperSdk/package-lock.json

Large diffs are not rendered by default.

8 changes: 6 additions & 2 deletions KeeperSdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@
"directory": "KeeperSdk"
},
"license": "ISC",
"main": "src/index.ts",
"main": "dist/index.js",
"browser": "dist/browser.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc",
"clean": "rm -rf dist",
"clean": "rm -rf dist node_modules",
"rebuild": "npm run clean && npm install && npm run build",
"link-local": "npm link ../keeperapi",
"format": "prettier --write .",
"format:check": "prettier --check .",
Expand All @@ -23,6 +26,7 @@
"dependencies": {
"@keeper-security/keeperapi": "17.1.4",
"ts-node": "^10.7.0",
"asmcrypto.js": "^2.3.2",
"typescript": "^4.6.3"
},
"devDependencies": {
Expand Down
241 changes: 241 additions & 0 deletions KeeperSdk/src/api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
export { SessionManager } from './auth/SessionManager'
export type {
KeeperJsonConfig,
ConfigLoader,
ConfigurationUser,
ConfigurationServerConfig,
ConfigurationDeviceConfig,
} from './auth/SessionManager'
export { connectSdkPlatform, getSdkPlatform, isSdkPlatformConnected } from './platform'
export type { SdkPlatform, SdkReadline, SdkRuntime } from './platform'

export { InMemoryStorage } from './storage/InMemoryStorage'

export {
Logger,
ConsoleLogger,
LogLevel,
logger,
setLogger,
getLogger,
resetLogger,
KeeperSdkError,
isKeeperError,
extractErrorMessage,
extractResultCode,
SdkDefaults,
AuthDefaults,
ResultCodes,
KEEPER_PUBLIC_HOSTS,
isBoolean,
isString,
isNonEmptyString,
isNumber,
isObject,
anyIsBoolean,
EMAIL_PATTERN,
EMAIL_LIST_SEPARATOR_PATTERN,
isValidEmail,
} from './utils'
export type { ILogger, Nullable, Optional, DeepPartial, Immutable } from './utils'

export {
searchRecords,
formatRecord,
getRecordTitle,
getRecordType,
getRecordFields,
getRecordSummary,
getRecordPassword,
getRecordLogin,
getRecordUrl,
getRecordTotpUrl,
RecordVersion,
} from './records/RecordUtils'
export type { RecordSummary } from './records/RecordUtils'
export { parseTotpUrl, getTotpCode } from './records/Totp'
export type { TotpAlgorithm, TotpParams, TotpCode } from './records/Totp'
export { addRecord, updateRecord, deleteRecord, getRecordHistory, moveRecord } from './records/RecordOperations'
export type {
PasswordRecordData,
TypedRecordData,
RecordFieldInput,
NewRecordInput,
AddRecordResult,
UpdateRecordResult,
DeleteRecordResult,
HistoryEntry,
RecordHistoryResult,
MoveRecordInput,
MoveRecordResult,
} from './records/RecordOperations'

export { shareRecord, removeRecordShare, getRecordShareInfo } from './sharing/Sharing'
export type {
ShareRecordInput,
ShareRecordResult,
RemoveShareInput,
RemoveShareResult,
RecordShareInfo,
RecordUserPermission,
RecordSharedFolderPermission,
} from './sharing/Sharing'

export { KeeperVault } from './vault/KeeperVault'
export type { KeeperVaultConfig, VaultSummary } from './vault/KeeperVault'

export type { SessionRestoreInput } from './auth/sessionRestore'
export {
toSessionParams,
validateSessionRestoreInput,
sessionRestoreFromJson,
resolveSessionRestorePayload,
} from './auth/sessionRestore'

export { getFolder, findFolder, GetFolderFormat } from './folders/getFolder'
export type {
GetFolderOptions,
GetFolderResult,
GetFolderResultFolder,
GetFolderResultSharedFolder,
GetFolderFormatInput,
FoundFolder,
} from './folders/getFolder'

export {
FolderKind,
ParentFolderKind,
FolderObjectType,
FolderResultStatus,
DeleteResolution,
DeleteObjectType,
folderKindFromString,
} from './folders/folderHelpers'
export type { FolderKindOrLiteral } from './folders/folderHelpers'

export { listFolder, findFolderUidByNameOrUid, listRootUserFolders } from './folders/listFolder'
export type {
ListFolderOptions,
ListFolderResult,
ListFolderFolderSimple,
ListFolderRecordSimple,
ListFolderFolderDetail,
ListFolderRecordDetail,
} from './folders/listFolder'

export {
listSharedFolders,
formatSharedFoldersTable,
renderSharedFoldersAsciiTable,
} from './sharedFolders/listSharedFolders'
export type {
ListSharedFoldersOptions,
ListSharedFolderRow,
FormattedSharedFoldersTable,
} from './sharedFolders/listSharedFolders'

export { shareFolder, ShareFolderAction, ShareFolderUserResultStatus } from './sharedFolders/shareFolder'
export type {
ShareFolderActionInput,
ShareFolderInput,
ShareFolderResult,
ShareFolderUserStatus,
} from './sharedFolders/shareFolder'

export {
changeDirectory,
createVaultFolderSession,
tryResolvePath,
resolveSingleFolder,
getWorkingFolderDisplayName,
findParentFolderUid,
splitPathComponents,
} from './folders/changeDirectory'
export type { VaultFolderSession, ChangeDirectoryResult, TryResolvePathResult } from './folders/changeDirectory'

export { addFolder, mkdir } from './folders/addFolder'
export type { AddFolderInput, AddFolderResult, MkdirOptions } from './folders/addFolder'

export { updateFolder, renameFolder, updateSharedFolderPermissions } from './folders/updateFolder'
export type { UpdateFolderInput, UpdateFolderResult, RenameFolderResult } from './folders/updateFolder'

export {
deleteFolder,
rmdir,
resolveRmdirPatternsToFolderUids,
buildFolderDeleteObject,
} from './folders/deleteFolder'
export type { DeleteFolderResult, RmdirOptions } from './folders/deleteFolder'

export {
buildFolderTree,
renderFolderTreeAscii,
folderTreeAscii,
userPermissionToText,
recordPermissionToText,
} from './folders/folderTree'
export type { FolderTreeBuildOptions, FolderTreeNode, FolderTreeResult } from './folders/folderTree'

export { FolderManager } from './folders/FolderManager'
export type { AuthProvider, SharedFolderPermissionsInput } from './folders/FolderManager'

export { SharedFolderManager } from './sharedFolders/SharedFolderManager'

export {
dispatchCliLine,
dispatchKeeperCli,
ensureKeeperCliRegistry,
registerCliCommand,
registerCliAlias,
getCliCommand,
listCliCommands,
listCliCommandNames,
listCliCommandNamesForLoginState,
listCliCommandsForLoginState,
isAuthCliCommand,
listDocumentedCommands,
getDetailedHelpPage,
formatDetailedHelpForCommand,
tokenizeArguments,
parseCliArgs,
wantsCliHelp,
rejectUnknownOptions,
loginWithCredentials,
loginWithSessionToken,
runLoginCommand,
runLogoutCommand,
KeeperCliParser,
createKeeperCliParser,
getKeeperCliPromptPrefix,
BUILTIN_CLI_COMMANDS,
registerBuiltinCliCommands,
listCommand,
} from './cli'
export type { KeeperCliParserOptions } from './cli'
export type {
CliResult,
ParsedCli,
CliCommandDefinition,
CliHelpDoc,
KeeperCliHost,
KeeperCliVault,
} from './cli'

export { Auth, KeeperEnvironment, syncDown, Authentication } from '@keeper-security/keeperapi'

export type {
DRecord,
DRecordMetadata,
DSharedFolder,
DTeam,
DUserFolder,
VaultStorage,
SyncResult,
SyncDownOptions,
ClientConfiguration,
DeviceConfig,
SessionStorage,
AuthUI3,
KeeperError,
LoginError,
} from '@keeper-security/keeperapi'
34 changes: 17 additions & 17 deletions KeeperSdk/src/auth/ConsoleAuthUI.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import readline from 'readline/promises'
import { setTimeout as delay } from 'timers/promises'
import type { AuthUI3, DeviceApprovalChannel, TwoFactorChannelData } from '@keeper-security/keeperapi'
import { Authentication } from '@keeper-security/keeperapi'
import { getSdkPlatform } from '../platform'
import { logger, extractErrorMessage, KeeperSdkError, AuthDefaults, ResultCodes } from '../utils'

export class ConsoleAuthUI implements AuthUI3 {
Expand Down Expand Up @@ -54,18 +53,19 @@ export class ConsoleAuthUI implements AuthUI3 {
}

private static async waitWithCancel(timeoutMs: number, cancel?: Promise<void>): Promise<void> {
const platform = getSdkPlatform()
if (!cancel) {
await delay(timeoutMs)
await platform.delay(timeoutMs)
return
}
await Promise.race([delay(timeoutMs), cancel])
await Promise.race([platform.delay(timeoutMs), cancel])
}

public async waitForDeviceApproval(channels: DeviceApprovalChannel[], isCloud: boolean): Promise<boolean> {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
public async waitForDeviceApproval(channels: DeviceApprovalChannel[], _isCloud: boolean): Promise<boolean> {
const rl = getSdkPlatform().createReadline(
typeof process !== 'undefined' ? process.stdin : undefined,
typeof process !== 'undefined' ? process.stdout : undefined
)

try {
logger.info('\n--- Device Approval Required ---')
Expand Down Expand Up @@ -106,10 +106,10 @@ export class ConsoleAuthUI implements AuthUI3 {
}

public async waitForTwoFactorCode(channels: TwoFactorChannelData[], cancel: Promise<void>): Promise<boolean> {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
const rl = getSdkPlatform().createReadline(
typeof process !== 'undefined' ? process.stdin : undefined,
typeof process !== 'undefined' ? process.stdout : undefined
)

try {
logger.info('\n--- Two-Factor Authentication Required ---')
Expand Down Expand Up @@ -155,10 +155,10 @@ export class ConsoleAuthUI implements AuthUI3 {
}

public async getPassword(isAlternate: boolean): Promise<string> {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
const rl = getSdkPlatform().createReadline(
typeof process !== 'undefined' ? process.stdin : undefined,
typeof process !== 'undefined' ? process.stdout : undefined
)
try {
const label = isAlternate ? 'alternate master password' : 'master password'
return (await rl.question(`Enter your ${label}: `)).trim()
Expand Down
19 changes: 7 additions & 12 deletions KeeperSdk/src/auth/ConsoleLogin.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import readline from 'readline/promises'
import type { AuthUI3 } from '@keeper-security/keeperapi'
import { KeeperVault } from '../vault/KeeperVault'
import { getSdkPlatform } from '../platform'
import type { SdkReadline } from '../platform'
import {
logger,
extractResultCode,
Expand All @@ -12,8 +13,7 @@ import {
KEEPER_PUBLIC_HOSTS,
} from '../utils'
import { ConsoleAuthUI } from './ConsoleAuthUI'
import { FileConfigLoader } from './SessionManager'
import type { KeeperJsonConfig } from './SessionManager'
import type { KeeperJsonConfig } from './config'

const DEFAULT_REGION = 'US'
const MASK_CHAR = '*'
Expand All @@ -35,8 +35,6 @@ type ConsoleHandlers = {
stderrWrite: typeof process.stderr.write
}

const defaultConfigLoader = new FileConfigLoader()

let rlManager: ReadlineManager | null = null
let suppressionDepth = 0
let originals: ConsoleHandlers | null = null
Expand Down Expand Up @@ -69,14 +67,11 @@ function classifyInputChar(ch: string): CliCharAction {
}

class ReadlineManager {
private rl: readline.Interface | null = null
private rl: SdkReadline | null = null

private getOrCreate(): readline.Interface {
private getOrCreate(): SdkReadline {
if (!this.rl) {
this.rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
this.rl = getSdkPlatform().createReadline(process.stdin, process.stdout)
}
return this.rl
}
Expand Down Expand Up @@ -154,7 +149,7 @@ export function prompt(question: string, masked = false): Promise<string> {

export async function loadKeeperConfig(preloaded?: KeeperJsonConfig): Promise<KeeperJsonConfig> {
if (preloaded) return preloaded
return defaultConfigLoader.load()
return getSdkPlatform().createFileConfigLoader().load()
}

export async function resolveServer(username?: string, preloadedConfig?: KeeperJsonConfig): Promise<string> {
Expand Down
Loading
Loading