66use wcf \data \package \update \server \PackageUpdateServer ;
77use wcf \data \package \update \server \PackageUpdateServerAction ;
88use wcf \data \package \update \server \PackageUpdateServerList ;
9- use wcf \form \AbstractForm ;
10- use wcf \system \exception \UserInputException ;
11- use wcf \system \request \LinkHandler ;
12- use wcf \system \WCF ;
13- use wcf \util \StringUtil ;
9+ use wcf \form \AbstractFormBuilderForm ;
10+ use wcf \system \form \builder \container \FormContainer ;
11+ use wcf \system \form \builder \data \processor \CustomFormDataProcessor ;
12+ use wcf \system \form \builder \field \BooleanFormField ;
13+ use wcf \system \form \builder \field \PasswordFormField ;
14+ use wcf \system \form \builder \field \TextFormField ;
15+ use wcf \system \form \builder \field \UrlFormField ;
16+ use wcf \system \form \builder \field \validation \FormFieldValidationError ;
17+ use wcf \system \form \builder \field \validation \FormFieldValidator ;
18+ use wcf \system \form \builder \IFormDocument ;
1419
1520/**
1621 * Shows the server add form.
1722 *
18- * @author Marcel Werk
19- * @copyright 2001-2019 WoltLab GmbH
20- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
23+ * @author Marcel Werk
24+ * @copyright 2001-2025 WoltLab GmbH
25+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
26+ *
27+ * @extends AbstractFormBuilderForm<PackageUpdateServer>
2128 */
22- class PackageUpdateServerAddForm extends AbstractForm
29+ class PackageUpdateServerAddForm extends AbstractFormBuilderForm
2330{
2431 /**
2532 * @inheritDoc
@@ -31,158 +38,151 @@ class PackageUpdateServerAddForm extends AbstractForm
3138 */
3239 public $ neededPermissions = ['admin.configuration.package.canEditServer ' ];
3340
34- /**
35- * server url
36- * @var string
37- */
38- public $ serverURL = '' ;
39-
40- /**
41- * server login username
42- * @var string
43- */
44- public $ loginUsername = '' ;
45-
46- /**
47- * server login password
48- * @var string
49- */
50- public $ loginPassword = '' ;
51-
5241 /**
5342 * @inheritDoc
5443 */
55- public function readFormParameters ()
56- {
57- parent ::readFormParameters ();
58-
59- if (isset ($ _POST ['serverURL ' ])) {
60- $ this ->serverURL = StringUtil::trim ($ _POST ['serverURL ' ]);
61- }
62- if (isset ($ _POST ['loginUsername ' ])) {
63- $ this ->loginUsername = $ _POST ['loginUsername ' ];
64- }
65- if (isset ($ _POST ['loginPassword ' ])) {
66- $ this ->loginPassword = $ _POST ['loginPassword ' ];
67- }
68- }
44+ public $ objectActionClass = PackageUpdateServerAction::class;
6945
7046 /**
7147 * @inheritDoc
7248 */
73- public function validate ()
74- {
75- parent ::validate ();
49+ public $ objectEditLinkController = PackageUpdateServerEditForm::class;
7650
77- $ this ->validateServerURL ();
51+ #[\Override]
52+ protected function createForm ()
53+ {
54+ parent ::createForm ();
55+
56+ $ this ->form ->appendChildren ([
57+ FormContainer::create ('data ' )
58+ ->appendChildren ([
59+ UrlFormField::create ('serverURL ' )
60+ ->label ('wcf.acp.updateServer.serverURL ' )
61+ ->required ()
62+ ->autoFocus ()
63+ ->addValidator (
64+ new FormFieldValidator ('serverUrlValidator ' , function (UrlFormField $ formField ) {
65+ try {
66+ $ url = new Uri ($ formField ->getValue ());
67+
68+ if (!$ url ->getHost ()) {
69+ $ formField ->addValidationError (
70+ new FormFieldValidationError (
71+ 'invalid ' ,
72+ 'wcf.acp.updateServer.serverURL.error.invalid '
73+ )
74+ );
75+ return ;
76+ }
77+ if ($ url ->getHost () !== 'localhost ' ) {
78+ if ($ url ->getScheme () !== 'https ' ) {
79+ $ formField ->addValidationError (
80+ new FormFieldValidationError (
81+ 'invalidScheme ' ,
82+ 'wcf.acp.updateServer.serverURL.error.invalidScheme '
83+ )
84+ );
85+ return ;
86+ }
87+ if ($ url ->getPort ()) {
88+ $ formField ->addValidationError (
89+ new FormFieldValidationError (
90+ 'nonStandardPort ' ,
91+ 'wcf.acp.updateServer.serverURL.error.nonStandardPort '
92+ )
93+ );
94+ return ;
95+ }
96+ }
97+ if ($ url ->getUserInfo ()) {
98+ $ formField ->addValidationError (
99+ new FormFieldValidationError (
100+ 'userinfo ' ,
101+ 'wcf.acp.updateServer.serverURL.error.userinfo '
102+ )
103+ );
104+ return ;
105+ }
106+ if (\str_ends_with (\strtolower ($ url ->getHost ()), '.woltlab.com ' )) {
107+ $ formField ->addValidationError (
108+ new FormFieldValidationError (
109+ 'woltlab ' ,
110+ 'wcf.acp.updateServer.serverURL.error.woltlab '
111+ )
112+ );
113+ return ;
114+ }
115+ } catch (\InvalidArgumentException ) {
116+ $ formField ->addValidationError (
117+ new FormFieldValidationError (
118+ 'invalid ' ,
119+ 'wcf.acp.updateServer.serverURL.error.invalid '
120+ )
121+ );
122+ return ;
123+ }
124+
125+ if (($ duplicate = $ this ->findDuplicateServer ((string )$ url ))) {
126+ $ formField ->addValidationError (
127+ new FormFieldValidationError (
128+ 'duplicate ' ,
129+ 'wcf.acp.updateServer.serverURL.error.duplicate ' ,
130+ ['duplicate ' => $ duplicate ]
131+ )
132+ );
133+ return ;
134+ }
135+ })
136+ ),
137+ TextFormField::create ('loginUsername ' )
138+ ->label ('wcf.acp.updateServer.loginUsername ' )
139+ ->description ('wcf.acp.updateServer.loginUsername.description ' )
140+ ->addFieldClass ('medium ' ),
141+ PasswordFormField::create ('loginPassword ' )
142+ ->label ('wcf.acp.updateServer.loginPassword ' )
143+ ->description ('wcf.acp.updateServer.loginPassword.description ' )
144+ ->addFieldClass ('medium ' )
145+ ->passwordStrengthMeter (false )
146+ ->autocomplete ('off ' ),
147+ BooleanFormField::create ('isDisabled ' )
148+ ->label ('wcf.acp.updateServer.isDisabled ' ),
149+ ]),
150+ ]);
78151 }
79152
80- /**
81- * Validates the server URL.
82- *
83- * @return void
84- * @since 5.3
85- */
86- protected function validateServerURL ()
153+ #[\Override]
154+ public function finalizeForm ()
87155 {
88- if (empty ($ this ->serverURL )) {
89- throw new UserInputException ('serverURL ' );
90- }
156+ parent ::finalizeForm ();
91157
92- try {
93- $ url = new Uri ($ this ->serverURL );
94- $ this ->serverURL = (string )$ url ;
158+ $ this ->form ->getDataHandler ()->addProcessor (
159+ new CustomFormDataProcessor (
160+ 'saveServerProcessor ' ,
161+ function (IFormDocument $ document , array $ parameters ) {
162+ // This ensures that the URL is well-formed.
163+ $ uri = new Uri ($ parameters ['data ' ]['serverURL ' ]);
164+ $ parameters ['data ' ]['serverURL ' ] = (string )$ uri ;
95165
96- if (!$ url ->getHost ()) {
97- throw new UserInputException ('serverURL ' , 'invalid ' );
98- }
99- if ($ url ->getHost () !== 'localhost ' ) {
100- if ($ url ->getScheme () !== 'https ' ) {
101- throw new UserInputException ('serverURL ' , 'invalidScheme ' );
102- }
103- if ($ url ->getPort ()) {
104- throw new UserInputException ('serverURL ' , 'nonStandardPort ' );
166+ return $ parameters ;
105167 }
106- }
107- if ($ url ->getUserInfo ()) {
108- throw new UserInputException ('serverURL ' , 'userinfo ' );
109- }
110- if (\str_ends_with (\strtolower ($ url ->getHost ()), '.woltlab.com ' )) {
111- throw new UserInputException ('serverURL ' , 'woltlab ' );
112- }
113- } catch (\InvalidArgumentException ) {
114- throw new UserInputException ('serverURL ' , 'invalid ' );
115- }
116-
117- if (($ duplicate = $ this ->findDuplicateServer ())) {
118- throw new UserInputException ('serverURL ' , [
119- 'duplicate ' => $ duplicate ,
120- ]);
121- }
168+ )
169+ );
122170 }
123171
124172 /**
125173 * Returns the first package update server with a matching serverURL.
126- *
127- * @return ?PackageUpdateServer
128- * @since 5.3
174+ * @since 5.3
129175 */
130- protected function findDuplicateServer ()
176+ protected function findDuplicateServer (string $ serverURL ): ? PackageUpdateServer
131177 {
132178 $ packageServerList = new PackageUpdateServerList ();
133179 $ packageServerList ->readObjects ();
134180 foreach ($ packageServerList as $ packageServer ) {
135- if ($ packageServer ->serverURL == $ this -> serverURL ) {
181+ if ($ packageServer ->serverURL == $ serverURL ) {
136182 return $ packageServer ;
137183 }
138184 }
139185
140186 return null ;
141187 }
142-
143- /**
144- * @inheritDoc
145- */
146- public function save ()
147- {
148- parent ::save ();
149-
150- // save server
151- $ this ->objectAction = new PackageUpdateServerAction ([], 'create ' , [
152- 'data ' => \array_merge ($ this ->additionalFields , [
153- 'serverURL ' => $ this ->serverURL ,
154- 'loginUsername ' => $ this ->loginUsername ,
155- 'loginPassword ' => $ this ->loginPassword ,
156- ]),
157- ]);
158- $ returnValues = $ this ->objectAction ->executeAction ();
159- $ this ->saved ();
160-
161- // reset values
162- $ this ->serverURL = $ this ->loginUsername = $ this ->loginPassword = '' ;
163-
164- // show success message
165- WCF ::getTPL ()->assign ([
166- 'success ' => true ,
167- 'objectEditLink ' => LinkHandler::getInstance ()->getControllerLink (
168- PackageUpdateServerEditForm::class,
169- ['id ' => $ returnValues ['returnValues ' ]->packageUpdateServerID ]
170- ),
171- ]);
172- }
173-
174- /**
175- * @inheritDoc
176- */
177- public function assignVariables ()
178- {
179- parent ::assignVariables ();
180-
181- WCF ::getTPL ()->assign ([
182- 'serverURL ' => $ this ->serverURL ,
183- 'loginUsername ' => $ this ->loginUsername ,
184- 'loginPassword ' => $ this ->loginPassword ,
185- 'action ' => 'add ' ,
186- ]);
187- }
188188}
0 commit comments