From 801d933c94f335bc952d79a6d944a55ce9e4ccd6 Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Fri, 26 Jun 2020 22:47:29 +0200 Subject: [PATCH 1/3] fix: gitAuthor parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds parsing for invalid address types: - github [bot] addresses - emails where the name part should be quoted but isn’t --- lib/platform/__snapshots__/index.spec.ts.snap | 14 ++++++ lib/platform/index.spec.ts | 24 +++++++++++ lib/platform/index.ts | 43 ++++++++++++++++--- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/lib/platform/__snapshots__/index.spec.ts.snap b/lib/platform/__snapshots__/index.spec.ts.snap index b7eb3bbe15110c..ea10a37a554aaf 100644 --- a/lib/platform/__snapshots__/index.spec.ts.snap +++ b/lib/platform/__snapshots__/index.spec.ts.snap @@ -210,3 +210,17 @@ Object { "platform": "bitbucket", } `; + +exports[`platform parses bot email 1`] = ` +Object { + "address": "some[bot]@users.noreply.github.com", + "name": "some[bot]", +} +`; + +exports[`platform parses bot name and email 1`] = ` +Object { + "address": "some[bot]@users.noreply.github.com", + "name": "some[bot]", +} +`; diff --git a/lib/platform/index.spec.ts b/lib/platform/index.spec.ts index 5a1cd17fc14566..2025d2b3e5e4b0 100644 --- a/lib/platform/index.spec.ts +++ b/lib/platform/index.spec.ts @@ -116,4 +116,28 @@ describe('platform', () => { const bitbucketMethods = Object.keys(bitbucketServer).sort(); expect(bitbucketMethods).toMatchObject(githubMethods); }); + + it('returns null if empty email given', () => { + expect(platform.parseGitAuthor(undefined)).toBeNull(); + }); + it('parses bot email', () => { + expect( + platform.parseGitAuthor('some[bot]@users.noreply.github.com') + ).toMatchSnapshot(); + }); + it('parses bot name and email', () => { + expect( + platform.parseGitAuthor( + '"some[bot]" ' + ) + ).toMatchSnapshot(); + }); + it('escapes names', () => { + expect( + platform.parseGitAuthor('name [what] ') + ).not.toBeNull(); + }); + it('gives up', () => { + expect(platform.parseGitAuthor('a.b.c')).toBeNull(); + }); }); diff --git a/lib/platform/index.ts b/lib/platform/index.ts index 531be8c536bc1e..5205608517cd10 100644 --- a/lib/platform/index.ts +++ b/lib/platform/index.ts @@ -37,6 +37,42 @@ export function setPlatformApi(name: string): void { _platform = platforms.get(name); } +interface GitAuthor { + name?: string; + address?: string; +} + +export function parseGitAuthor(input: string): GitAuthor | null { + let result: GitAuthor = null; + if (!input) { + return null; + } + if (input.includes('[bot]@')) { + // invalid github app/bot addresses + const parsed = addrs.parseOneAddress( + input.replace('[bot]@', '@') + ) as addrs.ParsedMailbox; + if (parsed?.address) { + result = { + name: parsed.name || input.replace(/@.*/, ''), + address: parsed.address.replace('@', '[bot]@'), + }; + return result; + } + } + result = addrs.parseOneAddress(input); + if (result) { + return result; + } + if (input.includes('<') && input.includes('>')) { + result = addrs.parseOneAddress('"' + input.replace(/(\s?<)/, '"$1')); + if (result) { + return result; + } + } + return null; +} + export async function initPlatform( config: RenovateConfig ): Promise { @@ -56,12 +92,7 @@ export async function initPlatform( logger.debug('Using platform gitAuthor: ' + platformInfo.gitAuthor); gitAuthor = platformInfo.gitAuthor; } - let gitAuthorParsed: addrs.ParsedMailbox | null = null; - try { - gitAuthorParsed = addrs.parseOneAddress(gitAuthor) as addrs.ParsedMailbox; - } catch (err) /* istanbul ignore next */ { - logger.debug({ gitAuthor, err }, 'Error parsing gitAuthor'); - } + const gitAuthorParsed = parseGitAuthor(gitAuthor); // istanbul ignore if if (!gitAuthorParsed) { throw new Error('Init: gitAuthor is not parsed as valid RFC5322 format'); From 5b2f25ea94a3a12b8728c9ef3ade5eb93c549a66 Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Fri, 26 Jun 2020 23:02:13 +0200 Subject: [PATCH 2/3] reorder --- lib/platform/index.ts | 44 ++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/platform/index.ts b/lib/platform/index.ts index 5205608517cd10..3e8eb6e41284f0 100644 --- a/lib/platform/index.ts +++ b/lib/platform/index.ts @@ -47,29 +47,35 @@ export function parseGitAuthor(input: string): GitAuthor | null { if (!input) { return null; } - if (input.includes('[bot]@')) { - // invalid github app/bot addresses - const parsed = addrs.parseOneAddress( - input.replace('[bot]@', '@') - ) as addrs.ParsedMailbox; - if (parsed?.address) { - result = { - name: parsed.name || input.replace(/@.*/, ''), - address: parsed.address.replace('@', '[bot]@'), - }; - return result; - } - } - result = addrs.parseOneAddress(input); - if (result) { - return result; - } - if (input.includes('<') && input.includes('>')) { - result = addrs.parseOneAddress('"' + input.replace(/(\s?<)/, '"$1')); + try { + result = addrs.parseOneAddress(input); if (result) { return result; } + if (input.includes('[bot]@')) { + // invalid github app/bot addresses + const parsed = addrs.parseOneAddress( + input.replace('[bot]@', '@') + ) as addrs.ParsedMailbox; + if (parsed?.address) { + result = { + name: parsed.name || input.replace(/@.*/, ''), + address: parsed.address.replace('@', '[bot]@'), + }; + return result; + } + } + if (input.includes('<') && input.includes('>')) { + // try wrapping the name part in quotations + result = addrs.parseOneAddress('"' + input.replace(/(\s?<)/, '"$1')); + if (result) { + return result; + } + } + } catch (err) /* istanbul ignore next */ { + logger.error({ err }, 'Unknown error parsing gitAuthor'); } + // give up return null; } From 3915546280067ff9b1abb5e577b81ae6ce8bc773 Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Sat, 27 Jun 2020 07:32:18 +0200 Subject: [PATCH 3/3] better test --- lib/platform/__snapshots__/index.spec.ts.snap | 2 ++ lib/platform/index.spec.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/platform/__snapshots__/index.spec.ts.snap b/lib/platform/__snapshots__/index.spec.ts.snap index ea10a37a554aaf..b7d428596ea8be 100644 --- a/lib/platform/__snapshots__/index.spec.ts.snap +++ b/lib/platform/__snapshots__/index.spec.ts.snap @@ -1,5 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`platform escapes names 1`] = `"name [what]"`; + exports[`platform has a list of supported methods for azure 1`] = ` Array [ "addAssignees", diff --git a/lib/platform/index.spec.ts b/lib/platform/index.spec.ts index 2025d2b3e5e4b0..ab87556b34a7db 100644 --- a/lib/platform/index.spec.ts +++ b/lib/platform/index.spec.ts @@ -134,8 +134,8 @@ describe('platform', () => { }); it('escapes names', () => { expect( - platform.parseGitAuthor('name [what] ') - ).not.toBeNull(); + platform.parseGitAuthor('name [what] ').name + ).toMatchSnapshot(); }); it('gives up', () => { expect(platform.parseGitAuthor('a.b.c')).toBeNull();