| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  | <?php | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01: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 01:29:20 +01:00
										 |  |  |  | if (!defined('PUBLICDIR')) { | 
					
						
							|  |  |  |  |     define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); | 
					
						
							|  |  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  | if (!defined('GNUSOCIAL')) { | 
					
						
							|  |  |  |  |     define('GNUSOCIAL', true); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | if (!defined('STATUSNET')) { // Compatibility
 | 
					
						
							|  |  |  |  |     define('STATUSNET', true); | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  | use PHPUnit\Framework\TestCase; | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |  | use PluginList; | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  | use XmppPlugin; | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-23 13:36:02 +01:00
										 |  |  |  | require_once INSTALLDIR . '/lib/util/common.php'; | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |  | require_once INSTALLDIR . '/plugins/Xmpp/XmppPlugin.php'; | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  | final class XmppValidateTest extends TestCase | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |     protected function setUp(): void | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-06-24 12:42:05 +01:00
										 |  |  |  |         if (!PluginList::isPluginActive('Xmpp')) { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |             static::markTestSkipped('XmppPlugin is not enabled.'); | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     /** | 
					
						
							|  |  |  |  |      * @dataProvider validationCases | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |      * @param $jid | 
					
						
							|  |  |  |  |      * @param $validFull | 
					
						
							|  |  |  |  |      * @param $validBase | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     public function testValidate($jid, $validFull, $validBase) | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |         $xmpp = new TestXmppPlugin(); | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01: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-30 17:35:27 -07:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /** | 
					
						
							|  |  |  |  |      * @dataProvider normalizationCases | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |      * @param $jid | 
					
						
							|  |  |  |  |      * @param $expected | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     public function testNormalize($jid, $expected) | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |         $xmpp = new XmppPlugin(); | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |         static::assertSame($expected, $xmpp->normalize($jid)); | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     /** | 
					
						
							|  |  |  |  |      * @dataProvider domainCheckCases() | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |      * @param $domain | 
					
						
							|  |  |  |  |      * @param $expected | 
					
						
							|  |  |  |  |      * @param $note | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |      */ | 
					
						
							|  |  |  |  |     public function testDomainCheck($domain, $expected, $note) | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  |         $xmpp = new TestXmppPlugin(); | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |         static::assertSame($expected, $xmpp->checkDomain($domain), $note); | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |     public static function validationCases() | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |         $long1023 = 'long1023' . str_repeat('x', 1023 - 8); | 
					
						
							|  |  |  |  |         $long1024 = 'long1024' . str_repeat('x', 1024 - 8); | 
					
						
							|  |  |  |  |         return [ | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |             // Our own test cases for standard things & those mentioned in bug reports
 | 
					
						
							|  |  |  |  |             // (jid, valid_full, valid_base)
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |             ['user@example.com', true, true], | 
					
						
							|  |  |  |  |             ['user@example.com/resource', true, false], | 
					
						
							|  |  |  |  |             ['user with spaces@example.com', false, false], // not kosher
 | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |             ['user.@example.com', true, true], // "common in intranets"
 | 
					
						
							|  |  |  |  |             ['example.com', true, true], | 
					
						
							|  |  |  |  |             ['example.com/resource', true, false], | 
					
						
							|  |  |  |  |             ['jabchat', true, true], | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01: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-30 17:35:27 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             // Borrowed from test_jabber_jutil.c in libpurple
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01: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-30 17:35:27 -07: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 13:08:11 +01:00
										 |  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |     public static function normalizationCases() | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |         return [ | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |             // Borrowed from test_jabber_jutil.c in libpurple
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |             ['PaUL@DaRkRain42.org', 'paul@darkrain42.org'], | 
					
						
							|  |  |  |  |             ['PaUL@DaRkRain42.org/', 'paul@darkrain42.org'], | 
					
						
							|  |  |  |  |             ['PaUL@DaRkRain42.org/resource', 'paul@darkrain42.org'], | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             // Also adapted from libpurple tests...
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |             ['Ф@darkrain42.org', 'ф@darkrain42.org'], | 
					
						
							|  |  |  |  |             ['paul@Өarkrain.org', 'paul@өarkrain.org'], | 
					
						
							|  |  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01:00
										 |  |  |  |     public static function domainCheckCases() | 
					
						
							| 
									
										
										
										
											2010-03-30 17:35:27 -07:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-06-24 13:08:11 +01: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-30 17:35:27 -07:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01: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); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |