Skip to content

Commit

Permalink
Remove usage of IsAuthenticatedRequest and LoginResult #2216 (#2217)
Browse files Browse the repository at this point in the history
  • Loading branch information
ashklianko authored Jan 28, 2025
1 parent 113f9a4 commit 7f9e3db
Show file tree
Hide file tree
Showing 18 changed files with 119 additions and 80 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Project settings
#
version=7.16.0-SNAPSHOT
libAdminUiVersion=5.0.0-SNAPSHOT
libAdminUiVersion=5.1.0-SNAPSHOT

systemProp.org.gradle.internal.http.connectionTimeout=120000
systemProp.org.gradle.internal.http.socketTimeout=120000
5 changes: 5 additions & 0 deletions src/main/resources/admin/tools/main/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ const mustache = require('/lib/mustache');
const portal = require('/lib/xp/portal');
const i18n = require('/lib/xp/i18n');
const assetLib = require('/lib/enonic/asset');
const authLib = require('/lib/xp/auth');

function getConfigAsJson() {
const user = authLib.getUser();

return JSON.stringify({
adminUrl: admin.getBaseUri(),
appId: app.name,
Expand Down Expand Up @@ -42,6 +45,8 @@ function getConfigAsJson() {
theme: 'dark',
}
}),
user,
principals: authLib.getMemberships(user.key, true)
}, null, 4).replace(/<(\/?script|!--)/gi, "\\u003C$1");
}

Expand Down
10 changes: 10 additions & 0 deletions src/main/resources/assets/js/app/browse/UserBrowsePanel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ export class UserBrowsePanel
this.appendUserItemNode(principal, idProvider);
this.setRefreshOfFilterRequired();

// IdProvider type
if (!principal) {
this.treeListBox.resetIdProviders();
}

/*
In case you switch to UserBrowsePanel before this event occured you need to trigger refresh manually
Otherwise 'shown' event won't update filter
Expand All @@ -75,6 +80,7 @@ export class UserBrowsePanel

if (!principal) { // IdProvider type
userTreeGridItem = builder.setIdProvider(idProvider).setType(UserTreeGridItemType.ID_PROVIDER).build();
this.treeListBox.resetIdProviders();
} else { // Principal type
userTreeGridItem = builder.setPrincipal(principal).setIdProvider(idProvider).setType(UserTreeGridItemType.PRINCIPAL).build();
}
Expand All @@ -92,6 +98,10 @@ export class UserBrowsePanel
this.selectionWrapper.deselect(item);
this.findParentList(item).forEach((list) => list.removeItems(item));
}

if (!item || item.isIdProvider()) {
this.treeListBox.resetIdProviders();
}
});

if (this.treeListBox.isFiltered() && this.treeListBox.getItems().length === 0) {
Expand Down
53 changes: 31 additions & 22 deletions src/main/resources/assets/js/app/browse/UserItemsTreeRootList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export class UserItemsTreeRootList extends UserItemsTreeList {

private searchString: string;
private searchTypes: UserItemType[];
private latestIdProviders: IdProvider[];
private cachedIdProviders: IdProvider[];
private constraintItems: string[];

setSearchString(searchString: string): this {
Expand All @@ -37,11 +37,14 @@ export class UserItemsTreeRootList extends UserItemsTreeList {
resetFilter(): void {
this.searchString = null;
this.searchTypes = null;
this.latestIdProviders = null;
this.constraintItems = null;
this.load();
}

resetIdProviders(): void {
this.cachedIdProviders = null;
}

protected fetchRoot(): Q.Promise<UserTreeGridItem[]> {
if (this.isFiltered()) {
return this.fetchFilteredItems();
Expand All @@ -51,37 +54,43 @@ export class UserItemsTreeRootList extends UserItemsTreeList {
}

private fetchFilteredItems(): Q.Promise<UserTreeGridItem[]> {
// load list of idproviders to set for filtered users/groups
const idProvidersPromise = this.latestIdProviders ? Q.resolve() : new ListIdProvidersRequest().sendAndParse().then((idProviders) => {
this.latestIdProviders = idProviders;
return Q.resolve();
}).catch(DefaultErrorHandler.handle);


return idProvidersPromise.then(() => {
return new ListUserItemsRequest()
.setCount(20)
.setTypes(this.searchTypes)
.setItems(this.constraintItems)
.setQuery(this.searchString)
.setStart(this.getItemCount())
.sendAndParse()
.then((result) => {
return result.userItems.map(userItem => {
return new ListUserItemsRequest()
.setCount(20)
.setTypes(this.searchTypes)
.setItems(this.constraintItems)
.setQuery(this.searchString)
.setStart(this.getItemCount())
.sendAndParse()
.then((userItemsResponse) => {
return this.getIdProviders().then((idProviders) => {
return userItemsResponse.userItems.map(userItem => {
const builder = new UserTreeGridItemBuilder();

if (userItem instanceof Principal) {
const idProv = this.latestIdProviders.find(idProv => idProv.getKey().equals(userItem.getKey().getIdProvider()));
builder.setPrincipal(userItem).setIdProvider(idProv).setType(UserTreeGridItemType.PRINCIPAL);
const idProv = idProviders.find(idProv => idProv.getKey().equals(userItem.getKey().getIdProvider()));
builder.setPrincipal(userItem).setIdProvider(idProv).setType(UserTreeGridItemType.PRINCIPAL);
} else if (userItem instanceof IdProvider) {
builder.setIdProvider(userItem).setType(UserTreeGridItemType.ID_PROVIDER);
}

return builder.build();
});
});
});
});
}

private getIdProviders(): Q.Promise<IdProvider[]> {
if (this.cachedIdProviders) {
return Q.resolve(this.cachedIdProviders.slice());
}

return new ListIdProvidersRequest().sendAndParse().then((result) => {
this.cachedIdProviders = result;
return this.cachedIdProviders.slice();
}).catch(() => {
DefaultErrorHandler.handle('Failed to load id providers');
return [];
});
}

isLoadAllowed(): boolean {
Expand Down
13 changes: 3 additions & 10 deletions src/main/resources/assets/js/app/create/UserItemTypesTreeGrid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@ import {Group, GroupBuilder} from '../principal/Group';
import {Role, RoleBuilder} from '../principal/Role';
import {PrincipalKey} from '@enonic/lib-admin-ui/security/PrincipalKey';
import {PrincipalType} from '@enonic/lib-admin-ui/security/PrincipalType';
import {IsAuthenticatedRequest} from '@enonic/lib-admin-ui/security/auth/IsAuthenticatedRequest';
import {IdProviderKey} from '@enonic/lib-admin-ui/security/IdProviderKey';
import {i18n} from '@enonic/lib-admin-ui/util/Messages';
import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler';
import {LoginResult} from '@enonic/lib-admin-ui/security/auth/LoginResult';
import {UserItem} from '@enonic/lib-admin-ui/security/UserItem';
import {TreeListBox, TreeListBoxParams, TreeListElement, TreeListElementParams} from '@enonic/lib-admin-ui/ui/selector/list/TreeListBox';
import {UserTypesTreeGridItemViewer} from './UserTypesTreeGridItemViewer';
import {AuthHelper} from '@enonic/lib-admin-ui/auth/AuthHelper';

export class UserItemTypesTreeGrid
extends TreeListBox<UserTypeTreeGridItem> {
Expand Down Expand Up @@ -76,13 +75,7 @@ export class UserItemTypesTreeGrid
}

private fetchRoot(): Q.Promise<UserTypeTreeGridItem[]> {
return Q.all([new IsAuthenticatedRequest().sendAndParse(), this.fetchIdProviders()]).then(
(result: [LoginResult, IdProvider[]]) => result[0].isUserAdmin(),
reason => {
DefaultErrorHandler.handle(reason);
return false;
}
).then(userIsAdmin => [
return this.fetchIdProviders().then(() => [
new UserTypeTreeGridItemBuilder()
.setUserItem(new UserBuilder()
.setKey(new PrincipalKey(IdProviderKey.SYSTEM, PrincipalType.USER, 'user'))
Expand All @@ -93,7 +86,7 @@ export class UserItemTypesTreeGrid
.setKey(new PrincipalKey(IdProviderKey.SYSTEM, PrincipalType.GROUP, 'user-group'))
.setDisplayName(i18n('field.userGroup'))
.build()).build(),
...((this.presetIdProvider || !userIsAdmin) ? [] : [
...((this.presetIdProvider || !AuthHelper.isUserAdmin()) ? [] : [
new UserTypeTreeGridItemBuilder()
.setUserItem(new IdProviderBuilder()
.setKey(IdProviderKey.SYSTEM.toString())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@ import {Principal} from '@enonic/lib-admin-ui/security/Principal';
import {PrincipalType} from '@enonic/lib-admin-ui/security/PrincipalType';
import {PrincipalKey} from '@enonic/lib-admin-ui/security/PrincipalKey';
import {PrincipalViewer} from '@enonic/lib-admin-ui/ui/security/PrincipalViewer';
import {RoleKeys} from '@enonic/lib-admin-ui/security/RoleKeys';
import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl';
import {Path} from '@enonic/lib-admin-ui/rest/Path';
import {IsAuthenticatedRequest} from '@enonic/lib-admin-ui/security/auth/IsAuthenticatedRequest';
import {AppHelper} from '@enonic/lib-admin-ui/util/AppHelper';
import {i18n} from '@enonic/lib-admin-ui/util/Messages';
import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler';
Expand All @@ -25,10 +23,10 @@ import {CheckboxBuilder} from '@enonic/lib-admin-ui/ui/Checkbox';
import {Element} from '@enonic/lib-admin-ui/dom/Element';
import {Button} from '@enonic/lib-admin-ui/ui/button/Button';
import {UserItemStatisticsHeader} from './UserItemStatisticsHeader';
import {LoginResult} from '@enonic/lib-admin-ui/security/auth/LoginResult';
import {CONFIG} from '@enonic/lib-admin-ui/util/Config';
import {MembersListing} from './MembersListing';
import {SelectionChange} from '@enonic/lib-admin-ui/util/SelectionChange';
import {AuthHelper} from '@enonic/lib-admin-ui/auth/AuthHelper';

export class UserItemStatisticsPanel
extends ItemStatisticsPanel {
Expand Down Expand Up @@ -198,9 +196,7 @@ export class UserItemStatisticsPanel
}

private async createReportGroup(principal: Principal): Promise<ItemDataGroup | null> {
const isAdmin = await new IsAuthenticatedRequest().sendAndParse().then((loginResult: LoginResult) => {
return loginResult.getPrincipals().some(key => key.equals(RoleKeys.ADMIN));
});
const isAdmin = AuthHelper.isAdmin();

if(!isAdmin) { return Q(null); }

Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/assets/js/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ import {InputTypeManager} from '@enonic/lib-admin-ui/form/inputtype/InputTypeMan
import {Class} from '@enonic/lib-admin-ui/Class';
import {JSONObject} from '@enonic/lib-admin-ui/types';
import {LauncherHelper} from '@enonic/lib-admin-ui/util/LauncherHelper';
import {AuthContext} from '@enonic/lib-admin-ui/auth/AuthContext';
import {Principal} from '@enonic/lib-admin-ui/security/Principal';
import {PrincipalJson} from '@enonic/lib-admin-ui/security/PrincipalJson';

const body = Body.get();

Expand Down Expand Up @@ -92,6 +95,8 @@ function startApplication() {

const configScriptEl: HTMLElement = document.getElementById(configScriptId);
CONFIG.setConfig(JSON.parse(configScriptEl.innerText) as JSONObject);
AuthContext.init(Principal.fromJson(CONFIG.get('user') as PrincipalJson),
(CONFIG.get('principals') as PrincipalJson[]).map(Principal.fromJson));

await i18nInit(CONFIG.getString('apis.i18nUrl'));
startApplication();
Expand Down
6 changes: 4 additions & 2 deletions testing/libs/test.utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ module.exports = {
let confirmationDialog = new ConfirmationDialog();
await this.findAndSelectItem(name);
await browsePanel.waitForDeleteButtonEnabled();
await browsePanel.pause(1000);
await browsePanel.clickOnDeleteButton();
await confirmationDialog.waitForDialogLoaded();
await confirmationDialog.clickOnYesButton();
Expand Down Expand Up @@ -199,7 +200,7 @@ module.exports = {
}
//2. Open New Principal dialog:
await browsePanel.waitForNewButtonEnabled();
await browsePanel.pause(400);
await browsePanel.pause(1000);
await browsePanel.clickOnNewButton();
await newPrincipalDialog.waitForDialogLoaded();
//3. Click on Group item in the modal dialog:
Expand Down Expand Up @@ -266,7 +267,8 @@ module.exports = {
await this.findAndSelectItem(displayName);
await browsePanel.waitForEditButtonEnabled();
await browsePanel.clickOnEditButton();
return await roleWizard.waitForLoaded();
await roleWizard.waitForLoaded();
await roleWizard.pause(500);
} catch (err) {
throw new Error("Error when open the role: " + err);
}
Expand Down
8 changes: 5 additions & 3 deletions testing/page_objects/browsepanel/userbrowse.panel.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ class UserBrowsePanel extends Page {

isItemDisplayed(itemName) {
return this.waitForElementDisplayed(xpath.rowByName(itemName), appConst.mediumTimeout).catch(err => {
console.log("item is not displayed:" + itemName + +" " + err);
console.log("item is not displayed: " + itemName);
return false;
});
}
Expand Down Expand Up @@ -178,7 +178,8 @@ class UserBrowsePanel extends Page {

async clickOnDeleteButton() {
await this.waitForDeleteButtonEnabled();
return await this.clickOnElement(this.deleteButton);
await await this.clickOnElement(this.deleteButton);
await this.pause(500);
}

isSearchButtonDisplayed() {
Expand All @@ -198,7 +199,8 @@ class UserBrowsePanel extends Page {

async waitForDeleteButtonEnabled() {
try {
await this.waitForElementEnabled(this.deleteButton, appConst.mediumTimeout)
await this.waitForElementEnabled(this.deleteButton, appConst.mediumTimeout);
await this.pause(400);
} catch (err) {
let screenshot = await this.saveScreenshotUniqueName('err_delete_button_not_enabled');
throw new Error(`Delete button is not enabled ! Screenshot: ${screenshot} ` + err);
Expand Down
10 changes: 7 additions & 3 deletions testing/page_objects/confirmation.dialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,14 @@ class ConfirmationDialog extends Page {
return this.clickOnElement(this.noButton);
}

waitForDialogLoaded() {
return this.waitForElementDisplayed(XPATH.container, appConst.mediumTimeout).catch(err => {
async waitForDialogLoaded() {
try {
await this.waitForElementDisplayed(XPATH.container, appConst.mediumTimeout);
await this.pause(300);
} catch (err) {
let screenshot = await this.saveScreenshotUniqueName('err_confirmation_dialog');
throw new Error("Confirmation dialog was not loaded! " + err);
})
}
}

isDialogLoaded() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@ class FirstIdProviderConfiguratorDialog extends Page {
return this.clickOnElement(this.applyButton);
}

waitForApplyButtonEnabled() {
return this.waitForElementEnabled(this.applyButton, appConst.mediumTimeout);
async waitForApplyButtonEnabled() {
await this.waitForElementEnabled(this.applyButton, appConst.mediumTimeout);
await this.pause(200);
}

waitForApplyButtonDisabled() {
Expand All @@ -77,10 +78,13 @@ class FirstIdProviderConfiguratorDialog extends Page {
return this.isElementEnabled(this.domainInput);
}

waitForClosed() {
return this.waitForElementNotDisplayed(XPATH.container, appConst.mediumTimeout).catch(error => {
throw new Error('ID Provider config Dialog was not closed');
});
async waitForClosed() {
try {
await this.waitForElementNotDisplayed(XPATH.container, appConst.mediumTimeout)
} catch (err) {
let screenshot = await this.saveScreenshotUniqueName('err_close_id_provider_config_dialog');
throw new Error(`ID Provider config Dialog was not closed, screenshot:${screenshot} ` + err);
}
}

typeInDomainInput(domain) {
Expand Down
2 changes: 1 addition & 1 deletion testing/page_objects/wizardpanel/wizard.panel.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class WizardPanel extends Page {
try {
await this.waitForSaveButtonEnabled();
await this.clickOnElement(this.saveButton);
return await this.pause(900);
return await this.pause(700);
} catch (err) {
let screenshot = await this.saveScreenshotUniqueName('err_save_button');
throw new Error(`Error occurred during clicking on Save button ! ${screenshot} ` + err);
Expand Down
2 changes: 1 addition & 1 deletion testing/tests/idprovider.delete.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ describe("Confirm and delete 'Id Provider' in wizard and in browse panel", funct
// Select the provider and click on Delete button:
await testUtils.selectAndDeleteItem(ID_PROVIDER.displayName);
let actualMessage = await userBrowsePanel.waitForNotificationMessage();
await testUtils.saveScreenshot('store_deleted_notification_mes2');
await testUtils.saveScreenshot('idprovider_deleted_notification_mes2');
let expectedMessage = appConst.providerDeletedMessage(ID_PROVIDER.displayName);
// Expected message: Id Provider "${displayName}" is deleted
assert.strictEqual(actualMessage, expectedMessage, 'expected notification message should be displayed');
Expand Down
9 changes: 5 additions & 4 deletions testing/tests/idprovider.with.required.inputs.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,9 +160,9 @@ describe('Id Provider, provider-dialog specification', function () {
// 1. Select an existing provider with configurator then click on Create User menu item in the modal dialog:
await testUtils.selectIdProviderAndClickOnMenuItem(TEST_ID_PROVIDER_NAME, 'User');
// 2. Verify the actual notification message - The application does not allow to create users
let actualMessage = await userBrowsePanel.waitForNotificationMessage();
let actualMessages = await userBrowsePanel.waitForNotificationMessage();
await testUtils.saveScreenshot('app_does_not_allow_users');
assert.equal(actualMessage, NOTIFICATION_MESSAGE, "The application does not allow to create users");
assert.ok(actualMessages.includes(NOTIFICATION_MESSAGE), "The application does not allow to create users");
});

it(`GIVEN id provider with a configuration is selected WHEN Create New User Group menu item has been clicked THEN expected notification message should appear`,
Expand All @@ -177,8 +177,9 @@ describe('Id Provider, provider-dialog specification', function () {
await groupWizard.waitAndClickOnSave();
await testUtils.saveScreenshot('group_saved_in_provider');
// 4. Verify that group is saved:
let message = await groupWizard.waitForNotificationMessage();
assert.equal(message, appConst.NOTIFICATION_MESSAGE.GROUP_WAS_CREATED, "Group was created - message should be displayed");
let messages = await groupWizard.waitForNotificationMessage();
assert.ok(messages.includes(appConst.NOTIFICATION_MESSAGE.GROUP_WAS_CREATED),
"Group was created - message should be displayed");
});

// Verify Error in group selector inside ID providers config form #940
Expand Down
2 changes: 1 addition & 1 deletion testing/tests/role.delete.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ describe('Deleting of a role - confirm and delete it in wizard and in browse pan
await testUtils.clickOnRolesFolderAndOpenWizard();
await roleWizard.typeData(TEST_ROLE);
await roleWizard.waitAndClickOnSave();
await roleWizard.pause(500);
await roleWizard.pause(1000);
// 2. Click on Delete and confirm the deleting:
await roleWizard.clickOnDelete();
await testUtils.confirmDelete();
Expand Down
Loading

0 comments on commit 7f9e3db

Please sign in to comment.