From 72178dd7c4a6e4780ef44cad6b10cc74338b38b2 Mon Sep 17 00:00:00 2001 From: _Bastler <_Bastler@bstly.de> Date: Thu, 22 Jul 2021 18:45:04 +0200 Subject: [PATCH] upgrade to newest backend --- src/app/app-routing.module.ts | 6 +- src/app/app.module.ts | 6 +- .../pages/account/account.component.spec.ts | 25 ---- .../account/aliases/aliases.component.spec.ts | 25 ---- .../account/domains/domains.component.spec.ts | 25 ---- .../pages/account/info/info.component.spec.ts | 25 ---- .../account/profile/profile.component.spec.ts | 25 ---- .../security/security.component.spec.ts | 25 ---- .../account/security/security.component.ts | 14 +- .../account/voucher/voucher.component.spec.ts | 25 ---- .../form-login-2fa.component.html | 39 ++++++ .../form-login-2fa.component.scss} | 0 .../form-login-2fa.component.ts} | 27 +++- .../form-login-totp.component.html | 27 ---- .../form-login-totp.component.spec.ts | 25 ---- .../form-login/form-login.component.spec.ts | 25 ---- .../pages/invites/invites.component.spec.ts | 25 ---- src/app/pages/jitsi/jitsi.component.spec.ts | 25 ---- .../login-totp/login-totp.component.spec.ts | 25 ---- .../pages/login-totp/login-totp.component.ts | 24 ++-- src/app/pages/login/login.component.spec.ts | 25 ---- .../pages/notfound/notfound.component.spec.ts | 25 ---- .../password-reset.component.spec.ts | 25 ---- .../pages/password/password.component.spec.ts | 25 ---- .../pages/register/register.component.spec.ts | 25 ---- .../pages/services/services.component.spec.ts | 25 ---- src/app/pages/tokens/tokens.component.spec.ts | 25 ---- .../unavailable/unavailable.component.spec.ts | 25 ---- src/app/pages/user/user.component.html | 2 +- src/app/pages/user/user.component.spec.ts | 25 ---- src/app/pages/user/user.component.ts | 9 ++ src/app/services/auth.2fa.service.ts | 45 +++++++ src/app/services/auth.service.ts | 32 +---- .../permissions/permissions.component.spec.ts | 25 ---- .../binary/pgp/profilefield.pgp-blob.ts | 2 +- .../profilefields.component.spec.ts | 25 ---- src/app/ui/quotas/quotas.component.spec.ts | 25 ---- .../templates/de-informal/privacy-policy.html | 127 ++++++++++++++++-- src/assets/templates/en/privacy-policy.html | 127 ++++++++++++++++-- 39 files changed, 382 insertions(+), 705 deletions(-) delete mode 100644 src/app/pages/account/account.component.spec.ts delete mode 100644 src/app/pages/account/aliases/aliases.component.spec.ts delete mode 100644 src/app/pages/account/domains/domains.component.spec.ts delete mode 100644 src/app/pages/account/info/info.component.spec.ts delete mode 100644 src/app/pages/account/profile/profile.component.spec.ts delete mode 100644 src/app/pages/account/security/security.component.spec.ts delete mode 100644 src/app/pages/account/voucher/voucher.component.spec.ts create mode 100644 src/app/pages/form-login-2fa/form-login-2fa.component.html rename src/app/pages/{form-login-totp/form-login-totp.component.scss => form-login-2fa/form-login-2fa.component.scss} (100%) rename src/app/pages/{form-login-totp/form-login-totp.component.ts => form-login-2fa/form-login-2fa.component.ts} (55%) delete mode 100644 src/app/pages/form-login-totp/form-login-totp.component.html delete mode 100644 src/app/pages/form-login-totp/form-login-totp.component.spec.ts delete mode 100644 src/app/pages/form-login/form-login.component.spec.ts delete mode 100644 src/app/pages/invites/invites.component.spec.ts delete mode 100644 src/app/pages/jitsi/jitsi.component.spec.ts delete mode 100644 src/app/pages/login-totp/login-totp.component.spec.ts delete mode 100644 src/app/pages/login/login.component.spec.ts delete mode 100644 src/app/pages/notfound/notfound.component.spec.ts delete mode 100644 src/app/pages/password-reset/password-reset.component.spec.ts delete mode 100644 src/app/pages/password/password.component.spec.ts delete mode 100644 src/app/pages/register/register.component.spec.ts delete mode 100644 src/app/pages/services/services.component.spec.ts delete mode 100644 src/app/pages/tokens/tokens.component.spec.ts delete mode 100644 src/app/pages/unavailable/unavailable.component.spec.ts delete mode 100644 src/app/pages/user/user.component.spec.ts create mode 100644 src/app/services/auth.2fa.service.ts delete mode 100644 src/app/ui/permissions/permissions.component.spec.ts delete mode 100644 src/app/ui/profilefields/profilefields.component.spec.ts delete mode 100644 src/app/ui/quotas/quotas.component.spec.ts diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 02ba82f..99b7358 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -4,7 +4,7 @@ import {Routes, RouterModule} from '@angular/router'; import {AuthGuard, AuthUpdateGuard, AuthenticatedGuard, AnonymousGuard} from './auth/auth.guard'; import {ImprintComponent, PrivacyPolicyComponent, TermsOfServiceComponent} from './pages/general/general.component'; import {FormLoginComponent} from './pages/form-login/form-login.component'; -import {FormLoginTotpComponent} from './pages/form-login-totp/form-login-totp.component'; +import {FormLogin2FAComponent} from './pages/form-login-2fa/form-login-2fa.component'; import {PasswordComponent} from './pages/password/password.component'; import {PasswordResetComponent} from './pages/password-reset/password-reset.component'; import {AccountComponent} from './pages/account/account.component'; @@ -30,9 +30,9 @@ const routes: Routes = [ {path: 'privacy-policy', component: PrivacyPolicyComponent, canActivate: [AuthUpdateGuard]}, {path: 'terms-of-service', component: TermsOfServiceComponent, canActivate: [AuthUpdateGuard]}, {path: 'login', component: FormLoginComponent, canActivate: [AnonymousGuard]}, - {path: 'login/totp', component: FormLoginTotpComponent, canActivate: [AnonymousGuard]}, + {path: 'login/2fa', component: FormLogin2FAComponent, canActivate: [AnonymousGuard]}, {path: 'service-login', component: FormLoginComponent, canActivate: [AnonymousGuard]}, - {path: 'service-login/totp', component: FormLoginTotpComponent, canActivate: [AnonymousGuard]}, + {path: 'service-login/2fa', component: FormLogin2FAComponent, canActivate: [AnonymousGuard]}, {path: 'password', component: PasswordComponent, canActivate: [AnonymousGuard]}, {path: 'password-reset', component: PasswordResetComponent, canActivate: [AnonymousGuard]}, {path: 'services', component: ServicesComponent, canActivate: [AuthenticatedGuard]}, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 43da62b..3ec8604 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -18,9 +18,8 @@ import {AccountComponent} from './pages/account/account.component'; import {ServicesComponent} from './pages/services/services.component'; import {AppComponent} from './app.component'; import {LoginComponent} from './pages/login/login.component'; -import {LoginTotpComponent} from './pages/login-totp/login-totp.component'; import {FormLoginComponent} from './pages/form-login/form-login.component'; -import {FormLoginTotpComponent} from './pages/form-login-totp/form-login-totp.component'; +import {FormLogin2FAComponent} from './pages/form-login-2fa/form-login-2fa.component'; import {TokensComponent} from './pages/tokens/tokens.component'; import {InvitesComponent} from './pages/invites/invites.component'; import {PermissionsComponent} from './ui/permissions/permissions.component'; @@ -73,9 +72,8 @@ export class XhrInterceptor implements HttpInterceptor { ImprintComponent, PrivacyPolicyComponent, TermsOfServiceComponent, AccountComponent, LoginComponent, - LoginTotpComponent, FormLoginComponent, - FormLoginTotpComponent, + FormLogin2FAComponent, TokensComponent, InvitesComponent, ServicesComponent, diff --git a/src/app/pages/account/account.component.spec.ts b/src/app/pages/account/account.component.spec.ts deleted file mode 100644 index bb03b11..0000000 --- a/src/app/pages/account/account.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AccountComponent } from './account.component'; - -describe('AccountComponent', () => { - let component: AccountComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ AccountComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(AccountComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/account/aliases/aliases.component.spec.ts b/src/app/pages/account/aliases/aliases.component.spec.ts deleted file mode 100644 index ee004f2..0000000 --- a/src/app/pages/account/aliases/aliases.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AliasesComponent } from './aliases.component'; - -describe('AliasesComponent', () => { - let component: AliasesComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ AliasesComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(AliasesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/account/domains/domains.component.spec.ts b/src/app/pages/account/domains/domains.component.spec.ts deleted file mode 100644 index 9df4628..0000000 --- a/src/app/pages/account/domains/domains.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { DomainsComponent } from './domains.component'; - -describe('DomainsComponent', () => { - let component: DomainsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ DomainsComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(DomainsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/account/info/info.component.spec.ts b/src/app/pages/account/info/info.component.spec.ts deleted file mode 100644 index fead35b..0000000 --- a/src/app/pages/account/info/info.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { InfoComponent } from './info.component'; - -describe('InfoComponent', () => { - let component: InfoComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ InfoComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(InfoComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/account/profile/profile.component.spec.ts b/src/app/pages/account/profile/profile.component.spec.ts deleted file mode 100644 index 39cbc71..0000000 --- a/src/app/pages/account/profile/profile.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {ComponentFixture, TestBed} from '@angular/core/testing'; - -import {ProfileComponent} from './profile.component'; - -describe('ProfileComponent', () => { - let component: ProfileComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ProfileComponent] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(ProfileComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/account/security/security.component.spec.ts b/src/app/pages/account/security/security.component.spec.ts deleted file mode 100644 index c9f63af..0000000 --- a/src/app/pages/account/security/security.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SecurityComponent } from './security.component'; - -describe('SecurityComponent', () => { - let component: SecurityComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ SecurityComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(SecurityComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/account/security/security.component.ts b/src/app/pages/account/security/security.component.ts index 05ad842..378976b 100644 --- a/src/app/pages/account/security/security.component.ts +++ b/src/app/pages/account/security/security.component.ts @@ -2,7 +2,7 @@ import {Component, OnInit, ViewChild, Inject} from '@angular/core'; import {FormBuilder, FormGroup, FormControl, Validators, NgForm} from '@angular/forms'; import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; -import {AuthService} from './../../../services/auth.service'; +import {Auth2FAService} from './../../../services/auth.2fa.service'; import {UserService} from './../../../services/user.service'; import {MatchingValidator} from './../../../utils/matching.validator'; @@ -29,7 +29,7 @@ export class SecurityComponent implements OnInit { constructor( private formBuilder: FormBuilder, private userService: UserService, - private authService: AuthService, + private auth2FAService: Auth2FAService, public dialog: MatDialog) {} ngOnInit(): void { @@ -52,7 +52,7 @@ export class SecurityComponent implements OnInit { }) - this.authService.isTotpEnabled().subscribe(response => { + this.auth2FAService.isEnabled('totp').subscribe(response => { this.totp = true; }, error => { this.totp = false; @@ -99,7 +99,7 @@ export class SecurityComponent implements OnInit { } createTotp() { - this.authService.createTotp().subscribe((result: any) => { + this.auth2FAService.create('totp').subscribe((result: any) => { const dialogRef = this.dialog.open(SecurityTotpDialog, { closeOnNavigation: false, disableClose: true, @@ -108,11 +108,11 @@ export class SecurityComponent implements OnInit { dialogRef.afterClosed().subscribe(result => { if(result) { - this.authService.enableTotp(result).subscribe((result: any) => { + this.auth2FAService.enable('totp', result).subscribe((result: any) => { this.totp = true; }) } else { - this.authService.removeTotp().subscribe((result: any) => { + this.auth2FAService.remove('totp').subscribe((result: any) => { this.totp = false; }) } @@ -130,7 +130,7 @@ export class SecurityComponent implements OnInit { } removeTotp() { - this.authService.removeTotp().subscribe((result: any) => { + this.auth2FAService.remove('totp').subscribe((result: any) => { this.totp = false; }) } diff --git a/src/app/pages/account/voucher/voucher.component.spec.ts b/src/app/pages/account/voucher/voucher.component.spec.ts deleted file mode 100644 index b2ff8f5..0000000 --- a/src/app/pages/account/voucher/voucher.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { VoucherComponent } from './voucher.component'; - -describe('VoucherComponent', () => { - let component: VoucherComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ VoucherComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(VoucherComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/form-login-2fa/form-login-2fa.component.html b/src/app/pages/form-login-2fa/form-login-2fa.component.html new file mode 100644 index 0000000..67b7fd9 --- /dev/null +++ b/src/app/pages/form-login-2fa/form-login-2fa.component.html @@ -0,0 +1,39 @@ +
+ + +

{{'security.2fa.external' | i18n}}open_in_new + +

+ + {{'security.2fa.invalid' | i18n}} + + + + + {{'security.2fa.' + provider.id | i18n}} + + + {{'security.2fa.' + selectedProvider.id + + '.request' + | i18n}} + + + + {{'security.2fa.missing' | i18n}} + + + + {{'login.keepSession' | i18n}} + +
+ + + +
+
\ No newline at end of file diff --git a/src/app/pages/form-login-totp/form-login-totp.component.scss b/src/app/pages/form-login-2fa/form-login-2fa.component.scss similarity index 100% rename from src/app/pages/form-login-totp/form-login-totp.component.scss rename to src/app/pages/form-login-2fa/form-login-2fa.component.scss diff --git a/src/app/pages/form-login-totp/form-login-totp.component.ts b/src/app/pages/form-login-2fa/form-login-2fa.component.ts similarity index 55% rename from src/app/pages/form-login-totp/form-login-totp.component.ts rename to src/app/pages/form-login-2fa/form-login-2fa.component.ts index 6664694..c18cf8d 100644 --- a/src/app/pages/form-login-totp/form-login-totp.component.ts +++ b/src/app/pages/form-login-2fa/form-login-2fa.component.ts @@ -3,20 +3,25 @@ import {ActivatedRoute, Router} from '@angular/router'; import {environment} from '../../../environments/environment'; +import {Auth2FAService} from '../../services/auth.2fa.service'; + @Component({ - selector: 'app-form-login-totp', - templateUrl: './form-login-totp.component.html', - styleUrls: ['./form-login-totp.component.scss'] + selector: 'app-form-login-2fa', + templateUrl: './form-login-2fa.component.html', + styleUrls: ['./form-login-2fa.component.scss'] }) -export class FormLoginTotpComponent implements OnInit { +export class FormLogin2FAComponent implements OnInit { loginInvalid: boolean; keep: boolean = false; apiUrl = environment.apiUrl; + selectedProvider = {id: "", request: false}; + providers = []; constructor( private router: Router, - private route: ActivatedRoute) {} + private route: ActivatedRoute, + private auth2FAService: Auth2FAService) {} async ngOnInit() { this.route.queryParams.subscribe(params => { @@ -29,8 +34,20 @@ export class FormLoginTotpComponent implements OnInit { this.router.navigate([], {queryParams: {keep: null}, queryParamsHandling: 'merge'}); } }); + + this.auth2FAService.getEnabled().subscribe((providers: any) => { + this.providers = providers; + if(this.providers[0]) { + this.selectedProvider = this.providers[0]; + } + }) + } + request() { + + } + } diff --git a/src/app/pages/form-login-totp/form-login-totp.component.html b/src/app/pages/form-login-totp/form-login-totp.component.html deleted file mode 100644 index 8e3938b..0000000 --- a/src/app/pages/form-login-totp/form-login-totp.component.html +++ /dev/null @@ -1,27 +0,0 @@ -
- - -

{{'security.2fa.totp.external' | i18n}}open_in_new - -

- - {{'security.2fa.totp.invalid' | i18n}} - - - - - {{'security.2fa.totp.missing' | i18n}} - - - - {{'login.keepSession' | i18n}} - -
- - - -
-
\ No newline at end of file diff --git a/src/app/pages/form-login-totp/form-login-totp.component.spec.ts b/src/app/pages/form-login-totp/form-login-totp.component.spec.ts deleted file mode 100644 index be51154..0000000 --- a/src/app/pages/form-login-totp/form-login-totp.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FormLoginTotpComponent } from './form-login-totp.component'; - -describe('FormLoginTotpComponent', () => { - let component: FormLoginTotpComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ FormLoginTotpComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(FormLoginTotpComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/form-login/form-login.component.spec.ts b/src/app/pages/form-login/form-login.component.spec.ts deleted file mode 100644 index bb9135d..0000000 --- a/src/app/pages/form-login/form-login.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FormLoginComponent } from './form-login.component'; - -describe('FormLoginComponent', () => { - let component: FormLoginComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ FormLoginComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(FormLoginComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/invites/invites.component.spec.ts b/src/app/pages/invites/invites.component.spec.ts deleted file mode 100644 index 80606dc..0000000 --- a/src/app/pages/invites/invites.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { InvitesComponent } from './invites.component'; - -describe('InvitesComponent', () => { - let component: InvitesComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ InvitesComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(InvitesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/jitsi/jitsi.component.spec.ts b/src/app/pages/jitsi/jitsi.component.spec.ts deleted file mode 100644 index 1447e9b..0000000 --- a/src/app/pages/jitsi/jitsi.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { JitsiComponent } from './jitsi.component'; - -describe('JitsiComponent', () => { - let component: JitsiComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ JitsiComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(JitsiComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/login-totp/login-totp.component.spec.ts b/src/app/pages/login-totp/login-totp.component.spec.ts deleted file mode 100644 index 767fba1..0000000 --- a/src/app/pages/login-totp/login-totp.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LoginTotpComponent } from './login-totp.component'; - -describe('LoginTotpComponent', () => { - let component: LoginTotpComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ LoginTotpComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(LoginTotpComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/login-totp/login-totp.component.ts b/src/app/pages/login-totp/login-totp.component.ts index 7bf20af..3112647 100644 --- a/src/app/pages/login-totp/login-totp.component.ts +++ b/src/app/pages/login-totp/login-totp.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { AuthService } from '../../services/auth.service'; -import { Router, ActivatedRoute } from '@angular/router'; +import {Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Auth2FAService} from '../../services/auth.2fa.service'; +import {Router, ActivatedRoute} from '@angular/router'; -import { environment } from '../../../environments/environment'; +import {environment} from '../../../environments/environment'; @Component({ selector: 'app-login', @@ -17,7 +17,7 @@ export class LoginTotpComponent implements OnInit { public apiUrl = environment.apiUrl; targetRoute = '/account/info'; - constructor(private formBuilder: FormBuilder, private authService: AuthService, private router: Router, private route: ActivatedRoute) { } + constructor(private formBuilder: FormBuilder, private auth2FAService: Auth2FAService, private router: Router, private route: ActivatedRoute) {} ngOnInit() { @@ -27,7 +27,7 @@ export class LoginTotpComponent implements OnInit { }); this.route.queryParams.subscribe(params => { - if (params['target']) { + if(params['target']) { this.targetRoute = params['target']; } }); @@ -35,14 +35,8 @@ export class LoginTotpComponent implements OnInit { async loginTotp() { this.loginInvalid = false; - if (this.form.valid) { - - const totpModel = { - code: this.form.get('code').value, - keep: this.form.get('keep').value - }; - - this.authService.loginTotp(totpModel).subscribe((response: any) => { + if(this.form.valid) { + this.auth2FAService.login('totp', this.form.get('code').value, this.form.get('keep').value).subscribe((response: any) => { this.router.navigate([this.targetRoute]); }, error => { this.loginInvalid = true; diff --git a/src/app/pages/login/login.component.spec.ts b/src/app/pages/login/login.component.spec.ts deleted file mode 100644 index d2c0e6c..0000000 --- a/src/app/pages/login/login.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LoginComponent } from './login.component'; - -describe('LoginComponent', () => { - let component: LoginComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ LoginComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(LoginComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/notfound/notfound.component.spec.ts b/src/app/pages/notfound/notfound.component.spec.ts deleted file mode 100644 index dc3ee05..0000000 --- a/src/app/pages/notfound/notfound.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NotfoundComponent } from './notfound.component'; - -describe('NotfoundComponent', () => { - let component: NotfoundComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ NotfoundComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(NotfoundComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/password-reset/password-reset.component.spec.ts b/src/app/pages/password-reset/password-reset.component.spec.ts deleted file mode 100644 index e6bd9ac..0000000 --- a/src/app/pages/password-reset/password-reset.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PasswordResetComponent } from './password-reset.component'; - -describe('PasswordResetComponent', () => { - let component: PasswordResetComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PasswordResetComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PasswordResetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/password/password.component.spec.ts b/src/app/pages/password/password.component.spec.ts deleted file mode 100644 index 5bbde29..0000000 --- a/src/app/pages/password/password.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PasswordComponent } from './password.component'; - -describe('PasswordComponent', () => { - let component: PasswordComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PasswordComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PasswordComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/register/register.component.spec.ts b/src/app/pages/register/register.component.spec.ts deleted file mode 100644 index f6db869..0000000 --- a/src/app/pages/register/register.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { RegisterComponent } from './register.component'; - -describe('RegisterComponent', () => { - let component: RegisterComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ RegisterComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(RegisterComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/services/services.component.spec.ts b/src/app/pages/services/services.component.spec.ts deleted file mode 100644 index 1284c5f..0000000 --- a/src/app/pages/services/services.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ServicesComponent } from './services.component'; - -describe('ServicesComponent', () => { - let component: ServicesComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ ServicesComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(ServicesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/tokens/tokens.component.spec.ts b/src/app/pages/tokens/tokens.component.spec.ts deleted file mode 100644 index d7812a2..0000000 --- a/src/app/pages/tokens/tokens.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TokensComponent } from './tokens.component'; - -describe('TokensComponent', () => { - let component: TokensComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ TokensComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(TokensComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/unavailable/unavailable.component.spec.ts b/src/app/pages/unavailable/unavailable.component.spec.ts deleted file mode 100644 index 4063e4b..0000000 --- a/src/app/pages/unavailable/unavailable.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UnavailableComponent } from './unavailable.component'; - -describe('UnavailableComponent', () => { - let component: UnavailableComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ UnavailableComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(UnavailableComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/user/user.component.html b/src/app/pages/user/user.component.html index cd7ed7d..a30ccdf 100644 --- a/src/app/pages/user/user.component.html +++ b/src/app/pages/user/user.component.html @@ -2,7 +2,7 @@
-

{{model.username}}

+

{{model.username}} {{'user.isMe' | i18n}}

{{'user.aliases' | i18n}}

diff --git a/src/app/pages/user/user.component.spec.ts b/src/app/pages/user/user.component.spec.ts deleted file mode 100644 index e6bf596..0000000 --- a/src/app/pages/user/user.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UserComponent } from './user.component'; - -describe('UserComponent', () => { - let component: UserComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ UserComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(UserComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/pages/user/user.component.ts b/src/app/pages/user/user.component.ts index 3c1cf6f..bb66bbe 100644 --- a/src/app/pages/user/user.component.ts +++ b/src/app/pages/user/user.component.ts @@ -2,6 +2,7 @@ import {Component, OnInit} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; +import {AuthService} from '../../services/auth.service'; import {ProfileService} from '../../services/profile.service'; @Component({ @@ -14,8 +15,10 @@ export class UserComponent implements OnInit { model: any; error = false; success = false; + isMe = false; constructor( + private authService: AuthService, private profileService: ProfileService, private route: ActivatedRoute) {} @@ -27,6 +30,12 @@ export class UserComponent implements OnInit { }, error => { this.error = error; }) + + this.authService.auth.subscribe((auth: any) => { + this.isMe = auth && auth.principal && auth.principal.username == this.username; + console.log(this.isMe, auth); + }); + } diff --git a/src/app/services/auth.2fa.service.ts b/src/app/services/auth.2fa.service.ts new file mode 100644 index 0000000..85bd91f --- /dev/null +++ b/src/app/services/auth.2fa.service.ts @@ -0,0 +1,45 @@ +import {Injectable} from '@angular/core'; +import {HttpClient, HttpHeaders} from '@angular/common/http'; + +import {environment} from '../../environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class Auth2FAService { + + constructor(private http: HttpClient) { + } + + getEnabled() { + return this.http.get(environment.apiUrl + "/auth/2fa"); + } + + getAvailable() { + return this.http.get(environment.apiUrl + "/auth/2fa/available"); + } + + isEnabled(provider) { + return this.http.get(environment.apiUrl + "/auth/2fa/" + provider); + } + + create(provider) { + return this.http.put(environment.apiUrl + "/auth/2fa/" + provider, {}); + } + + enable(provider, code) { + return this.http.patch(environment.apiUrl + "/auth/2fa/" + provider, code); + } + + remove(provider) { + return this.http.delete(environment.apiUrl + "/auth/2fa/" + provider); + } + + login(provider, code, keep) { + return this.http.post(environment.apiUrl + "/auth/login/2fa", { + 'provider': provider, + 'code': code, + 'keep': keep + }); + } +} \ No newline at end of file diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index a33ca02..4cc7ec4 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -1,15 +1,15 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject, of } from 'rxjs'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import {Injectable} from '@angular/core'; +import {ReplaySubject, of} from 'rxjs'; +import {HttpClient, HttpHeaders} from '@angular/common/http'; -import { environment } from './../../environments/environment'; +import {environment} from './../../environments/environment'; @Injectable({ providedIn: 'root', }) export class AuthService { - auth: BehaviorSubject = new BehaviorSubject(undefined); + auth: ReplaySubject = new ReplaySubject(undefined); constructor(private http: HttpClient) { } @@ -37,31 +37,11 @@ export class AuthService { passwordRequest(username) { const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8'); - return this.http.post(environment.apiUrl + "/auth/password/request", username, { headers, responseType: 'text' }); + return this.http.post(environment.apiUrl + "/auth/password/request", username, {headers, responseType: 'text'}); } passwordReset(model) { const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8'); return this.http.post(environment.apiUrl + "/auth/password/reset", model); } - - isTotpEnabled() { - return this.http.get(environment.apiUrl + "/auth/totp"); - } - - createTotp() { - return this.http.put(environment.apiUrl + "/auth/totp", {}); - } - - enableTotp(code) { - return this.http.patch(environment.apiUrl + "/auth/totp", code); - } - - removeTotp() { - return this.http.delete(environment.apiUrl + "/auth/totp"); - } - - loginTotp(totpModel) { - return this.http.post(environment.apiUrl + "/auth/login/totp", totpModel); - } } \ No newline at end of file diff --git a/src/app/ui/permissions/permissions.component.spec.ts b/src/app/ui/permissions/permissions.component.spec.ts deleted file mode 100644 index 03094d7..0000000 --- a/src/app/ui/permissions/permissions.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PermissionsComponent } from './permissions.component'; - -describe('PermissionsComponent', () => { - let component: PermissionComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PermissionsComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PermissionsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/ui/profilefields/binary/pgp/profilefield.pgp-blob.ts b/src/app/ui/profilefields/binary/pgp/profilefield.pgp-blob.ts index 720ac78..2ea2d98 100644 --- a/src/app/ui/profilefields/binary/pgp/profilefield.pgp-blob.ts +++ b/src/app/ui/profilefields/binary/pgp/profilefield.pgp-blob.ts @@ -29,7 +29,7 @@ export class ProfileFieldPgpBlob implements OnInit { } ngOnInit(): void { - this.authService.getAuth().then((auth: any) => { + this.authService.auth.subscribe((auth: any) => { if(!auth.authenticated) { return; } diff --git a/src/app/ui/profilefields/profilefields.component.spec.ts b/src/app/ui/profilefields/profilefields.component.spec.ts deleted file mode 100644 index 363865c..0000000 --- a/src/app/ui/profilefields/profilefields.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {ComponentFixture, TestBed} from '@angular/core/testing'; - -import {ProfileFieldsComponent} from './profilefields.component'; - -describe('ProfileFieldsComponent', () => { - let component: ProfileFieldsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ProfileFieldsComponent] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(ProfileFieldsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/ui/quotas/quotas.component.spec.ts b/src/app/ui/quotas/quotas.component.spec.ts deleted file mode 100644 index 85355bb..0000000 --- a/src/app/ui/quotas/quotas.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { QuotasComponent } from './quotas.component'; - -describe('QuotasComponent', () => { - let component: QuotasComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ QuotasComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(QuotasComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/assets/templates/de-informal/privacy-policy.html b/src/assets/templates/de-informal/privacy-policy.html index 2806642..70f4c30 100644 --- a/src/assets/templates/de-informal/privacy-policy.html +++ b/src/assets/templates/de-informal/privacy-policy.html @@ -878,6 +878,117 @@ +

Nutzung des Dienstes PeerTube tube.bstly.de

+ +
Gespeicherte Daten
+ +

Die folgenden Daten werden durch den Dienst PeerTube erfasst: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer SpeicherfristVerwendungszweckWeitergabe an Dritte
+ Streaming-Daten / IP-Addresse +

P2P Video Funktionalität (Details)

+
+

Alle Nutzer der Plattform mit aktiviertem Verteilsystem (Standard)

+
+

Bis zum Leeren des Browser Caches

+
+

Teilen von geschauten Videos über P2P mit anderen.

+
+

Weitergabe an Dritte! Kann aktiv ausgeschaltet werden.

+
+ Account-Daten +

Benutzername, E-Mail Adresse, Profildaten (freiwillig)

+
+

Benutzer mit Account

+
+

bis zur Löschung

+
+

Erstellen von Kanälen, Videos, Livestreams und Kommentaren.

+
+

einsehbar für andere Benutzer

+

öffentlich einsehbar bei Aktivitäten in öffentlichen Kanälen

+
+ Einstellungen/Kanäle +

Eigene, favorisierte Kanäle

+
+

Benutzer mit Account

+
+

bis zur Löschung

+
+

Verwaltung der Kanälen, Nutzung der Plattform

+
+

Weitergabe individuell vom Nutzer einstellbar

+
+ Videos/Livestreams +

Videos in den Kanälen

+
+

Benutzer mit Account

+
+

siehe Einstellungen/Kanäle

+
+

Hochladen von Videos in Kanäle, Bereitstellen der Videos für andere, Livestreams

+
+

Abhängig von Sichtbarkeit der entsprechenden Kanäle/Videos/Livestreams, siehe Einstellungen/Kanäle

+
+ Kommentare +

Kommentare zu Videos

+
+

Benutzer mit Account

+
+

siehe Einstellungen/ Kanäle

+
+

Kommunikation über Inhalte

+
+

Abhängig von Sichtbarkeit der entsprechenden Kanäle/Videos, siehe Einstellungen/Kanäle

+

Nutzung des Dienstes Gitea git.bstly.de

@@ -918,7 +1029,7 @@ - Einstellungen/ Repositorien + Einstellungen/Repositorien

Eigene, favorisierte Repositorien, Öffentlicher Schlüssel zur Authentifizierung

@@ -943,13 +1054,13 @@

Benutzer mit Account

-

siehe Einstellungen/ Repositorien

+

siehe Einstellungen/Repositorien

Speichern von Dateien in Repositorien

-

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/ Repositorien

+

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/Repositorien

@@ -961,13 +1072,13 @@

Benutzer mit Account

-

siehe Einstellungen/ Repositorien

+

siehe Einstellungen/Repositorien

Nachverfolgung und Wiederherstellung von Änderungen

-

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/ Repositorien

+

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/Repositorien

@@ -979,13 +1090,13 @@

Benutzer mit Account

-

siehe Einstellungen/ Repositorien

+

siehe Einstellungen/Repositorien

Dokumentation, Aufgabenmanagement und Kommunikation über Inhalte

-

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/ Repositorien

+

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/Repositorien

@@ -1007,4 +1118,4 @@ target="_blank">netcup GmbH gespeichert. Eine regelmäßige, automatisierte Datensicherung der Bestandsdaten wird durchgeführt. -

\ No newline at end of file +

diff --git a/src/assets/templates/en/privacy-policy.html b/src/assets/templates/en/privacy-policy.html index 426c4cc..ae4f3c2 100644 --- a/src/assets/templates/en/privacy-policy.html +++ b/src/assets/templates/en/privacy-policy.html @@ -880,6 +880,117 @@ +

Nutzung des Dienstes PeerTube tube.bstly.de

+ +
Gespeicherte Daten
+ +

Die folgenden Daten werden durch den Dienst PeerTube erfasst: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer SpeicherfristVerwendungszweckWeitergabe an Dritte
+ Streaming-Daten / IP-Addresse +

P2P Video Funktionalität (Details)

+
+

Alle Nutzer der Plattform mit aktiviertem Verteilsystem (Standard)

+
+

Bis zum Leeren des Browser Caches

+
+

Teilen von geschauten Videos über P2P mit anderen.

+
+

Weitergabe an Dritte! Kann aktiv ausgeschaltet werden.

+
+ Account-Daten +

Benutzername, E-Mail Adresse, Profildaten (freiwillig)

+
+

Benutzer mit Account

+
+

bis zur Löschung

+
+

Erstellen von Kanälen, Videos, Livestreams und Kommentaren.

+
+

einsehbar für andere Benutzer

+

öffentlich einsehbar bei Aktivitäten in öffentlichen Kanälen

+
+ Einstellungen/Kanäle +

Eigene, favorisierte Kanäle

+
+

Benutzer mit Account

+
+

bis zur Löschung

+
+

Verwaltung der Kanälen, Nutzung der Plattform

+
+

Weitergabe individuell vom Nutzer einstellbar

+
+ Videos/Livestreams +

Videos in den Kanälen

+
+

Benutzer mit Account

+
+

siehe Einstellungen/Kanäle

+
+

Hochladen von Videos in Kanäle, Bereitstellen der Videos für andere, Livestreams

+
+

Abhängig von Sichtbarkeit der entsprechenden Kanäle/Videos/Livestreams, siehe Einstellungen/Kanäle

+
+ Kommentare +

Kommentare zu Videos

+
+

Benutzer mit Account

+
+

siehe Einstellungen/ Kanäle

+
+

Kommunikation über Inhalte

+
+

Abhängig von Sichtbarkeit der entsprechenden Kanäle/Videos, siehe Einstellungen/Kanäle

+

Nutzung des Dienstes Gitea git.bstly.de

@@ -920,7 +1031,7 @@ - Einstellungen/ Repositorien + Einstellungen/Repositorien

Eigene, favorisierte Repositorien, Öffentlicher Schlüssel zur Authentifizierung

@@ -945,13 +1056,13 @@

Benutzer mit Account

-

siehe Einstellungen/ Repositorien

+

siehe Einstellungen/Repositorien

Speichern von Dateien in Repositorien

-

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/ Repositorien

+

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/Repositorien

@@ -963,13 +1074,13 @@

Benutzer mit Account

-

siehe Einstellungen/ Repositorien

+

siehe Einstellungen/Repositorien

Nachverfolgung und Wiederherstellung von Änderungen

-

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/ Repositorien

+

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/Repositorien

@@ -981,13 +1092,13 @@

Benutzer mit Account

-

siehe Einstellungen/ Repositorien

+

siehe Einstellungen/Repositorien

Dokumentation, Aufgabenmanagement und Kommunikation über Inhalte

-

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/ Repositorien

+

Abhängig von Sichtbarkeit der entsprechenden Repositorien, siehe Einstellungen/Repositorien

@@ -1009,4 +1120,4 @@ target="_blank">netcup GmbH gespeichert. Eine regelmäßige, automatisierte Datensicherung der Bestandsdaten wird durchgeführt. -

\ No newline at end of file +