Skip to content

Commit 1184436

Browse files
authored
[ENG-5949] Preprint assertion validation (#2271)
- Ticket: [ENG-5949] - Feature flag: n/a ## Purpose - Update URL validators used for author assertions to prevent preprint saves from failing ## Summary of Changes - Add new URL validator that checks for the presence of a protocol - Use ember-changeset-validations existing url validations for some false positives - Remove old validator that is no longer used
1 parent 0dd5e57 commit 1184436

File tree

6 files changed

+77
-36
lines changed

6 files changed

+77
-36
lines changed

app/preprints/-components/submit/author-assertions/link-widget/link/component.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import { action } from '@ember/object';
33
import { inject as service } from '@ember/service';
44
import Intl from 'ember-intl/services/intl';
55
import { ValidationObject } from 'ember-changeset-validations';
6-
import { validateFormat} from 'ember-changeset-validations/validators';
6+
77
import buildChangeset from 'ember-osf-web/utils/build-changeset';
8+
import { validateUrlWithProtocols } from 'ember-osf-web/validators/url-with-protocol';
89
import { tracked } from '@glimmer/tracking';
910

1011

@@ -31,9 +32,7 @@ export default class Link extends Component<LinkArgs>{
3132
@tracked linkFormChangeset: any = null;
3233

3334
linkFormValidation: ValidationObject<LinkForm> = {
34-
value: validateFormat({
35-
allowBlank: false,
36-
type: 'url',
35+
value: validateUrlWithProtocols({
3736
translationArgs: { description: this.intl.t('validationErrors.description') },
3837
}),
3938
};

app/validators/http-url.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import buildMessage from 'ember-changeset-validations/utils/validation-errors';
2+
import { validateFormat } from 'ember-changeset-validations/validators';
3+
4+
const Protocols = {
5+
http: 'http:',
6+
https: 'https:',
7+
};
8+
9+
interface Options {
10+
acceptedProtocols?: string[];
11+
translationArgs?: {
12+
description: string,
13+
};
14+
}
15+
16+
export function validateUrlWithProtocols(options?: Options) {
17+
return (key: string, newValue: string, _: any, __: any, ___: any) => {
18+
const acceptedProtocols = options?.acceptedProtocols || [Protocols.http, Protocols.https];
19+
const translationArgs = options?.translationArgs || { description: '' };
20+
21+
let url;
22+
try {
23+
url = new URL(newValue);
24+
} catch (e) {
25+
return buildMessage(key, {
26+
type: 'url',
27+
context: {
28+
type: 'url',
29+
translationArgs,
30+
},
31+
});
32+
}
33+
34+
if (acceptedProtocols.indexOf(url.protocol) === -1) {
35+
return buildMessage(key, {
36+
type: 'url',
37+
context: {
38+
type: 'url',
39+
translationArgs,
40+
},
41+
});
42+
}
43+
return validateFormat({
44+
allowBlank: false,
45+
type: 'url',
46+
translationArgs,
47+
})(key, newValue, _, __, ___);
48+
};
49+
}

mirage/fixtures/preprint-providers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const preprintProviders: Array<Partial<PreprintProvider>> = [
2121
assets: randomAssets(1),
2222
footerLinks: 'fake footer links',
2323
reviewsWorkflow: PreprintProviderReviewsWorkFlow.PRE_MODERATION,
24+
assertionsEnabled: true,
2425
allowCommenting: true,
2526
allowSubmissions: true,
2627
},
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { module, test } from 'qunit';
2+
import { setupTest } from 'ember-qunit';
3+
import { validateUrlWithProtocols } from 'ember-osf-web/validators/url-with-protocol';
4+
5+
module('Unit | Validator | url-with-protocol', function(hooks) {
6+
setupTest(hooks);
7+
8+
test('it works', function(assert) {
9+
const baseValidator = validateUrlWithProtocols();
10+
assert.ok(baseValidator('http://a.com'), 'http is valid');
11+
assert.ok(baseValidator('https://b.com'), 'https is valid');
12+
assert.strictEqual(baseValidator('c.com').type, 'url', 'no protocol is invalid');
13+
assert.strictEqual(baseValidator('http://d').type, 'url', 'no domain is invalid');
14+
assert.strictEqual(baseValidator('ftp://e.com').type, 'url', 'ftp is invalid');
15+
16+
const customValidator = validateUrlWithProtocols({ acceptedProtocols: ['http'] });
17+
assert.ok(customValidator('http://a.com'), 'http is valid');
18+
assert.strictEqual(customValidator('https://b.com').type, 'url', 'https is invalid');
19+
assert.strictEqual(customValidator('c.com').type, 'url', 'no protocol is invalid');
20+
assert.strictEqual(customValidator('http://d').type, 'url', 'no domain is invalid');
21+
assert.strictEqual(customValidator('ftp://e.com').type, 'url', 'ftp is invalid');
22+
});
23+
});

types/ember-changeset-validations/utils/validation-errors.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ export interface RawValidationResult extends ValidationResult {
1111
message: string;
1212
}
1313

14-
export default function buildMessage(key: tring, result: ValidationResult): string | RawValidationResult;
14+
export default function buildMessage(key: string, result: ValidationResult): string | RawValidationResult;

0 commit comments

Comments
 (0)