2010-03-31 09:35:27 +09:00
|
|
|
|
<?php
|
2019-07-13 00:31:14 +09:00
|
|
|
|
// This file is part of GNU social - https://www.gnu.org/software/social
|
|
|
|
|
//
|
|
|
|
|
// GNU social is free software: you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// GNU social is distributed in the hope that it will be useful,
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
|
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
namespace Tests\Unit;
|
|
|
|
|
|
|
|
|
|
if (!defined('INSTALLDIR')) {
|
|
|
|
|
define('INSTALLDIR', dirname(dirname(__DIR__)));
|
|
|
|
|
}
|
2019-07-25 09:29:20 +09:00
|
|
|
|
if (!defined('PUBLICDIR')) {
|
|
|
|
|
define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public');
|
|
|
|
|
}
|
2019-07-13 00:31:14 +09:00
|
|
|
|
if (!defined('GNUSOCIAL')) {
|
|
|
|
|
define('GNUSOCIAL', true);
|
|
|
|
|
}
|
|
|
|
|
if (!defined('STATUSNET')) { // Compatibility
|
|
|
|
|
define('STATUSNET', true);
|
2010-03-31 09:35:27 +09:00
|
|
|
|
}
|
|
|
|
|
|
2019-07-13 00:31:14 +09:00
|
|
|
|
use PHPUnit\Framework\TestCase;
|
2020-06-24 20:42:05 +09:00
|
|
|
|
use PluginList;
|
2019-07-13 00:31:14 +09:00
|
|
|
|
use XmppPlugin;
|
2010-03-31 09:35:27 +09:00
|
|
|
|
|
2019-08-23 21:36:02 +09:00
|
|
|
|
require_once INSTALLDIR . '/lib/util/common.php';
|
2020-06-24 20:42:05 +09:00
|
|
|
|
require_once INSTALLDIR . '/plugins/Xmpp/XmppPlugin.php';
|
2010-03-31 09:35:27 +09:00
|
|
|
|
|
2019-07-13 00:31:14 +09:00
|
|
|
|
final class XmppValidateTest extends TestCase
|
2010-03-31 09:35:27 +09:00
|
|
|
|
{
|
2020-06-24 21:08:11 +09:00
|
|
|
|
protected function setUp(): void
|
2019-07-13 00:31:14 +09:00
|
|
|
|
{
|
2020-06-24 20:42:05 +09:00
|
|
|
|
if (!PluginList::isPluginActive('Xmpp')) {
|
2020-06-24 21:08:11 +09:00
|
|
|
|
static::markTestSkipped('XmppPlugin is not enabled.');
|
2019-07-13 00:31:14 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-31 09:35:27 +09:00
|
|
|
|
/**
|
|
|
|
|
* @dataProvider validationCases
|
2020-06-24 21:08:11 +09:00
|
|
|
|
*
|
2019-07-13 00:31:14 +09:00
|
|
|
|
* @param $jid
|
|
|
|
|
* @param $validFull
|
|
|
|
|
* @param $validBase
|
2010-03-31 09:35:27 +09:00
|
|
|
|
*/
|
|
|
|
|
public function testValidate($jid, $validFull, $validBase)
|
|
|
|
|
{
|
2019-07-13 00:31:14 +09:00
|
|
|
|
$xmpp = new TestXmppPlugin();
|
2020-06-24 21:08:11 +09:00
|
|
|
|
static::assertSame($validFull || $validBase, $xmpp->validate($jid));
|
|
|
|
|
static::assertSame($validFull, $xmpp->validateFullJid($jid), 'validating as full or base JID');
|
|
|
|
|
static::assertSame($validBase, $xmpp->validateBaseJid($jid), 'validating as base JID only');
|
2010-03-31 09:35:27 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider normalizationCases
|
2020-06-24 21:08:11 +09:00
|
|
|
|
*
|
2019-07-13 00:31:14 +09:00
|
|
|
|
* @param $jid
|
|
|
|
|
* @param $expected
|
2010-03-31 09:35:27 +09:00
|
|
|
|
*/
|
|
|
|
|
public function testNormalize($jid, $expected)
|
|
|
|
|
{
|
2019-07-13 00:31:14 +09:00
|
|
|
|
$xmpp = new XmppPlugin();
|
2020-06-24 21:08:11 +09:00
|
|
|
|
static::assertSame($expected, $xmpp->normalize($jid));
|
2010-03-31 09:35:27 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider domainCheckCases()
|
2020-06-24 21:08:11 +09:00
|
|
|
|
*
|
2019-07-13 00:31:14 +09:00
|
|
|
|
* @param $domain
|
|
|
|
|
* @param $expected
|
|
|
|
|
* @param $note
|
2010-03-31 09:35:27 +09:00
|
|
|
|
*/
|
|
|
|
|
public function testDomainCheck($domain, $expected, $note)
|
|
|
|
|
{
|
2019-07-13 00:31:14 +09:00
|
|
|
|
$xmpp = new TestXmppPlugin();
|
2020-06-24 21:08:11 +09:00
|
|
|
|
static::assertSame($expected, $xmpp->checkDomain($domain), $note);
|
2010-03-31 09:35:27 +09:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-24 21:08:11 +09:00
|
|
|
|
public static function validationCases()
|
2010-03-31 09:35:27 +09:00
|
|
|
|
{
|
2020-06-24 21:08:11 +09:00
|
|
|
|
$long1023 = 'long1023' . str_repeat('x', 1023 - 8);
|
|
|
|
|
$long1024 = 'long1024' . str_repeat('x', 1024 - 8);
|
|
|
|
|
return [
|
2010-03-31 09:35:27 +09:00
|
|
|
|
// Our own test cases for standard things & those mentioned in bug reports
|
|
|
|
|
// (jid, valid_full, valid_base)
|
2020-06-24 21:08:11 +09:00
|
|
|
|
['user@example.com', true, true],
|
|
|
|
|
['user@example.com/resource', true, false],
|
|
|
|
|
['user with spaces@example.com', false, false], // not kosher
|
2010-03-31 09:35:27 +09:00
|
|
|
|
|
2020-06-24 21:08:11 +09:00
|
|
|
|
['user.@example.com', true, true], // "common in intranets"
|
|
|
|
|
['example.com', true, true],
|
|
|
|
|
['example.com/resource', true, false],
|
|
|
|
|
['jabchat', true, true],
|
2019-07-13 00:31:14 +09:00
|
|
|
|
|
2020-06-24 21:08:11 +09:00
|
|
|
|
["{$long1023}@{$long1023}/{$long1023}", true, false], // max 1023 "bytes" per portion per spec. Do they really mean bytes though?
|
|
|
|
|
["{$long1024}@{$long1023}/{$long1023}", false, false],
|
|
|
|
|
["{$long1023}@{$long1024}/{$long1023}", false, false],
|
|
|
|
|
["{$long1023}@{$long1023}/{$long1024}", false, false],
|
2010-03-31 09:35:27 +09:00
|
|
|
|
|
|
|
|
|
// Borrowed from test_jabber_jutil.c in libpurple
|
2020-06-24 21:08:11 +09:00
|
|
|
|
['gmail.com', true, true],
|
|
|
|
|
['gmail.com/Test', true, false],
|
|
|
|
|
['gmail.com/Test@', true, false],
|
|
|
|
|
['gmail.com/@', true, false],
|
|
|
|
|
['gmail.com/Test@alkjaweflkj', true, false],
|
|
|
|
|
['mark.doliner@gmail.com', true, true],
|
|
|
|
|
['mark.doliner@gmail.com/Test12345', true, false],
|
|
|
|
|
['mark.doliner@gmail.com/Test@12345', true, false],
|
|
|
|
|
['mark.doliner@gmail.com/Te/st@12@//345', true, false],
|
|
|
|
|
['わいど@conference.jabber.org', true, true],
|
|
|
|
|
['まりるーむ@conference.jabber.org', true, true],
|
|
|
|
|
['mark.doliner@gmail.com/まりるーむ', true, false],
|
|
|
|
|
['mark.doliner@gmail/stuff.org', true, false],
|
|
|
|
|
['stuart@nödåtXäYZ.se', true, true],
|
|
|
|
|
['stuart@nödåtXäYZ.se/まりるーむ', true, false],
|
|
|
|
|
['mark.doliner@わいど.org', true, true],
|
|
|
|
|
['nick@まつ.おおかみ.net', true, true],
|
|
|
|
|
['paul@10.0.42.230/s', true, false],
|
|
|
|
|
['paul@[::1]', true, true], // IPv6
|
|
|
|
|
['paul@[2001:470:1f05:d58::2]', true, true],
|
|
|
|
|
['paul@[2001:470:1f05:d58::2]/foo', true, false],
|
|
|
|
|
['pa=ul@10.0.42.230', true, true],
|
|
|
|
|
['pa,ul@10.0.42.230', true, true],
|
|
|
|
|
|
|
|
|
|
['@gmail.com', false, false],
|
|
|
|
|
['@@gmail.com', false, false],
|
|
|
|
|
['mark.doliner@@gmail.com/Test12345', false, false],
|
|
|
|
|
['mark@doliner@gmail.com/Test12345', false, false],
|
|
|
|
|
['@gmail.com/Test@12345', false, false],
|
|
|
|
|
['/Test@12345', false, false],
|
|
|
|
|
['mark.doliner@', false, false],
|
|
|
|
|
['mark.doliner/', false, false],
|
|
|
|
|
['mark.doliner@gmail_stuff.org', false, false],
|
|
|
|
|
['mark.doliner@gmail[stuff.org', false, false],
|
|
|
|
|
['mark.doliner@gmail\\stuff.org', false, false],
|
|
|
|
|
['paul@[::1]124', false, false],
|
|
|
|
|
['paul@2[::1]124/as', false, false],
|
|
|
|
|
["paul@まつ.おおかみ/\x01", false, false],
|
2010-03-31 09:35:27 +09:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* RFC 3454 Section 6 reads, in part,
|
|
|
|
|
* "If a string contains any RandALCat character, the
|
|
|
|
|
* string MUST NOT contain any LCat character."
|
|
|
|
|
* The character is U+066D (ARABIC FIVE POINTED STAR).
|
|
|
|
|
*/
|
|
|
|
|
// Leaving this one commented out for the moment
|
|
|
|
|
// as it shouldn't hurt anything for our purposes.
|
|
|
|
|
//array("foo@example.com/٭simplexe٭", false, false)
|
2020-06-24 21:08:11 +09:00
|
|
|
|
];
|
2010-03-31 09:35:27 +09:00
|
|
|
|
}
|
2019-07-13 00:31:14 +09:00
|
|
|
|
|
2020-06-24 21:08:11 +09:00
|
|
|
|
public static function normalizationCases()
|
2010-03-31 09:35:27 +09:00
|
|
|
|
{
|
2020-06-24 21:08:11 +09:00
|
|
|
|
return [
|
2010-03-31 09:35:27 +09:00
|
|
|
|
// Borrowed from test_jabber_jutil.c in libpurple
|
2020-06-24 21:08:11 +09:00
|
|
|
|
['PaUL@DaRkRain42.org', 'paul@darkrain42.org'],
|
|
|
|
|
['PaUL@DaRkRain42.org/', 'paul@darkrain42.org'],
|
|
|
|
|
['PaUL@DaRkRain42.org/resource', 'paul@darkrain42.org'],
|
2010-03-31 09:35:27 +09:00
|
|
|
|
|
|
|
|
|
// Also adapted from libpurple tests...
|
2020-06-24 21:08:11 +09:00
|
|
|
|
['Ф@darkrain42.org', 'ф@darkrain42.org'],
|
|
|
|
|
['paul@Өarkrain.org', 'paul@өarkrain.org'],
|
|
|
|
|
];
|
2010-03-31 09:35:27 +09:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-24 21:08:11 +09:00
|
|
|
|
public static function domainCheckCases()
|
2010-03-31 09:35:27 +09:00
|
|
|
|
{
|
2020-06-24 21:08:11 +09:00
|
|
|
|
return [
|
|
|
|
|
['gmail.com', true, 'known SRV record'],
|
|
|
|
|
['jabber.org', true, 'known SRV record'],
|
|
|
|
|
['status.net', true, 'known SRV record'],
|
|
|
|
|
['status.leuksman.com', true, 'known no SRV record but valid domain'],
|
|
|
|
|
];
|
2010-03-31 09:35:27 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-13 00:31:14 +09:00
|
|
|
|
class TestXmppPlugin extends XmppPlugin
|
|
|
|
|
{
|
|
|
|
|
public function checkDomain($domain)
|
|
|
|
|
{
|
|
|
|
|
return parent::checkDomain($domain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function validateBaseJid($jid, $check_domain = false)
|
|
|
|
|
{
|
|
|
|
|
return parent::validateBaseJid($jid, $check_domain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function validateFullJid($jid, $check_domain = false)
|
|
|
|
|
{
|
|
|
|
|
return parent::validateFullJid($jid, $check_domain);
|
|
|
|
|
}
|
|
|
|
|
}
|