]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(SharingEntryLink): Show default password before create if any
authorfenn-cs <fenn25.fn@gmail.com>
Wed, 6 Nov 2024 15:50:59 +0000 (16:50 +0100)
committerskjnldsv <skjnldsv@protonmail.com>
Fri, 8 Nov 2024 15:20:19 +0000 (16:20 +0100)
Prevent silent addition of expiration date to shares.

Prevent silent addition for password to shares.

Both now have a `shareRequiresReview` check

Resolves : https://github.com/nextcloud/server/issues/48860

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

index 8fb6b61e18bbdc4842c736a1469db5824eb90e6f..41373ef04307aa5ff49c393b8dcf496684e3b705 100644 (file)
@@ -40,7 +40,7 @@
                </div>
 
                <!-- pending actions -->
-               <NcActions v-if="!pending && (pendingPassword || pendingEnforcedPassword || pendingExpirationDate)"
+               <NcActions v-if="!pending && pendingDataIsMissing"
                        class="sharing-entry__actions"
                        :aria-label="actionsTooltip"
                        menu-align="right"
                                </template>
                        </NcActionInput>
 
+                       <NcActionCheckbox v-if="hasDefaultExpirationDate"
+                               :checked.sync="defaultExpirationDateEnabled"
+                               :disabled="pendingEnforcedExpirationDate || saving"
+                               class="share-link-expiration-date-checkbox"
+                               @change="onDefaultExpirationDateEnabledChange">
+                               {{ config.enforcePasswordForPublicLink ? t('files_sharing', 'Enable link expiration (enforced)') : t('files_sharing', 'Enable link expiration') }}
+                       </NcActionCheckbox>
+
                        <!-- expiration date -->
-                       <NcActionInput v-if="pendingExpirationDate"
+                       <NcActionInput v-if="(hasDefaultExpirationDate || pendingEnforcedExpirationDate) && defaultExpirationDateEnabled"
                                class="share-link-expire-date"
-                               :label="t('files_sharing', 'Expiration date (enforced)')"
+                               :label="pendingEnforcedExpirationDate ? t('files_sharing', 'Enter expiration date (enforced)') : t('files_sharing', 'Enter expiration date')"
                                :disabled="saving"
                                :is-native-picker="true"
                                :hide-label="true"
@@ -287,6 +295,7 @@ export default {
                        shareCreationComplete: false,
                        copySuccess: true,
                        copied: false,
+                       defaultExpirationDateEnabled: false,
 
                        // Are we waiting for password/expiration date
                        pending: false,
@@ -460,14 +469,28 @@ export default {
                 *
                 * @return {boolean}
                 */
+               pendingDataIsMissing() {
+                       return this.pendingPassword || this.pendingEnforcedPassword || this.pendingEnforcedExpirationDate
+               },
                pendingPassword() {
-                       return this.config.enableLinkPasswordByDefault && this.share && !this.share.id
+                       return this.config.enableLinkPasswordByDefault && this.isPendingShare
                },
                pendingEnforcedPassword() {
-                       return this.config.enforcePasswordForPublicLink && this.share && !this.share.id
+                       return this.config.enforcePasswordForPublicLink && this.isPendingShare
+               },
+               pendingEnforcedExpirationDate() {
+                       return this.config.isDefaultExpireDateEnforced && this.isPendingShare
+               },
+               hasDefaultExpirationDate() {
+                       return (this.config.defaultExpirationDate instanceof Date || !isNaN(new Date(this.config.defaultExpirationDate).getTime())) && this.isPendingShare
                },
-               pendingExpirationDate() {
-                       return this.config.isDefaultExpireDateEnforced && this.share && !this.share.id
+
+               isPendingShare() {
+                       return !!(this.share && !this.share.id)
+               },
+
+               shareRequiresReview() {
+                       return this.defaultExpirationDateEnabled || this.config.enableLinkPasswordByDefault
                },
 
                sharePolicyHasRequiredProperties() {
@@ -570,6 +593,10 @@ export default {
                        return this.share.isFileRequest
                },
        },
+       mounted() {
+               this.defaultExpirationDateEnabled = this.config.defaultExpirationDate instanceof Date
+               this.share.expireDate = this.defaultExpirationDateEnabled ? this.formatDateToString(this.config.defaultExpirationDate) : ''
+       },
 
        methods: {
                /**
@@ -592,8 +619,10 @@ export default {
                        }
 
                        this.logger.debug('Missing required properties?', this.requiredPropertiesMissing)
-                       // do not push yet if we need a password or an expiration date: show pending menu
-                       if (this.sharePolicyHasRequiredProperties && this.requiredPropertiesMissing) {
+                       // Do not push yet if we need a password or an expiration date: show pending menu
+                       // A share would require a review for example is default expiration date is set but not enforced, this allows
+                       // the user to review the share and remove the expiration date if they don't want it
+                       if ((this.sharePolicyHasRequiredProperties && this.requiredPropertiesMissing) || this.shareRequiresReview) {
                                this.pending = true
                                this.shareCreationComplete = false
 
@@ -827,6 +856,9 @@ export default {
                        this.onPasswordSubmit()
                        this.onNoteSubmit()
                },
+               onDefaultExpirationDateEnabledChange(enabled) {
+                       this.share.expireDate = enabled ? this.formatDateToString(this.config.defaultExpirationDate) : ''
+               },
 
                /**
                 * Cancel the share creation