jenkins-bot has submitted this change and it was merged.

Change subject: Bypass login page if no user input is required.
......................................................................


Bypass login page if no user input is required.

Bug: T141474
Bug: T110464
Change-Id: I9588a2b87a423f614fc5d2e771ad1ac7279ebd0b
---
M includes/auth/AuthenticationRequest.php
M includes/auth/RememberMeAuthenticationRequest.php
M includes/specialpage/LoginSignupSpecialPage.php
3 files changed, 53 insertions(+), 0 deletions(-)

Approvals:
  Gergő Tisza: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/includes/auth/AuthenticationRequest.php 
b/includes/auth/AuthenticationRequest.php
index f6f949e..460deb2 100644
--- a/includes/auth/AuthenticationRequest.php
+++ b/includes/auth/AuthenticationRequest.php
@@ -102,6 +102,10 @@
         *  - label: (Message) Text suitable for a label in an HTML form
         *  - help: (Message) Text suitable as a description of what the field 
is
         *  - optional: (bool) If set and truthy, the field may be left empty
+        *  - skippable: (bool) If set and truthy, the client is free to hide 
this
+        *      field from the user to streamline the workflow. If all fields 
are
+        *      skippable (except possibly a single button), no user 
interaction is
+        *      required at all.
         *
         * @return array As above
         */
diff --git a/includes/auth/RememberMeAuthenticationRequest.php 
b/includes/auth/RememberMeAuthenticationRequest.php
index d487e31..06060b1 100644
--- a/includes/auth/RememberMeAuthenticationRequest.php
+++ b/includes/auth/RememberMeAuthenticationRequest.php
@@ -58,6 +58,7 @@
                                'label' => wfMessage( 
'userlogin-remembermypassword' )->numParams( $expirationDays ),
                                'help' => wfMessage( 
'authmanager-userlogin-remembermypassword-help' ),
                                'optional' => true,
+                               'skippable' => true,
                        ]
                ];
        }
diff --git a/includes/specialpage/LoginSignupSpecialPage.php 
b/includes/specialpage/LoginSignupSpecialPage.php
index 90774ef..1e6bdc7 100644
--- a/includes/specialpage/LoginSignupSpecialPage.php
+++ b/includes/specialpage/LoginSignupSpecialPage.php
@@ -290,6 +290,14 @@
                        return;
                }
 
+               if ( $this->canBypassForm( $button_name ) ) {
+                       $this->setRequest( [], true );
+                       $this->getRequest()->setVal( $this->getTokenName(), 
$this->getToken() );
+                       if ( $button_name ) {
+                               $this->getRequest()->setVal( $button_name, true 
);
+                       }
+               }
+
                $status = $this->trySubmit();
 
                if ( !$status || !$status->isGood() ) {
@@ -363,6 +371,46 @@
        }
 
        /**
+        * Determine if the login form can be bypassed. This will be the case 
when no more than one
+        * button is present and no other user input fields that are not marked 
as 'skippable' are
+        * present. If the login form were not bypassed, the user would be 
presented with a
+        * superfluous page on which they must press the single button to 
proceed with login.
+        * Not only does this cause an additional mouse click and page load, it 
confuses users,
+        * especially since there are a help link and forgotten password link 
that are
+        * provided on the login page that do not apply to this situation.
+        *
+        * @param string|null &$button_name if the form has a single button, 
returns
+        *   the name of the button; otherwise, returns null
+        * @return bool
+        */
+       private function canBypassForm( &$button_name ) {
+               $button_name = null;
+               if ( $this->isContinued() ) {
+                       return false;
+               }
+               $fields = AuthenticationRequest::mergeFieldInfo( 
$this->authRequests );
+               foreach ( $fields as $fieldname => $field ) {
+                       if ( !isset( $field['type'] ) ) {
+                               return false;
+                       }
+                       if ( !empty( $field['skippable'] ) ) {
+                               continue;
+                       }
+                       if ( $field['type'] === 'button' ) {
+                               if ( $button_name !== null ) {
+                                       $button_name = null;
+                                       return false;
+                               } else {
+                                       $button_name = $fieldname;
+                               }
+                       } elseif ( $field['type'] !== 'null' ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       /**
         * Show the success page.
         *
         * @param string $type Condition of return to; see `executeReturnTo`

-- 
To view, visit https://gerrit.wikimedia.org/r/323646
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I9588a2b87a423f614fc5d2e771ad1ac7279ebd0b
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: REL1_27
Gerrit-Owner: Cicalese <cical...@mitre.org>
Gerrit-Reviewer: Anomie <bjor...@wikimedia.org>
Gerrit-Reviewer: Gergő Tisza <gti...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to