-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
102 lines (82 loc) · 2.43 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable sonarjs/os-command */
import { execSync } from 'node:child_process'
import Debug from 'debug'
import exitHook from 'exit-hook'
import type { ConnectOptions, UncPath, UncPathOptions } from './types.js'
import {
isWindows,
uncPathIsSafe,
uncPathOptionsAreSafe,
uncPathOptionsHaveCredentials
} from './validators.js'
const debug = Debug('windows-unc-path-connect')
/**
* Connects to a given UNC path.
* @param uncPathOptions - UNC path and optional connection credentials.
* @param connectOptions - Optional options for the connection.
* @returns True when the connection is made successfully.
*/
export function connectToUncPath(
uncPathOptions: UncPathOptions,
connectOptions?: Partial<ConnectOptions>
): boolean {
if (!isWindows() || !uncPathOptionsAreSafe(uncPathOptions)) {
return false
}
debug(`Connecting to share: ${uncPathOptions.uncPath}`)
let command = `net use "${uncPathOptions.uncPath}"`
if (uncPathOptionsHaveCredentials(uncPathOptions)) {
command += ` /user:"${uncPathOptions.userName}" "${
uncPathOptions.password
}"`
}
try {
const output = execSync(command, { stdio: 'pipe' })
debug(output.toString().trim())
if (connectOptions?.deleteOnExit ?? false) {
exitHook(() => {
disconnectUncPath(uncPathOptions.uncPath)
})
}
return output.includes('command completed successfully')
} catch (error) {
return (error as Error)
.toString()
.includes('Multiple connections to a server or shared resource')
}
}
/**
* Disconnects a given UNC path.
* @param uncPath - UNC path to disconnect
* @returns True if the path was disconnected.
*/
export function disconnectUncPath(uncPath: UncPath): boolean {
if (!isWindows() || !uncPathIsSafe(uncPath)) {
return false
}
debug(`Disconnecting share: ${uncPath}`)
const command = `net use "${uncPath}" /delete`
try {
const output = execSync(command, { stdio: 'pipe' })
debug(output.toString().trim())
return (
output.includes('deleted successfully') ||
output.includes('connection could not be found')
)
} catch {
return false
}
}
export type {
UncPath,
UncPathOptions,
UncPathOptionsWithoutCredentials,
UncPathOptionsWithCredentials,
ConnectOptions
} from './types.js'
export {
isWindows,
uncPathIsSafe,
uncPathOptionsAreSafe
} from './validators.js'