Skip to content

Commit 5a194b7

Browse files
FrancescoMolinaroatarix83
authored andcommitted
Merged in task/dspace-cris-2024_02_x/DSC-2609 (pull request DSpace#3895)
[DSC-2609] sanitize schema for structured data, fix schema decorator Approved-by: Giuseppe Digilio
2 parents 909856a + 20ecd0e commit 5a194b7

File tree

4 files changed

+65
-3
lines changed

4 files changed

+65
-3
lines changed

src/app/app.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import { AuthInterceptor } from './core/auth/auth.interceptor';
5757
import { DspaceRestInterceptor } from './core/dspace-rest/dspace-rest.interceptor';
5858
import { LocaleInterceptor } from './core/locale/locale.interceptor';
5959
import { LogInterceptor } from './core/log/log.interceptor';
60+
import { schemaModels } from './core/metadata/schema-json-ld/schema-types/provide-schema';
6061
import {
6162
models,
6263
provideCore,
@@ -169,3 +170,4 @@ const metadataRepresentations = METADATA_REPRESENTATION_COMPONENT_DECORATOR_MAP;
169170
const startsWithDecoratorMap = STARTS_WITH_DECORATOR_MAP;
170171
const browseByDecoratorMap = BROWSE_BY_DECORATOR_MAP;
171172
const authMethodForDecoratorMap = AUTH_METHOD_FOR_DECORATOR_MAP;
173+
const schemaModelList = schemaModels;

src/app/core/metadata/schema-json-ld/schema-json-ld.service.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
Inject,
44
Injectable,
55
} from '@angular/core';
6+
import { DomSanitizer } from '@angular/platform-browser';
67

78
import {
89
isEmpty,
@@ -20,7 +21,10 @@ import {
2021
export class SchemaJsonLDService {
2122
static scriptType = 'application/ld+json';
2223

23-
constructor(@Inject(DOCUMENT) private _document: Document) {}
24+
constructor(
25+
@Inject(DOCUMENT) private _document: Document,
26+
protected sanitizer: DomSanitizer,
27+
) {}
2428

2529
removeStructuredData(): void {
2630
const els = [];
@@ -66,7 +70,7 @@ export class SchemaJsonLDService {
6670
}
6771

6872
if (isNotEmpty(constructor)) {
69-
const provider: SchemaType = new constructor();
73+
const provider: SchemaType = new constructor(this.sanitizer);
7074
return provider.getSchema(item);
7175
} else {
7276
return null;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { PersonSchemaType } from './Person/person-schema-type';
2+
import { ProductCreativeWorkSchemaType } from './product/product-creative-work-schema-type';
3+
import { ProductDatasetSchemaType } from './product/product-dataset-schema-type';
4+
import { PublicationBookSchemaType } from './publication/publication-book-schema-type';
5+
import { PublicationChapterSchemaType } from './publication/publication-chapter-schema-type';
6+
import { PublicationCreativeWorkSchemaType } from './publication/publication-creative-work-schema-type';
7+
import { PublicationReportSchemaType } from './publication/publication-report-schema-type';
8+
import { PublicationScholarlyArticleSchemaType } from './publication/publication-scholarly-article-schema-type';
9+
import { PublicationThesisSchemaType } from './publication/publication-thesis-schema-type';
10+
11+
/**
12+
* Declaration needed to make sure all decorator functions are called in time
13+
*/
14+
export const schemaModels = [
15+
PersonSchemaType,
16+
ProductCreativeWorkSchemaType,
17+
ProductDatasetSchemaType,
18+
PublicationBookSchemaType,
19+
PublicationChapterSchemaType,
20+
PublicationCreativeWorkSchemaType,
21+
PublicationReportSchemaType,
22+
PublicationScholarlyArticleSchemaType,
23+
PublicationThesisSchemaType,
24+
];

src/app/core/metadata/schema-json-ld/schema-types/schema-type.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
import { SecurityContext } from '@angular/core';
2+
import { DomSanitizer } from '@angular/platform-browser';
13
import isObject from 'lodash/isObject';
24

35
import { isNotEmpty } from '../../../../shared/empty.util';
46
import { Item } from '../../../shared/item.model';
57

68
export abstract class SchemaType {
9+
constructor(protected sanitizer: DomSanitizer) {}
10+
711
protected abstract createSchema(item: Item): Record<string, any>;
812
protected abstract createSchema(item: Item): Record<string, any>;
913

@@ -31,7 +35,35 @@ export abstract class SchemaType {
3135
}
3236
}
3337

38+
protected sanitizeSchema(obj: any): Record<string, any> {
39+
if (Array.isArray(obj)) {
40+
return obj.map(v =>
41+
typeof v === 'string'
42+
? this.sanitizer.sanitize(SecurityContext.HTML, v)
43+
: this.sanitizeSchema(v),
44+
);
45+
}
46+
47+
if (typeof obj === 'object' && obj !== null) {
48+
const sanitized: Record<string, any> = {};
49+
for (const key in obj) {
50+
if (obj.hasOwnProperty(key)) {
51+
const value = obj[key];
52+
sanitized[key] =
53+
typeof value === 'string'
54+
? this.sanitizer.sanitize(SecurityContext.HTML, value)
55+
: this.sanitizeSchema(value);
56+
}
57+
}
58+
return sanitized;
59+
}
60+
61+
return obj;
62+
}
63+
64+
3465
getSchema(item: Item): Record<string, any> {
35-
return SchemaType.removeEmpty(this.createSchema(item));
66+
const sanitizedRaw = this.sanitizeSchema(this.createSchema(item));
67+
return SchemaType.removeEmpty(sanitizedRaw);
3668
}
3769
}

0 commit comments

Comments
 (0)