From b8ce726b0d7db3337de6babe0987afdff0afc5d5 Mon Sep 17 00:00:00 2001 From: Miguel Alatzar Date: Fri, 2 Oct 2020 10:03:31 -0700 Subject: [PATCH] [MM-29216] Don't allow sharing of files if file uploads are disabled (#4857) * Don't allow sharing of files if file uploads are disabled * Remove snapshot * Fix iOS message --- assets/base/i18n/en.json | 1 + ios/MattermostShare/ShareViewController.swift | 4 ++++ .../UploadAttachments/StoreManager.h | 1 + .../UploadAttachments/StoreManager.m | 19 +++++++++++++++++++ .../android/extension_post/extension_post.js | 12 +++++++++++- .../extension_post/extension_post.test.js | 8 ++++++++ .../android/extension_post/index.js | 3 ++- 7 files changed, 46 insertions(+), 2 deletions(-) diff --git a/assets/base/i18n/en.json b/assets/base/i18n/en.json index 4982d25db..61071c2a4 100644 --- a/assets/base/i18n/en.json +++ b/assets/base/i18n/en.json @@ -276,6 +276,7 @@ "mobile.file_upload.browse": "Browse Files", "mobile.file_upload.camera_photo": "Take Photo", "mobile.file_upload.camera_video": "Take Video", + "mobile.file_upload.disabled": "File uploads from mobile are disabled. Please contact your System Admin for more details.", "mobile.file_upload.library": "Photo Library", "mobile.file_upload.max_warning": "Uploads limited to 5 files maximum.", "mobile.file_upload.unsupportedMimeType": "Only BMP, JPG or PNG images may be used for profile pictures.", diff --git a/ios/MattermostShare/ShareViewController.swift b/ios/MattermostShare/ShareViewController.swift index 031ba63c3..11ff1024b 100644 --- a/ios/MattermostShare/ShareViewController.swift +++ b/ios/MattermostShare/ShareViewController.swift @@ -29,6 +29,7 @@ class ShareViewController: SLComposeServiceViewController { private var teamsVC: TeamsViewController = TeamsViewController() private var maxMessageSize: Int = 0 + private var canUploadFiles: Bool = true required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) @@ -37,6 +38,7 @@ class ShareViewController: SLComposeServiceViewController { sessionToken = store.getToken() serverURL = store.getServerUrl() maxMessageSize = Int(store.getMaxPostSize()) + canUploadFiles = store.getCanUploadFiles() } // MARK: - Lifecycle methods @@ -94,6 +96,8 @@ class ShareViewController: SLComposeServiceViewController { showErrorMessage(title: "", message: "Authentication required: Please first login using the app.", VC: self) } else if store.getCurrentTeamId() == "" || store.getMyTeams().count == 0 { showErrorMessage(title: "", message: "You must belong to a team before you can share files.", VC: self) + } else if !canUploadFiles { + showErrorMessage(title: "", message: "File uploads from mobile are disabled. Please contact your System Admin for more details.", VC: self) } else { extractDataFromContext() } diff --git a/ios/UploadAttachments/UploadAttachments/StoreManager.h b/ios/UploadAttachments/UploadAttachments/StoreManager.h index 23fb17be6..c740d3fac 100644 --- a/ios/UploadAttachments/UploadAttachments/StoreManager.h +++ b/ios/UploadAttachments/UploadAttachments/StoreManager.h @@ -22,5 +22,6 @@ -(NSArray *)getMyTeams; -(NSString *)getServerUrl; -(NSString *)getToken; +-(BOOL)getCanUploadFiles; -(void)updateEntities:(NSString *)content; @end diff --git a/ios/UploadAttachments/UploadAttachments/StoreManager.m b/ios/UploadAttachments/UploadAttachments/StoreManager.m index 02fc2bdd8..ba2a29e1e 100644 --- a/ios/UploadAttachments/UploadAttachments/StoreManager.m +++ b/ios/UploadAttachments/UploadAttachments/StoreManager.m @@ -207,6 +207,21 @@ return DEFAULT_SERVER_MAX_POST_SIZE; } +-(BOOL)getCanUploadFiles { + NSDictionary *config = [self getConfig]; + NSDictionary *license = [self getLicense]; + if (config != nil && license != nil) { + NSString *enableFileAttachments = [config objectForKey:@"EnableFileAttachments"]; + NSString *isLicensed = [license objectForKey:@"IsLicensed"]; + NSString *compliance = [license objectForKey:@"Compliance"]; + NSString *enableMobileFileUpload = [config objectForKey:@"EnableMobileFileUpload"]; + return ![enableFileAttachments isEqual:@"false"] && + ([isLicensed isEqual:@"false"] || [compliance isEqual:@"false"] || ![enableMobileFileUpload isEqual:@"false"]); + } + + return YES; +} + -(void)updateEntities:(NSString *)content { [self.bucket writeToFile:@"entities" content:content]; } @@ -272,6 +287,10 @@ return [[self.entities objectForKey:@"general"] objectForKey:@"config"]; } +-(NSDictionary *)getLicense { + return [[self.entities objectForKey:@"general"] objectForKey:@"license"]; +} + -(NSDictionary *)getMyPreferences { return [[self.entities objectForKey:@"preferences"] objectForKey:@"myPreferences"]; } diff --git a/share_extension/android/extension_post/extension_post.js b/share_extension/android/extension_post/extension_post.js index daa87ebc1..61d5472a9 100644 --- a/share_extension/android/extension_post/extension_post.js +++ b/share_extension/android/extension_post/extension_post.js @@ -66,6 +66,7 @@ export default class ExtensionPost extends PureComponent { channels: PropTypes.object.isRequired, currentUserId: PropTypes.string.isRequired, getTeamChannels: PropTypes.func.isRequired, + canUploadFiles: PropTypes.bool.isRequired, maxFileSize: PropTypes.number.isRequired, navigation: PropTypes.object.isRequired, teamId: PropTypes.string.isRequired, @@ -377,7 +378,7 @@ export default class ExtensionPost extends PureComponent { }; onClose = (data) => { - ShareExtension.close(data.nativeEvent ? null : data); + ShareExtension.close(data?.nativeEvent ? null : data); }; onPost = () => { @@ -555,6 +556,7 @@ export default class ExtensionPost extends PureComponent { delayPressIn={0} pressColorAndroid='rgba(0, 0, 0, .32)' onPress={this.onPost} + disabled={!this.props.canUploadFiles} > { channels: {}, currentUserId: 'current-user-id', getTeamChannels: jest.fn(), + canUploadFiles: true, maxFileSize: 1024, navigation: { setOptions: jest.fn(), @@ -39,6 +40,7 @@ describe('ExtensionPost', () => { ); const instance = wrapper.instance(); + instance.renderErrorMessage = jest.fn(); const postMessage = (message) => { wrapper.setState({value: message}); @@ -65,4 +67,10 @@ describe('ExtensionPost', () => { expect(Alert.alert).not.toHaveBeenCalled(); }); + + test('should render file uploads disabled message when canUploadFiles is false', () => { + wrapper.setState({loaded: true}); + wrapper.setProps({canUploadFiles: false}); + expect(instance.renderErrorMessage).toHaveBeenCalledWith('File uploads from mobile are disabled. Please contact your System Admin for more details.'); + }); }); diff --git a/share_extension/android/extension_post/index.js b/share_extension/android/extension_post/index.js index bf28c0754..2a0347497 100644 --- a/share_extension/android/extension_post/index.js +++ b/share_extension/android/extension_post/index.js @@ -6,7 +6,7 @@ import {connect} from 'react-redux'; import {getAllChannels, getCurrentChannel, getDefaultChannel} from '@mm-redux/selectors/entities/channels'; import {getCurrentTeamId} from '@mm-redux/selectors/entities/teams'; import {getCurrentUserId} from '@mm-redux/selectors/entities/users'; -import {getConfig} from '@mm-redux/selectors/entities/general'; +import {getConfig, canUploadFilesOnMobile} from '@mm-redux/selectors/entities/general'; import {getTeamChannels} from 'share_extension/android/actions'; import {getAllowedServerMaxFileSize} from 'app/utils/file'; @@ -25,6 +25,7 @@ function mapStateToProps(state) { channelId: channel?.id, channels: getAllChannels(state), currentUserId: getCurrentUserId(state), + canUploadFiles: canUploadFilesOnMobile(state), maxFileSize: getAllowedServerMaxFileSize(config), teamId: getCurrentTeamId(state), };