Browse Source

Merge pull request #20938 from nextcloud/fix/share-talk-verification

Fix the Talk verification
Christoph Wurst 3 years ago
parent
commit
497350a7d3

File diff suppressed because it is too large
+ 0 - 0
apps/files_sharing/js/dist/files_sharing_tab.js


File diff suppressed because it is too large
+ 0 - 0
apps/files_sharing/js/dist/files_sharing_tab.js.map


+ 32 - 2
apps/files_sharing/src/components/SharingEntryLink.vue

@@ -198,9 +198,9 @@
 					<!-- password protected by Talk -->
 					<ActionCheckbox v-if="isPasswordProtectedByTalkAvailable"
 						:checked.sync="isPasswordProtectedByTalk"
-						:disabled="saving"
+						:disabled="!canTogglePasswordProtectedByTalkAvailable || saving"
 						class="share-link-password-talk-checkbox"
-						@change="queueUpdate('sendPasswordByTalk')">
+						@change="onPasswordProtectedByTalkChange">
 						{{ t('files_sharing', 'Video verification') }}
 					</ActionCheckbox>
 
@@ -481,6 +481,20 @@ export default {
 				: false
 		},
 
+		canTogglePasswordProtectedByTalkAvailable() {
+			if (!this.isPasswordProtected) {
+				// Makes no sense
+				return false
+			} else if (this.isEmailShareType && !this.hasUnsavedPassword) {
+				// For email shares we need a new password in order to enable or
+				// disable
+				return false
+			}
+
+			// Anything else should be fine
+			return true
+		},
+
 		/**
 		 * Pending data.
 		 * If the share still doesn't have an id, it is not synced
@@ -792,6 +806,22 @@ export default {
 			}
 		},
 
+		/**
+		 * Update the password along with "sendPasswordByTalk".
+		 *
+		 * If the password was modified the new password is sent; otherwise
+		 * updating a mail share would fail, as in that case it is required that
+		 * a new password is set when enabling or disabling
+		 * "sendPasswordByTalk".
+		 */
+		onPasswordProtectedByTalkChange() {
+			if (this.hasUnsavedPassword) {
+				this.share.password = this.share.newPassword.trim()
+			}
+
+			this.queueUpdate('sendPasswordByTalk', 'password')
+		},
+
 		/**
 		 * Save potential changed data on menu close
 		 */

+ 4 - 10
apps/files_sharing/src/mixins/ShareRequests.js

@@ -88,17 +88,11 @@ export default {
 		 * Update a share
 		 *
 		 * @param {number} id share id
-		 * @param {Object} data destructuring object
-		 * @param {string} data.property property to update
-		 * @param {any} data.value value to set
+		 * @param {Object} properties key-value object of the properties to update
 		 */
-		async updateShare(id, { property, value }) {
+		async updateShare(id, properties) {
 			try {
-				// ocs api requires x-www-form-urlencoded
-				const data = new URLSearchParams()
-				data.append(property, value)
-
-				const request = await axios.put(shareUrl + `/${id}`, { [property]: value }, headers)
+				const request = await axios.put(shareUrl + `/${id}`, properties, headers)
 				if (!('ocs' in request.data)) {
 					throw request
 				}
@@ -107,7 +101,7 @@ export default {
 				console.error('Error while updating share', error)
 				OC.Notification.showTemporary(t('files_sharing', 'Error updating the share'), { type: 'error' })
 				const message = error.response.data.ocs.meta.message
-				throw new Error(`${property}, ${message}`)
+				throw new Error(`${Object.keys(properties)}, ${message}`)
 			}
 		},
 	},

+ 20 - 9
apps/files_sharing/src/mixins/SharesMixin.js

@@ -224,31 +224,34 @@ export default {
 		/**
 		 * Send an update of the share to the queue
 		 *
-		 * @param {string} property the property to sync
+		 * @param {string} propertyNames the properties to sync
 		 */
-		queueUpdate(property) {
+		queueUpdate(...propertyNames) {
+			if (propertyNames.length === 0) {
+				// Nothing to update
+				return
+			}
+
 			if (this.share.id) {
+				const properties = {}
 				// force value to string because that is what our
 				// share api controller accepts
-				const value = this.share[property].toString()
+				propertyNames.map(p => (properties[p] = this.share[p].toString()))
 
 				this.updateQueue.add(async() => {
 					this.saving = true
 					this.errors = {}
 					try {
-						await this.updateShare(this.share.id, {
-							property,
-							value,
-						})
+						await this.updateShare(this.share.id, properties)
 
 						// clear any previous errors
-						this.$delete(this.errors, property)
+						this.$delete(this.errors, propertyNames[0])
 
 						// reset password state after sync
 						this.$delete(this.share, 'newPassword')
 					} catch ({ message }) {
 						if (message && message !== '') {
-							this.onSyncError(property, message)
+							this.onSyncError(propertyNames[0], message)
 						}
 					} finally {
 						this.saving = false
@@ -288,6 +291,14 @@ export default {
 				}
 				break
 			}
+			case 'sendPasswordByTalk': {
+				// show error
+				this.$set(this.errors, property, message)
+
+				// Restore previous state
+				this.share.sendPasswordByTalk = !this.share.sendPasswordByTalk
+				break
+			}
 			}
 		},
 

Some files were not shown because too many files changed in this diff