diff --git a/console/src/app/pages/users/user-detail/memberships/memberships.component.ts b/console/src/app/pages/users/user-detail/memberships/memberships.component.ts
index ea6da4572..23e2ed1a8 100644
--- a/console/src/app/pages/users/user-detail/memberships/memberships.component.ts
+++ b/console/src/app/pages/users/user-detail/memberships/memberships.component.ts
@@ -5,9 +5,7 @@ import { Router } from '@angular/router';
import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component';
import { MemberType, UserView, UserMembershipSearchResponse } from 'src/app/proto/generated/management_pb';
import { AdminService } from 'src/app/services/admin.service';
-import { MgmtUserService } from 'src/app/services/mgmt-user.service';
-import { OrgService } from 'src/app/services/org.service';
-import { ProjectService } from 'src/app/services/project.service';
+import { ManagementService } from 'src/app/services/mgmt.service';
import { ToastService } from 'src/app/services/toast.service';
@Component({
@@ -39,9 +37,7 @@ export class MembershipsComponent implements OnInit {
public MemberType: any = MemberType;
constructor(
- private orgService: OrgService,
- private projectService: ProjectService,
- private mgmtUserService: MgmtUserService,
+ private mgmtService: ManagementService,
private adminService: AdminService,
private dialog: MatDialog,
private toast: ToastService,
@@ -53,7 +49,7 @@ export class MembershipsComponent implements OnInit {
}
public async loadManager(userId: string): Promise
{
- this.mgmtUserService.SearchUserMemberships(userId, 100, 0, []).then(response => {
+ this.mgmtService.SearchUserMemberships(userId, 100, 0, []).then(response => {
this.memberships = response.toObject();
this.loading = false;
});
@@ -112,7 +108,7 @@ export class MembershipsComponent implements OnInit {
if (users && users.length && roles && roles.length) {
Promise.all(users.map(user => {
- return this.orgService.AddMyOrgMember(user.id, roles);
+ return this.mgmtService.AddMyOrgMember(user.id, roles);
})).then(() => {
this.toast.showInfo('ORG.TOAST.MEMBERADDED', true);
}).catch(error => {
@@ -127,7 +123,7 @@ export class MembershipsComponent implements OnInit {
if (users && users.length && roles && roles.length) {
users.forEach(user => {
- return this.projectService.AddProjectGrantMember(
+ return this.mgmtService.AddProjectGrantMember(
response.projectId,
response.grantId,
user.id,
@@ -147,7 +143,7 @@ export class MembershipsComponent implements OnInit {
if (users && users.length && roles && roles.length) {
users.forEach(user => {
- return this.projectService.AddProjectMember(response.projectId, user.id, roles)
+ return this.mgmtService.AddProjectMember(response.projectId, user.id, roles)
.then(() => {
this.toast.showInfo('PROJECT.TOAST.MEMBERADDED', true);
}).catch(error => {
diff --git a/console/src/app/pages/users/user-detail/password/password.component.ts b/console/src/app/pages/users/user-detail/password/password.component.ts
index 4042c0167..e0d49a9e2 100644
--- a/console/src/app/pages/users/user-detail/password/password.component.ts
+++ b/console/src/app/pages/users/user-detail/password/password.component.ts
@@ -4,8 +4,8 @@ import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
import { lowerCaseValidator, numberValidator, symbolValidator, upperCaseValidator } from 'src/app/pages/validators';
import { PasswordComplexityPolicy } from 'src/app/proto/generated/auth_pb';
-import { AuthUserService } from 'src/app/services/auth-user.service';
-import { MgmtUserService } from 'src/app/services/mgmt-user.service';
+import { GrpcAuthService } from 'src/app/services/grpc-auth.service';
+import { ManagementService } from 'src/app/services/mgmt.service';
import { ToastService } from 'src/app/services/toast.service';
function passwordConfirmValidator(c: AbstractControl): any {
@@ -39,11 +39,10 @@ export class PasswordComponent implements OnDestroy {
constructor(
activatedRoute: ActivatedRoute,
private fb: FormBuilder,
- private userService: AuthUserService,
- private mgmtUserService: MgmtUserService,
+ private authService: GrpcAuthService,
+ private mgmtUserService: ManagementService,
private toast: ToastService,
) {
-
activatedRoute.params.subscribe(data => {
const { id } = data;
if (id) {
@@ -51,7 +50,7 @@ export class PasswordComponent implements OnDestroy {
}
const validators: Validators[] = [Validators.required];
- this.userService.GetMyPasswordComplexityPolicy().then(complexity => {
+ this.authService.GetMyPasswordComplexityPolicy().then(complexity => {
this.policy = complexity.toObject();
if (this.policy.minLength) {
validators.push(Validators.minLength(this.policy.minLength));
@@ -110,8 +109,8 @@ export class PasswordComponent implements OnDestroy {
if (this.passwordForm.valid && this.currentPassword &&
this.currentPassword.value &&
this.newPassword && this.newPassword.value && this.newPassword.valid) {
- this.userService
- .ChangeMyPassword(this.currentPassword.value, this.newPassword.value).then((data: any) => {
+ this.authService.ChangeMyPassword(this.currentPassword.value, this.newPassword.value)
+ .then((data: any) => {
this.toast.showInfo('USER.TOAST.PASSWORDCHANGED', true);
window.history.back();
}).catch(error => {
diff --git a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts
index e76fd86de..23965093b 100644
--- a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts
+++ b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts
@@ -13,8 +13,7 @@ import {
UserState,
UserView,
} from 'src/app/proto/generated/management_pb';
-import { MgmtUserService } from 'src/app/services/mgmt-user.service';
-import { ProjectService } from 'src/app/services/project.service';
+import { ManagementService } from 'src/app/services/mgmt.service';
import { ToastService } from 'src/app/services/toast.service';
@Component({
@@ -41,9 +40,9 @@ export class UserDetailComponent implements OnInit, OnDestroy {
public translate: TranslateService,
private route: ActivatedRoute,
private toast: ToastService,
- private mgmtUserService: MgmtUserService,
+ private mgmtUserService: ManagementService,
private _location: Location,
- public projectService: ProjectService,
+ public mgmtService: ManagementService,
) { }
public ngOnInit(): void {
diff --git a/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.ts b/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.ts
index f4e695e6a..388bdb5c8 100644
--- a/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.ts
+++ b/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.ts
@@ -3,7 +3,7 @@ import { MatSort } from '@angular/material/sort';
import { MatTable, MatTableDataSource } from '@angular/material/table';
import { BehaviorSubject, Observable } from 'rxjs';
import { MFAState, MfaType, MultiFactor, UserView } from 'src/app/proto/generated/management_pb';
-import { MgmtUserService } from 'src/app/services/mgmt-user.service';
+import { ManagementService } from 'src/app/services/mgmt.service';
export interface MFAItem {
@@ -31,7 +31,7 @@ export class UserMfaComponent implements OnInit, OnDestroy {
public MFAState: any = MFAState;
public error: string = '';
- constructor(private mgmtUserService: MgmtUserService) { }
+ constructor(private mgmtUserService: ManagementService) { }
public ngOnInit(): void {
this.getOTP();
diff --git a/console/src/app/pages/users/user-list/user-list.component.ts b/console/src/app/pages/users/user-list/user-list.component.ts
index c3698bf69..5950622b1 100644
--- a/console/src/app/pages/users/user-list/user-list.component.ts
+++ b/console/src/app/pages/users/user-list/user-list.component.ts
@@ -6,7 +6,7 @@ import { ActivatedRoute } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
import { User, UserSearchResponse } from 'src/app/proto/generated/management_pb';
-import { MgmtUserService } from 'src/app/services/mgmt-user.service';
+import { ManagementService } from 'src/app/services/mgmt.service';
import { ToastService } from 'src/app/services/toast.service';
@Component({
@@ -26,7 +26,7 @@ export class UserListComponent implements OnDestroy {
private subscription?: Subscription;
- constructor(public translate: TranslateService, private route: ActivatedRoute, private userService: MgmtUserService,
+ constructor(public translate: TranslateService, private route: ActivatedRoute, private userService: ManagementService,
private toast: ToastService) {
this.subscription = this.route.params.subscribe(() => this.getData(10, 0));
diff --git a/console/src/app/pipes/has-role.pipe.ts b/console/src/app/pipes/has-role.pipe.ts
index 543918e65..c0b97846c 100644
--- a/console/src/app/pipes/has-role.pipe.ts
+++ b/console/src/app/pipes/has-role.pipe.ts
@@ -1,13 +1,13 @@
import { Pipe, PipeTransform } from '@angular/core';
import { Observable } from 'rxjs';
-import { AuthService } from '../services/auth.service';
+import { GrpcAuthService } from '../services/grpc-auth.service';
@Pipe({
name: 'hasRole',
})
export class HasRolePipe implements PipeTransform {
- constructor(private authService: AuthService) { }
+ constructor(private authService: GrpcAuthService) { }
public transform(values: string[]): Observable {
return this.authService.isAllowed(values);
diff --git a/console/src/app/services/admin.service.ts b/console/src/app/services/admin.service.ts
index 238d7892c..06b49af1b 100644
--- a/console/src/app/services/admin.service.ts
+++ b/console/src/app/services/admin.service.ts
@@ -1,8 +1,6 @@
import { Injectable } from '@angular/core';
import { Empty } from 'google-protobuf/google/protobuf/empty_pb';
-import { Metadata } from 'grpc-web';
-import { AdminServicePromiseClient } from '../proto/generated/admin_grpc_web_pb';
import {
AddIamMemberRequest,
ChangeIamMemberRequest,
@@ -24,29 +22,13 @@ import {
ViewID,
Views,
} from '../proto/generated/admin_pb';
-import { GrpcBackendService } from './grpc-backend.service';
-import { GrpcService, RequestFactory, ResponseMapper } from './grpc.service';
+import { GrpcService } from './grpc.service';
@Injectable({
providedIn: 'root',
})
export class AdminService {
- constructor(private readonly grpcService: GrpcService, private grpcBackendService: GrpcBackendService) { }
-
- public async request(
- requestFn: RequestFactory,
- request: TReq,
- responseMapper: ResponseMapper,
- metadata?: Metadata,
- ): Promise {
- const mappedRequestFn = requestFn(this.grpcService.admin).bind(this.grpcService.mgmt);
- const response = await this.grpcBackendService.runRequest(
- mappedRequestFn,
- request,
- metadata,
- );
- return responseMapper(response);
- }
+ constructor(private readonly grpcService: GrpcService) { }
public async SetUpOrg(
createOrgRequest: CreateOrgRequest,
@@ -57,46 +39,29 @@ export class AdminService {
req.setOrg(createOrgRequest);
req.setUser(registerUserRequest);
- return await this.request(
- c => c.setUpOrg,
- req,
- f => f,
- );
+ return this.grpcService.admin.setUpOrg(req);
}
public async GetIamMemberRoles(): Promise {
- return await this.request(
- c => c.getIamMemberRoles,
- new Empty(),
- f => f,
- );
+ const req = new Empty();
+ return this.grpcService.admin.getIamMemberRoles(req);
}
public async GetViews(): Promise {
- return await this.request(
- c => c.getViews,
- new Empty(),
- f => f,
- );
+ const req = new Empty();
+ return this.grpcService.admin.getViews(req);
}
public async GetFailedEvents(): Promise {
- return await this.request(
- c => c.getFailedEvents,
- new Empty(),
- f => f,
- );
+ const req = new Empty();
+ return this.grpcService.admin.getFailedEvents(req);
}
public async ClearView(viewname: string, db: string): Promise {
const req: ViewID = new ViewID();
req.setDatabase(db);
req.setViewName(viewname);
- return await this.request(
- c => c.clearView,
- req,
- f => f,
- );
+ return this.grpcService.admin.clearView(req);
}
public async RemoveFailedEvent(viewname: string, db: string, sequence: number): Promise {
@@ -104,11 +69,7 @@ export class AdminService {
req.setDatabase(db);
req.setViewName(viewname);
req.setFailedSequence(sequence);
- return await this.request(
- c => c.removeFailedEvent,
- req,
- f => f,
- );
+ return this.grpcService.admin.removeFailedEvent(req);
}
public async SearchIamMembers(
@@ -122,11 +83,7 @@ export class AdminService {
if (queryList) {
req.setQueriesList(queryList);
}
- return await this.request(
- c => c.searchIamMembers,
- req,
- f => f,
- );
+ return this.grpcService.admin.searchIamMembers(req);
}
public async RemoveIamMember(
@@ -135,11 +92,7 @@ export class AdminService {
const req = new RemoveIamMemberRequest();
req.setUserId(userId);
- return await this.request(
- c => c.removeIamMember,
- req,
- f => f,
- );
+ return this.grpcService.admin.removeIamMember(req);
}
public async AddIamMember(
@@ -150,11 +103,7 @@ export class AdminService {
req.setUserId(userId);
req.setRolesList(rolesList);
- return await this.request(
- c => c.addIamMember,
- req,
- f => f,
- );
+ return this.grpcService.admin.addIamMember(req);
}
public async ChangeIamMember(
@@ -165,22 +114,14 @@ export class AdminService {
req.setUserId(userId);
req.setRolesList(rolesList);
- return await this.request(
- c => c.changeIamMember,
- req,
- f => f,
- );
+ return this.grpcService.admin.changeIamMember(req);
}
public async GetOrgIamPolicy(orgId: string): Promise {
const req = new OrgIamPolicyID();
req.setOrgId(orgId);
- return await this.request(
- c => c.getOrgIamPolicy,
- req,
- f => f,
- );
+ return this.grpcService.admin.getOrgIamPolicy(req);
}
public async CreateOrgIamPolicy(
@@ -192,11 +133,7 @@ export class AdminService {
req.setDescription(description);
req.setUserLoginMustBeDomain(userLoginMustBeDomain);
- return await this.request(
- c => c.createOrgIamPolicy,
- req,
- f => f,
- );
+ return this.grpcService.admin.createOrgIamPolicy(req);
}
public async UpdateOrgIamPolicy(
@@ -207,12 +144,7 @@ export class AdminService {
req.setOrgId(orgId);
req.setDescription(description);
req.setUserLoginMustBeDomain(userLoginMustBeDomain);
-
- return await this.request(
- c => c.updateOrgIamPolicy,
- req,
- f => f,
- );
+ return this.grpcService.admin.updateOrgIamPolicy(req);
}
public async deleteOrgIamPolicy(
@@ -220,10 +152,6 @@ export class AdminService {
): Promise {
const req = new OrgIamPolicyID();
req.setOrgId(orgId);
- return await this.request(
- c => c.deleteOrgIamPolicy,
- req,
- f => f,
- );
+ return this.grpcService.admin.deleteOrgIamPolicy(req);
}
}
diff --git a/console/src/app/services/auth-user.service.ts b/console/src/app/services/auth-user.service.ts
deleted file mode 100644
index a83650242..000000000
--- a/console/src/app/services/auth-user.service.ts
+++ /dev/null
@@ -1,298 +0,0 @@
-import { Injectable } from '@angular/core';
-import { Empty } from 'google-protobuf/google/protobuf/empty_pb';
-import { Metadata } from 'grpc-web';
-
-import { AuthServicePromiseClient } from '../proto/generated/auth_grpc_web_pb';
-import {
- Changes,
- ChangesRequest,
- Gender,
- MfaOtpResponse,
- MultiFactors,
- MyPermissions,
- MyProjectOrgSearchQuery,
- MyProjectOrgSearchRequest,
- MyProjectOrgSearchResponse,
- PasswordChange,
- PasswordComplexityPolicy,
- UpdateUserAddressRequest,
- UpdateUserEmailRequest,
- UpdateUserPhoneRequest,
- UpdateUserProfileRequest,
- UserAddress,
- UserEmail,
- UserPhone,
- UserProfile,
- UserProfileView,
- UserSessionViews,
- UserView,
- VerifyMfaOtp,
- VerifyUserPhoneRequest,
-} from '../proto/generated/auth_pb';
-import { GrpcBackendService } from './grpc-backend.service';
-import { GrpcService, RequestFactory, ResponseMapper } from './grpc.service';
-
-
-@Injectable({
- providedIn: 'root',
-})
-export class AuthUserService {
- constructor(private readonly grpcClient: GrpcService,
- private grpcBackendService: GrpcBackendService,
- ) { }
-
- public async request(
- requestFn: RequestFactory,
- request: TReq,
- responseMapper: ResponseMapper,
- metadata?: Metadata,
- ): Promise {
- const mappedRequestFn = requestFn(this.grpcClient.auth).bind(this.grpcClient.auth);
- const response = await this.grpcBackendService.runRequest(
- mappedRequestFn,
- request,
- metadata,
- );
- return responseMapper(response);
- }
-
- public async GetMyUserProfile(): Promise {
- return await this.request(
- c => c.getMyUserProfile,
- new Empty(),
- f => f,
- );
- }
-
- public async GetMyPasswordComplexityPolicy(): Promise {
- return await this.request(
- c => c.getMyPasswordComplexityPolicy,
- new Empty(),
- f => f,
- );
- }
-
- public async GetMyUser(): Promise {
- return await this.request(
- c => c.getMyUser,
- new Empty(),
- f => f,
- );
- }
-
- public async GetMyMfas(): Promise {
- return await this.request(
- c => c.getMyMfas,
- new Empty(),
- f => f,
- );
- }
-
- public async SearchMyProjectOrgs(
- limit: number,
- offset: number,
- queryList?: MyProjectOrgSearchQuery[],
- ): Promise {
- const req: MyProjectOrgSearchRequest = new MyProjectOrgSearchRequest();
- req.setOffset(offset);
- req.setLimit(limit);
- if (queryList) {
- req.setQueriesList(queryList);
- }
-
- return await this.request(
- c => c.searchMyProjectOrgs,
- req,
- f => f,
- );
- }
-
- public async SaveMyUserProfile(
- firstName?: string,
- lastName?: string,
- nickName?: string,
- preferredLanguage?: string,
- gender?: Gender,
- ): Promise {
- const req = new UpdateUserProfileRequest();
- if (firstName) {
- req.setFirstName(firstName);
- }
- if (lastName) {
- req.setLastName(lastName);
- }
- if (nickName) {
- req.setNickName(nickName);
- }
- if (gender) {
- req.setGender(gender);
- }
- if (preferredLanguage) {
- req.setPreferredLanguage(preferredLanguage);
- }
- return await this.request(
- c => c.updateMyUserProfile,
- req,
- f => f,
- );
- }
-
- public async getMyUserSessions(): Promise {
- return await this.request(
- c => c.getMyUserSessions,
- new Empty(),
- f => f,
- );
- }
-
- public async GetMyUserEmail(): Promise {
- return await this.request(
- c => c.getMyUserEmail,
- new Empty(),
- f => f,
- );
- }
-
- public async SaveMyUserEmail(email: string): Promise {
- const req = new UpdateUserEmailRequest();
- req.setEmail(email);
- return await this.request(
- c => c.changeMyUserEmail,
- req,
- f => f,
- );
- }
-
- public async RemoveMyUserPhone(): Promise {
- return await this.request(
- c => c.removeMyUserPhone,
- new Empty(),
- f => f,
- );
- }
-
- public async GetMyzitadelPermissions(): Promise {
- return await this.request(
- c => c.getMyZitadelPermissions,
- new Empty(),
- f => f,
- );
- }
-
- public async GetMyUserPhone(): Promise {
- // return this.grpcClient.auth.getMyUserPhone(new Empty());
- return await this.request(
- c => c.getMyUserPhone,
- new Empty(),
- (f: UserPhone) => f,
- );
- }
-
- public async SaveMyUserPhone(phone: string): Promise {
- const req = new UpdateUserPhoneRequest();
- req.setPhone(phone);
- return await this.request(
- c => c.changeMyUserPhone,
- req,
- f => f,
- );
- }
-
- public async GetMyUserAddress(): Promise {
- return await this.request(
- c => c.getMyUserAddress,
- new Empty(),
- f => f,
- );
- }
-
- public async ResendEmailVerification(): Promise {
- const req = new Empty();
- return await this.request(
- c => c.resendMyEmailVerificationMail,
- req,
- f => f,
- );
- }
-
- public async ResendPhoneVerification(): Promise {
- const req = new Empty();
- return await this.request(
- c => c.resendMyPhoneVerificationCode,
- req,
- f => f,
- );
- }
-
- public async ChangeMyPassword(oldPassword: string, newPassword: string): Promise {
- const req = new PasswordChange();
- req.setOldPassword(oldPassword);
- req.setNewPassword(newPassword);
- return await this.request(
- c => c.changeMyPassword,
- req,
- f => f,
- );
- }
-
- public async AddMfaOTP(): Promise {
- return await this.request(
- c => c.addMfaOTP,
- new Empty(),
- f => f,
- );
- }
-
- public async RemoveMfaOTP(): Promise {
- return await this.request(
- c => c.removeMfaOTP,
- new Empty(),
- f => f,
- );
- }
-
- public async VerifyMfaOTP(code: string): Promise {
- const req = new VerifyMfaOtp();
- req.setCode(code);
- return await this.request(
- c => c.verifyMfaOTP,
- req,
- f => f,
- );
- }
-
- public async VerifyMyUserPhone(code: string): Promise {
- const req = new VerifyUserPhoneRequest();
- req.setCode(code);
- return await this.request(
- c => c.verifyMyUserPhone,
- req,
- f => f,
- );
- }
-
- public async SaveMyUserAddress(address: UserAddress.AsObject): Promise {
- const req = new UpdateUserAddressRequest();
- req.setStreetAddress(address.streetAddress);
- req.setPostalCode(address.postalCode);
- req.setLocality(address.locality);
- req.setRegion(address.region);
- req.setCountry(address.country);
- return await this.request(
- c => c.updateMyUserAddress,
- req,
- f => f,
- );
- }
-
- public async GetMyUserChanges(limit: number, sequenceoffset: number): Promise {
- const req = new ChangesRequest();
- req.setLimit(limit);
- req.setSequenceOffset(sequenceoffset);
- return await this.request(
- c => c.getMyUserChanges,
- req,
- f => f,
- );
- }
-}
diff --git a/console/src/app/services/auth.service.ts b/console/src/app/services/auth.service.ts
deleted file mode 100644
index f1eecdf52..000000000
--- a/console/src/app/services/auth.service.ts
+++ /dev/null
@@ -1,175 +0,0 @@
-import { Injectable } from '@angular/core';
-import { AuthConfig, OAuthService } from 'angular-oauth2-oidc';
-import { BehaviorSubject, from, merge, Observable, of, Subject } from 'rxjs';
-import { catchError, filter, finalize, first, map, mergeMap, switchMap, take, timeout } from 'rxjs/operators';
-
-import { Org, UserProfileView } from '../proto/generated/auth_pb';
-import { AuthUserService } from './auth-user.service';
-import { GrpcService } from './grpc.service';
-import { StatehandlerService } from './statehandler.service';
-import { StorageKey, StorageService } from './storage.service';
-
-@Injectable({
- providedIn: 'root',
-})
-export class AuthService {
- private cachedOrgs: Org.AsObject[] = [];
- private _activeOrgChanged: Subject = new Subject();
- public user!: Observable;
- private _authenticated: boolean = false;
- private readonly _authenticationChanged: BehaviorSubject<
- boolean
- > = new BehaviorSubject(this.authenticated);
-
- private zitadelPermissions: BehaviorSubject = new BehaviorSubject(['user.resourceowner']);
-
- constructor(
- private grpcService: GrpcService,
- private config: AuthConfig,
- private oauthService: OAuthService,
- private userService: AuthUserService,
- private storage: StorageService,
- private statehandler: StatehandlerService,
- ) {
- this.user = merge(
- of(this.oauthService.getAccessToken()).pipe(
- filter(token => token ? true : false),
- ),
- this.oauthService.events.pipe(
- filter(e => e.type === 'token_received'),
- timeout(this.oauthService.waitForTokenInMsec || 0),
- catchError(_ => of(null)), // timeout is not an error
- map(_ => this.oauthService.getAccessToken()),
- ),
- ).pipe(
- take(1),
- mergeMap(() => {
- return from(this.userService.GetMyUserProfile().then(userprofile => userprofile.toObject()));
- }),
- finalize(() => {
- this.loadPermissions();
- }),
- );
-
- this.activeOrgChanged.subscribe(() => {
- this.loadPermissions();
- });
- }
-
- private loadPermissions(): void {
- merge([
- // this.authenticationChanged,
- this.activeOrgChanged.pipe(map(org => !!org)),
- ]).pipe(
- first(),
- switchMap(() => from(this.userService.GetMyzitadelPermissions())),
- map(rolesResp => rolesResp.toObject().permissionsList),
- ).subscribe(roles => {
- this.zitadelPermissions.next(roles);
- });
- }
-
- public isAllowed(roles: string[] | RegExp[]): Observable {
- if (roles && roles.length > 0) {
- return this.zitadelPermissions.pipe(switchMap(zroles => {
- return of(this.hasRoles(zroles, roles));
- }));
- } else {
- return of(false);
- }
- }
-
- public hasRoles(userRoles: string[], requestedRoles: string[] | RegExp[]): boolean {
- return requestedRoles.findIndex((regexp: any) => {
- return userRoles.findIndex(role => {
- return (new RegExp(regexp)).test(role);
- }) > -1;
- }) > -1;
- }
-
- public get authenticated(): boolean {
- return this._authenticated;
- }
-
- public get authenticationChanged(): Observable {
- return this._authenticationChanged;
- }
-
- public getOIDCUser(): Observable {
- return from(this.oauthService.loadUserProfile());
- }
-
- public async authenticate(
- config?: Partial,
- setState: boolean = true,
- force: boolean = false,
- ): Promise {
- this.config.issuer = config?.issuer || this.grpcService.issuer;
- this.config.clientId = config?.clientId || this.grpcService.clientid;
- this.config.redirectUri = config?.redirectUri || this.grpcService.redirectUri;
- this.config.postLogoutRedirectUri = config?.postLogoutRedirectUri || this.grpcService.postLogoutRedirectUri;
- this.config.customQueryParams = config?.customQueryParams;
- this.oauthService.configure(this.config);
- // this.oauthService.setupAutomaticSilentRefresh();
- this.oauthService.strictDiscoveryDocumentValidation = false;
- await this.oauthService.loadDiscoveryDocumentAndTryLogin();
-
- this._authenticated = this.oauthService.hasValidAccessToken();
-
- if (!this.oauthService.hasValidIdToken() || !this.authenticated || config || force) {
- const newState = setState ? await this.statehandler.createState().toPromise() : undefined;
- this.oauthService.initCodeFlow(newState);
- }
- this._authenticationChanged.next(this.authenticated);
-
- return this.authenticated;
- }
-
- public signout(): void {
- this.oauthService.logOut();
- this._authenticated = false;
- this._authenticationChanged.next(false);
- }
-
- public get activeOrgChanged(): Observable {
- return this._activeOrgChanged;
- }
-
- public async GetActiveOrg(id?: string): Promise {
- if (id) {
- const org = this.storage.getItem(StorageKey.organization);
- if (org && this.cachedOrgs.find(tmp => tmp.id === org.id)) {
- return org;
- }
- return Promise.reject(new Error('no cached org'));
- } else {
- let orgs = this.cachedOrgs;
- if (orgs.length === 0) {
- orgs = (await this.userService.SearchMyProjectOrgs(10, 0)).toObject().resultList;
- this.cachedOrgs = orgs;
- }
-
- const org = this.storage.getItem(StorageKey.organization);
- if (org && orgs.find(tmp => tmp.id === org.id)) {
- return org;
- }
-
- if (orgs.length === 0) {
- return Promise.reject(new Error('No organizations found!'));
- }
- const orgToSet = orgs.find(element => element.id !== '0' && element.name !== '');
-
- if (orgToSet) {
- this.setActiveOrg(orgToSet);
- return Promise.resolve(orgToSet);
- }
- return Promise.resolve(orgs[0]);
- }
- }
-
- public setActiveOrg(org: Org.AsObject): void {
- this.storage.setItem(StorageKey.organization, org);
- this._activeOrgChanged.next(org);
- }
-}
-
diff --git a/console/src/app/services/authentication.service.ts b/console/src/app/services/authentication.service.ts
new file mode 100644
index 000000000..eb795d5c9
--- /dev/null
+++ b/console/src/app/services/authentication.service.ts
@@ -0,0 +1,69 @@
+import { Injectable } from '@angular/core';
+import { AuthConfig, OAuthService } from 'angular-oauth2-oidc';
+import { BehaviorSubject, from, Observable } from 'rxjs';
+
+import { StatehandlerService } from './statehandler.service';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class AuthenticationService {
+ private authConfig!: AuthConfig;
+ private _authenticated: boolean = false;
+ private readonly _authenticationChanged: BehaviorSubject<
+ boolean
+ > = new BehaviorSubject(this.authenticated);
+
+ constructor(
+ private oauthService: OAuthService,
+ private statehandler: StatehandlerService,
+ ) { }
+
+ public initConfig(data: AuthConfig): void {
+ this.authConfig = data;
+ }
+
+ public get authenticated(): boolean {
+ return this._authenticated;
+ }
+
+ public get authenticationChanged(): Observable {
+ return this._authenticationChanged;
+ }
+
+ public getOIDCUser(): Observable {
+ return from(this.oauthService.loadUserProfile());
+ }
+
+ public async authenticate(
+ config?: Partial,
+ setState: boolean = true,
+ force: boolean = false,
+ ): Promise {
+ if (config) {
+ this.authConfig = config;
+ }
+ console.log(this.authConfig);
+ this.oauthService.configure(this.authConfig);
+
+ this.oauthService.strictDiscoveryDocumentValidation = false;
+ await this.oauthService.loadDiscoveryDocumentAndTryLogin();
+
+ this._authenticated = this.oauthService.hasValidAccessToken();
+
+ if (!this.oauthService.hasValidIdToken() || !this.authenticated || config || force) {
+ const newState = setState ? await this.statehandler.createState().toPromise() : undefined;
+ this.oauthService.initCodeFlow(newState);
+ }
+ this._authenticationChanged.next(this.authenticated);
+
+ return this.authenticated;
+ }
+
+ public signout(): void {
+ this.oauthService.logOut();
+ this._authenticated = false;
+ this._authenticationChanged.next(false);
+ }
+}
+
diff --git a/console/src/app/services/grpc-auth.service.ts b/console/src/app/services/grpc-auth.service.ts
new file mode 100644
index 000000000..843fc7094
--- /dev/null
+++ b/console/src/app/services/grpc-auth.service.ts
@@ -0,0 +1,317 @@
+import { Injectable } from '@angular/core';
+import { OAuthService } from 'angular-oauth2-oidc';
+import { Empty } from 'google-protobuf/google/protobuf/empty_pb';
+import { BehaviorSubject, from, merge, Observable, of, Subject } from 'rxjs';
+import { catchError, filter, finalize, first, map, mergeMap, switchMap, take, timeout } from 'rxjs/operators';
+
+import {
+ Changes,
+ ChangesRequest,
+ Gender,
+ MfaOtpResponse,
+ MultiFactors,
+ MyPermissions,
+ MyProjectOrgSearchQuery,
+ MyProjectOrgSearchRequest,
+ MyProjectOrgSearchResponse,
+ Org,
+ PasswordChange,
+ PasswordComplexityPolicy,
+ UpdateUserAddressRequest,
+ UpdateUserEmailRequest,
+ UpdateUserPhoneRequest,
+ UpdateUserProfileRequest,
+ UserAddress,
+ UserEmail,
+ UserPhone,
+ UserProfile,
+ UserProfileView,
+ UserSessionViews,
+ UserView,
+ VerifyMfaOtp,
+ VerifyUserPhoneRequest,
+} from '../proto/generated/auth_pb';
+import { GrpcService } from './grpc.service';
+import { StorageKey, StorageService } from './storage.service';
+
+
+@Injectable({
+ providedIn: 'root',
+})
+export class GrpcAuthService {
+ private _activeOrgChanged: Subject = new Subject();
+ public user!: Observable;
+ private zitadelPermissions: BehaviorSubject = new BehaviorSubject(['user.resourceowner']);
+ private cachedOrgs: Org.AsObject[] = [];
+
+ constructor(
+ private readonly grpcService: GrpcService,
+ private oauthService: OAuthService,
+ private storage: StorageService,
+ ) {
+ this.user = merge(
+ of(this.oauthService.getAccessToken()).pipe(
+ filter(token => token ? true : false),
+ ),
+ this.oauthService.events.pipe(
+ filter(e => e.type === 'token_received'),
+ timeout(this.oauthService.waitForTokenInMsec || 0),
+ catchError(_ => of(null)), // timeout is not an error
+ map(_ => this.oauthService.getAccessToken()),
+ ),
+ ).pipe(
+ take(1),
+ mergeMap(() => {
+ return from(this.GetMyUserProfile().then(userprofile => userprofile.toObject()));
+ }),
+ finalize(() => {
+ this.loadPermissions();
+ }),
+ );
+
+ this.activeOrgChanged.subscribe(() => {
+ this.loadPermissions();
+ });
+ }
+
+ public async GetActiveOrg(id?: string): Promise {
+ if (id) {
+ const org = this.storage.getItem(StorageKey.organization);
+ if (org && this.cachedOrgs.find(tmp => tmp.id === org.id)) {
+ return org;
+ }
+ return Promise.reject(new Error('no cached org'));
+ } else {
+ let orgs = this.cachedOrgs;
+ if (orgs.length === 0) {
+ orgs = (await this.SearchMyProjectOrgs(10, 0)).toObject().resultList;
+ this.cachedOrgs = orgs;
+ }
+
+ const org = this.storage.getItem(StorageKey.organization);
+ if (org && orgs.find(tmp => tmp.id === org.id)) {
+ return org;
+ }
+
+ if (orgs.length === 0) {
+ return Promise.reject(new Error('No organizations found!'));
+ }
+ const orgToSet = orgs.find(element => element.id !== '0' && element.name !== '');
+
+ if (orgToSet) {
+ this.setActiveOrg(orgToSet);
+ return Promise.resolve(orgToSet);
+ }
+ return Promise.resolve(orgs[0]);
+ }
+ }
+
+ public get activeOrgChanged(): Observable {
+ return this._activeOrgChanged;
+ }
+
+ public setActiveOrg(org: Org.AsObject): void {
+ this.storage.setItem(StorageKey.organization, org);
+ this._activeOrgChanged.next(org);
+ }
+
+ private loadPermissions(): void {
+ merge([
+ // this.authenticationChanged,
+ this.activeOrgChanged.pipe(map(org => !!org)),
+ ]).pipe(
+ first(),
+ switchMap(() => from(this.GetMyzitadelPermissions())),
+ map(rolesResp => rolesResp.toObject().permissionsList),
+ ).subscribe(roles => {
+ this.zitadelPermissions.next(roles);
+ });
+ }
+
+ public isAllowed(roles: string[] | RegExp[]): Observable {
+ if (roles && roles.length > 0) {
+ return this.zitadelPermissions.pipe(switchMap(zroles => {
+ return of(this.hasRoles(zroles, roles));
+ }));
+ } else {
+ return of(false);
+ }
+ }
+
+ public hasRoles(userRoles: string[], requestedRoles: string[] | RegExp[]): boolean {
+ return requestedRoles.findIndex((regexp: any) => {
+ return userRoles.findIndex(role => {
+ return (new RegExp(regexp)).test(role);
+ }) > -1;
+ }) > -1;
+ }
+
+ public async GetMyUserProfile(): Promise {
+ return this.grpcService.auth.getMyUserProfile(new Empty());
+ }
+
+ public async GetMyPasswordComplexityPolicy(): Promise {
+ return this.grpcService.auth.getMyPasswordComplexityPolicy(
+ new Empty(),
+ );
+ }
+
+ public async GetMyUser(): Promise {
+ return this.grpcService.auth.getMyUser(
+ new Empty(),
+ );
+ }
+
+ public async GetMyMfas(): Promise {
+ return this.grpcService.auth.getMyMfas(
+ new Empty(),
+ );
+ }
+
+ public async SearchMyProjectOrgs(
+ limit: number,
+ offset: number,
+ queryList?: MyProjectOrgSearchQuery[],
+ ): Promise {
+ const req: MyProjectOrgSearchRequest = new MyProjectOrgSearchRequest();
+ req.setOffset(offset);
+ req.setLimit(limit);
+ if (queryList) {
+ req.setQueriesList(queryList);
+ }
+
+ return this.grpcService.auth.searchMyProjectOrgs(req);
+ }
+
+ public async SaveMyUserProfile(
+ firstName?: string,
+ lastName?: string,
+ nickName?: string,
+ preferredLanguage?: string,
+ gender?: Gender,
+ ): Promise {
+ const req = new UpdateUserProfileRequest();
+ if (firstName) {
+ req.setFirstName(firstName);
+ }
+ if (lastName) {
+ req.setLastName(lastName);
+ }
+ if (nickName) {
+ req.setNickName(nickName);
+ }
+ if (gender) {
+ req.setGender(gender);
+ }
+ if (preferredLanguage) {
+ req.setPreferredLanguage(preferredLanguage);
+ }
+ return this.grpcService.auth.updateMyUserProfile(req);
+ }
+
+ public async getMyUserSessions(): Promise {
+ return this.grpcService.auth.getMyUserSessions(
+ new Empty(),
+ );
+ }
+
+ public async GetMyUserEmail(): Promise {
+ return this.grpcService.auth.getMyUserEmail(
+ new Empty(),
+ );
+ }
+
+ public async SaveMyUserEmail(email: string): Promise {
+ const req = new UpdateUserEmailRequest();
+ req.setEmail(email);
+ return this.grpcService.auth.changeMyUserEmail(req);
+ }
+
+ public async RemoveMyUserPhone(): Promise {
+ return this.grpcService.auth.removeMyUserPhone(
+ new Empty(),
+ );
+ }
+
+ public async GetMyzitadelPermissions(): Promise {
+ return this.grpcService.auth.getMyZitadelPermissions(
+ new Empty(),
+ );
+ }
+
+ public async GetMyUserPhone(): Promise {
+ return this.grpcService.auth.getMyUserPhone(
+ new Empty(),
+ );
+ }
+
+ public async SaveMyUserPhone(phone: string): Promise {
+ const req = new UpdateUserPhoneRequest();
+ req.setPhone(phone);
+ return this.grpcService.auth.changeMyUserPhone(req);
+ }
+
+ public async GetMyUserAddress(): Promise {
+ return this.grpcService.auth.getMyUserAddress(
+ new Empty(),
+ );
+ }
+
+ public async ResendEmailVerification(): Promise {
+ const req = new Empty();
+ return this.grpcService.auth.resendMyEmailVerificationMail(req);
+ }
+
+ public async ResendPhoneVerification(): Promise {
+ const req = new Empty();
+ return this.grpcService.auth.resendMyPhoneVerificationCode(req);
+ }
+
+ public async ChangeMyPassword(oldPassword: string, newPassword: string): Promise {
+ const req = new PasswordChange();
+ req.setOldPassword(oldPassword);
+ req.setNewPassword(newPassword);
+ return this.grpcService.auth.changeMyPassword(req);
+ }
+
+ public async AddMfaOTP(): Promise {
+ return this.grpcService.auth.addMfaOTP(
+ new Empty(),
+ );
+ }
+
+ public async RemoveMfaOTP(): Promise {
+ return this.grpcService.auth.removeMfaOTP(
+ new Empty(),
+ );
+ }
+
+ public async VerifyMfaOTP(code: string): Promise {
+ const req = new VerifyMfaOtp();
+ req.setCode(code);
+ return this.grpcService.auth.verifyMfaOTP(req);
+ }
+
+ public async VerifyMyUserPhone(code: string): Promise {
+ const req = new VerifyUserPhoneRequest();
+ req.setCode(code);
+ return this.grpcService.auth.verifyMyUserPhone(req);
+ }
+
+ public async SaveMyUserAddress(address: UserAddress.AsObject): Promise {
+ const req = new UpdateUserAddressRequest();
+ req.setStreetAddress(address.streetAddress);
+ req.setPostalCode(address.postalCode);
+ req.setLocality(address.locality);
+ req.setRegion(address.region);
+ req.setCountry(address.country);
+ return this.grpcService.auth.updateMyUserAddress(req);
+ }
+
+ public async GetMyUserChanges(limit: number, sequenceoffset: number): Promise {
+ const req = new ChangesRequest();
+ req.setLimit(limit);
+ req.setSequenceOffset(sequenceoffset);
+ return this.grpcService.auth.getMyUserChanges(req);
+ }
+}
diff --git a/console/src/app/services/grpc-backend.service.ts b/console/src/app/services/grpc-backend.service.ts
deleted file mode 100644
index 4cb98fa38..000000000
--- a/console/src/app/services/grpc-backend.service.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Inject, Injectable } from '@angular/core';
-import { Metadata } from 'grpc-web';
-
-import { GrpcDefaultHandler, GrpcHandler, GrpcInterceptorHandler, GrpcRequestFn } from './grpc-handler';
-import { GRPC_INTERCEPTORS, GrpcInterceptor } from './interceptors/grpc-interceptor';
-
-@Injectable({
- providedIn: 'root',
-})
-export class GrpcBackendService {
- constructor(
- @Inject(GRPC_INTERCEPTORS) private readonly interceptors: GrpcInterceptor[],
- ) { }
-
- public async runRequest(
- requestFn: GrpcRequestFn,
- request: TReq,
- metadata: Metadata = {},
- ): Promise {
- const defaultHandler: GrpcHandler = new GrpcDefaultHandler(requestFn);
- const chain = this.interceptors.reduceRight(
- (next, interceptor) => new GrpcInterceptorHandler(next, interceptor),
- defaultHandler,
- );
- return chain.handle(request, metadata);
- }
-}
diff --git a/console/src/app/services/grpc-handler.ts b/console/src/app/services/grpc-handler.ts
deleted file mode 100644
index 216396c57..000000000
--- a/console/src/app/services/grpc-handler.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Metadata } from 'grpc-web';
-
-import { GrpcInterceptor } from './interceptors/grpc-interceptor';
-
-export type GrpcRequestFn = (
- request: TReq,
- metadata?: Metadata,
-) => Promise;
-
-export interface GrpcHandler {
- handle(req: unknown, metadata: Metadata): Promise;
-}
-
-export class GrpcInterceptorHandler implements GrpcHandler {
- constructor(
- private readonly next: GrpcHandler,
- private interceptor: GrpcInterceptor,
- ) { }
-
- public handle(req: unknown, metadata: Metadata): Promise {
- return this.interceptor.intercept(req, metadata, this.next);
- }
-}
-
-export class GrpcDefaultHandler implements GrpcHandler {
- constructor(private readonly requestFn: GrpcRequestFn) { }
-
- public handle(req: TReq, metadata: Metadata): Promise {
- return this.requestFn(req, metadata);
- }
-}
diff --git a/console/src/app/services/grpc.service.ts b/console/src/app/services/grpc.service.ts
index 89355e3c3..0a44c0ad7 100644
--- a/console/src/app/services/grpc.service.ts
+++ b/console/src/app/services/grpc.service.ts
@@ -1,21 +1,20 @@
import { PlatformLocation } from '@angular/common';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
+import { AuthConfig } from 'angular-oauth2-oidc';
import { AdminServicePromiseClient } from '../proto/generated/admin_grpc_web_pb';
import { AuthServicePromiseClient } from '../proto/generated/auth_grpc_web_pb';
import { ManagementServicePromiseClient } from '../proto/generated/management_grpc_web_pb';
-import { GrpcRequestFn } from './grpc-handler';
+import { AuthenticationService } from './authentication.service';
+import { AuthInterceptor } from './interceptors/auth.interceptor';
+import { OrgInterceptor } from './interceptors/org.interceptor';
+import { StorageService } from './storage.service';
@Injectable({
providedIn: 'root',
})
export class GrpcService {
- public issuer: string = '';
- public clientid: string = '';
- public redirectUri: string = '';
- public postLogoutRedirectUri: string = '';
-
public auth!: AuthServicePromiseClient;
public mgmt!: ManagementServicePromiseClient;
public admin!: AdminServicePromiseClient;
@@ -23,22 +22,51 @@ export class GrpcService {
constructor(
private http: HttpClient,
private platformLocation: PlatformLocation,
+ private authenticationService: AuthenticationService,
+ private storageService: StorageService,
) { }
public async loadAppEnvironment(): Promise {
return this.http.get('./assets/environment.json')
.toPromise().then((data: any) => {
if (data && data.authServiceUrl && data.mgmtServiceUrl && data.issuer) {
- this.auth = new AuthServicePromiseClient(data.authServiceUrl);
- this.mgmt = new ManagementServicePromiseClient(data.mgmtServiceUrl);
- this.admin = new AdminServicePromiseClient(data.adminServiceUrl);
+ const interceptors = {
+ 'unaryInterceptors': [
+ new AuthInterceptor(this.authenticationService, this.storageService),
+ new OrgInterceptor(this.storageService),
+ ],
+ };
- this.issuer = data.issuer;
- if (data.clientid) {
- this.clientid = data.clientid;
- this.redirectUri = window.location.origin + this.platformLocation.getBaseHrefFromDOM() + 'auth/callback';
- this.postLogoutRedirectUri = window.location.origin + this.platformLocation.getBaseHrefFromDOM() + 'signedout';
- }
+ this.auth = new AuthServicePromiseClient(
+ data.authServiceUrl,
+ null,
+ // @ts-ignore
+ interceptors,
+ );
+ this.mgmt = new ManagementServicePromiseClient(
+ data.mgmtServiceUrl,
+ null,
+ // @ts-ignore
+ interceptors,
+ );
+ this.admin = new AdminServicePromiseClient(
+ data.adminServiceUrl,
+ null,
+ // @ts-ignore
+ interceptors,
+ );
+
+ const authConfig: AuthConfig = {
+ scope: 'openid profile email',
+ responseType: 'code',
+ oidc: true,
+ clientId: data.clientid,
+ issuer: data.issuer,
+ redirectUri: window.location.origin + this.platformLocation.getBaseHrefFromDOM() + 'auth/callback',
+ postLogoutRedirectUri: window.location.origin + this.platformLocation.getBaseHrefFromDOM() + 'signedout',
+ };
+
+ this.authenticationService.initConfig(authConfig);
}
return Promise.resolve(data);
}).catch(() => {
@@ -46,9 +74,3 @@ export class GrpcService {
});
}
}
-
-export type RequestFactory = (
- client: TClient,
-) => GrpcRequestFn;
-
-export type ResponseMapper = (resp: TResp) => TMappedResp;
diff --git a/console/src/app/services/interceptors/auth.interceptor.ts b/console/src/app/services/interceptors/auth.interceptor.ts
new file mode 100644
index 000000000..09acb771c
--- /dev/null
+++ b/console/src/app/services/interceptors/auth.interceptor.ts
@@ -0,0 +1,40 @@
+import { Injectable } from '@angular/core';
+import { Request, UnaryInterceptor, UnaryResponse } from 'grpc-web';
+import { filter, first } from 'rxjs/operators';
+
+import { AuthenticationService } from '../authentication.service';
+import { StorageService } from '../storage.service';
+
+
+const authorizationKey = 'Authorization';
+const bearerPrefix = 'Bearer';
+const accessTokenStorageKey = 'access_token';
+@Injectable({ providedIn: 'root' })
+export class AuthInterceptor implements UnaryInterceptor {
+ constructor(private authenticationService: AuthenticationService, private storageService: StorageService) { }
+
+ public async intercept(request: Request, invoker: any): Promise> {
+ await this.authenticationService.authenticationChanged.pipe(
+ filter((authed) => !!authed),
+ first(),
+ ).toPromise();
+
+ const metadata = request.getMetadata();
+ const accessToken = this.storageService.getItem(accessTokenStorageKey);
+ metadata[authorizationKey] = `${bearerPrefix} ${accessToken}`;
+
+ return invoker(request).then((response: any) => {
+ // const message = response.getResponseMessage();
+ const respMetadata = response.getMetadata();
+
+ // TODO: intercept unauthenticated an authenticate
+
+ // const status = respMetadata['grpc-status'];
+ // console.log(respMetadata, status);
+ // if (status?.code === 16) {
+ // this.authenticationService.authenticate();
+ // }
+ return response;
+ });
+ }
+}
diff --git a/console/src/app/services/interceptors/grpc-auth.interceptor.ts b/console/src/app/services/interceptors/grpc-auth.interceptor.ts
deleted file mode 100644
index ab89079e3..000000000
--- a/console/src/app/services/interceptors/grpc-auth.interceptor.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Injectable } from '@angular/core';
-import { Metadata } from 'grpc-web';
-
-import { GrpcHandler } from '../grpc-handler';
-import { StorageService } from '../storage.service';
-import { GrpcInterceptor } from './grpc-interceptor';
-
-const authorizationKey = 'Authorization';
-const bearerPrefix = 'Bearer ';
-const accessTokenStorageField = 'access_token';
-
-@Injectable({ providedIn: 'root' })
-export class GrpcAuthInterceptor implements GrpcInterceptor {
- constructor(private readonly authStorage: StorageService) { }
-
- public async intercept(
- req: unknown,
- metadata: Metadata,
- next: GrpcHandler,
- ): Promise {
- if (!metadata[authorizationKey]) {
- const accessToken = this.authStorage.getItem(accessTokenStorageField);
- if (accessToken) {
- metadata[authorizationKey] = bearerPrefix + accessToken;
- }
- }
-
- return await next.handle(req, metadata);
- }
-}
diff --git a/console/src/app/services/interceptors/grpc-interceptor.ts b/console/src/app/services/interceptors/grpc-interceptor.ts
index 78e9dad8b..ea4a73d07 100644
--- a/console/src/app/services/interceptors/grpc-interceptor.ts
+++ b/console/src/app/services/interceptors/grpc-interceptor.ts
@@ -1,12 +1,6 @@
-import { InjectionToken } from '@angular/core';
-import { Metadata } from 'grpc-web';
-
-import { GrpcHandler } from '../grpc-handler';
-
-export const GRPC_INTERCEPTORS = new InjectionToken(
- 'GRPC_INTERCEPTORS',
-);
-
-export interface GrpcInterceptor {
- intercept(req: unknown, metadata: Metadata, next: GrpcHandler): Promise;
-}
+import { InjectionToken } from '@angular/core';
+import { UnaryInterceptor } from 'grpc-web';
+
+export const GRPC_INTERCEPTORS = new InjectionToken>>(
+ 'GRPC_INTERCEPTORS',
+);
diff --git a/console/src/app/services/interceptors/grpc-org.interceptor.ts b/console/src/app/services/interceptors/grpc-org.interceptor.ts
deleted file mode 100644
index 4ab74d0f8..000000000
--- a/console/src/app/services/interceptors/grpc-org.interceptor.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Injectable } from '@angular/core';
-import { Metadata } from 'grpc-web';
-
-import { Org } from '../../proto/generated/auth_pb';
-import { GrpcHandler } from '../grpc-handler';
-import { StorageService } from '../storage.service';
-import { GrpcInterceptor } from './grpc-interceptor';
-
-const orgKey = 'x-zitadel-orgid';
-
-@Injectable({ providedIn: 'root' })
-export class GrpcOrgInterceptor implements GrpcInterceptor {
- constructor(private readonly storageService: StorageService) { }
-
- public async intercept(
- req: unknown,
- metadata: Metadata,
- next: GrpcHandler,
- ): Promise {
- const org: Org.AsObject | null = (this.storageService.getItem('organization'));
- if (!metadata[orgKey] && org) {
- metadata[orgKey] = org.id ?? '';
- }
- return await next.handle(req, metadata);
- }
-}
diff --git a/console/src/app/services/interceptors/org.interceptor.ts b/console/src/app/services/interceptors/org.interceptor.ts
new file mode 100644
index 000000000..bcd8522c5
--- /dev/null
+++ b/console/src/app/services/interceptors/org.interceptor.ts
@@ -0,0 +1,26 @@
+import { Injectable } from '@angular/core';
+import { Request, UnaryInterceptor, UnaryResponse } from 'grpc-web';
+import { Org } from 'src/app/proto/generated/auth_pb';
+
+import { StorageService } from '../storage.service';
+
+
+const orgKey = 'x-zitadel-orgid';
+@Injectable({ providedIn: 'root' })
+export class OrgInterceptor implements UnaryInterceptor {
+ constructor(private readonly storageService: StorageService) { }
+
+ public intercept(request: Request, invoker: any): Promise> {
+ const metadata = request.getMetadata();
+
+ const org: Org.AsObject | null = (this.storageService.getItem('organization'));
+
+ if (org) {
+ metadata[orgKey] = `${org.id}`;
+ }
+
+ return invoker(request).then((response: any) => {
+ return response;
+ });
+ }
+}
diff --git a/console/src/app/services/mgmt-user.service.ts b/console/src/app/services/mgmt-user.service.ts
deleted file mode 100644
index a8d9df355..000000000
--- a/console/src/app/services/mgmt-user.service.ts
+++ /dev/null
@@ -1,534 +0,0 @@
-import { Injectable } from '@angular/core';
-import { Empty } from 'google-protobuf/google/protobuf/empty_pb';
-import { Metadata } from 'grpc-web';
-
-import { ManagementServicePromiseClient } from '../proto/generated/management_grpc_web_pb';
-import {
- ChangeRequest,
- Changes,
- CreateUserRequest,
- LoginName,
- Gender,
- MultiFactors,
- NotificationType,
- PasswordRequest,
- ProjectGrantMemberSearchQuery,
- ProjectGrantMemberSearchRequest,
- ProjectGrantMemberSearchResponse,
- ProjectMemberSearchQuery,
- ProjectMemberSearchRequest,
- ProjectMemberSearchResponse,
- ProjectRoleAdd,
- SetPasswordNotificationRequest,
- UpdateUserAddressRequest,
- UpdateUserEmailRequest,
- UpdateUserPhoneRequest,
- UpdateUserProfileRequest,
- User,
- UserAddress,
- UserEmail,
- UserGrant,
- UserGrantCreate,
- UserGrantID,
- UserGrantRemoveBulk,
- UserGrantSearchQuery,
- UserGrantSearchRequest,
- UserGrantSearchResponse,
- UserGrantUpdate,
- UserGrantView,
- UserID,
- UserMembershipSearchQuery,
- UserMembershipSearchRequest,
- UserMembershipSearchResponse,
- UserPhone,
- UserProfile,
- UserSearchQuery,
- UserSearchRequest,
- UserSearchResponse,
- UserView,
-} from '../proto/generated/management_pb';
-import { GrpcBackendService } from './grpc-backend.service';
-import { GrpcService, RequestFactory, ResponseMapper } from './grpc.service';
-
-@Injectable({
- providedIn: 'root',
-})
-export class MgmtUserService {
- constructor(private grpcService: GrpcService, private grpcBackendService: GrpcBackendService) { }
-
- public async request(
- requestFn: RequestFactory,
- request: TReq,
- responseMapper: ResponseMapper,
- metadata?: Metadata,
- ): Promise {
- const mappedRequestFn = requestFn(this.grpcService.mgmt).bind(this.grpcService.mgmt);
- const response = await this.grpcBackendService.runRequest(
- mappedRequestFn,
- request,
- metadata,
- );
- return responseMapper(response);
- }
-
- public async CreateUser(user: CreateUserRequest.AsObject): Promise {
- const req = new CreateUserRequest();
- req.setEmail(user.email);
- req.setUserName(user.userName);
- req.setFirstName(user.firstName);
- req.setLastName(user.lastName);
- req.setNickName(user.nickName);
- req.setPassword(user.password);
- req.setPreferredLanguage(user.preferredLanguage);
- req.setGender(user.gender);
- req.setPhone(user.phone);
- req.setStreetAddress(user.streetAddress);
- req.setPostalCode(user.postalCode);
- req.setLocality(user.locality);
- req.setRegion(user.region);
- req.setCountry(user.country);
- return await this.request(
- c => c.createUser,
- req,
- f => f,
- );
- }
-
- public async GetUserByID(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.getUserByID,
- req,
- f => f,
- );
- }
-
- public async SearchProjectMembers(
- limit: number, offset: number, queryList?: ProjectMemberSearchQuery[]): Promise {
- const req = new ProjectMemberSearchRequest();
- req.setLimit(limit);
- req.setOffset(offset);
- if (queryList) {
- req.setQueriesList(queryList);
- }
- return await this.request(
- c => c.searchProjectMembers,
- req,
- f => f,
- );
- }
-
- public async SearchUserMemberships(userId: string,
- limit: number, offset: number, queryList?: UserMembershipSearchQuery[]): Promise {
- const req = new UserMembershipSearchRequest();
- req.setLimit(limit);
- req.setOffset(offset);
- req.setUserId(userId);
- if (queryList) {
- req.setQueriesList(queryList);
- }
- return await this.request(
- c => c.searchUserMemberships,
- req,
- f => f,
- );
- }
-
- public async GetUserProfile(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.getUserProfile,
- req,
- f => f,
- );
- }
-
- public async getUserMfas(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.getUserMfas,
- req,
- f => f,
- );
- }
-
- public async SaveUserProfile(
- id: string,
- firstName?: string,
- lastName?: string,
- nickName?: string,
- preferredLanguage?: string,
- gender?: Gender,
- ): Promise {
- const req = new UpdateUserProfileRequest();
- req.setId(id);
- if (firstName) {
- req.setFirstName(firstName);
- }
- if (lastName) {
- req.setLastName(lastName);
- }
- if (nickName) {
- req.setNickName(nickName);
- }
- if (gender) {
- req.setGender(gender);
- }
- if (preferredLanguage) {
- req.setPreferredLanguage(preferredLanguage);
- }
- return await this.request(
- c => c.updateUserProfile,
- req,
- f => f,
- );
- }
-
- public async GetUserEmail(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.getUserEmail,
- req,
- f => f,
- );
- }
-
- public async SaveUserEmail(id: string, email: string): Promise {
- const req = new UpdateUserEmailRequest();
- req.setId(id);
- req.setEmail(email);
- return await this.request(
- c => c.changeUserEmail,
- req,
- f => f,
- );
- }
-
- public async GetUserPhone(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.getUserPhone,
- req,
- f => f,
- );
- }
-
- public async SaveUserPhone(id: string, phone: string): Promise {
- const req = new UpdateUserPhoneRequest();
- req.setId(id);
- req.setPhone(phone);
- return await this.request(
- c => c.changeUserPhone,
- req,
- f => f,
- );
- }
-
- public async RemoveUserPhone(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.removeUserPhone,
- req,
- f => f,
- );
- }
-
- public async DeactivateUser(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.deactivateUser,
- req,
- f => f,
- );
- }
-
- public async CreateUserGrant(
- userId: string,
- roleNamesList: string[],
- projectId?: string,
- grantId?: string,
- ): Promise {
- const req = new UserGrantCreate();
- if (projectId) { req.setProjectId(projectId); }
- if (grantId) { req.setGrantId(grantId); }
- req.setUserId(userId);
- req.setRoleKeysList(roleNamesList);
-
- return await this.request(
- c => c.createUserGrant,
- req,
- f => f,
- );
- }
- public async ReactivateUser(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.reactivateUser,
- req,
- f => f,
- );
- }
-
- public async AddRole(id: string, key: string, displayName: string, group: string): Promise {
- const req = new ProjectRoleAdd();
- req.setId(id);
- req.setKey(key);
- if (displayName) {
- req.setDisplayName(displayName);
- }
- req.setGroup(group);
- return await this.request(
- c => c.addProjectRole,
- req,
- f => f,
- );
- }
-
- public async GetUserAddress(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.getUserAddress,
- req,
- f => f,
- );
- }
-
- public async ResendEmailVerification(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.resendEmailVerificationMail,
- req,
- f => f,
- );
- }
-
- public async ResendPhoneVerification(id: string): Promise {
- const req = new UserID();
- req.setId(id);
- return await this.request(
- c => c.resendPhoneVerificationCode,
- req,
- f => f,
- );
- }
-
- public async SetInitialPassword(id: string, password: string): Promise {
- const req = new PasswordRequest();
- req.setId(id);
- req.setPassword(password);
- return await this.request(
- c => c.setInitialPassword,
- req,
- f => f,
- );
- }
-
- public async SendSetPasswordNotification(id: string, type: NotificationType): Promise {
- const req = new SetPasswordNotificationRequest();
- req.setId(id);
- req.setType(type);
- return await this.request(
- c => c.sendSetPasswordNotification,
- req,
- f => f,
- );
- }
-
- public async SaveUserAddress(address: UserAddress.AsObject): Promise {
- const req = new UpdateUserAddressRequest();
- req.setId(address.id);
- req.setStreetAddress(address.streetAddress);
- req.setPostalCode(address.postalCode);
- req.setLocality(address.locality);
- req.setRegion(address.region);
- req.setCountry(address.country);
- return await this.request(
- c => c.updateUserAddress,
- req,
- f => f,
- );
- }
-
- public async SearchProjectGrantMembers(
- limit: number,
- offset: number,
- query?: ProjectGrantMemberSearchQuery[],
- ): Promise {
- const req = new ProjectGrantMemberSearchRequest();
- req.setLimit(limit);
- req.setOffset(offset);
- if (query) {
- req.setQueriesList(query);
- }
- return await this.request(
- c => c.searchProjectGrantMembers,
- req,
- f => f,
- );
- }
-
- public async SearchUsers(limit: number, offset: number, queryList?: UserSearchQuery[]): Promise {
- const req = new UserSearchRequest();
- req.setLimit(limit);
- req.setOffset(offset);
- if (queryList) {
- req.setQueriesList(queryList);
- }
- return await this.request(
- c => c.searchUsers,
- req,
- f => f,
- );
- }
-
- public async GetUserByLoginNameGlobal(loginName: string): Promise {
- const req = new LoginName();
- req.setLoginName(loginName);
- return await this.request(
- c => c.getUserByLoginNameGlobal,
- req,
- f => f,
- );
- }
-
- // USER GRANTS
-
- public async SearchUserGrants(
- limit: number,
- offset: number,
- queryList?: UserGrantSearchQuery[],
- ): Promise {
- const req = new UserGrantSearchRequest();
- req.setLimit(limit);
- req.setOffset(offset);
- if (queryList) {
- req.setQueriesList(queryList);
- }
- return await this.request(
- c => c.searchUserGrants,
- req,
- f => f,
- );
- }
-
-
- public async UserGrantByID(
- id: string,
- userId: string,
- ): Promise {
- const req = new UserGrantID();
- req.setId(id);
- req.setUserId(userId);
-
- return await this.request(
- c => c.userGrantByID,
- req,
- f => f,
- );
- }
-
- public async UpdateUserGrant(
- id: string,
- userId: string,
- roleKeysList: string[],
- ): Promise {
- const req = new UserGrantUpdate();
- req.setId(id);
- req.setRoleKeysList(roleKeysList);
- req.setUserId(userId);
-
- return await this.request(
- c => c.updateUserGrant,
- req,
- f => f,
- );
- }
-
- public async RemoveUserGrant(
- id: string,
- userId: string,
- ): Promise {
- const req = new UserGrantID();
- req.setId(id);
- req.setUserId(userId);
-
- return await this.request(
- c => c.removeUserGrant,
- req,
- f => f,
- );
- }
-
- public async BulkRemoveUserGrant(
- idsList: string[],
- ): Promise {
- const req = new UserGrantRemoveBulk();
- req.setIdsList(idsList);
-
- return await this.request(
- c => c.bulkRemoveUserGrant,
- req,
- f => f,
- );
- }
-
- //
-
- public async ApplicationChanges(id: string, limit: number, offset: number): Promise {
- const req = new ChangeRequest();
- req.setId(id);
- req.setLimit(limit);
- req.setSequenceOffset(offset);
- return await this.request(
- c => c.applicationChanges,
- req,
- f => f,
- );
- }
-
- public async OrgChanges(id: string, limit: number, offset: number): Promise {
- const req = new ChangeRequest();
- req.setId(id);
- req.setLimit(limit);
- req.setSequenceOffset(offset);
- return await this.request(
- c => c.orgChanges,
- req,
- f => f,
- );
- }
-
- public async ProjectChanges(id: string, limit: number, offset: number): Promise {
- const req = new ChangeRequest();
- req.setId(id);
- req.setLimit(limit);
- req.setSequenceOffset(offset);
- return await this.request(
- c => c.projectChanges,
- req,
- f => f,
- );
- }
-
- public async UserChanges(id: string, limit: number, sequenceoffset: number): Promise {
- const req = new ChangeRequest();
- req.setId(id);
- req.setLimit(limit);
- req.setSequenceOffset(sequenceoffset);
- return await this.request(
- c => c.userChanges,
- req,
- f => f,
- );
- }
-}
diff --git a/console/src/app/services/mgmt.service.ts b/console/src/app/services/mgmt.service.ts
new file mode 100644
index 000000000..d27b29a03
--- /dev/null
+++ b/console/src/app/services/mgmt.service.ts
@@ -0,0 +1,1066 @@
+import { Injectable } from '@angular/core';
+import { Empty } from 'google-protobuf/google/protobuf/empty_pb';
+
+import {
+ AddOrgDomainRequest,
+ AddOrgMemberRequest,
+ Application,
+ ApplicationID,
+ ApplicationSearchQuery,
+ ApplicationSearchRequest,
+ ApplicationSearchResponse,
+ ApplicationUpdate,
+ ApplicationView,
+ ChangeOrgMemberRequest,
+ ChangeRequest,
+ Changes,
+ CreateUserRequest,
+ Domain,
+ Gender,
+ GrantedProjectSearchRequest,
+ Iam,
+ LoginName,
+ MultiFactors,
+ NotificationType,
+ OIDCApplicationCreate,
+ OIDCConfig,
+ OIDCConfigUpdate,
+ Org,
+ OrgCreateRequest,
+ OrgDomain,
+ OrgDomainSearchQuery,
+ OrgDomainSearchRequest,
+ OrgDomainSearchResponse,
+ OrgDomainValidationRequest,
+ OrgDomainValidationResponse,
+ OrgDomainValidationType,
+ OrgIamPolicy,
+ OrgID,
+ OrgMember,
+ OrgMemberRoles,
+ OrgMemberSearchRequest,
+ OrgMemberSearchResponse,
+ OrgView,
+ PasswordAgePolicy,
+ PasswordAgePolicyCreate,
+ PasswordAgePolicyID,
+ PasswordAgePolicyUpdate,
+ PasswordComplexityPolicy,
+ PasswordComplexityPolicyCreate,
+ PasswordComplexityPolicyID,
+ PasswordComplexityPolicyUpdate,
+ PasswordLockoutPolicy,
+ PasswordLockoutPolicyCreate,
+ PasswordLockoutPolicyID,
+ PasswordLockoutPolicyUpdate,
+ PasswordRequest,
+ Project,
+ ProjectCreateRequest,
+ ProjectGrant,
+ ProjectGrantCreate,
+ ProjectGrantID,
+ ProjectGrantMember,
+ ProjectGrantMemberAdd,
+ ProjectGrantMemberChange,
+ ProjectGrantMemberRemove,
+ ProjectGrantMemberRoles,
+ ProjectGrantMemberSearchQuery,
+ ProjectGrantMemberSearchRequest,
+ ProjectGrantSearchRequest,
+ ProjectGrantSearchResponse,
+ ProjectGrantUpdate,
+ ProjectGrantView,
+ ProjectID,
+ ProjectMember,
+ ProjectMemberAdd,
+ ProjectMemberChange,
+ ProjectMemberRemove,
+ ProjectMemberRoles,
+ ProjectMemberSearchQuery,
+ ProjectMemberSearchRequest,
+ ProjectMemberSearchResponse,
+ ProjectRole,
+ ProjectRoleAdd,
+ ProjectRoleAddBulk,
+ ProjectRoleChange,
+ ProjectRoleRemove,
+ ProjectRoleSearchQuery,
+ ProjectRoleSearchRequest,
+ ProjectRoleSearchResponse,
+ ProjectSearchQuery,
+ ProjectSearchRequest,
+ ProjectSearchResponse,
+ ProjectUpdateRequest,
+ ProjectView,
+ RemoveOrgDomainRequest,
+ RemoveOrgMemberRequest,
+ SetPasswordNotificationRequest,
+ UpdateUserAddressRequest,
+ UpdateUserEmailRequest,
+ UpdateUserPhoneRequest,
+ UpdateUserProfileRequest,
+ User,
+ UserAddress,
+ UserEmail,
+ UserGrant,
+ UserGrantCreate,
+ UserGrantID,
+ UserGrantRemoveBulk,
+ UserGrantSearchQuery,
+ UserGrantSearchRequest,
+ UserGrantSearchResponse,
+ UserGrantUpdate,
+ UserGrantView,
+ UserID,
+ UserMembershipSearchQuery,
+ UserMembershipSearchRequest,
+ UserMembershipSearchResponse,
+ UserPhone,
+ UserProfile,
+ UserSearchQuery,
+ UserSearchRequest,
+ UserSearchResponse,
+ UserView,
+ ValidateOrgDomainRequest,
+ ZitadelDocs,
+} from '../proto/generated/management_pb';
+import { GrpcService } from './grpc.service';
+
+export type ResponseMapper = (resp: TResp) => TMappedResp;
+
+@Injectable({
+ providedIn: 'root',
+})
+export class ManagementService {
+ constructor(private readonly grpcService: GrpcService) { }
+
+ public async GetIam(): Promise {
+ const req = new Empty();
+ return this.grpcService.mgmt.getIam(req);
+ }
+
+ public async GetDefaultPasswordComplexityPolicy(): Promise {
+ const req = new Empty();
+ return this.grpcService.mgmt.getDefaultPasswordComplexityPolicy(req);
+ }
+
+ public async GetMyOrg(): Promise {
+ const req = new Empty();
+ return this.grpcService.mgmt.getMyOrg(req);
+ }
+
+ public async AddMyOrgDomain(domain: string): Promise {
+ const req: AddOrgDomainRequest = new AddOrgDomainRequest();
+ req.setDomain(domain);
+ return this.grpcService.mgmt.addMyOrgDomain(req);
+ }
+
+ public async RemoveMyOrgDomain(domain: string): Promise {
+ const req: RemoveOrgDomainRequest = new AddOrgDomainRequest();
+ req.setDomain(domain);
+ return this.grpcService.mgmt.removeMyOrgDomain(req);
+ }
+
+ public async SearchMyOrgDomains(offset: number, limit: number, queryList?: OrgDomainSearchQuery[]):
+ Promise {
+ const req: OrgDomainSearchRequest = new OrgDomainSearchRequest();
+ req.setLimit(limit);
+ req.setOffset(offset);
+ if (queryList) {
+ req.setQueriesList(queryList);
+ }
+
+ return this.grpcService.mgmt.searchMyOrgDomains(req);
+ }
+
+ public async GenerateMyOrgDomainValidation(domain: string, type: OrgDomainValidationType):
+ Promise {
+ const req: OrgDomainValidationRequest = new OrgDomainValidationRequest();
+ req.setDomain(domain);
+ req.setType(type);
+
+ return this.grpcService.mgmt.generateMyOrgDomainValidation(req);
+ }
+
+ public async ValidateMyOrgDomain(domain: string):
+ Promise {
+ const req: ValidateOrgDomainRequest = new ValidateOrgDomainRequest();
+ req.setDomain(domain);
+
+ return this.grpcService.mgmt.validateMyOrgDomain(req);
+ }
+
+ public async SearchMyOrgMembers(limit: number, offset: number): Promise {
+ const req = new OrgMemberSearchRequest();
+ req.setLimit(limit);
+ req.setOffset(offset);
+ return this.grpcService.mgmt.searchMyOrgMembers(req);
+ }
+
+ public async getOrgByDomainGlobal(domain: string): Promise {
+ const req = new Domain();
+ req.setDomain(domain);
+ return this.grpcService.mgmt.getOrgByDomainGlobal(req);
+ }
+
+ public async CreateOrg(name: string): Promise {
+ const req = new OrgCreateRequest();
+ req.setName(name);
+ return this.grpcService.mgmt.createOrg(req);
+ }
+
+ public async AddMyOrgMember(userId: string, rolesList: string[]): Promise {
+ const req = new AddOrgMemberRequest();
+ req.setUserId(userId);
+ if (rolesList) {
+ req.setRolesList(rolesList);
+ }
+ return this.grpcService.mgmt.addMyOrgMember(req);
+ }
+
+ public async ChangeMyOrgMember(userId: string, rolesList: string[]): Promise {
+ const req = new ChangeOrgMemberRequest();
+ req.setUserId(userId);
+ req.setRolesList(rolesList);
+ return this.grpcService.mgmt.changeMyOrgMember(req);
+ }
+
+
+ public async RemoveMyOrgMember(userId: string): Promise {
+ const req = new RemoveOrgMemberRequest();
+ req.setUserId(userId);
+ return this.grpcService.mgmt.removeMyOrgMember(req);
+ }
+
+ public async DeactivateMyOrg(): Promise {
+ const req = new Empty();
+ return this.grpcService.mgmt.deactivateMyOrg(req);
+ }
+
+ public async ReactivateMyOrg(): Promise {
+ const req = new OrgID();
+ return this.grpcService.mgmt.reactivateMyOrg(req);
+ }
+
+ public async CreateProjectGrant(
+ projectId: string,
+ orgId: string,
+ roleKeysList: string[],
+ ): Promise {
+ const req = new ProjectGrantCreate();
+ req.setProjectId(projectId);
+ req.setGrantedOrgId(orgId);
+ req.setRoleKeysList(roleKeysList);
+ return this.grpcService.mgmt.createProjectGrant(req);
+ }
+
+ public async GetOrgMemberRoles(): Promise {
+ const req = new Empty();
+ return this.grpcService.mgmt.getOrgMemberRoles(req);
+ }
+
+ // Policy
+
+ public async GetMyOrgIamPolicy(): Promise {
+ const req = new Empty();
+ return this.grpcService.mgmt.getMyOrgIamPolicy(req);
+ }
+
+ public async GetPasswordAgePolicy(): Promise {
+ const req = new Empty();
+
+ return this.grpcService.mgmt.getPasswordAgePolicy(req);
+ }
+
+ public async CreatePasswordAgePolicy(
+ description: string,
+ maxAgeDays: number,
+ expireWarnDays: number,
+ ): Promise {
+ const req = new PasswordAgePolicyCreate();
+ req.setDescription(description);
+ req.setMaxAgeDays(maxAgeDays);
+ req.setExpireWarnDays(expireWarnDays);
+
+ return this.grpcService.mgmt.createPasswordAgePolicy(req);
+ }
+
+ public async DeletePasswordAgePolicy(id: string): Promise {
+ const req = new PasswordAgePolicyID();
+ req.setId(id);
+ return this.grpcService.mgmt.deletePasswordAgePolicy(req);
+ }
+
+ public async UpdatePasswordAgePolicy(
+ description: string,
+ maxAgeDays: number,
+ expireWarnDays: number,
+ ): Promise {
+ const req = new PasswordAgePolicyUpdate();
+ req.setDescription(description);
+ req.setMaxAgeDays(maxAgeDays);
+ req.setExpireWarnDays(expireWarnDays);
+ return this.grpcService.mgmt.updatePasswordAgePolicy(req);
+ }
+
+ public async GetPasswordComplexityPolicy(): Promise {
+ const req = new Empty();
+ return this.grpcService.mgmt.getPasswordComplexityPolicy(req);
+ }
+
+ public async CreatePasswordComplexityPolicy(
+ description: string,
+ hasLowerCase: boolean,
+ hasUpperCase: boolean,
+ hasNumber: boolean,
+ hasSymbol: boolean,
+ minLength: number,
+ ): Promise