Prevent the official servers from being disabled
authorAlexander Ebert <ebert@woltlab.com>
Tue, 13 Oct 2020 14:10:10 +0000 (16:10 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Tue, 13 Oct 2020 14:10:10 +0000 (16:10 +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
wcfsetup/install/files/lib/system/package/PackageUpdateDispatcher.class.php

index 171936425ec15d90524934e645076edf19aa65dc..df6d3cee4b664ddf67c3bc52994741b4196f50f1 100644 (file)
                                {foreach from=$objects item=updateServer}
                                        <tr class="jsUpdateServerRow">
                                                <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>
+                                                       {if $updateServer->canDisable()}
+                                                               <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>
+                                                       {else}
+                                                               <span class="icon icon16 fa-check-square-o disabled"></span>
+                                                       {/if}
                                                        <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 {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>
+                                                       <span class="icon icon16 fa-times {if $updateServer->canDelete()}jsDeleteButton jsTooltip pointer{else}disabled{/if}"{if $updateServer->canDelete()} 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}"{/if}></span>
                                                        
                                                        {event name='itemButtons'}
                                                </td>
index 72e14de583ea006e429eed0e78c89802151220e8..5c0741ad807cd6f43a09a5b0b2cddd59e713c5d6 100644 (file)
@@ -59,6 +59,9 @@ class PackageUpdateServer extends DatabaseObject {
                if ($this->isWoltLabStoreServer()) {
                        $this->data['serverURL'] = 'http://store.woltlab.com/'.\wcf\getMinorVersion().'/';
                }
+               if ($this->isWoltLabUpdateServer() || $this->isWoltLabStoreServer()) {
+                       $this->data['isDisabled'] = 0;
+               }
        }
        
        /**
@@ -285,6 +288,16 @@ class PackageUpdateServer extends DatabaseObject {
                return !$this->isWoltLabUpdateServer() && !$this->isWoltLabStoreServer();
        }
        
+       /**
+        * Returns whether the current user may disable this update server.
+        * 
+        * @return      boolean
+        * @since       5.3
+        */
+       public final function canDisable() {
+               return !$this->isWoltLabUpdateServer() && !$this->isWoltLabStoreServer();
+       }
+       
        /**
         * Returns true if the host is `update.woltlab.com`.
         * 
index 51be70377a3e9f700d82b56913cad313c36055bd..5d8ae5cce78061f93c3c8a86e611695b1f5ce7ac 100644 (file)
@@ -18,7 +18,9 @@ use wcf\system\exception\PermissionDeniedException;
  * @method     PackageUpdateServerEditor       getSingleObject()
  */
 class PackageUpdateServerAction extends AbstractDatabaseObjectAction implements IToggleAction {
-       use TDatabaseObjectToggle;
+       use TDatabaseObjectToggle {
+               validateToggle as traitValidateToggle;
+       }
        
        /**
         * @inheritDoc
@@ -56,4 +58,17 @@ class PackageUpdateServerAction extends AbstractDatabaseObjectAction implements
                        if (!$updateServer->canDelete()) throw new PermissionDeniedException();
                }
        }
+       
+       /**
+        * @inheritDoc
+        */
+       public function validateToggle() {
+               $this->traitValidateToggle();
+               
+               /** @var PackageUpdateServer $updateServer */
+               foreach ($this->getObjects() as $updateServer) {
+                       if (!$updateServer->canDisable()) throw new PermissionDeniedException();
+               }
+       }
+       
 }
index 689391eacd6961fff769b73e1db791f2bcce5d9b..4fcb13dca974ad922dafa9ca78d2021e396a7fd0 100644 (file)
@@ -866,29 +866,32 @@ class PackageUpdateDispatcher extends SingletonFactory {
         * @throws      SystemException
         */
        public function getPackageUpdateVersions($package, $version = '') {
+               $packageUpdateServerIDs = [];
+               foreach (PackageUpdateServer::getActiveUpdateServers() as $packageUpdateServer) {
+                       $packageUpdateServerIDs[] = $packageUpdateServer->packageUpdateServerID;
+               }
+               
                // get newest package version
                if (empty($version)) {
                        $version = $this->getNewestPackageVersion($package);
                }
                
                // get versions
+               $conditions = new PreparedStatementConditionBuilder();
+               $conditions->add('pu.package = ?', [$package]);
+               $conditions->add('puv.packageVersion = ?', [$version]);
+               $conditions->add('puv.isAccessible = ?', [1]);
+               $conditions->add('pus.packageUpdateServerID IN (?)', [$packageUpdateServerIDs]);
+               
                $sql = "SELECT          puv.*, pu.*, pus.serverURL, pus.loginUsername, pus.loginPassword
                        FROM            wcf".WCF_N."_package_update_version puv
                        LEFT JOIN       wcf".WCF_N."_package_update pu
                        ON              (pu.packageUpdateID = puv.packageUpdateID)
                        LEFT JOIN       wcf".WCF_N."_package_update_server pus
                        ON              (pus.packageUpdateServerID = pu.packageUpdateServerID)
-                       WHERE           pu.package = ?
-                                       AND puv.packageVersion = ?
-                                       AND puv.isAccessible = ?
-                                       AND pus.isDisabled = ?";
+                       ".$conditions;
                $statement = WCF::getDB()->prepareStatement($sql);
-               $statement->execute([
-                       $package,
-                       $version,
-                       1,
-                       0
-               ]);
+               $statement->execute($conditions->getParameters());
                $versions = $statement->fetchAll(\PDO::FETCH_ASSOC);
                
                if (empty($versions)) {