[Tͪ#n$;<:a4sX[y ,)RYlrE08<?޾eߌ&|LVk[w> ݏo!)9(Cfl<V7A^}.El(lw墤/K{OK_"b^O7IXMw;vhր}UǇ?-+6@SD*.[)sFZ7ڈD&xv~L-aD<gi;jsFt*yj*gWf Մn).SxnpnX g/&hOujUccK&C&Zeiz넴9WOEK;V9h:NsŦY&+a/CqrpBNHl7#Gk{/5GSi/5L%V'CՅMx4"-3%d<fw-S;c()êdh{SJ fB#upg=?w?Eq8/1i@E-eϼjVKԴ2F|G>:l|TGgcֽP3]C̪qUi#Zvzu|	!o]ǂqa3O$NɣʨEKe%ۚZ]wLҟs٬٫VD-fTsgM]:x@j_ 9zDa5FI
I&ћiݮLm*|N\ś*NR,Rf,Vo?T!敦_a8F	.xlԛ+EZ_P tI0L~C.8E<܁rsn41Z}A$襉Oy7mG*0dY6.SxnpnX g/&hOujUcc)d6t@׺kjMP6dj ]܃Wz"AMiڧؚP5Ms_ne`ŝAr=N#̍b4C,TO{%  XWȟHWIcQ^'{Z_>.8\3uonET9̝ ߠDJo5}?*ɲܚU#)$m鵓ol_~xח!y<ǬǽK+GqP;(alA#p9Ϭp(9oO\U"16÷#mvPS4K5ڡyI6c(3yttTnot2,CJ&7H: vj{e'"Ta.0:")1:ldJ fBi4+1:,ގῇ`0Y
ozX
&͒ڠHB*BVNqF/p^#ʻm[A`cazk1.WjB3zﾉ6x'zªAZVDXͤ^tP*y/<4Mэ0̬x%
vOh0SY
\
>KGXL'ᮏAGdTTZ
訉GYg"z!<sB9uQ^]<$DrGOmp;A-w59(| [;K@6f>i_%f9bb)cpmݩTfv(Fq֘e"iG	v**^ʻYz+ S<&jw>P&Ho,I`/X%3Fͷ2~4fD:T*\@f\Y[t/ ==3f+4;3*2ssy ܖKqIP]j=rԬPBhϤyDjSoPk.LIUG1~UJ5%uسF'ȵ}H|iюJk*Y|y׽-vʷ$0+/6|@Z+{o%P_'b{^Y|0{ lVB¦0CqVqŮ'iN#̍b4C,TO{%  XWȟYP+(P>B㒬cj; Fuh,ĶHMQb̞4On@FHqME_y]djX6	*
P?2i!` zG \wjș{'F]+!q&4h}>tו<c9rj?&4@U^Mhgn#8s	sQL4YɱrHJc$9.ؾ*zIGi|ފ3_@EMHWA-dE~췕~M {BԄsxha͐[۹|_Ww	#}1~2g?͟22Zצbȗm`qQN Svxۈ8ÇwsT>>x%yȮ\M*csE㊺\W#/X%3Fͷ2[vAdxXk-λVWSi&H=y\mlBC'X`0ܤ=;;(1/CLVNgA[UF>t_~Vf_1^vDWxTOr`$SQm¼A{=D#9eHdȍƕ@/X%3Fͷ2~4fD:T*ӡt 	?MSӇ8zyҳZsG,9ksU7O35:Fن&yja&mfzn1̝VҧK˫>SnuFR&.+ym%hnz.]UUNVsr?ep;|)hl=dC!^v}:1-IL2UTP0>TqFLtfrZq
'!f7H|
ySu! qg`gԨU@r侘q\+*[. u\`rbA(56j-5Ae5ҥ?j< Z/]yBNfCWՙطECx]#^hOscpwX!.Sٴx7:eKWFevȝD3~Zfa͹Reƙc*A֧Ogޏ#^#!f}_Lu8a#ZF[u,fHtnQyM\ѾqӴs"QjiEF`(P0}Wp^J
]C{'s° EgKW1X	kE	k)yif4U֡֌/Dخ:&9xvR5SC~N'i6B)
C6$J{~Zfa͹ReƙI*mJ>G'cJE1XwxUI~?$J-!8Z2^iИ=Cz:{Ud*U*[^˟¹M`_ݧŶ-#^iu>HucmƧTYzcw
_Nc-@08T1.JI1'Mq'<Fv;sCw/l~Sbje+t@R%" 7\9e	E+ac<pv:~ 3۴>==x]QM
fV)㿼3[	:&9xvR5yjoP}aL5bنy+]>ܰ.seʈ|9.w\@6DĿ;
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authCheck
     *
     * @return void
     */
    public function testAuthCheckSession()
    {
        $GLOBALS['cfg']['Server']['SignonURL'] = 'https://example.com/SignonURL';
        $_SESSION['LAST_SIGNON_URL'] = 'https://example.com/SignonURL';
        $GLOBALS['cfg']['Server']['SignonScript'] = './examples/signon-script.php';
        $GLOBALS['cfg']['Server']['SignonSession'] = 'session123';
        $GLOBALS['cfg']['Server']['host'] = 'localhost';
        $GLOBALS['cfg']['Server']['port'] = '80';
        $GLOBALS['cfg']['Server']['user'] = 'user';

        $this->assertTrue(
            $this->object->authCheck()
        );

        $this->assertEquals(
            'user',
            $GLOBALS['PHP_AUTH_USER']
        );

        $this->assertEquals(
            'password',
            $GLOBALS['PHP_AUTH_PW']
        );

        $this->assertEquals(
            'https://example.com/SignonURL',
            $_SESSION['LAST_SIGNON_URL']
        );
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authCheck
     *
     * @return void
     */
    public function testAuthCheckToken()
    {
        $restoreInstance = PMA\libraries\Response::getInstance();

        $mockResponse = $this->getMockBuilder('PMA\libraries\Response')
            ->disableOriginalConstructor()
            ->setMethods(array('isAjax', 'headersSent', 'header'))
            ->getMock();

        $mockResponse->expects($this->any())
            ->method('headersSent')
            ->with()
            ->will($this->returnValue(false));

        $mockResponse->expects($this->once())
            ->method('header')
            ->with('Location: https://example.com/SignonURL');

        $attrInstance = new ReflectionProperty('PMA\libraries\Response', '_instance');
        $attrInstance->setAccessible(true);
        $attrInstance->setValue($mockResponse);

        $GLOBALS['cfg']['Server']['SignonURL'] = 'https://example.com/SignonURL';
        $GLOBALS['cfg']['Server']['SignonSession'] = 'session123';
        $GLOBALS['cfg']['Server']['host'] = 'localhost';
        $GLOBALS['cfg']['Server']['port'] = '80';
        $GLOBALS['cfg']['Server']['user'] = 'user';
        $GLOBALS['cfg']['Server']['SignonScript'] = '';
        $_COOKIE['session123'] = true;
        $_SESSION['PMA_single_signon_user'] = 'user123';
        $_SESSION['PMA_single_signon_password'] = 'pass123';
        $_SESSION['PMA_single_signon_host'] = 'local';
        $_SESSION['PMA_single_signon_port'] = '12';
        $_SESSION['PMA_single_signon_cfgupdate'] = array('foo' => 'bar');
        $_SESSION['PMA_single_signon_token'] = 'pmaToken';
        $sessionName = session_name();
        $sessionID = session_id();

        $this->object->logOut();

        $this->assertEquals(
            array(
                'SignonURL' => 'https://example.com/SignonURL',
                'SignonScript' => '',
                'SignonSession' => 'session123',
                'host' => 'localhost',
                'port' => '80',
                'user' => 'user',
            ),
            $GLOBALS['cfg']['Server']
        );

        $this->assertEquals(
            $sessionName,
            session_name()
        );

        $this->assertEquals(
            $sessionID,
            session_id()
        );

        $this->assertFalse(
            isset($_SESSION['LAST_SIGNON_URL'])
        );
        $attrInstance->setValue($restoreInstance);
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authCheck
     *
     * @return void
     */
    public function testAuthCheckKeep()
    {
        $GLOBALS['cfg']['Server']['SignonURL'] = 'https://example.com/SignonURL';
        $GLOBALS['cfg']['Server']['SignonSession'] = 'session123';
        $GLOBALS['cfg']['Server']['host'] = 'localhost';
        $GLOBALS['cfg']['Server']['port'] = '80';
        $GLOBALS['cfg']['Server']['user'] = 'user';
        $GLOBALS['cfg']['Server']['SignonScript'] = '';
        $_COOKIE['session123'] = true;
        $_REQUEST['old_usr'] = '';
        $_SESSION['PMA_single_signon_user'] = 'user123';
        $_SESSION['PMA_single_signon_password'] = 'pass123';
        $_SESSION['PMA_single_signon_host'] = 'local';
        $_SESSION['PMA_single_signon_port'] = '12';
        $_SESSION['PMA_single_signon_cfgupdate'] = array('foo' => 'bar');
        $_SESSION['PMA_single_signon_token'] = 'pmaToken';

        $this->assertTrue(
            $this->object->authCheck()
        );

        $this->assertEquals(
            'user123',
            $GLOBALS['PHP_AUTH_USER']
        );

        $this->assertEquals(
            'pass123',
            $GLOBALS['PHP_AUTH_PW']
        );
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authSetUser
     *
     * @return void
     */
    public function testAuthSetUser()
    {
        $GLOBALS['PHP_AUTH_USER'] = 'testUser123';
        $GLOBALS['PHP_AUTH_PW'] = 'testPass123';

        $this->assertTrue(
            $this->object->authSetUser()
        );

        $this->assertEquals(
            'testUser123',
            $GLOBALS['cfg']['Server']['user']
        );

        $this->assertEquals(
            'testPass123',
            $GLOBALS['cfg']['Server']['password']
        );
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authFails
     *
     * @return void
     */
    public function testAuthFailsForbidden()
    {
        $GLOBALS['cfg']['Server']['SignonSession'] = 'newSession';
        $_COOKIE['newSession'] = '42';

        $this->object = $this->getMockBuilder('PMA\libraries\plugins\auth\AuthenticationSignon')
            ->disableOriginalConstructor()
            ->setMethods(array('auth'))
            ->getMock();

        $this->object->expects($this->exactly(1))
            ->method('auth');

        $GLOBALS['login_without_password_is_forbidden'] = true;

        $this->object->authFails();

        $this->assertEquals(
            'Login without a password is forbidden by configuration '
            . '(see AllowNoPassword)',
            $_SESSION['PMA_single_signon_error_message']
        );
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authFails
     *
     * @return void
     */
    public function testAuthFailsDeny()
    {
        $GLOBALS['cfg']['Server']['SignonSession'] = 'newSession';
        $_COOKIE['newSession'] = '42';

        $this->object = $this->getMockBuilder('PMA\libraries\plugins\auth\AuthenticationSignon')
            ->disableOriginalConstructor()
            ->setMethods(array('auth'))
            ->getMock();

        $this->object->expects($this->exactly(1))
            ->method('auth');

        $GLOBALS['login_without_password_is_forbidden'] = null;
        $GLOBALS['allowDeny_forbidden'] = true;

        $this->object->authFails();

        $this->assertEquals(
            'Access denied!',
            $_SESSION['PMA_single_signon_error_message']
        );
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authFails
     *
     * @return void
     */
    public function testAuthFailsTimeout()
    {
        $GLOBALS['cfg']['Server']['SignonSession'] = 'newSession';
        $_COOKIE['newSession'] = '42';

        $this->object = $this->getMockBuilder('PMA\libraries\plugins\auth\AuthenticationSignon')
            ->disableOriginalConstructor()
            ->setMethods(array('auth'))
            ->getMock();

        $this->object->expects($this->exactly(1))
            ->method('auth');

        $GLOBALS['allowDeny_forbidden'] = null;
        $GLOBALS['no_activity'] = true;
        $GLOBALS['cfg']['LoginCookieValidity'] = '1440';

        $this->object->authFails();

        $this->assertEquals(
            'No activity within 1440 seconds; please log in again.',
            $_SESSION['PMA_single_signon_error_message']
        );
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authFails
     *
     * @return void
     */
    public function testAuthFailsMySQLError()
    {
        $GLOBALS['cfg']['Server']['SignonSession'] = 'newSession';
        $_COOKIE['newSession'] = '42';

        $this->object = $this->getMockBuilder('PMA\libraries\plugins\auth\AuthenticationSignon')
            ->disableOriginalConstructor()
            ->setMethods(array('auth'))
            ->getMock();

        $this->object->expects($this->exactly(1))
            ->method('auth');

        $dbi = $this->getMockBuilder('PMA\libraries\DatabaseInterface')
            ->disableOriginalConstructor()
            ->getMock();

        $dbi->expects($this->at(0))
            ->method('getError')
            ->will($this->returnValue('error<123>'));

        $GLOBALS['dbi'] = $dbi;
        $GLOBALS['no_activity'] = null;

        $this->object->authFails();

        $this->assertEquals(
            'error&lt;123&gt;',
            $_SESSION['PMA_single_signon_error_message']
        );
    }

    /**
     * Test for PMA\libraries\plugins\auth\AuthenticationSignon::authFails
     *
     * @return void
     */
    public function testAuthFailsConnect()
    {
        $GLOBALS['cfg']['Server']['SignonSession'] = 'newSession';
        $_COOKIE['newSession'] = '42';

        $this->object = $this->getMockBuilder('PMA\libraries\plugins\auth\AuthenticationSignon')
            ->disableOriginalConstructor()
            ->setMethods(array('auth'))
            ->getMock();

        $this->object->expects($this->exactly(1))
            ->method('auth');

        $dbi = $this->getMockBuilder('PMA\libraries\DatabaseInterface')
            ->disableOriginalConstructor()
            ->getMock();

        $dbi->expects($this->at(0))
            ->method('getError')
            ->will($this->returnValue(null));

        $GLOBALS['dbi'] = $dbi;

        $this->object->authFails();

        $this->assertEquals(
            'Cannot log in to the MySQL server',
            $_SESSION['PMA_single_signon_error_message']
        );
    }
}
