Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 4 additions & 51 deletions wcfsetup/install/files/acp/templates/packageUpdateServerAdd.tpl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{include file='header' pageTitle='wcf.acp.updateServer.'|concat:$action}
{include file='header' pageTitle="wcf.acp.updateServer.$action"}

<header class="contentHeader">
<div class="contentHeaderTitle">
Expand All @@ -17,57 +17,10 @@
</nav>
</header>

{if $packageUpdateServer|isset && $packageUpdateServer->errorMessage}
<woltlab-core-notice type="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br>{$packageUpdateServer->errorMessage}</woltlab-core-notice>
{if $formObject|isset && $formObject->errorMessage}
<woltlab-core-notice type="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br>{$formObject->errorMessage}</woltlab-core-notice>
{/if}

{include file='shared_formNotice'}

<form method="post" action="{if $action == 'add'}{link controller='PackageUpdateServerAdd'}{/link}{else}{link controller='PackageUpdateServerEdit' id=$packageUpdateServerID}{/link}{/if}">
<div class="section">
<dl{if $errorField == 'serverURL'} class="formError"{/if}>
<dt><label for="serverURL">{lang}wcf.acp.updateServer.serverURL{/lang}</label></dt>
<dd>
<input type="url" id="serverURL" name="serverURL" value="{$serverURL}" required autofocus class="long"{if $action != 'add'} readonly{/if}>
{if $errorField == 'serverURL'}
<small class="innerError">
{if $errorType == 'empty'}
{lang}wcf.global.form.error.empty{/lang}
{elseif $errorType[duplicate]|isset}
{lang}wcf.acp.updateServer.serverURL.error.duplicate{/lang}
{else}
{lang}wcf.acp.updateServer.serverURL.error.{$errorType}{/lang}
{/if}
</small>
{/if}
</dd>
</dl>

<dl>
<dt><label for="loginUsername">{lang}wcf.acp.updateServer.loginUsername{/lang}</label></dt>
<dd>
<input type="text" id="loginUsername" name="loginUsername" value="{$loginUsername}" class="medium">
<small>{lang}wcf.acp.updateServer.loginUsername.description{/lang}</small>
</dd>
</dl>

<dl>
<dt><label for="loginPassword">{lang}wcf.acp.updateServer.loginPassword{/lang}</label></dt>
<dd>
<input type="password" id="loginPassword" name="loginPassword" value="{$loginPassword}" class="medium" autocomplete="off"{if $action != 'add' && $loginUsername} placeholder="{lang}wcf.acp.updateServer.loginPassword.noChange{/lang}"{/if}>
<small>{lang}wcf.acp.updateServer.loginPassword.description{/lang}</small>
</dd>
</dl>

{event name='dataFields'}
</div>

{event name='sections'}

<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
{csrfToken}
</div>
</form>
{unsafe:$form->getHtml()}

{include file='footer'}
268 changes: 134 additions & 134 deletions wcfsetup/install/files/lib/acp/form/PackageUpdateServerAddForm.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,27 @@
use wcf\data\package\update\server\PackageUpdateServer;
use wcf\data\package\update\server\PackageUpdateServerAction;
use wcf\data\package\update\server\PackageUpdateServerList;
use wcf\form\AbstractForm;
use wcf\system\exception\UserInputException;
use wcf\system\request\LinkHandler;
use wcf\system\WCF;
use wcf\util\StringUtil;
use wcf\form\AbstractFormBuilderForm;
use wcf\system\form\builder\container\FormContainer;
use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
use wcf\system\form\builder\field\BooleanFormField;
use wcf\system\form\builder\field\PasswordFormField;
use wcf\system\form\builder\field\TextFormField;
use wcf\system\form\builder\field\UrlFormField;
use wcf\system\form\builder\field\validation\FormFieldValidationError;
use wcf\system\form\builder\field\validation\FormFieldValidator;
use wcf\system\form\builder\IFormDocument;

/**
* Shows the server add form.
*
* @author Marcel Werk
* @copyright 2001-2019 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
*
* @extends AbstractFormBuilderForm<PackageUpdateServer>
*/
class PackageUpdateServerAddForm extends AbstractForm
class PackageUpdateServerAddForm extends AbstractFormBuilderForm
{
/**
* @inheritDoc
Expand All @@ -31,158 +38,151 @@ class PackageUpdateServerAddForm extends AbstractForm
*/
public $neededPermissions = ['admin.configuration.package.canEditServer'];

/**
* server url
* @var string
*/
public $serverURL = '';

/**
* server login username
* @var string
*/
public $loginUsername = '';

/**
* server login password
* @var string
*/
public $loginPassword = '';

/**
* @inheritDoc
*/
public function readFormParameters()
{
parent::readFormParameters();

if (isset($_POST['serverURL'])) {
$this->serverURL = StringUtil::trim($_POST['serverURL']);
}
if (isset($_POST['loginUsername'])) {
$this->loginUsername = $_POST['loginUsername'];
}
if (isset($_POST['loginPassword'])) {
$this->loginPassword = $_POST['loginPassword'];
}
}
public $objectActionClass = PackageUpdateServerAction::class;

/**
* @inheritDoc
*/
public function validate()
{
parent::validate();
public $objectEditLinkController = PackageUpdateServerEditForm::class;

$this->validateServerURL();
#[\Override]
protected function createForm()
{
parent::createForm();

$this->form->appendChildren([
FormContainer::create('data')
->appendChildren([
UrlFormField::create('serverURL')
->label('wcf.acp.updateServer.serverURL')
->required()
->autoFocus()
->addValidator(
new FormFieldValidator('serverUrlValidator', function (UrlFormField $formField) {
try {
$url = new Uri($formField->getValue());

if (!$url->getHost()) {
$formField->addValidationError(
new FormFieldValidationError(
'invalid',
'wcf.acp.updateServer.serverURL.error.invalid'
)
);
return;
}
if ($url->getHost() !== 'localhost') {
if ($url->getScheme() !== 'https') {
$formField->addValidationError(
new FormFieldValidationError(
'invalidScheme',
'wcf.acp.updateServer.serverURL.error.invalidScheme'
)
);
return;
}
if ($url->getPort()) {
$formField->addValidationError(
new FormFieldValidationError(
'nonStandardPort',
'wcf.acp.updateServer.serverURL.error.nonStandardPort'
)
);
return;
}
}
if ($url->getUserInfo()) {
$formField->addValidationError(
new FormFieldValidationError(
'userinfo',
'wcf.acp.updateServer.serverURL.error.userinfo'
)
);
return;
}
if (\str_ends_with(\strtolower($url->getHost()), '.woltlab.com')) {
$formField->addValidationError(
new FormFieldValidationError(
'woltlab',
'wcf.acp.updateServer.serverURL.error.woltlab'
)
);
return;
}
} catch (\InvalidArgumentException) {
$formField->addValidationError(
new FormFieldValidationError(
'invalid',
'wcf.acp.updateServer.serverURL.error.invalid'
)
);
return;
}

if (($duplicate = $this->findDuplicateServer((string)$url))) {
$formField->addValidationError(
new FormFieldValidationError(
'duplicate',
'wcf.acp.updateServer.serverURL.error.duplicate',
['duplicate' => $duplicate]
)
);
return;
}
})
),
TextFormField::create('loginUsername')
->label('wcf.acp.updateServer.loginUsername')
->description('wcf.acp.updateServer.loginUsername.description')
->addFieldClass('medium'),
PasswordFormField::create('loginPassword')
->label('wcf.acp.updateServer.loginPassword')
->description('wcf.acp.updateServer.loginPassword.description')
->addFieldClass('medium')
->passwordStrengthMeter(false)
->autocomplete('off'),
BooleanFormField::create('isDisabled')
->label('wcf.acp.updateServer.isDisabled'),
]),
]);
}

/**
* Validates the server URL.
*
* @return void
* @since 5.3
*/
protected function validateServerURL()
#[\Override]
public function finalizeForm()
{
if (empty($this->serverURL)) {
throw new UserInputException('serverURL');
}
parent::finalizeForm();

try {
$url = new Uri($this->serverURL);
$this->serverURL = (string)$url;
$this->form->getDataHandler()->addProcessor(
new CustomFormDataProcessor(
'saveServerProcessor',
function (IFormDocument $document, array $parameters) {
// This ensures that the URL is well-formed.
$uri = new Uri($parameters['data']['serverURL']);
$parameters['data']['serverURL'] = (string)$uri;

if (!$url->getHost()) {
throw new UserInputException('serverURL', 'invalid');
}
if ($url->getHost() !== 'localhost') {
if ($url->getScheme() !== 'https') {
throw new UserInputException('serverURL', 'invalidScheme');
}
if ($url->getPort()) {
throw new UserInputException('serverURL', 'nonStandardPort');
return $parameters;
}
}
if ($url->getUserInfo()) {
throw new UserInputException('serverURL', 'userinfo');
}
if (\str_ends_with(\strtolower($url->getHost()), '.woltlab.com')) {
throw new UserInputException('serverURL', 'woltlab');
}
} catch (\InvalidArgumentException) {
throw new UserInputException('serverURL', 'invalid');
}

if (($duplicate = $this->findDuplicateServer())) {
throw new UserInputException('serverURL', [
'duplicate' => $duplicate,
]);
}
)
);
}

/**
* Returns the first package update server with a matching serverURL.
*
* @return ?PackageUpdateServer
* @since 5.3
* @since 5.3
*/
protected function findDuplicateServer()
protected function findDuplicateServer(string $serverURL): ?PackageUpdateServer
{
$packageServerList = new PackageUpdateServerList();
$packageServerList->readObjects();
foreach ($packageServerList as $packageServer) {
if ($packageServer->serverURL == $this->serverURL) {
if ($packageServer->serverURL == $serverURL) {
return $packageServer;
}
}

return null;
}

/**
* @inheritDoc
*/
public function save()
{
parent::save();

// save server
$this->objectAction = new PackageUpdateServerAction([], 'create', [
'data' => \array_merge($this->additionalFields, [
'serverURL' => $this->serverURL,
'loginUsername' => $this->loginUsername,
'loginPassword' => $this->loginPassword,
]),
]);
$returnValues = $this->objectAction->executeAction();
$this->saved();

// reset values
$this->serverURL = $this->loginUsername = $this->loginPassword = '';

// show success message
WCF::getTPL()->assign([
'success' => true,
'objectEditLink' => LinkHandler::getInstance()->getControllerLink(
PackageUpdateServerEditForm::class,
['id' => $returnValues['returnValues']->packageUpdateServerID]
),
]);
}

/**
* @inheritDoc
*/
public function assignVariables()
{
parent::assignVariables();

WCF::getTPL()->assign([
'serverURL' => $this->serverURL,
'loginUsername' => $this->loginUsername,
'loginPassword' => $this->loginPassword,
'action' => 'add',
]);
}
}
Loading