gpg: fallback to gpg homedir if HOME not set

This commit is contained in:
CrazyMax 2023-09-03 15:17:48 +02:00
parent 72f7de7ebf
commit 27cae0743d
No known key found for this signature in database
GPG key ID: 3248E46B6BB8C7F7
3 changed files with 47 additions and 45 deletions

View file

@ -72,7 +72,7 @@ describe('getDirs', () => {
describe('configureAgent', () => {
// eslint-disable-next-line jest/expect-expect
it('configures GnuPG agent', async () => {
await gpg.configureAgent(gpg.agentConfig);
await gpg.configureAgent(await gpg.getHome(), gpg.agentConfig);
});
});
@ -119,7 +119,7 @@ for (const userInfo of userInfos) {
describe('presetPassphrase', () => {
it('presets passphrase', async () => {
await gpg.importKey(userInfo.pgp);
await gpg.configureAgent(gpg.agentConfig);
await gpg.configureAgent(await gpg.getHome(), gpg.agentConfig);
for (const keygrip of await gpg.getKeygrips(userInfo.fingerprint)) {
await gpg.presetPassphrase(keygrip, userInfo.passphrase).then(output => {
expect(output).not.toEqual('');
@ -131,7 +131,7 @@ for (const userInfo of userInfos) {
describe('setTrustLevel', () => {
it('set trust level', async () => {
await gpg.importKey(userInfo.pgp);
await gpg.configureAgent(gpg.agentConfig);
await gpg.configureAgent(await gpg.getHome(), gpg.agentConfig);
expect(() => {
gpg.setTrustLevel(userInfo.keyID, '5');
}).not.toThrow();

View file

@ -20,17 +20,6 @@ export interface Dirs {
homedir: string;
}
const getGnupgHome = async (): Promise<string> => {
if (process.env.GNUPGHOME) {
return process.env.GNUPGHOME;
}
let homedir: string = path.join(process.env.HOME || '', '.gnupg');
if (os.platform() == 'win32' && !process.env.HOME) {
homedir = path.join(process.env.USERPROFILE || '', '.gnupg');
}
return homedir;
};
const gpgConnectAgent = async (command: string): Promise<string> => {
return await exec
.getExecOutput(`gpg-connect-agent "${command}" /bye`, [], {
@ -50,6 +39,26 @@ const gpgConnectAgent = async (command: string): Promise<string> => {
});
};
export const getHome = async (): Promise<string> => {
let homedir = '';
if (process.env.GNUPGHOME) {
homedir = process.env.GNUPGHOME;
} else if (os.platform() == 'win32' && !process.env.HOME && process.env.USERPROFILE) {
homedir = path.join(process.env.USERPROFILE, '.gnupg');
} else if (process.env.HOME) {
homedir = path.join(process.env.HOME, '.gnupg');
} else {
homedir = (await getDirs()).homedir;
}
if (homedir.length == 0) {
throw new Error('Unable to determine GnuPG home directory');
}
if (!fs.existsSync(homedir)) {
fs.mkdirSync(homedir, {recursive: true});
}
return homedir;
};
export const getVersion = async (): Promise<Version> => {
return await exec
.getExecOutput('gpg', ['--version'], {
@ -192,12 +201,8 @@ export const getKeygrip = async (fingerprint: string): Promise<string> => {
});
};
export const configureAgent = async (config: string): Promise<void> => {
const gnupgHomeDir = await getGnupgHome();
if (!fs.existsSync(gnupgHomeDir)) {
fs.mkdirSync(gnupgHomeDir, {recursive: true});
}
const gpgAgentConf = path.join(gnupgHomeDir, 'gpg-agent.conf');
export const configureAgent = async (homedir: string, config: string): Promise<void> => {
const gpgAgentConf = path.join(homedir, 'gpg-agent.conf');
await fs.writeFile(gpgAgentConf, config, function (err) {
if (err) throw err;
});

View file

@ -50,35 +50,32 @@ async function run(): Promise<void> {
});
});
if (inputs.passphrase && !inputs.fingerprint) {
// Set the passphrase for all subkeys
core.info('Configuring GnuPG agent');
await gpg.configureAgent(gpg.agentConfig);
await core.group(`Getting keygrips`, async () => {
for (const keygrip of await gpg.getKeygrips(fingerprint)) {
core.info(`Presetting passphrase for ${keygrip}`);
if (inputs.passphrase) {
await core.group(`Configuring GnuPG agent`, async () => {
const gpgHome = await gpg.getHome();
core.info(`GnuPG home: ${gpgHome}`);
await gpg.configureAgent(gpgHome, gpg.agentConfig);
});
if (!inputs.fingerprint) {
// Set the passphrase for all subkeys
await core.group(`Getting keygrips`, async () => {
for (const keygrip of await gpg.getKeygrips(fingerprint)) {
core.info(`Presetting passphrase for ${keygrip}`);
await gpg.presetPassphrase(keygrip, inputs.passphrase).then(stdout => {
core.debug(stdout);
});
}
});
} else {
// Set the passphrase only for the subkey specified in the input `fingerprint`
await core.group(`Getting keygrip for fingerprint`, async () => {
const keygrip = await gpg.getKeygrip(fingerprint);
core.info(`Presetting passphrase for key ${fingerprint} with keygrip ${keygrip}`);
await gpg.presetPassphrase(keygrip, inputs.passphrase).then(stdout => {
core.debug(stdout);
});
}
});
}
if (inputs.passphrase && inputs.fingerprint) {
// Set the passphrase only for the subkey specified in the input `fingerprint`
core.info('Configuring GnuPG agent');
await gpg.configureAgent(gpg.agentConfig);
await core.group(`Getting keygrip for fingerprint`, async () => {
const keygrip = await gpg.getKeygrip(fingerprint);
core.info(`Presetting passphrase for key ${fingerprint} with keygrip ${keygrip}`);
await gpg.presetPassphrase(keygrip, inputs.passphrase).then(stdout => {
core.debug(stdout);
});
});
}
}
if (inputs.trustLevel) {