Files
setup-java/src/auth.ts
T

175 lines
5.2 KiB
TypeScript
Raw Normal View History

2019-11-15 16:01:13 -08:00
import * as path from 'path';
import * as core from '@actions/core';
import * as io from '@actions/io';
import * as fs from 'fs';
import * as os from 'os';
import {create as xmlCreate} from 'xmlbuilder2';
import * as constants from './constants.js';
import * as gpg from './gpg.js';
import {getBooleanInput} from './util.js';
2019-11-15 16:01:13 -08:00
export async function configureAuthentication() {
const id = core.getInput(constants.INPUT_SERVER_ID);
const usernameEnvVar = getInputWithDeprecatedAlias(
constants.INPUT_SERVER_USERNAME_ENV_VAR,
constants.INPUT_SERVER_USERNAME_DEPRECATED,
constants.INPUT_DEFAULT_SERVER_USERNAME
);
const passwordEnvVar = getInputWithDeprecatedAlias(
constants.INPUT_SERVER_PASSWORD_ENV_VAR,
constants.INPUT_SERVER_PASSWORD_DEPRECATED,
constants.INPUT_DEFAULT_SERVER_PASSWORD
);
const settingsDirectory =
core.getInput(constants.INPUT_SETTINGS_PATH) ||
path.join(os.homedir(), constants.M2_DIR);
const overwriteSettings = getBooleanInput(
constants.INPUT_OVERWRITE_SETTINGS,
true
);
const gpgPrivateKey =
core.getInput(constants.INPUT_GPG_PRIVATE_KEY) ||
constants.INPUT_DEFAULT_GPG_PRIVATE_KEY;
const gpgPassphraseEnvVar = getInputWithDeprecatedAlias(
constants.INPUT_GPG_PASSPHRASE_ENV_VAR,
constants.INPUT_GPG_PASSPHRASE_DEPRECATED,
gpgPrivateKey ? constants.INPUT_DEFAULT_GPG_PASSPHRASE : undefined
);
if (gpgPrivateKey) {
core.setSecret(gpgPrivateKey);
}
await createAuthenticationSettings(
id,
usernameEnvVar,
passwordEnvVar,
settingsDirectory,
overwriteSettings,
gpgPassphraseEnvVar
);
if (gpgPrivateKey) {
core.info('Importing private gpg key');
const keyFingerprint = (await gpg.importKey(gpgPrivateKey)) || '';
core.saveState(constants.STATE_GPG_PRIVATE_KEY_FINGERPRINT, keyFingerprint);
}
}
export function getInputWithDeprecatedAlias(
inputName: string,
deprecatedInputName: string,
defaultValue?: string
): string {
const value = core.getInput(inputName);
const deprecatedValue = core.getInput(deprecatedInputName);
if (deprecatedValue) {
core.warning(
`The '${deprecatedInputName}' input is deprecated and may be removed in a future release. Please use '${inputName}' instead.`
);
}
return value || deprecatedValue || defaultValue || '';
}
export async function createAuthenticationSettings(
2020-05-02 04:33:15 -07:00
id: string,
usernameEnvVar: string,
passwordEnvVar: string,
settingsDirectory: string,
overwriteSettings: boolean,
gpgPassphraseEnvVar: string | undefined = undefined
2019-11-28 12:40:45 -08:00
) {
2022-01-16 17:33:29 +01:00
core.info(`Creating ${constants.MVN_SETTINGS_FILE} with server-id: ${id}`);
2019-12-19 11:28:11 -08:00
// when an alternate m2 location is specified use only that location (no .m2 directory)
// otherwise use the home/.m2/ path
2020-05-02 04:33:15 -07:00
await io.mkdirP(settingsDirectory);
await write(
settingsDirectory,
generate(id, usernameEnvVar, passwordEnvVar, gpgPassphraseEnvVar),
overwriteSettings
2020-05-02 04:33:15 -07:00
);
2019-12-10 09:26:51 -08:00
}
2019-11-15 16:01:13 -08:00
// only exported for testing purposes
2019-12-19 11:28:11 -08:00
export function generate(
2020-05-02 04:33:15 -07:00
id: string,
usernameEnvVar: string,
passwordEnvVar: string,
gpgPassphraseEnvVar?: string | undefined
2019-12-19 11:28:11 -08:00
) {
const xmlObj: {[key: string]: any} = {
2020-05-02 04:33:15 -07:00
settings: {
'@xmlns': 'http://maven.apache.org/SETTINGS/1.0.0',
'@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'@xsi:schemaLocation':
'http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd',
interactiveMode: false,
2020-05-02 04:33:15 -07:00
servers: {
server: [
{
id: id,
username: `\${env.${usernameEnvVar}}`,
password: `\${env.${passwordEnvVar}}`
2020-05-02 04:33:15 -07:00
}
]
}
}
};
// The maven-gpg-plugin reads the passphrase from the environment variable
// named by the `gpg.passphraseEnvName` property (default MAVEN_GPG_PASSPHRASE).
// Only configure it when the requested env var name differs from that default;
// otherwise the plugin already reads the right variable and no extra settings
// are needed. Writing `gpg.passphrase` to settings.xml is deprecated and fails
// when the plugin's `bestPractices` mode is enabled.
if (
gpgPassphraseEnvVar &&
gpgPassphraseEnvVar !== constants.MAVEN_GPG_PASSPHRASE_DEFAULT_ENV
) {
xmlObj.settings.profiles = {
profile: {
id: constants.GPG_PASSPHRASE_PROFILE_ID,
properties: {
'gpg.passphraseEnvName': gpgPassphraseEnvVar
}
}
};
xmlObj.settings.activeProfiles = {
activeProfile: constants.GPG_PASSPHRASE_PROFILE_ID
2020-05-02 04:33:15 -07:00
};
}
return xmlCreate(xmlObj).end({
headless: true,
prettyPrint: true,
width: 80
});
2019-11-15 16:01:13 -08:00
}
async function write(
directory: string,
settings: string,
overwriteSettings: boolean
) {
2022-01-16 17:33:29 +01:00
const location = path.join(directory, constants.MVN_SETTINGS_FILE);
const settingsExists = fs.existsSync(location);
if (settingsExists && overwriteSettings) {
core.info(`Overwriting existing file ${location}`);
} else if (!settingsExists) {
core.info(`Writing to ${location}`);
2019-12-19 08:52:26 -08:00
} else {
core.info(
`Skipping generation ${location} because file already exists and overwriting is not required`
);
return;
2019-12-04 23:54:21 -05:00
}
2019-12-19 08:52:26 -08:00
return fs.writeFileSync(location, settings, {
encoding: 'utf-8',
flag: 'w'
});
2019-11-15 16:01:13 -08:00
}