From c20321e7e0e4c3d304ae7a56c609567b4a80ec55 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julius=20H=C3=A4rtl?= <jus@bitgrid.net>
Date: Thu, 2 Apr 2020 19:37:40 +0200
Subject: [PATCH] Add tests for encoded group id
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Julius Härtl <jus@bitgrid.net>
Signed-off-by: npmbuildbot[bot] <npmbuildbot[bot]@users.noreply.github.com>
---
 .../tests/Controller/GroupsControllerTest.php |  84 +++++++++++++++---
 apps/settings/js/vue-6.js                     | Bin 52151 -> 52380 bytes
 apps/settings/js/vue-6.js.map                 | Bin 145144 -> 145517 bytes
 .../js/vue-settings-apps-users-management.js  | Bin 262115 -> 262175 bytes
 .../vue-settings-apps-users-management.js.map | Bin 1241120 -> 1241204 bytes
 5 files changed, 74 insertions(+), 10 deletions(-)

diff --git a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php
index 0ed6d58e217..34bcdd4e645 100644
--- a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php
+++ b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php
@@ -75,13 +75,13 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->userSession = $this->createMock(IUserSession::class);
 		$this->accountManager = $this->createMock(AccountManager::class);
 		$this->logger = $this->createMock(ILogger::class);
-		
+
 		$this->subAdminManager = $this->createMock(SubAdmin::class);
 
 		$this->groupManager
 				->method('getSubAdmin')
 				->willReturn($this->subAdminManager);
-		
+
 		$this->api = $this->getMockBuilder(GroupsController::class)
 			->setConstructorArgs([
 				'provisioning_api',
@@ -256,7 +256,6 @@ class GroupsControllerTest extends \Test\TestCase {
 				'disabled' => 11,
 				'canAdd' => true,
 				'canRemove' => true
-				
 			]
 		]], $result->getData());
 	}
@@ -285,7 +284,7 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->assertEquals(['users' => ['user1', 'user2']], $result->getData());
 	}
 
-	
+
 	public function testGetGroupAsIrrelevantSubadmin() {
 		$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
 		$this->expectExceptionCode(403);
@@ -330,7 +329,7 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->assertEquals(['users' => ['user1', 'user2']], $result->getData());
 	}
 
-	
+
 	public function testGetGroupNonExisting() {
 		$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
 		$this->expectExceptionMessage('The requested group could not be found');
@@ -341,7 +340,7 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->api->getGroup($this->getUniqueID());
 	}
 
-	
+
 	public function testGetSubAdminsOfGroupsNotExists() {
 		$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
 		$this->expectExceptionMessage('Group does not exist');
@@ -388,7 +387,7 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->assertEquals([], $result->getData());
 	}
 
-	
+
 	public function testAddGroupEmptyGroup() {
 		$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
 		$this->expectExceptionMessage('Invalid group name');
@@ -397,7 +396,7 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->api->addGroup('');
 	}
 
-	
+
 	public function testAddGroupExistingGroup() {
 		$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
 		$this->expectExceptionCode(102);
@@ -438,7 +437,7 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->api->addGroup('Iñtërnâtiônàlizætiøn');
 	}
 
-	
+
 	public function testDeleteGroupNonExisting() {
 		$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
 		$this->expectExceptionCode(101);
@@ -446,7 +445,7 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->api->deleteGroup('NonExistingGroup');
 	}
 
-	
+
 	public function testDeleteAdminGroup() {
 		$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
 		$this->expectExceptionCode(102);
@@ -478,6 +477,25 @@ class GroupsControllerTest extends \Test\TestCase {
 		$this->api->deleteGroup('ExistingGroup');
 	}
 
+	public function testDeleteGroupEncoding() {
+		$this->groupManager
+			->method('groupExists')
+			->with('ExistingGroup A/B')
+			->willReturn('true');
+
+		$group = $this->createGroup('ExistingGroup');
+		$this->groupManager
+			->method('get')
+			->with('ExistingGroup A/B')
+			->willReturn($group);
+		$group
+			->expects($this->once())
+			->method('delete')
+			->willReturn(true);
+
+		$this->api->deleteGroup(urlencode('ExistingGroup A/B'));
+	}
+
 	public function testGetGroupUsersDetails() {
 		$gid = 'ncg1';
 
@@ -523,4 +541,50 @@ class GroupsControllerTest extends \Test\TestCase {
 
 		$this->api->getGroupUsersDetails($gid);
 	}
+
+	public function testGetGroupUsersDetailsEncoded() {
+		$gid = 'Department A/B C/D';
+
+		$this->asAdmin();
+		$this->useAccountManager();
+
+		$users = [
+			'ncu1' => $this->createUser('ncu1'), # regular
+			'ncu2' => $this->createUser('ncu2'), # the zombie
+		];
+		$users['ncu2']->expects($this->atLeastOnce())
+			->method('getHome')
+			->willThrowException(new NoUserException());
+
+		$this->userManager->expects($this->any())
+			->method('get')
+			->willReturnCallback(function(string $uid) use ($users) {
+				return isset($users[$uid]) ? $users[$uid] : null;
+			});
+
+		$group = $this->createGroup($gid);
+		$group->expects($this->once())
+			->method('searchUsers')
+			->with('', null, 0)
+			->willReturn(array_values($users));
+
+		$this->groupManager
+			->method('get')
+			->with($gid)
+			->willReturn($group);
+		$this->groupManager->expects($this->any())
+			->method('getUserGroups')
+			->willReturn([$group]);
+
+		/** @var \PHPUnit_Framework_MockObject_MockObject */
+		$this->subAdminManager->expects($this->any())
+			->method('isSubAdminOfGroup')
+			->willReturn(false);
+		$this->subAdminManager->expects($this->any())
+			->method('getSubAdminsGroups')
+			->willReturn([]);
+
+
+		$this->api->getGroupUsersDetails(urlencode($gid));
+	}
 }
diff --git a/apps/settings/js/vue-6.js b/apps/settings/js/vue-6.js
index 1e149e192d0f70199bc62afce75ee0ddc84af5f3..9ecff6edfcf1032420c3723d8a24137d6ff5b600 100644
GIT binary patch
delta 517
zcmdl!oq5ho<_&ikIZREB%~DfSjVC{0Y~?UBv@kKXNHW-5$P~-OVPtAxkeq6oHu)OM
zRrX}_v{cg+v(1}W9||)DZJr|eo0l<b@&xq?#;VCuvkQRip4rMka^q~H$rm)Nfl7EZ
z4fz<WHrtukF#*-snd?l}a|qsSW3_=1iJN0{7QtOPncw~sL~^s9!+D^@=6{YiA-dH!
z|98=q<My=8)63Hc*VGBIooqN)XLEA03?rlG=7tmrM#hlIGgH@y6sP8-CYPk9xEJM@
z7PzD)=clBmOcqQRR!af1LxVh>^K%RG^HTFlG)giui}g@6Xl`~+n{5F1`sQcTOxbZ6
zDKWV$jZcp_W3BQ^b8>2RN+<iJiB0YoW1AeXP;9f`yp@7dc_0^}xGGhzq$o32Lv!=r
z^`%_$shA2%^fFU4Yk@!~x@5BA_N2}Ccm3q&fcjNu^54lSlmDKIfJNElnA7eerpc+6
U=7t6a#s+CgCP^k{rbeb|00!W@H2?qr

delta 328
zcmbO;lX?4e<_&ikIgC>i(~?Y#EG9o;Y~?VuOfpF^wlv>d$P~-Ok!p}=W^80+H2E6K
zRrbWh)Kp80l+Bx19||*OZJr|eo0qX_@&xq?#-PcZ8U;Z1?b*tVRg>lzO}?OE4OGFS
zX~+kZTew7hbE<hb6NEWg(;;HBjnxK5ByNt)Sp;|8WPbZkP;HtHSD+G`Rh>3LOsJcD
zz>aHkg6kPs?hxBNy*!O@O&w3$$qjRLHYX>`FfxX0Zb*?}Wb~XoGj+}8DQPne;J(;w
zI^C3g^Tm001ljaTiZXLGHXq+m%EeQnmzh!v1Uk_rdXvxZ5SzSyoA>6uyMOXe-g~+h
f=IhChXWT_hj4cceO-)RUk}ZtWObsjz%neciJvew<

diff --git a/apps/settings/js/vue-6.js.map b/apps/settings/js/vue-6.js.map
index 67d68a09e573fed5945e011e2f3c726f70f92d45..255f5b85d35dddeff54eb6941244a6d933aba070 100644
GIT binary patch
delta 2713
zcmb7GTTE0(7|uCvyGL6QirlOuCz=wF0rqy5rNx@rg+040uplC#!8Ut2z;fBM%U-y&
zSSkceAZjvAPam4vs<kGj8a)rBHO89QOZw9K(uX#+YTK74T9f)<Vq!Zpdv=!vV&r8q
z^Z(!f&-eZRoH_I89(V5ncjB(jX11Epo##zDOTR=WyU+<;g&Jgv8J$Hi`>5p;wp8c0
z1sf<%@JoI=F-rXbI<X3ZKyd2JrrJ$9e}mtTzS8mN7P}3_alTt@zFMds<X)1(0XZmj
z?{_=o(TE(D!f`aQ?aM-GL<+>Epg1NcB25y31l5}STa9l-?XU%c9_WFf+5wv(2*3`q
z?t~!bfDQ=8n}{`Lhi(Wa>D&v4>;y83$0)_%NQ|^luMZ}vcM^5A?J66>c8tWMjb``3
zF=|PmV{Jz7U=#6%@R*>ny)aBIG9FD7-vi^+g8jgtS*EDPKrED1H*BDmYLwSLtT$tx
zJ<y`gv>#wuA%uQ6m8<`DoG*7{r4)wMB$|n)wv2MD0<XO*mE(0UJV;XYWV!gsI)Hu-
z4_2G03=1A7X>b>8pcY&TLKKtmX=0)%BwyhMMG`w8A`s!h6kQnbC_Bl{!*(c8lNFES
zPKd`|n52CfM-!3VTpgVcd(_jBs|;&%Aph7oCZfI&^XZGc05<|RBi;g<A#7^~oe*}b
zlT!|c8x?UL*qc;uyj{j@l|{@6`lvsG{(fgMKPmzl$I5mfLMV=j=#rmDZ_a$wD0>L1
zGcJ;p?t};=2&H6dH7-*0M8+3@Fo25(y#y>K(e&Y(J+WpQIh6yV3r~`|ya@-52_f%X
zDQEQHZooDf$#XlodTk$c^SwQ<X$wq&Y@=m$rM7cGSV!eroK_bh<pFL?Hywhe-!13r
zQ`kv#f1#u}?MWqblRdl4A}ZKbf=(XkK-QTXtCUx#l-FsDa+G6VuJXEdlxv_?QjLu%
zw`*jz4DG3UK9llv2>NNEc-;bMfR+^nP){ByVk&a`Zm@$8J{}>v(N1?C*Yu-bW?eP8
z9mdcB3>~l!I5#d;)TCyTRIlmtkdqup+j@P@Mxh@UN^<m;txg<ru8@p-z5{uW{)*n3
z=T|8=rInjkDgSJKwQ>wiDNm8!Sd(AZ2xgMlHlo~w9?$XX3eM!i?Z`RgMDSll11^m-
z@Q}}z-Vsjp@oX{7Jpdt>b^wN4IR_y1Ibd%}dG_NUa-py1Ye4SV$ly9Qel(m~figMv
zQzBE@@8BsXBOA2lODJ8Pw|#A$tjM?6wRPA<JZ<z_A3@g_Uv3?B0sJq4QM-2WhEv6v
zYSM~j_0Wn&QsyYVnM8muD+e8h9Q2j~-T0awMiomuE5wj%$-G?%NDcKygTZX*_gnlH
zt6&oP)#FPq>N%5OFa#u_AMHC`s$M~b3?~R?t0YNgbV1pnK6rnY(Ff}LB_U`<d1uR1
z^Z|xgjW&y5^BdF)O3jws6pue`WL8=pZcguTNcry|Q>q>~qh>Oyd1vP`3z8mP{`@|t
zZFfkyX=2OOZ_eG`ymRf-qjG?}H)=z{D)o!Y=I#3Q%j5R9SASD3o?^D9E$Gfag%v^i
zE?N0>sf-VXVzsfAkC&?D<7b%byEE*Ss$K>t*S=?7Q49iGOlE<MlhjMOA+UdBE!Q4i
zQcf_8Zu#yH%uzG{G|v1qKdtP2#DL{fPnd!&X|BsE$3D?3?mRY!zG5h1pHmK(u-sny
z%HsF&&nAd}l@BLIM*6~i@xJ&pSU#W6ez>!IJz}9?ZG0>=T3NN+TEiaKr(3R-z`|}*
a?tjM=D76BcO#4W`NCo~(8<dMy*8M+fa!f`5

delta 2540
zcmb7EZERCj7|y+0?47W%F<1b%Scf2Cm#yu+?QJ6{r(d_D>pq-Vt5MRmrR%oRZtG-B
z=cdDrzy@RQuws~z2+NEyMsDIX#IM9;(GbPIMiKpGq7Y;Jp#jlz&i%knVzwXm%{lMq
z^FH@I@3mjKKdy08KNhz;qXPVJm#sK1N;Z6`fvMuHN}Q==irXEMg=$`BHx#?#(YWg8
zvXFyNl&}(ip(rlciI*}`R993aNe=j+_&&J8u7Mm*c7-idDoh<5Os#oOd8+K2om>p<
zL3|hmp(Rvxf1DhXZp8O^kO%R#REl2YLwpovu|ACY;AE&~ql=!C*vIKnt=;$>Mj5yi
zvNlWfj4gaWjg6oVFR`Yuv{C;sIzTlUEG?QQM>RNtx42OQ;`btfYD8#k>M{*rO&A?g
zK5BZDWd~ERN~l(>t#4I3Lx_4|h!`}M&00f<@1yq!Y9W!Ww@W`p?qS%H>8Kr`NDpC&
zKOEeK1ga6S#JF(HsD`}@-p^d*BtMCD_~F^Cna|1O(vM}vPlCJLXppKbSRV8vEF&mO
z>Ft5V>}JkR&$WA$-?ASvti=uQ_Rce%$`gH2Q)ztz??Wi$!}w8~a(U3ha9uKvN0FRz
z&vP4@(zJ}RpeWyp(B1=phK`kGWIp3YDC6d3gygIYUpJWHz^E5?KmYj7bdY$q_R1t}
zL!Zni5K83KTfa;ro-u4Ogkq#{GjW!4F!{oc?L9skIZ)t4FTor&HTQdHOcHv=H*kYN
zK7{e7;pBJ~XV>aLW_bIscEJ!x87*r-E$2a~-ba9nelb8m1^EUH_f8>deuBy8rJi;*
z$H4%_shYj?j7JBB^&F*Y-39`$%?d5YY*04pfXR{1mT=@$IdW;(3pm2ILXKQ_;7D_7
zBp6o4(SsUTEkhISVqjSuIbrg}YH@j7XzBM9P;p~x;iy>Ld<suh%58O182uU%U_Bhz
zQ8*OX6)y|CFly;vU0Kf$X+0ZBoc|e(PCpq9=bc8w0@X*%((>9iDkS|z=N<6vk@N8L
zsF~Bdhbv>1oYCyfu>hwx3s=Y2m#wThedujELyna+w=`<yqhCpXoskFsAAR~s<L|7m
zm9;;|2g$3aYsL?sj8!6?4)qlz1KKcjsIN@t$FQpZ|Mu?a2tecE9lTE662F#}KaE}5
zm|!Gotw)wVj{ljGB-}W9uVZ;rViagHxVku;3Xn^PKK@RX0>O)yJ_>8R*wl?<^Q-$I
zjh{o>E%+(ML9gx<qzref3DR`Y$vobD9xCeHbm@_;wKwUZtC`2E-r@GZ#6$(#*$ZbU
zgmt3ev|8<=Xp1?8{dSAXB3a_fPZO(6T*4A{2sWDyzIt^73?KhEKO(W^u<L9o>^mWu
z64CwbqRpw)pPFS%(P$#!a>ny!iQTCD@^S^k*<I~oTyRNHe`*uN&U}C2v{+J@aqzU5
z&n_~haCN2}cE7fMdJZR^FN4cd71MK7@a5zK({m3)`i;&14%-KBze3y&!O*!ihC!J*
zcWDWTk-4ry4Xm2KuH(G$=B*Mg*_-Ll)}`XgCPi4s@cHm{W}7m!IP={?_jyLST{S-&
z!PeuSGh6c4B1|PY#f-|78{h9T;pU8?UAXxLvrAm9S1=Emhw`icWcY=b{$|SWUYIRm
zZ<!X>u4SjIN|LE~U9LBk-nQ^*9ecv0BUFoCbg(sQQG9yZuwj<}GA_83lz-C6uKfo`
CUIsJ(

diff --git a/apps/settings/js/vue-settings-apps-users-management.js b/apps/settings/js/vue-settings-apps-users-management.js
index b1449d33ebb43e5b4b490c919478da1098d6acd1..a1cde0dff88ab5adde4dd4eb6dfd7bc7aeae41d7 100644
GIT binary patch
delta 150
zcmaF-pMQRXz=n@ZBBsfymga^A2F3<yNhV1qW~N4_Y0a$6?X1j<K+LqAm6=)XplE7d
za(+r`XppCKer`d2UTR*6MyBR=og>WGS*L$E$t=2^<rH%zvnZyjR87t46OS^BPOrPd
n%r$+(9cHfW%g-`v7>O7q8YUVUrx;rrq@@{HCM6lAnIr)KsAn=l

delta 97
zcmbQ=An^D<|AvoDA|}QbhK8mlCPv8?#%ZPomImeqDb1|R?X1j<K+LqAm6=)XAY<ls
zha=3_SsC-T>zrb)WM<Ty{`v~D=Jv;DnKg_=EE7!(%?-`XEi97^6HUxhOj8Y00jO&o
ACIA2c

diff --git a/apps/settings/js/vue-settings-apps-users-management.js.map b/apps/settings/js/vue-settings-apps-users-management.js.map
index c8277b5284aa6211bdceee07b180573d8068d103..217763eeb6fbb88a155697bc9c620f902684351b 100644
GIT binary patch
delta 391
zcmZ4R!28Ps?}iq}7N!>F7M3lnTfewD>f|~(I_5g%W;*M5Iy&aL>SQ_t`R)Z3&N{9@
zzPnB~NZz9|!v)OufT;H@GI!Q-cXSK|YH~L8nttIY>!s~Szp@swTEa}Us05ps<Emo>
zG{M46A7X-~8`wk(caVud6M{h|6nGXHyG`%sVbj<?;Wz6YCP}y<<<2_ZP(`M0#)e=;
zI@?$NW6jeQF-kN{G%`*xwlqjfGq6lbGD<T^+ODm`wvJWAG&$AM+|a<l*dQ&*B+10g
z)W|fg{jDJz5VHd@2M}`tF&7YX12GQ}^8zs+5c31E01yjqe`_dI<U8G`UPzKjvv&H+
zHX+~XUKfRww_mFla_0hxOR#39Xac3)w+U%%_v;d3WRpnEOU_S84Gr>i&d)8#&r8iK
U(MSg=n!bCvkm>f02|_dC0hFVKDgXcg

delta 331
zcmezJz<a?1?}iq}7N!>F7M3lnTff-lW;*M*J33~#=wv!OI%>NXR5<InIy&mR>SQ|s
z`EHd!84%x1Cl|zbFER(K57qH>bT09nF8_`7()P1oS&LW=EGoe=`p!B=K$Qlr`VgIl
z5R(kRCIM{<2I<W3C^DXI&&Z~^eZg<mJ50P5<<3B1$3T!=#q<aNS#`GW{l{9QD`J^w
zVrXt?Zf;?jWSD4To?@D6n7Z9rhix6Jh>5X<p`odXiBYnJahj=trGdFYN;|6&8xXSt
zF$WNH0x=g5a|1CC5c2{t9}x2cu>cSYZf7+TD)MDbFUl`1*gm0NXeZb7m@Xj>#@gx9
j?Lr#c`?`b}*;vvuQ#7Yvs25V5zM)G<VEdg3LNnq4yv}4%

-- 
GitLab