blob: eb2054ba20fe41846ccb80531e38fa295b518a4c (
plain)
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
|
import { getRequiredEnv, getStdout, loggerWithPrefix } from "./mod.ts";
const logger = loggerWithPrefix(() =>
`[${new Date().toISOString()}] [BitwardenSession]`
);
export class BitwardenSession {
private readonly sessionInitializer: Promise<string>;
constructor(server = getRequiredEnv("BW_SERVER")) {
["BW_CLIENTID", "BW_CLIENTSECRET"].forEach(getRequiredEnv);
this.sessionInitializer = getStdout(
`bw config server ${server} --quiet`,
)
.then(() => {
logger.log("Logging in via API");
return getStdout(`bw login --apikey --quiet`);
})
.then(() => {
logger.log("Unlocking vault in session");
return getStdout(`bw unlock --passwordenv BW_PASSWORD --raw`);
})
.then((session) => {
logger.log(`Session ${session}`);
return session.trim();
});
}
public async getItem<T extends LoginItem | SecureNote>(
secretName: string,
): Promise<T> {
logger.log(`Finding secret ${secretName}`);
return await this.sessionInitializer.then((session) =>
getStdout(`bw list items`, {
env: {
BW_SESSION: session,
},
})
).then((items) => JSON.parse(items)).then((items) =>
items.find(({ name }: { name: string }) => name === secretName)
).then((item) => {
if (!item) throw new Error("Could not find bitwarden item " + secretName);
logger.log(`Found secret: ${secretName}`);
return item;
});
}
async close(): Promise<void> {
return await this.sessionInitializer.then((session) =>
getStdout(`bw lock`, { env: { BW_SESSION: session } })
).then(() => {
logger.log("Locked session");
});
}
}
export type LoginItem = {
login: {
username: string;
password: string;
};
};
export type SecureNote = {
notes: string;
};
|