restrict access to channel converstion to public for non team admin+ (#29819)
Этот коммит содержится в:
@@ -1124,6 +1124,23 @@ func (a *App) getAddUploadFilePermissionMigration() (permissionsMap, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only sysadmins, team admins, and users with channels and groups managements have access to "convert channel to public"
|
||||||
|
func (a *App) getRestrictAcessToChannelConversionToPublic() (permissionsMap, error) {
|
||||||
|
return []permissionTransformation{
|
||||||
|
{
|
||||||
|
On: permissionAnd(
|
||||||
|
isNotRole(model.SystemAdminRoleId),
|
||||||
|
isNotRole(model.TeamAdminRoleId),
|
||||||
|
permissionOr(
|
||||||
|
permissionNotExists(model.PermissionSysconsoleWriteUserManagementChannels.Id),
|
||||||
|
permissionNotExists(model.PermissionSysconsoleWriteUserManagementGroups.Id),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Remove: []string{PermissionConvertPrivateChannelToPublic},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// DoPermissionsMigrations execute all the permissions migrations need by the current version.
|
// DoPermissionsMigrations execute all the permissions migrations need by the current version.
|
||||||
func (a *App) DoPermissionsMigrations() error {
|
func (a *App) DoPermissionsMigrations() error {
|
||||||
return a.Srv().doPermissionsMigrations()
|
return a.Srv().doPermissionsMigrations()
|
||||||
@@ -1173,6 +1190,7 @@ func (s *Server) doPermissionsMigrations() error {
|
|||||||
{Key: model.MigrationKeyAddChannelBookmarksPermissions, Migration: a.getAddChannelBookmarksPermissionsMigration},
|
{Key: model.MigrationKeyAddChannelBookmarksPermissions, Migration: a.getAddChannelBookmarksPermissionsMigration},
|
||||||
{Key: model.MigrationKeyAddManageJobAncillaryPermissions, Migration: a.getAddManageJobAncillaryPermissionsMigration},
|
{Key: model.MigrationKeyAddManageJobAncillaryPermissions, Migration: a.getAddManageJobAncillaryPermissionsMigration},
|
||||||
{Key: model.MigrationKeyAddUploadFilePermission, Migration: a.getAddUploadFilePermissionMigration},
|
{Key: model.MigrationKeyAddUploadFilePermission, Migration: a.getAddUploadFilePermissionMigration},
|
||||||
|
{Key: model.RestrictAccessToChannelConversionToPublic, Migration: a.getRestrictAcessToChannelConversionToPublic},
|
||||||
}
|
}
|
||||||
|
|
||||||
roles, err := s.Store().Role().GetAll()
|
roles, err := s.Store().Role().GetAll()
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ func GetMockStoreForSetupFunctions() *mocks.Store {
|
|||||||
systemStore.On("GetByName", model.MigrationKeyDeleteDmsPreferences).Return(&model.System{Name: model.MigrationKeyDeleteDmsPreferences, Value: "true"}, nil)
|
systemStore.On("GetByName", model.MigrationKeyDeleteDmsPreferences).Return(&model.System{Name: model.MigrationKeyDeleteDmsPreferences, Value: "true"}, nil)
|
||||||
systemStore.On("GetByName", model.MigrationKeyAddManageJobAncillaryPermissions).Return(&model.System{Name: model.MigrationKeyAddManageJobAncillaryPermissions, Value: "true"}, nil)
|
systemStore.On("GetByName", model.MigrationKeyAddManageJobAncillaryPermissions).Return(&model.System{Name: model.MigrationKeyAddManageJobAncillaryPermissions, Value: "true"}, nil)
|
||||||
systemStore.On("GetByName", model.MigrationKeyAddUploadFilePermission).Return(&model.System{Name: model.MigrationKeyAddUploadFilePermission, Value: "true"}, nil)
|
systemStore.On("GetByName", model.MigrationKeyAddUploadFilePermission).Return(&model.System{Name: model.MigrationKeyAddUploadFilePermission, Value: "true"}, nil)
|
||||||
|
systemStore.On("GetByName", model.RestrictAccessToChannelConversionToPublic).Return(&model.System{Name: model.RestrictAccessToChannelConversionToPublic, Value: "true"}, nil)
|
||||||
systemStore.On("GetByName", "CustomGroupAdminRoleCreationMigrationComplete").Return(&model.System{Name: model.MigrationKeyAddPlayboosksManageRolesPermissions, Value: "true"}, nil)
|
systemStore.On("GetByName", "CustomGroupAdminRoleCreationMigrationComplete").Return(&model.System{Name: model.MigrationKeyAddPlayboosksManageRolesPermissions, Value: "true"}, nil)
|
||||||
systemStore.On("GetByName", "products_boards").Return(&model.System{Name: "products_boards", Value: "true"}, nil)
|
systemStore.On("GetByName", "products_boards").Return(&model.System{Name: "products_boards", Value: "true"}, nil)
|
||||||
systemStore.On("GetByName", "elasticsearch_fix_channel_index_migration").Return(&model.System{Name: "elasticsearch_fix_channel_index_migration", Value: "true"}, nil)
|
systemStore.On("GetByName", "elasticsearch_fix_channel_index_migration").Return(&model.System{Name: "elasticsearch_fix_channel_index_migration", Value: "true"}, nil)
|
||||||
|
|||||||
@@ -50,4 +50,5 @@ const (
|
|||||||
MigrationKeyDeleteDmsPreferences = "delete_dms_preferences_migration"
|
MigrationKeyDeleteDmsPreferences = "delete_dms_preferences_migration"
|
||||||
MigrationKeyAddManageJobAncillaryPermissions = "add_manage_jobs_ancillary_permissions"
|
MigrationKeyAddManageJobAncillaryPermissions = "add_manage_jobs_ancillary_permissions"
|
||||||
MigrationKeyAddUploadFilePermission = "add_upload_file_permission"
|
MigrationKeyAddUploadFilePermission = "add_upload_file_permission"
|
||||||
|
RestrictAccessToChannelConversionToPublic = "restrict_access_to_channel_conversion_to_public_permissions"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -73,14 +73,7 @@ exports[`components/admin_console/permission_schemes_settings/permission_tree sh
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"delete_public_channel",
|
"delete_public_channel",
|
||||||
Object {
|
"convert_public_channel_to_private",
|
||||||
"combined": true,
|
|
||||||
"id": "convert_public_channel_to_private",
|
|
||||||
"permissions": Array [
|
|
||||||
"convert_public_channel_to_private",
|
|
||||||
"convert_private_channel_to_public",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
Object {
|
Object {
|
||||||
@@ -274,14 +267,7 @@ exports[`components/admin_console/permission_schemes_settings/permission_tree sh
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"delete_public_channel",
|
"delete_public_channel",
|
||||||
Object {
|
"convert_public_channel_to_private",
|
||||||
"combined": true,
|
|
||||||
"id": "convert_public_channel_to_private",
|
|
||||||
"permissions": Array [
|
|
||||||
"convert_public_channel_to_private",
|
|
||||||
"convert_private_channel_to_public",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
Object {
|
Object {
|
||||||
@@ -483,14 +469,7 @@ exports[`components/admin_console/permission_schemes_settings/permission_tree sh
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"delete_public_channel",
|
"delete_public_channel",
|
||||||
Object {
|
"convert_public_channel_to_private",
|
||||||
"combined": true,
|
|
||||||
"id": "convert_public_channel_to_private",
|
|
||||||
"permissions": Array [
|
|
||||||
"convert_public_channel_to_private",
|
|
||||||
"convert_private_channel_to_public",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
Object {
|
Object {
|
||||||
@@ -681,14 +660,7 @@ exports[`components/admin_console/permission_schemes_settings/permission_tree sh
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"delete_public_channel",
|
"delete_public_channel",
|
||||||
Object {
|
"convert_public_channel_to_private",
|
||||||
"combined": true,
|
|
||||||
"id": "convert_public_channel_to_private",
|
|
||||||
"permissions": Array [
|
|
||||||
"convert_public_channel_to_private",
|
|
||||||
"convert_private_channel_to_public",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
Object {
|
Object {
|
||||||
@@ -890,14 +862,7 @@ exports[`components/admin_console/permission_schemes_settings/permission_tree sh
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"delete_public_channel",
|
"delete_public_channel",
|
||||||
Object {
|
"convert_public_channel_to_private",
|
||||||
"combined": true,
|
|
||||||
"id": "convert_public_channel_to_private",
|
|
||||||
"permissions": Array [
|
|
||||||
"convert_public_channel_to_private",
|
|
||||||
"convert_private_channel_to_public",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
Object {
|
Object {
|
||||||
@@ -1099,14 +1064,7 @@ exports[`components/admin_console/permission_schemes_settings/permission_tree sh
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"delete_public_channel",
|
"delete_public_channel",
|
||||||
Object {
|
"convert_public_channel_to_private",
|
||||||
"combined": true,
|
|
||||||
"id": "convert_public_channel_to_private",
|
|
||||||
"permissions": Array [
|
|
||||||
"convert_public_channel_to_private",
|
|
||||||
"convert_private_channel_to_public",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
Object {
|
Object {
|
||||||
@@ -1315,14 +1273,7 @@ exports[`components/admin_console/permission_schemes_settings/permission_tree sh
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"delete_public_channel",
|
"delete_public_channel",
|
||||||
Object {
|
"convert_public_channel_to_private",
|
||||||
"combined": true,
|
|
||||||
"id": "convert_public_channel_to_private",
|
|
||||||
"permissions": Array [
|
|
||||||
"convert_public_channel_to_private",
|
|
||||||
"convert_private_channel_to_public",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
Object {
|
Object {
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
import {shallow} from 'enzyme';
|
import {shallow} from 'enzyme';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
|
import GeneralConstants from 'mattermost-redux/constants/general';
|
||||||
|
|
||||||
import PermissionGroup from 'components/admin_console/permission_schemes_settings/permission_group';
|
import PermissionGroup from 'components/admin_console/permission_schemes_settings/permission_group';
|
||||||
import PermissionsTree from 'components/admin_console/permission_schemes_settings/permissions_tree/permissions_tree';
|
import PermissionsTree from 'components/admin_console/permission_schemes_settings/permissions_tree/permissions_tree';
|
||||||
|
|
||||||
@@ -107,6 +109,27 @@ describe('components/admin_console/permission_schemes_settings/permission_tree',
|
|||||||
expect(onToggle).toBeCalledWith('test', ['test_permission', 'test_permission2']);
|
expect(onToggle).toBeCalledWith('test', ['test_permission', 'test_permission2']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test.each([
|
||||||
|
{roleName: GeneralConstants.SYSTEM_ADMIN_ROLE, shouldSeeConvertPrivateToPublic: true},
|
||||||
|
{roleName: GeneralConstants.TEAM_ADMIN_ROLE, shouldSeeConvertPrivateToPublic: true},
|
||||||
|
{roleName: GeneralConstants.CHANNEL_ADMIN_ROLE, shouldSeeConvertPrivateToPublic: false},
|
||||||
|
{roleName: GeneralConstants.SYSTEM_USER_ROLE, shouldSeeConvertPrivateToPublic: false},
|
||||||
|
{roleName: GeneralConstants.SYSTEM_GUEST_ROLE, shouldSeeConvertPrivateToPublic: false},
|
||||||
|
])('should show convert private channel to public for $roleName: $shouldSeeConvertPrivateToPublic', ({roleName, shouldSeeConvertPrivateToPublic}) => {
|
||||||
|
const wrapper = shallow(
|
||||||
|
<PermissionsTree
|
||||||
|
{...defaultProps}
|
||||||
|
role={{name: roleName}}
|
||||||
|
/>,
|
||||||
|
);
|
||||||
|
const groups = wrapper.find(PermissionGroup).first().prop('permissions') as Array<Group | Permission>;
|
||||||
|
if (shouldSeeConvertPrivateToPublic) {
|
||||||
|
expect(groups[2].permissions).toContain('convert_private_channel_to_public');
|
||||||
|
} else {
|
||||||
|
expect(groups[2].permissions).not.toContain('convert_private_channel_to_public');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
test('should hide disabbled integration options', () => {
|
test('should hide disabbled integration options', () => {
|
||||||
const wrapper = shallow(
|
const wrapper = shallow(
|
||||||
<PermissionsTree
|
<PermissionsTree
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {FormattedMessage} from 'react-intl';
|
|||||||
import type {ClientConfig, ClientLicense} from '@mattermost/types/config';
|
import type {ClientConfig, ClientLicense} from '@mattermost/types/config';
|
||||||
import type {Role} from '@mattermost/types/roles';
|
import type {Role} from '@mattermost/types/roles';
|
||||||
|
|
||||||
|
import GeneralConstants from 'mattermost-redux/constants/general';
|
||||||
import Permissions from 'mattermost-redux/constants/permissions';
|
import Permissions from 'mattermost-redux/constants/permissions';
|
||||||
|
|
||||||
import {isEnterpriseLicense, isNonEnterpriseLicense} from 'utils/license_utils';
|
import {isEnterpriseLicense, isNonEnterpriseLicense} from 'utils/license_utils';
|
||||||
@@ -91,14 +92,7 @@ export default class PermissionsTree extends React.PureComponent<Props, State> {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
Permissions.DELETE_PUBLIC_CHANNEL,
|
Permissions.DELETE_PUBLIC_CHANNEL,
|
||||||
{
|
Permissions.CONVERT_PUBLIC_CHANNEL_TO_PRIVATE,
|
||||||
id: 'convert_public_channel_to_private',
|
|
||||||
combined: true,
|
|
||||||
permissions: [
|
|
||||||
Permissions.CONVERT_PUBLIC_CHANNEL_TO_PRIVATE,
|
|
||||||
Permissions.CONVERT_PRIVATE_CHANNEL_TO_PUBLIC,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -205,7 +199,7 @@ export default class PermissionsTree extends React.PureComponent<Props, State> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateGroups = () => {
|
updateGroups = () => {
|
||||||
const {config, scope, license} = this.props;
|
const {config, scope, license, role} = this.props;
|
||||||
|
|
||||||
const teamsGroup = this.groups[0];
|
const teamsGroup = this.groups[0];
|
||||||
const publicChannelsGroup = this.groups[1];
|
const publicChannelsGroup = this.groups[1];
|
||||||
@@ -265,6 +259,10 @@ export default class PermissionsTree extends React.PureComponent<Props, State> {
|
|||||||
customGroupsGroup?.permissions.pop();
|
customGroupsGroup?.permissions.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ([GeneralConstants.TEAM_ADMIN_ROLE, GeneralConstants.SYSTEM_ADMIN_ROLE].includes(role.name || '')) {
|
||||||
|
privateChannelsGroup.permissions.push(Permissions.CONVERT_PRIVATE_CHANNEL_TO_PUBLIC);
|
||||||
|
}
|
||||||
|
|
||||||
if (license?.IsLicensed === 'true') {
|
if (license?.IsLicensed === 'true') {
|
||||||
publicChannelsGroup.permissions.push({
|
publicChannelsGroup.permissions.push({
|
||||||
id: 'manage_public_channel_bookmarks',
|
id: 'manage_public_channel_bookmarks',
|
||||||
|
|||||||
@@ -208,13 +208,23 @@ export const groupRolesStrings: Record<string, Record<string, MessageDescriptor>
|
|||||||
convert_public_channel_to_private: defineMessages({
|
convert_public_channel_to_private: defineMessages({
|
||||||
name: {
|
name: {
|
||||||
id: 'admin.permissions.group.convert_public_channel_to_private.name',
|
id: 'admin.permissions.group.convert_public_channel_to_private.name',
|
||||||
defaultMessage: 'Convert Channels',
|
defaultMessage: 'Convert to private',
|
||||||
},
|
},
|
||||||
description: {
|
description: {
|
||||||
id: 'admin.permissions.group.convert_public_channel_to_private.description',
|
id: 'admin.permissions.group.convert_public_channel_to_private.description',
|
||||||
defaultMessage: 'Convert public channels to private',
|
defaultMessage: 'Convert public channels to private',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
convert_private_channel_to_public: defineMessages({
|
||||||
|
name: {
|
||||||
|
id: 'admin.permissions.group.convert_private_channel_to_public.name',
|
||||||
|
defaultMessage: 'Convert to public',
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
id: 'admin.permissions.group.convert_private_channel_to_public.description',
|
||||||
|
defaultMessage: 'Convert private channels to public',
|
||||||
|
},
|
||||||
|
}),
|
||||||
manage_shared_channels: defineMessages({
|
manage_shared_channels: defineMessages({
|
||||||
name: {
|
name: {
|
||||||
id: 'admin.permissions.group.manage_shared_channels.name',
|
id: 'admin.permissions.group.manage_shared_channels.name',
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export const permissionRolesStrings: Record<string, Record<string, MessageDescri
|
|||||||
convert_public_channel_to_private: defineMessages({
|
convert_public_channel_to_private: defineMessages({
|
||||||
name: {
|
name: {
|
||||||
id: 'admin.permissions.permission.convert_public_channel_to_private.name',
|
id: 'admin.permissions.permission.convert_public_channel_to_private.name',
|
||||||
defaultMessage: 'Convert Channels',
|
defaultMessage: 'Convert to private',
|
||||||
},
|
},
|
||||||
description: {
|
description: {
|
||||||
id: 'admin.permissions.permission.convert_public_channel_to_private.description',
|
id: 'admin.permissions.permission.convert_public_channel_to_private.description',
|
||||||
@@ -28,7 +28,7 @@ export const permissionRolesStrings: Record<string, Record<string, MessageDescri
|
|||||||
convert_private_channel_to_public: defineMessages({
|
convert_private_channel_to_public: defineMessages({
|
||||||
name: {
|
name: {
|
||||||
id: 'admin.permissions.permission.convert_private_channel_to_public.name',
|
id: 'admin.permissions.permission.convert_private_channel_to_public.name',
|
||||||
defaultMessage: 'Convert Channels',
|
defaultMessage: 'Convert to public',
|
||||||
},
|
},
|
||||||
description: {
|
description: {
|
||||||
id: 'admin.permissions.permission.convert_private_channel_to_public.description',
|
id: 'admin.permissions.permission.convert_private_channel_to_public.description',
|
||||||
|
|||||||
@@ -1589,8 +1589,10 @@
|
|||||||
"admin.password.preview": "Error message preview",
|
"admin.password.preview": "Error message preview",
|
||||||
"admin.password.symbol": "At least one symbol (e.g. \"~!@#$%^&*()\")",
|
"admin.password.symbol": "At least one symbol (e.g. \"~!@#$%^&*()\")",
|
||||||
"admin.password.uppercase": "At least one uppercase letter",
|
"admin.password.uppercase": "At least one uppercase letter",
|
||||||
|
"admin.permissions.group.convert_private_channel_to_public.description": "Convert private channels to public",
|
||||||
|
"admin.permissions.group.convert_private_channel_to_public.name": "Convert to public",
|
||||||
"admin.permissions.group.convert_public_channel_to_private.description": "Convert public channels to private",
|
"admin.permissions.group.convert_public_channel_to_private.description": "Convert public channels to private",
|
||||||
"admin.permissions.group.convert_public_channel_to_private.name": "Convert Channels",
|
"admin.permissions.group.convert_public_channel_to_private.name": "Convert to private",
|
||||||
"admin.permissions.group.custom_groups.description": "Create, edit, delete and manage the members of custom groups.",
|
"admin.permissions.group.custom_groups.description": "Create, edit, delete and manage the members of custom groups.",
|
||||||
"admin.permissions.group.custom_groups.name": "Custom Groups",
|
"admin.permissions.group.custom_groups.name": "Custom Groups",
|
||||||
"admin.permissions.group.delete_posts.description": "Delete own and others' posts.",
|
"admin.permissions.group.delete_posts.description": "Delete own and others' posts.",
|
||||||
@@ -1650,9 +1652,9 @@
|
|||||||
"admin.permissions.permission.assign_system_admin_role.description": "Assign system admin role",
|
"admin.permissions.permission.assign_system_admin_role.description": "Assign system admin role",
|
||||||
"admin.permissions.permission.assign_system_admin_role.name": "Assign system admin role",
|
"admin.permissions.permission.assign_system_admin_role.name": "Assign system admin role",
|
||||||
"admin.permissions.permission.convert_private_channel_to_public.description": "Convert private channels to public",
|
"admin.permissions.permission.convert_private_channel_to_public.description": "Convert private channels to public",
|
||||||
"admin.permissions.permission.convert_private_channel_to_public.name": "Convert Channels",
|
"admin.permissions.permission.convert_private_channel_to_public.name": "Convert to public",
|
||||||
"admin.permissions.permission.convert_public_channel_to_private.description": "Convert public channels to private",
|
"admin.permissions.permission.convert_public_channel_to_private.description": "Convert public channels to private",
|
||||||
"admin.permissions.permission.convert_public_channel_to_private.name": "Convert Channels",
|
"admin.permissions.permission.convert_public_channel_to_private.name": "Convert to private",
|
||||||
"admin.permissions.permission.create_custom_group.description": "Create custom groups.",
|
"admin.permissions.permission.create_custom_group.description": "Create custom groups.",
|
||||||
"admin.permissions.permission.create_custom_group.name": "Create",
|
"admin.permissions.permission.create_custom_group.name": "Create",
|
||||||
"admin.permissions.permission.create_direct_channel.description": "Create direct channel",
|
"admin.permissions.permission.create_direct_channel.description": "Create direct channel",
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user