Skip to content

Commit ca48a46

Browse files
committed
Merged dspace-cris-2023_02_x into task/dspace-cris-2023_02_x/DSC-2599
2 parents 3648b0f + 5d1abaa commit ca48a46

63 files changed

Lines changed: 844 additions & 103 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

config/config.example.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ auth:
133133
# This is independent from the idle warning.
134134
timeLeftBeforeTokenRefresh: 120000 # 2 minutes
135135
# Standard login enabled
136-
disableStandardLogin: false
136+
isPasswordLoginEnabledForAdminsOnly: false
137137

138138
# Form settings
139139
form:

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
"markdown-it-mathjax3": "^4.3.2",
134134
"mirador": "^3.4.3",
135135
"mirador-dl-plugin": "^0.13.0",
136+
"mirador-imagecropper": "^0.1.9",
136137
"mirador-share-plugin": "^0.16.0",
137138
"morgan": "^1.10.0",
138139
"ng2-file-upload": "1.4.0",
@@ -205,8 +206,8 @@
205206
"karma-jasmine": "~4.0.0",
206207
"karma-jasmine-html-reporter": "^1.5.0",
207208
"karma-mocha-reporter": "2.2.5",
208-
"ngx-export-as": "~1.15.1",
209209
"ng-mocks": "^14.13.2",
210+
"ngx-export-as": "~1.15.1",
210211
"ngx-mask": "13.1.7",
211212
"nodemon": "^2.0.22",
212213
"postcss": "^8.5",

src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
252252
name: 'email',
253253
validators: {
254254
required: null,
255-
pattern: '^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$',
255+
pattern: '^\\s*[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}\\s*$',
256256
},
257257
required: true,
258258
errorMessages: {
@@ -367,7 +367,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
367367
},
368368
],
369369
},
370-
email: this.email.value,
370+
email: (this.email.value as string)?.trim(),
371371
canLogIn: this.canLogIn.value,
372372
requireCertificate: this.requireCertificate.value,
373373
};

src/app/app-routing.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,12 @@ import {
179179
canActivate: [GenericAdministratorGuard, EndUserAgreementCurrentUserGuard]
180180
},
181181
{
182-
path: 'standard-login',
182+
path: 'admin-only-login',
183183
loadChildren: () => import('./login-page/login-page.module').then((m) => m.LoginPageModule),
184184
data: {
185185
isBackDoor: true,
186186
},
187-
canMatch: [() => !environment.auth.disableStandardLogin],
187+
canMatch: [() => environment.auth.isPasswordLoginEnabledForAdminsOnly],
188188
},
189189
{
190190
path: 'login',

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
import { Inject, Injectable } from '@angular/core';
22
import { DOCUMENT } from '@angular/common';
3+
import { DomSanitizer } from '@angular/platform-browser';
34

45
import { Item } from '../../shared/item.model';
56
import { getSchemaJsonLDProviderByEntity, getSchemaJsonLDProviderByType } from './schema-types/schema-type-decorator';
67
import { GenericConstructor } from '../../shared/generic-constructor';
78
import { SchemaType } from './schema-types/schema-type';
89
import { isEmpty, isNotEmpty } from '../../../shared/empty.util';
910

10-
@Injectable()
11+
@Injectable({ providedIn: 'root' })
1112
export class SchemaJsonLDService {
1213
static scriptType = 'application/ld+json';
1314

14-
constructor(@Inject(DOCUMENT) private _document: Document) {}
15+
constructor(
16+
@Inject(DOCUMENT) private _document: Document,
17+
protected sanitizer: DomSanitizer,
18+
) {}
1519

1620
removeStructuredData(): void {
1721
const els = [];
@@ -57,7 +61,7 @@ export class SchemaJsonLDService {
5761
}
5862

5963
if (isNotEmpty(constructor)) {
60-
const provider: SchemaType = new constructor();
64+
const provider: SchemaType = new constructor(this.sanitizer);
6165
return provider.getSchema(item);
6266
} else {
6367
return null;

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

Lines changed: 33 additions & 0 deletions
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 { Item } from '../../../shared/item.model';
46
import { isNotEmpty } from '../../../../shared/empty.util';
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,36 @@ 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> {
3566
return SchemaType.removeEmpty(this.createSchema(item));
67+
const sanitizedRaw = this.sanitizeSchema(this.createSchema(item));
68+
return SchemaType.removeEmpty(sanitizedRaw);
3669
}
3770
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<ds-item-page-cc-license-field
2+
[item]="item"
3+
[variant]="'full'"
4+
[ccLicenseUriField]="dcRightsUri"
5+
[ccLicenseNameField]="dcRights"
6+
[showLabel]="false"
7+
[showUrl]="true">
8+
</ds-item-page-cc-license-field>

src/app/cris-layout/cris-layout-matrix/cris-layout-box-container/boxes/metadata/rendering-types/cc-license-large/cc-license-large.component.scss

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
import { TranslateModule } from '@ngx-translate/core';
3+
import { CcLicenseLargeComponent } from './cc-license-large.component';
4+
5+
describe('CcLicenseLargeComponent', () => {
6+
let component: CcLicenseLargeComponent;
7+
let fixture: ComponentFixture<CcLicenseLargeComponent>;
8+
9+
const mockItem = {
10+
firstMetadataValue: jasmine.createSpy('firstMetadataValue').and.returnValue(''),
11+
metadata: {},
12+
findMetadataSortedByPlace: jasmine.createSpy('findMetadataSortedByPlace').and.returnValue([]),
13+
};
14+
15+
const mockField = {
16+
metadataGroup: { elements: [] },
17+
styleValue: '',
18+
};
19+
20+
beforeEach(async () => {
21+
await TestBed.configureTestingModule({
22+
imports: [TranslateModule.forRoot()],
23+
declarations: [CcLicenseLargeComponent],
24+
providers: [
25+
{ provide: 'fieldProvider', useValue: mockField },
26+
{ provide: 'itemProvider', useValue: mockItem },
27+
{ provide: 'metadataValueProvider', useValue: {} },
28+
{ provide: 'renderingSubTypeProvider', useValue: '' },
29+
{ provide: 'tabNameProvider', useValue: '' },
30+
],
31+
}).compileComponents();
32+
33+
fixture = TestBed.createComponent(CcLicenseLargeComponent);
34+
component = fixture.componentInstance;
35+
36+
component.componentsToBeRenderedMap.set(0, [
37+
{ field: { metadata: 'dc.rights' } as any, value: {} as any },
38+
{ field: { metadata: 'dc.rights.uri' } as any, value: {} as any },
39+
] as any);
40+
41+
fixture.detectChanges();
42+
});
43+
44+
it('should create', () => {
45+
expect(component).toBeTruthy();
46+
});
47+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {Component, Inject, OnInit} from '@angular/core';
2+
import {FieldRenderingType, MetadataBoxFieldRendering} from '../metadata-box.decorator';
3+
import {MetadataGroupComponent} from '../metadataGroup/metadata-group.component';
4+
import {LayoutField} from '../../../../../../../core/layout/models/box.model';
5+
import {Item} from '../../../../../../../core/shared/item.model';
6+
import {TranslateService} from '@ngx-translate/core';
7+
8+
@Component({
9+
selector: 'ds-cc-license-large',
10+
templateUrl: './cc-license-large.component.html',
11+
styleUrls: ['./cc-license-large.component.scss']
12+
})
13+
@MetadataBoxFieldRendering(FieldRenderingType.CCLICENSEFULL)
14+
export class CcLicenseLargeComponent extends MetadataGroupComponent implements OnInit {
15+
16+
dcRights: any;
17+
dcRightsUri: any;
18+
19+
constructor(
20+
@Inject('fieldProvider') public fieldProvider: LayoutField,
21+
@Inject('itemProvider') public itemProvider: Item,
22+
@Inject('renderingSubTypeProvider') public renderingSubTypeProvider: string,
23+
@Inject('tabNameProvider') public tabNameProvider: string,
24+
protected translateService: TranslateService,
25+
) {
26+
super(fieldProvider, itemProvider, renderingSubTypeProvider, tabNameProvider, translateService);
27+
}
28+
ngOnInit(): void {
29+
super.ngOnInit();
30+
const ccLicenseEntryMetadata = this.componentsToBeRenderedMap.get(0);
31+
[this.dcRights, this.dcRightsUri] = ccLicenseEntryMetadata.map((entryMeta) => entryMeta.field.metadata);
32+
33+
}
34+
}

0 commit comments

Comments
 (0)