]> source.dussan.org Git - nextcloud-server.git/commitdiff
Improve share logic for enforced password & expiry date
authorfenn-cs <fenn25.fn@gmail.com>
Wed, 29 Nov 2023 14:06:51 +0000 (15:06 +0100)
committerAndy Scherzinger <info@andy-scherzinger.de>
Thu, 30 Nov 2023 10:58:35 +0000 (11:58 +0100)
* It's possible for the admin to enforce and expiry date after, some
 shares have been created. This commit makes possible to update the
 share with the new admin constraints.

* This commit would users to modify enforced expiry to anything within
 range and less than the enforced limit in the pre-create dialog for public
 shares.

* This commit fixes, unable to update share without updating password.

Signed-off-by: fenn-cs <fenn25.fn@gmail.com>
apps/files_sharing/src/components/SharingEntryLink.vue
apps/files_sharing/src/mixins/SharesMixin.js
apps/files_sharing/src/views/SharingDetailsTab.vue

index 77caaee0154ae0ab851ff1a13b0785f184eb922f..d14fc2b6df36cfe6706ce7fe435ed96c2fb97e9a 100644 (file)
                        </NcActionText>
                        <NcActionInput v-if="pendingExpirationDate"
                                class="share-link-expire-date"
-                               :disabled="saving || isExpiryDateEnforced"
+                               :disabled="saving"
                                :is-native-picker="true"
                                :hide-label="true"
                                :value="new Date(share.expireDate)"
                                type="date"
                                :min="dateTomorrow"
-                               :max="dateMaxEnforced"
+                               :max="maxExpirationDateEnforced"
                                @input="onExpirationChange">
                                <!-- let's not submit when picked, the user
                                        might want to still edit or copy the password -->
@@ -300,12 +300,6 @@ export default {
                        }
                        return null
                },
-               dateMaxEnforced() {
-                       if (this.config.isDefaultExpireDateEnforced) {
-                               return new Date(new Date().setDate(new Date().getDate() + this.config.defaultExpireDate))
-                       }
-                       return null
-               },
                /**
                 * Is the current share password protected ?
                 *
index 860d1716fe0a6ba04b9a378ae25c21baf7709018..41bdf302f7a8ccf49c352fe03bf71cc221e3404a 100644 (file)
@@ -132,6 +132,9 @@ export default {
                        const shareType = this.share.shareType ?? this.share.type
                        return [this.SHARE_TYPES.SHARE_TYPE_LINK, this.SHARE_TYPES.SHARE_TYPE_EMAIL].includes(shareType)
                },
+               isRemoteShare() {
+                       return this.share.type === this.SHARE_TYPES.SHARE_TYPE_REMOTE_GROUP || this.share.type === this.SHARE_TYPES.SHARE_TYPE_REMOTE
+               },
                isShareOwner() {
                        return this.share && this.share.owner === getCurrentUser().uid
                },
@@ -152,6 +155,19 @@ export default {
                        ]
                        return !bundledPermissions.includes(this.share.permissions)
                },
+               maxExpirationDateEnforced() {
+                       if (this.isExpiryDateEnforced) {
+                               if (this.isPublicShare) {
+                                       return this.config.defaultExpirationDate
+                               }
+                               if (this.isRemoteShare) {
+                                       return this.config.defaultRemoteExpirationDateString
+                               }
+                               // If it get's here then it must be an internal share
+                               return this.config.defaultInternalExpirationDate
+                       }
+                       return null
+               },
        },
 
        methods: {
index b59d855db927ab2734e4ceeb3560f8c941f240cf..a4a312fcc0e3db8e944eb582b7b5aa7931fbeef3 100644 (file)
@@ -78,8 +78,8 @@
                                </div>
                        </div>
                        <div class="sharingTabDetailsView__advanced-control">
-                               <NcButton type="tertiary"
-                                       id="advancedSectionAccordionAdvancedControl"
+                               <NcButton id="advancedSectionAccordionAdvancedControl"
+                                       type="tertiary"
                                        alignment="end-reverse"
                                        aria-controls="advancedSectionAccordionAdvanced"
                                        :aria-expanded="advancedControlExpandedValue"
                                        </template>
                                </NcButton>
                        </div>
-                       <div v-if="advancedSectionAccordionExpanded" id="advancedSectionAccordionAdvanced" class="sharingTabDetailsView__advanced"
-                               aria-labelledby="advancedSectionAccordionAdvancedControl" role="region">
+                       <div v-if="advancedSectionAccordionExpanded"
+                               id="advancedSectionAccordionAdvanced"
+                               class="sharingTabDetailsView__advanced"
+                               aria-labelledby="advancedSectionAccordionAdvancedControl"
+                               role="region">
                                <section>
                                        <NcInputField v-if="isPublicShare"
                                                :value.sync="share.label"
@@ -427,19 +430,6 @@ export default {
                isFolder() {
                        return this.fileInfo.type === 'dir'
                },
-               maxExpirationDateEnforced() {
-                       if (this.isExpiryDateEnforced) {
-                               if (this.isPublicShare) {
-                                       return this.config.defaultExpirationDate
-                               }
-                               if (this.isRemoteShare) {
-                                       return this.config.defaultRemoteExpirationDateString
-                               }
-                               // If it get's here then it must be an internal share
-                               return this.config.defaultInternalExpirationDate
-                       }
-                       return null
-               },
                /**
                 * @return {boolean}
                 */
@@ -478,9 +468,6 @@ export default {
                isGroupShare() {
                        return this.share.type === this.SHARE_TYPES.SHARE_TYPE_GROUP
                },
-               isRemoteShare() {
-                       return this.share.type === this.SHARE_TYPES.SHARE_TYPE_REMOTE_GROUP || this.share.type === this.SHARE_TYPES.SHARE_TYPE_REMOTE
-               },
                isNewShare() {
                        return this.share.id === null || this.share.id === undefined
                },
@@ -654,7 +641,7 @@ export default {
                },
                advancedControlExpandedValue() {
                        return this.advancedSectionAccordionExpanded ? 'true' : 'false'
-               }
+               },
        },
        watch: {
                setCustomPermissions(isChecked) {
@@ -731,6 +718,12 @@ export default {
                                return
                        }
 
+                       // If there is an enforced expiry date, then existing shares created before enforcement
+                       // have no expiry date, hence we set it here.
+                       if (!this.isValidShareAttribute(this.share.expireDate) && this.isExpiryDateEnforced) {
+                               this.hasExpirationDate = true
+                       }
+
                        if (
                                this.isValidShareAttribute(this.share.password)
                                || this.isValidShareAttribute(this.share.expireDate)
@@ -786,16 +779,12 @@ export default {
                        if (!this.writeNoteToRecipientIsChecked) {
                                this.share.note = ''
                        }
-
                        if (this.isPasswordProtected) {
-                               if (this.isValidShareAttribute(this.share.newPassword)) {
+                               if (this.hasUnsavedPassword && this.isValidShareAttribute(this.share.newPassword)) {
                                        this.share.password = this.share.newPassword
                                        this.$delete(this.share, 'newPassword')
-                               } else {
-                                       if (this.isPasswordEnforced) {
-                                               this.passwordError = true
-                                               return
-                                       }
+                               } else if (this.isPasswordEnforced && !this.isValidShareAttribute(this.share.password)) {
+                                       this.passwordError = true
                                }
                        } else {
                                this.share.password = ''