mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-10-13 01:38:13 +00:00
Domain restriction for non domain entities (#17314)
* add forbidden handling of entities * add forbidden page * move forbidden page to authenticated app router * fix domain tests
This commit is contained in:
parent
4c43509203
commit
c6e7fe9423
@ -12,9 +12,11 @@
|
|||||||
*/
|
*/
|
||||||
import test, { expect } from '@playwright/test';
|
import test, { expect } from '@playwright/test';
|
||||||
import { Operation } from 'fast-json-patch';
|
import { Operation } from 'fast-json-patch';
|
||||||
|
import { get } from 'lodash';
|
||||||
import { SidebarItem } from '../../constant/sidebar';
|
import { SidebarItem } from '../../constant/sidebar';
|
||||||
import { DataProduct } from '../../support/domain/DataProduct';
|
import { DataProduct } from '../../support/domain/DataProduct';
|
||||||
import { Domain } from '../../support/domain/Domain';
|
import { Domain } from '../../support/domain/Domain';
|
||||||
|
import { ENTITY_PATH } from '../../support/entity/Entity.interface';
|
||||||
import { UserClass } from '../../support/user/UserClass';
|
import { UserClass } from '../../support/user/UserClass';
|
||||||
import { performAdminLogin } from '../../utils/admin';
|
import { performAdminLogin } from '../../utils/admin';
|
||||||
import { getApiContext, redirectToHomePage } from '../../utils/common';
|
import { getApiContext, redirectToHomePage } from '../../utils/common';
|
||||||
@ -31,7 +33,7 @@ import {
|
|||||||
verifyDomain,
|
verifyDomain,
|
||||||
} from '../../utils/domain';
|
} from '../../utils/domain';
|
||||||
import { sidebarClick } from '../../utils/sidebar';
|
import { sidebarClick } from '../../utils/sidebar';
|
||||||
import { performUserLogin } from '../../utils/user';
|
import { performUserLogin, visitUserProfilePage } from '../../utils/user';
|
||||||
|
|
||||||
test.describe('Domains', () => {
|
test.describe('Domains', () => {
|
||||||
test.use({ storageState: 'playwright/.auth/admin.json' });
|
test.use({ storageState: 'playwright/.auth/admin.json' });
|
||||||
@ -181,6 +183,7 @@ test.describe('Domains', () => {
|
|||||||
|
|
||||||
await checkAssetsCount(page, assets.length);
|
await checkAssetsCount(page, assets.length);
|
||||||
await domain.delete(apiContext);
|
await domain.delete(apiContext);
|
||||||
|
await assetCleanup();
|
||||||
await afterAction();
|
await afterAction();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -194,7 +197,7 @@ test.describe('Domains Rbac', () => {
|
|||||||
const user1 = new UserClass();
|
const user1 = new UserClass();
|
||||||
|
|
||||||
test.beforeAll('Setup pre-requests', async ({ browser }) => {
|
test.beforeAll('Setup pre-requests', async ({ browser }) => {
|
||||||
const { apiContext, afterAction } = await performAdminLogin(browser);
|
const { apiContext, afterAction, page } = await performAdminLogin(browser);
|
||||||
await domain1.create(apiContext);
|
await domain1.create(apiContext);
|
||||||
await domain2.create(apiContext);
|
await domain2.create(apiContext);
|
||||||
await domain3.create(apiContext);
|
await domain3.create(apiContext);
|
||||||
@ -220,6 +223,24 @@ test.describe('Domains Rbac', () => {
|
|||||||
];
|
];
|
||||||
|
|
||||||
await user1.patch({ apiContext, patchData: domainPayload });
|
await user1.patch({ apiContext, patchData: domainPayload });
|
||||||
|
|
||||||
|
// Add domain role to the user
|
||||||
|
await visitUserProfilePage(page, user1.responseData.name);
|
||||||
|
await page
|
||||||
|
.getByTestId('user-profile')
|
||||||
|
.locator('.ant-collapse-expand-icon')
|
||||||
|
.click();
|
||||||
|
await page.getByTestId('edit-roles-button').click();
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByTestId('select-user-roles')
|
||||||
|
.getByLabel('Select roles')
|
||||||
|
.click();
|
||||||
|
await page.getByText('Domain Only Access Role').click();
|
||||||
|
await page.click('body');
|
||||||
|
const patchRes = page.waitForResponse('/api/v1/users/*');
|
||||||
|
await page.getByTestId('inline-save-btn').click();
|
||||||
|
await patchRes;
|
||||||
await afterAction();
|
await afterAction();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -265,6 +286,24 @@ test.describe('Domains Rbac', () => {
|
|||||||
.locator('span')
|
.locator('span')
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
|
|
||||||
|
for (const asset of domainAssset2) {
|
||||||
|
const fqn = encodeURIComponent(
|
||||||
|
get(asset, 'entityResponseData.fullyQualifiedName', '')
|
||||||
|
);
|
||||||
|
|
||||||
|
const assetData = userPage.waitForResponse(
|
||||||
|
`/api/v1/${asset.endpoint}/name/${fqn}*`
|
||||||
|
);
|
||||||
|
await userPage.goto(`/${ENTITY_PATH[asset.endpoint]}/${fqn}`);
|
||||||
|
await assetData;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
userPage.getByTestId('permission-error-placeholder')
|
||||||
|
).toHaveText(
|
||||||
|
'You don’t have access, please check with the admin to get permissions'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
await afterActionUser1();
|
await afterActionUser1();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -12,8 +12,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { expect, Page } from '@playwright/test';
|
import { expect, Page } from '@playwright/test';
|
||||||
|
import { GlobalSettingOptions } from '../constant/settings';
|
||||||
import { UserClass } from '../support/user/UserClass';
|
import { UserClass } from '../support/user/UserClass';
|
||||||
import { getAuthContext, getToken, toastNotification } from './common';
|
import { getAuthContext, getToken, toastNotification } from './common';
|
||||||
|
import { settingClick } from './sidebar';
|
||||||
|
|
||||||
export const performUserLogin = async (browser, user: UserClass) => {
|
export const performUserLogin = async (browser, user: UserClass) => {
|
||||||
const page = await browser.newPage();
|
const page = await browser.newPage();
|
||||||
@ -76,6 +78,16 @@ export const deletedUserChecks = async (page: Page) => {
|
|||||||
).not.toBeVisible();
|
).not.toBeVisible();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const visitUserProfilePage = async (page: Page, userName: string) => {
|
||||||
|
await settingClick(page, GlobalSettingOptions.USERS);
|
||||||
|
const userResponse = page.waitForResponse(
|
||||||
|
'/api/v1/search/query?q=**&from=0&size=*&index=*'
|
||||||
|
);
|
||||||
|
await page.getByTestId('searchbar').fill(userName);
|
||||||
|
await userResponse;
|
||||||
|
await page.getByTestId(userName).click();
|
||||||
|
};
|
||||||
|
|
||||||
export const softDeleteUserProfilePage = async (
|
export const softDeleteUserProfilePage = async (
|
||||||
page: Page,
|
page: Page,
|
||||||
userName: string,
|
userName: string,
|
||||||
|
@ -23,6 +23,7 @@ import { Operation } from '../../generated/entity/policies/policy';
|
|||||||
import AddCustomMetricPage from '../../pages/AddCustomMetricPage/AddCustomMetricPage';
|
import AddCustomMetricPage from '../../pages/AddCustomMetricPage/AddCustomMetricPage';
|
||||||
import { CustomizablePage } from '../../pages/CustomizablePage/CustomizablePage';
|
import { CustomizablePage } from '../../pages/CustomizablePage/CustomizablePage';
|
||||||
import DataQualityPage from '../../pages/DataQuality/DataQualityPage';
|
import DataQualityPage from '../../pages/DataQuality/DataQualityPage';
|
||||||
|
import ForbiddenPage from '../../pages/ForbiddenPage/ForbiddenPage';
|
||||||
import { checkPermission, userPermissions } from '../../utils/PermissionsUtils';
|
import { checkPermission, userPermissions } from '../../utils/PermissionsUtils';
|
||||||
import AdminProtectedRoute from './AdminProtectedRoute';
|
import AdminProtectedRoute from './AdminProtectedRoute';
|
||||||
import withSuspenseFallback from './withSuspenseFallback';
|
import withSuspenseFallback from './withSuspenseFallback';
|
||||||
@ -265,6 +266,7 @@ const AuthenticatedAppRouter: FunctionComponent = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Switch>
|
<Switch>
|
||||||
|
<Route exact component={ForbiddenPage} path={ROUTES.FORBIDDEN} />
|
||||||
<Route exact component={MyDataPage} path={ROUTES.MY_DATA} />
|
<Route exact component={MyDataPage} path={ROUTES.MY_DATA} />
|
||||||
<Route exact component={TourPageComponent} path={ROUTES.TOUR} />
|
<Route exact component={TourPageComponent} path={ROUTES.TOUR} />
|
||||||
<Route exact component={ExplorePageV1} path={ROUTES.EXPLORE} />
|
<Route exact component={ExplorePageV1} path={ROUTES.EXPLORE} />
|
||||||
|
@ -30,7 +30,7 @@ const SuggestionsSlider = () => {
|
|||||||
} = useSuggestionsContext();
|
} = useSuggestionsContext();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="d-flex items-center gap-2">
|
<div className="d-flex items-center gap-2 m-r-md">
|
||||||
<Typography.Text className="right-panel-label">
|
<Typography.Text className="right-panel-label">
|
||||||
{t('label.suggested-description-plural')}
|
{t('label.suggested-description-plural')}
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
|
@ -135,6 +135,7 @@ export const ROUTES = {
|
|||||||
SAML_CALLBACK: '/saml/callback',
|
SAML_CALLBACK: '/saml/callback',
|
||||||
SILENT_CALLBACK: '/silent-callback',
|
SILENT_CALLBACK: '/silent-callback',
|
||||||
NOT_FOUND: '/404',
|
NOT_FOUND: '/404',
|
||||||
|
FORBIDDEN: '/403',
|
||||||
MY_DATA: '/my-data',
|
MY_DATA: '/my-data',
|
||||||
TOUR: '/tour',
|
TOUR: '/tour',
|
||||||
REPORTS: '/reports',
|
REPORTS: '/reports',
|
||||||
|
@ -42,7 +42,7 @@ export const useDomainStore = create<DomainStore>()(
|
|||||||
userDomainsObj.map((item) => item.fullyQualifiedName) ?? [];
|
userDomainsObj.map((item) => item.fullyQualifiedName) ?? [];
|
||||||
|
|
||||||
let filteredDomains: Domain[] = data;
|
let filteredDomains: Domain[] = data;
|
||||||
if (domains.length > 0) {
|
if (domains.length > 0 && !isAdmin) {
|
||||||
filteredDomains = data.filter((domain) =>
|
filteredDomains = data.filter((domain) =>
|
||||||
userDomainFqn.includes(domain.fullyQualifiedName)
|
userDomainFqn.includes(domain.fullyQualifiedName)
|
||||||
);
|
);
|
||||||
|
@ -46,6 +46,7 @@ import {
|
|||||||
getEntityDetailsPath,
|
getEntityDetailsPath,
|
||||||
getVersionPath,
|
getVersionPath,
|
||||||
INITIAL_PAGING_VALUE,
|
INITIAL_PAGING_VALUE,
|
||||||
|
ROUTES,
|
||||||
} from '../../constants/constants';
|
} from '../../constants/constants';
|
||||||
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
@ -53,6 +54,7 @@ import {
|
|||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import {
|
import {
|
||||||
EntityTabs,
|
EntityTabs,
|
||||||
@ -213,6 +215,9 @@ const APICollectionPage: FunctionComponent = () => {
|
|||||||
setShowDeletedEndpoints(response.deleted ?? false);
|
setShowDeletedEndpoints(response.deleted ?? false);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Error
|
// Error
|
||||||
|
if ((err as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setIsAPICollectionLoading(false);
|
setIsAPICollectionLoading(false);
|
||||||
}
|
}
|
||||||
|
@ -22,12 +22,13 @@ import APIEndpointDetails from '../../components/APIEndpoint/APIEndpointDetails/
|
|||||||
import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
||||||
import Loader from '../../components/common/Loader/Loader';
|
import Loader from '../../components/common/Loader/Loader';
|
||||||
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
||||||
import { getVersionPath } from '../../constants/constants';
|
import { getVersionPath, ROUTES } from '../../constants/constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
import {
|
import {
|
||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
||||||
import { CreateThread } from '../../generated/api/feed/createThread';
|
import { CreateThread } from '../../generated/api/feed/createThread';
|
||||||
@ -154,6 +155,10 @@ const APIEndpointPage = () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
if ((error as AxiosError).response?.status === 404) {
|
if ((error as AxiosError).response?.status === 404) {
|
||||||
setIsError(true);
|
setIsError(true);
|
||||||
|
} else if (
|
||||||
|
(error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN
|
||||||
|
) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
} else {
|
} else {
|
||||||
showErrorToast(
|
showErrorToast(
|
||||||
error as AxiosError,
|
error as AxiosError,
|
||||||
|
@ -41,6 +41,7 @@ import { SourceType } from '../../components/SearchedData/SearchedData.interface
|
|||||||
import {
|
import {
|
||||||
getEntityDetailsPath,
|
getEntityDetailsPath,
|
||||||
getVersionPath,
|
getVersionPath,
|
||||||
|
ROUTES,
|
||||||
} from '../../constants/constants';
|
} from '../../constants/constants';
|
||||||
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
||||||
import LineageProvider from '../../context/LineageProvider/LineageProvider';
|
import LineageProvider from '../../context/LineageProvider/LineageProvider';
|
||||||
@ -49,6 +50,7 @@ import {
|
|||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import {
|
import {
|
||||||
EntityTabs,
|
EntityTabs,
|
||||||
@ -150,6 +152,9 @@ const ContainerPage = () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
showErrorToast(error as AxiosError);
|
showErrorToast(error as AxiosError);
|
||||||
setHasError(true);
|
setHasError(true);
|
||||||
|
if ((error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,10 @@ import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/Error
|
|||||||
import Loader from '../../components/common/Loader/Loader';
|
import Loader from '../../components/common/Loader/Loader';
|
||||||
import DashboardDetails from '../../components/Dashboard/DashboardDetails/DashboardDetails.component';
|
import DashboardDetails from '../../components/Dashboard/DashboardDetails/DashboardDetails.component';
|
||||||
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
||||||
import { getVersionPath } from '../../constants/constants';
|
import { getVersionPath, ROUTES } from '../../constants/constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
import { ResourceEntity } from '../../context/PermissionProvider/PermissionProvider.interface';
|
import { ResourceEntity } from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
||||||
import { CreateThread } from '../../generated/api/feed/createThread';
|
import { CreateThread } from '../../generated/api/feed/createThread';
|
||||||
@ -151,6 +152,10 @@ const DashboardDetailsPage = () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
if ((error as AxiosError).response?.status === 404) {
|
if ((error as AxiosError).response?.status === 404) {
|
||||||
setIsError(true);
|
setIsError(true);
|
||||||
|
} else if (
|
||||||
|
(error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN
|
||||||
|
) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
} else {
|
} else {
|
||||||
showErrorToast(
|
showErrorToast(
|
||||||
error as AxiosError,
|
error as AxiosError,
|
||||||
|
@ -24,15 +24,18 @@ import {
|
|||||||
} from 'react';
|
} from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
|
import { useHistory } from 'react-router-dom';
|
||||||
import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
||||||
import Loader from '../../components/common/Loader/Loader';
|
import Loader from '../../components/common/Loader/Loader';
|
||||||
import DataModelDetails from '../../components/Dashboard/DataModel/DataModels/DataModelDetails.component';
|
import DataModelDetails from '../../components/Dashboard/DataModel/DataModels/DataModelDetails.component';
|
||||||
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
||||||
|
import { ROUTES } from '../../constants/constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
import {
|
import {
|
||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import { TabSpecificField } from '../../enums/entity.enum';
|
import { TabSpecificField } from '../../enums/entity.enum';
|
||||||
import { CreateThread } from '../../generated/api/feed/createThread';
|
import { CreateThread } from '../../generated/api/feed/createThread';
|
||||||
@ -61,6 +64,7 @@ import { showErrorToast } from '../../utils/ToastUtils';
|
|||||||
|
|
||||||
const DataModelsPage = () => {
|
const DataModelsPage = () => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const history = useHistory();
|
||||||
const { currentUser } = useApplicationStore();
|
const { currentUser } = useApplicationStore();
|
||||||
const { getEntityPermissionByFqn } = usePermissionProvider();
|
const { getEntityPermissionByFqn } = usePermissionProvider();
|
||||||
|
|
||||||
@ -133,6 +137,9 @@ const DataModelsPage = () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
showErrorToast(error as AxiosError);
|
showErrorToast(error as AxiosError);
|
||||||
setHasError(true);
|
setHasError(true);
|
||||||
|
if ((error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ import {
|
|||||||
getEntityDetailsPath,
|
getEntityDetailsPath,
|
||||||
getExplorePath,
|
getExplorePath,
|
||||||
getVersionPath,
|
getVersionPath,
|
||||||
|
ROUTES,
|
||||||
} from '../../constants/constants';
|
} from '../../constants/constants';
|
||||||
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
@ -55,6 +56,7 @@ import {
|
|||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import {
|
import {
|
||||||
EntityTabs,
|
EntityTabs,
|
||||||
@ -214,8 +216,13 @@ const DatabaseDetails: FunctionComponent = () => {
|
|||||||
setServiceType(serviceType);
|
setServiceType(serviceType);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch((error) => {
|
||||||
// Error
|
// Error
|
||||||
|
if (
|
||||||
|
(error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN
|
||||||
|
) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
|
@ -47,6 +47,7 @@ import {
|
|||||||
getEntityDetailsPath,
|
getEntityDetailsPath,
|
||||||
getVersionPath,
|
getVersionPath,
|
||||||
INITIAL_PAGING_VALUE,
|
INITIAL_PAGING_VALUE,
|
||||||
|
ROUTES,
|
||||||
} from '../../constants/constants';
|
} from '../../constants/constants';
|
||||||
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
@ -54,6 +55,7 @@ import {
|
|||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import {
|
import {
|
||||||
EntityTabs,
|
EntityTabs,
|
||||||
@ -229,6 +231,9 @@ const DatabaseSchemaPage: FunctionComponent = () => {
|
|||||||
setShowDeletedTables(response.deleted ?? false);
|
setShowDeletedTables(response.deleted ?? false);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Error
|
// Error
|
||||||
|
if ((err as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setIsSchemaDetailsLoading(false);
|
setIsSchemaDetailsLoading(false);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Collate.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import React from 'react';
|
||||||
|
import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
||||||
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
|
|
||||||
|
const ForbiddenPage = () => {
|
||||||
|
return <ErrorPlaceHolder type={ERROR_PLACEHOLDER_TYPE.PERMISSION} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ForbiddenPage;
|
@ -22,9 +22,10 @@ import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/Error
|
|||||||
import Loader from '../../components/common/Loader/Loader';
|
import Loader from '../../components/common/Loader/Loader';
|
||||||
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
||||||
import MlModelDetailComponent from '../../components/MlModel/MlModelDetail/MlModelDetail.component';
|
import MlModelDetailComponent from '../../components/MlModel/MlModelDetail/MlModelDetail.component';
|
||||||
import { getVersionPath } from '../../constants/constants';
|
import { getVersionPath, ROUTES } from '../../constants/constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
import { ResourceEntity } from '../../context/PermissionProvider/PermissionProvider.interface';
|
import { ResourceEntity } from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
||||||
import { CreateThread } from '../../generated/api/feed/createThread';
|
import { CreateThread } from '../../generated/api/feed/createThread';
|
||||||
@ -107,6 +108,9 @@ const MlModelPage = () => {
|
|||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showErrorToast(error as AxiosError);
|
showErrorToast(error as AxiosError);
|
||||||
|
if ((error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setIsDetailLoading(false);
|
setIsDetailLoading(false);
|
||||||
}
|
}
|
||||||
|
@ -21,9 +21,10 @@ import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/Error
|
|||||||
import Loader from '../../components/common/Loader/Loader';
|
import Loader from '../../components/common/Loader/Loader';
|
||||||
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
||||||
import PipelineDetails from '../../components/Pipeline/PipelineDetails/PipelineDetails.component';
|
import PipelineDetails from '../../components/Pipeline/PipelineDetails/PipelineDetails.component';
|
||||||
import { getVersionPath } from '../../constants/constants';
|
import { getVersionPath, ROUTES } from '../../constants/constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
import { ResourceEntity } from '../../context/PermissionProvider/PermissionProvider.interface';
|
import { ResourceEntity } from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import { EntityType } from '../../enums/entity.enum';
|
import { EntityType } from '../../enums/entity.enum';
|
||||||
import { Pipeline } from '../../generated/entity/data/pipeline';
|
import { Pipeline } from '../../generated/entity/data/pipeline';
|
||||||
@ -135,6 +136,10 @@ const PipelineDetailsPage = () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
if ((error as AxiosError).response?.status === 404) {
|
if ((error as AxiosError).response?.status === 404) {
|
||||||
setIsError(true);
|
setIsError(true);
|
||||||
|
} else if (
|
||||||
|
(error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN
|
||||||
|
) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
} else {
|
} else {
|
||||||
showErrorToast(
|
showErrorToast(
|
||||||
error as AxiosError,
|
error as AxiosError,
|
||||||
|
@ -40,6 +40,7 @@ import { SourceType } from '../../components/SearchedData/SearchedData.interface
|
|||||||
import {
|
import {
|
||||||
getEntityDetailsPath,
|
getEntityDetailsPath,
|
||||||
getVersionPath,
|
getVersionPath,
|
||||||
|
ROUTES,
|
||||||
} from '../../constants/constants';
|
} from '../../constants/constants';
|
||||||
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
||||||
import LineageProvider from '../../context/LineageProvider/LineageProvider';
|
import LineageProvider from '../../context/LineageProvider/LineageProvider';
|
||||||
@ -48,6 +49,7 @@ import {
|
|||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { CSMode } from '../../enums/codemirror.enum';
|
import { CSMode } from '../../enums/codemirror.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import { EntityTabs, EntityType } from '../../enums/entity.enum';
|
import { EntityTabs, EntityType } from '../../enums/entity.enum';
|
||||||
@ -198,7 +200,9 @@ const StoredProcedurePage = () => {
|
|||||||
id: response.id ?? '',
|
id: response.id ?? '',
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Error here
|
if ((error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ import { FQN_SEPARATOR_CHAR } from '../../constants/char.constants';
|
|||||||
import {
|
import {
|
||||||
getEntityDetailsPath,
|
getEntityDetailsPath,
|
||||||
getVersionPath,
|
getVersionPath,
|
||||||
|
ROUTES,
|
||||||
} from '../../constants/constants';
|
} from '../../constants/constants';
|
||||||
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
import { FEED_COUNT_INITIAL_DATA } from '../../constants/entity.constants';
|
||||||
import { mockDatasetData } from '../../constants/mockTourData.constants';
|
import { mockDatasetData } from '../../constants/mockTourData.constants';
|
||||||
@ -58,6 +59,7 @@ import {
|
|||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
import { useTourProvider } from '../../context/TourProvider/TourProvider';
|
import { useTourProvider } from '../../context/TourProvider/TourProvider';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import {
|
import {
|
||||||
EntityTabs,
|
EntityTabs,
|
||||||
@ -196,7 +198,9 @@ const TableDetailsPageV1: React.FC = () => {
|
|||||||
id: details.id,
|
id: details.id,
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Error here
|
if ((error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
@ -27,12 +27,13 @@ import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/Error
|
|||||||
import Loader from '../../components/common/Loader/Loader';
|
import Loader from '../../components/common/Loader/Loader';
|
||||||
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
import { QueryVote } from '../../components/Database/TableQueries/TableQueries.interface';
|
||||||
import TopicDetails from '../../components/Topic/TopicDetails/TopicDetails.component';
|
import TopicDetails from '../../components/Topic/TopicDetails/TopicDetails.component';
|
||||||
import { getVersionPath } from '../../constants/constants';
|
import { getVersionPath, ROUTES } from '../../constants/constants';
|
||||||
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider';
|
||||||
import {
|
import {
|
||||||
OperationPermission,
|
OperationPermission,
|
||||||
ResourceEntity,
|
ResourceEntity,
|
||||||
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
} from '../../context/PermissionProvider/PermissionProvider.interface';
|
||||||
|
import { ClientErrors } from '../../enums/Axios.enum';
|
||||||
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum';
|
||||||
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
import { EntityType, TabSpecificField } from '../../enums/entity.enum';
|
||||||
import { CreateThread } from '../../generated/api/feed/createThread';
|
import { CreateThread } from '../../generated/api/feed/createThread';
|
||||||
@ -152,6 +153,10 @@ const TopicDetailsPage: FunctionComponent = () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
if ((error as AxiosError).response?.status === 404) {
|
if ((error as AxiosError).response?.status === 404) {
|
||||||
setIsError(true);
|
setIsError(true);
|
||||||
|
} else if (
|
||||||
|
(error as AxiosError)?.response?.status === ClientErrors.FORBIDDEN
|
||||||
|
) {
|
||||||
|
history.replace(ROUTES.FORBIDDEN);
|
||||||
} else {
|
} else {
|
||||||
showErrorToast(
|
showErrorToast(
|
||||||
error as AxiosError,
|
error as AxiosError,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user