Disallow deleting official update servers
authorTim Düsterhus <duesterhus@woltlab.com>
Wed, 19 Aug 2020 12:52:18 +0000 (14:52 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Wed, 19 Aug 2020 14:18:06 +0000 (16:18 +0200)
wcfsetup/install/files/acp/templates/packageUpdateServerList.tpl
wcfsetup/install/files/lib/data/package/update/server/PackageUpdateServer.class.php
wcfsetup/install/files/lib/data/package/update/server/PackageUpdateServerAction.class.php

index a4027cdbcdd7b2998921878fab495f407641e6e8..4684b62a1fce4d68de54474db9495b6071baccff 100644 (file)
@@ -49,7 +49,7 @@
                                                <td class="columnIcon">
                                                        <span class="icon icon16 fa-{if !$updateServer->isDisabled}check-{/if}square-o jsToggleButton jsTooltip pointer" title="{lang}wcf.global.button.{if !$updateServer->isDisabled}disable{else}enable{/if}{/lang}" data-object-id="{@$updateServer->packageUpdateServerID}"></span>
                                                        <a href="{link controller='PackageUpdateServerEdit' id=$updateServer->packageUpdateServerID}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip"><span class="icon icon16 fa-pencil"></span></a>
-                                                       <span class="icon icon16 fa-times jsDeleteButton jsTooltip pointer" title="{lang}wcf.global.button.delete{/lang}" data-object-id="{@$updateServer->packageUpdateServerID}" data-confirm-message-html="{lang __encode=true}wcf.acp.updateServer.delete.sure{/lang}"></span>
+                                                       <span class="icon icon16 fa-times {if $updateServer->canDelete()}jsDeleteButton jsTooltip pointer{else}disabled{/if}" title="{lang}wcf.global.button.delete{/lang}" data-object-id="{@$updateServer->packageUpdateServerID}" data-confirm-message-html="{lang __encode=true}wcf.acp.updateServer.delete.sure{/lang}"></span>
                                                        
                                                        {event name='itemButtons'}
                                                </td>
index 5cd2294177f2af63fa205432deb66ce5a3d167c7..45b06e43f92ba43c526ca8e2f9a54667f929d248 100644 (file)
@@ -238,6 +238,15 @@ class PackageUpdateServer extends DatabaseObject {
                return false;
        }
        
+       /**
+        * Returns whether the current user may delete this update server.
+        * 
+        * @return      boolean
+        */
+       public final function canDelete() {
+               return !$this->isWoltLabUpdateServer() && !$this->isWoltLabStoreServer();
+       }
+       
        /**
         * Returns true if the host is `update.woltlab.com`.
         * 
index 897ef73de3435aabb6d774c27eced36eefc1bbfe..51be70377a3e9f700d82b56913cad313c36055bd 100644 (file)
@@ -3,6 +3,7 @@ namespace wcf\data\package\update\server;
 use wcf\data\AbstractDatabaseObjectAction;
 use wcf\data\IToggleAction;
 use wcf\data\TDatabaseObjectToggle;
+use wcf\system\exception\PermissionDeniedException;
 
 /**
  * Executes package update server-related actions.
@@ -43,4 +44,16 @@ class PackageUpdateServerAction extends AbstractDatabaseObjectAction implements
         * @inheritDoc
         */
        protected $requireACP = ['create', 'delete', 'toggle', 'update'];
+       
+       /**
+        * @inheritDoc
+        */
+       public function validateDelete() {
+               parent::validateDelete();
+               
+               /** @var PackageUpdateServer $updateServer */
+               foreach ($this->getObjects() as $updateServer) {
+                       if (!$updateServer->canDelete()) throw new PermissionDeniedException();
+               }
+       }
 }