From 7d8a915ee0887a293b16a9da18c8779b4309c345 Mon Sep 17 00:00:00 2001 From: Aditya Toshniwal Date: Tue, 15 Apr 2025 11:25:31 +0530 Subject: [PATCH] Add support for custom roles and role permissions management in pgAdmin. #7310 --- docs/en_US/images/add_role.png | Bin 0 -> 26593 bytes docs/en_US/images/permissions.png | Bin 0 -> 89281 bytes docs/en_US/images/roles.png | Bin 0 -> 47028 bytes docs/en_US/images/user.png | Bin 72128 -> 0 bytes docs/en_US/images/users.png | Bin 0 -> 63918 bytes docs/en_US/user_management.rst | 88 +++++-- web/migrations/versions/1f0eddc8fc79_.py | 14 ++ web/pgadmin/__init__.py | 2 + .../browser/server_groups/servers/__init__.py | 4 +- .../databases/schemas/static/js/schema.js | 4 +- .../schemas/tables/static/js/table.js | 4 +- .../servers/databases/static/js/database.js | 4 +- .../server_groups/servers/static/js/server.js | 7 +- .../browser/static/js/MainMenuFactory.js | 6 +- web/pgadmin/browser/static/js/browser.js | 1 + web/pgadmin/browser/static/js/collection.js | 4 + web/pgadmin/browser/static/js/constants.js | 18 ++ web/pgadmin/browser/static/js/node.js | 7 +- .../browser/static/js/withCheckPermission.js | 27 +++ .../static/js/components/SectionContainer.jsx | 3 +- web/pgadmin/misc/file_manager/__init__.py | 33 ++- .../static/js/components/FileManager.jsx | 2 +- .../workspaces/static/js/WorkspaceToolbar.jsx | 22 +- web/pgadmin/model/__init__.py | 44 ++++ web/pgadmin/static/js/Theme/dark.js | 7 +- web/pgadmin/static/js/Theme/high_contrast.js | 7 +- web/pgadmin/static/js/Theme/index.jsx | 8 +- web/pgadmin/static/js/Theme/light.js | 7 +- .../static/js/components/FormComponents.jsx | 3 +- web/pgadmin/static/js/helpers/Menu.js | 7 +- web/pgadmin/tools/backup/__init__.py | 17 +- web/pgadmin/tools/backup/static/js/backup.js | 6 + web/pgadmin/tools/debugger/__init__.py | 3 + .../debugger/static/js/DebuggerModule.js | 12 +- web/pgadmin/tools/erd/__init__.py | 3 + web/pgadmin/tools/erd/static/js/ERDModule.js | 3 +- web/pgadmin/tools/grant_wizard/__init__.py | 13 +- .../grant_wizard/static/js/grant_wizard.js | 3 +- web/pgadmin/tools/import_export/__init__.py | 4 +- .../import_export/static/js/import_export.js | 2 + .../tools/import_export_servers/__init__.py | 17 +- .../static/js/import_export_servers.js | 1 + web/pgadmin/tools/maintenance/__init__.py | 14 +- .../maintenance/static/js/maintenance.js | 2 + .../tools/psql/static/js/PsqlModule.js | 3 +- web/pgadmin/tools/restore/__init__.py | 17 +- .../tools/restore/static/js/restore.js | 3 + web/pgadmin/tools/schema_diff/__init__.py | 5 +- .../schema_diff/static/js/SchemaDiffModule.js | 3 +- web/pgadmin/tools/search_objects/__init__.py | 3 + .../tools/search_objects/static/js/index.js | 1 + web/pgadmin/tools/sqleditor/__init__.py | 5 +- .../sqleditor/static/js/SQLEditorModule.js | 7 +- .../user_management/PgAdminPermissions.py | 135 +++++++++++ web/pgadmin/tools/user_management/__init__.py | 215 +++++++++++++++--- .../user_management/static/js/Component.jsx | 37 ++- .../user_management/static/js/Permissions.jsx | 202 ++++++++++++++++ .../user_management/static/js/RoleDialog.jsx | 84 +++++++ .../tools/user_management/static/js/Roles.jsx | 177 ++++++++++++++ .../tools/user_management/static/js/Users.jsx | 37 ++- .../user_management/js/current_user.js | 3 +- web/regression/javascript/fake_endpoints.js | 2 + .../user_management/Permissions.spec.js | 113 +++++++++ .../javascript/user_management/Roles.spec.js | 67 ++++++ .../javascript/user_management/Users.spec.js | 7 +- web/setup.py | 84 +++++-- 66 files changed, 1438 insertions(+), 205 deletions(-) create mode 100644 docs/en_US/images/add_role.png create mode 100644 docs/en_US/images/permissions.png create mode 100644 docs/en_US/images/roles.png delete mode 100644 docs/en_US/images/user.png create mode 100644 docs/en_US/images/users.png create mode 100644 web/pgadmin/browser/static/js/withCheckPermission.js create mode 100644 web/pgadmin/tools/user_management/PgAdminPermissions.py create mode 100644 web/pgadmin/tools/user_management/static/js/Permissions.jsx create mode 100644 web/pgadmin/tools/user_management/static/js/RoleDialog.jsx create mode 100644 web/pgadmin/tools/user_management/static/js/Roles.jsx create mode 100644 web/regression/javascript/user_management/Permissions.spec.js create mode 100644 web/regression/javascript/user_management/Roles.spec.js diff --git a/docs/en_US/images/add_role.png b/docs/en_US/images/add_role.png new file mode 100644 index 0000000000000000000000000000000000000000..69739eb8ee6b4e82cb57dabe517fc552f8c3ad91 GIT binary patch literal 26593 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

lUfJd6p+YM50Ou##VdDATbL*YzM#BPffF;A^ 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�JB3+gz=d-ymmqw4t^-=zf4!_kVIApBz= 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­OO8f8u-S3xZp8 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 F{{x8xK;8fV literal 0 HcmV?d00001 diff --git a/docs/en_US/images/roles.png b/docs/en_US/images/roles.png new file mode 100644 index 0000000000000000000000000000000000000000..293a3d53cde03ec79ea246da08aafcd2e9ad24f4 GIT binary patch literal 47028 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 literal 0 HcmV?d00001 diff --git a/docs/en_US/images/user.png b/docs/en_US/images/user.png deleted file mode 100644 index dcfe729d4eade9c1cf29af3cc8ff765d0782cee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72128 zcmZ^q1zc3k_wYePx}>|L7nbf&5mp)jVX1|syJP7PL|R}eNkKpb=~TK|I;5q$S-M|* z;#dFY-Tmy|xifR-%$+%B=H9vA30GGI;bBu@qoAPRDZG54fr5foje>&eiuve12K#B^ z{R!?fYgt)!1zA}Jbr(kqYddokl$YU&Iv8Nh9dS1Gi!xr0!j z*Q>_}z-yn!jKX1At*p{Xc+LVSoLW3O@u-2*q}>A8FiLgVZ{#MHL`Lino@StyIXXDd z(JyJev;P=PVNxe8u#1rq)nuKIXYEo)DGL@OmwSapqSzre`{mA3{MNIlKMwD*^ljn? z4y@?JLCUpVZ4XE-jV9wBQJ$Rqvm*3E3`Qd;0iR+IJd~Av_Z4#{9MAQU8>7dXD_R?) zaIh#CPE5(yT#$$JMvSnHG?)zgNbHbsTee=E0WX5ObPCWDNqZ1Fp06}ngnBEflXJjz zcJeeSqnTP?Mn=K*%cpyy#I`f}jMCZ?lElD^>}YA$g|A#4blH z=c1=1kF&?Rut!*0%Fs?(>PA{FOwt5G)4Nf98Ds>cwNmMeQoCNa6RZat61@Xsy%B$~ zIr*-o?f^aL8KTbA@WHF+vw;H`&i+q}TmY&>>n{i7glx?kY(mOqQdJ$a^NLdf@?LJ^mBdhu;7a4#Cv zTqsk-BT9Tmliua&)2jKLdXZ@H(Z@GVKJiY)D+TObf%u>4CErI@(z^!f%c_V-qMQY7 zsZ&mL-~}=7Vc(QG$!tvFmG1=AuIfUsKi$+&ULOcP+UXuJgBO8L*=BAfHTog__Ali! zx9N{^qlE0)=XXA4X5CZ-bW77$FUshf;FP_Y6x$*3K$Up=6ZO&fyPu}qlg?svdWLEw zg|NuY*_0p-hwlPGZ!?78T_7*>NyCPP_rG| z`KbXR>r&)HMxvL1_^3}zlkS-(8B0FK2$xZtEL&HezoFBt_$0XiZ4M85+z#(Z|RM-X0LNIU)Dwn zquBj++e3?Ms$0VSjwT|jhs?ofEs@QPQ7mSJ`GgTz<{`TwZ6N|qK=;RUMBy(CbMS`I z_BzZ=$egL1`JB<5frn4ZqR&$%K}>PDFY%wyYmkI1A=pS0#^XE^s1$S*GCmP-e&x*P zSn!9r=Ro0mUxrZuO=4z(!VvD`6E zo}37u;6=+<$H-4`S(O|CBGc+ zIPcWUXD7W|QdDMmws_T#bWHQ*>pF>|J))&mzOTLPXYV)Y@A&XT5NPFL9amXY6TIfH$`acNbW-rl`8!RIb`Y&s^_YnYiW2+;pdS zk9UxJhI?{!BVJd2cmDKRCU^h%phvlV-mbeu4(%wq&{PF{nDe2v$y4FTMK&( zZj%c`!s)!TuC-RM)dLUESLWWb=CbL-j|s(^A)^Kb;swdf0MMr>u=LXGJI4Ws0kMIZ z^!=DIDoSCOz3#VhC5AhOFrHPO3DB@Sdh7?Gul{3PIv6@Z+wv3o4sJDk4mh(PW*fiz z)GE!|&i;@BNNGrMN=~Ov_gSr(ta+&gTL!KJ22C^R8)h4j4fwE|)!mJZ-G<&Dww3)> zEgSZ^^j9fYPJY$rZs+{Intmcz9_OhS&NrMlbQk*PM>jQBGNw~y<=`K>K(utUC#Yd) za}^Df0+VcLWzFxKREcJ_IGXgV%S$lEX;0{e9eS6Diy zs$&XhGOBdV$p&U{et7^QIwgvK_m*!XrIe4WYc{enf<$gyE{I)q4DtDDSa>)gH@1_| zG{+QSn%Nl>l|kpj6GJD$;h;17<2>*@@6eOjj@S%KC44J1b5bQ5B8_P&SbX~cG{B&xN%!%ijx?aK*cY|d=7$}FE) z^Y#>PTBDb=U9Lt%tx2sLB!wOE_R;6Fnj+@84~U8gC6&$;jN;}J7Zb|(b0tQB6@Us* zH(4=xBLcgB8h#=z!RZ6?2vF4+m@`P69h+rl;(k^AS#0o032%wY4g(LFr}F8CdT*DK zCkEw)5ii+ZZXZ=G#`;F~X`e>!K!Y5gd9{RbglpoH*^otG>*r6a848~0zH%CN96hkE zw^kYL&mT;^b$VpmnUvbySDC6(0kG)L`Y9%1b~+#i7n^eR&)Sys?3k@NieD4z6UmhE zxm`AT?*D~Hn=6T=26zA|wPtKouPt>S{w%jm=Et>|YyfcQ;pVz2PpLUyDq#*Vyt2KE zKW6!+^efrHK;D2=&%?ED9+|-n0_7gnx$~AIJ5Hdd8+MHz7SlfT!_|| zd3?O2!l1_PSMo{fwj&$^zWH7*T;I5Q zs~^{p+4+6vcAlx5PicB>FER`HezT1~921jKCXrSs`Sq&@<*uGyw07^;AD*%Ee&%Wm znU_>uAGm$o&yx1guFS47_tky{96db`%74@MMkuTZ|20iMJOLNuTu?PrOSAlU&jNo|*H+Qo{@Oij`?mM3Dp`tW!sxJm zWJvh?Zu{$|!h&LSh=fmu>&-}XH?_S8vBR7V{rsGBWI*Az$H1}8R6r0#2#L3 zzMSdVNZ52ft9f0pmPHD*H=?`jy(>wYD{IIoc~Wv|1oSsOu;|jCs8R77_9K{EZM?c} zTzS(HmO-CNKj^1;dAxH32Yv$DHck84pOfA0LINBDno_tHIsMUj!NbRHD3E=Wz$9E0 z+RQ=rW%#;`+%vePHu{4*EUv+K5li?_@vZ}6H-iF1c2Ra_9>p4|8~I713=5(xNui3{ zjH%N~7IF+EBA2lfvejk=6BH*p{Y)(M>NW*^jj)B#Il4t| zhv42vU^%_iz0bkJ{QHLr%aidyL3uD`tp#=it0;?`I@mNgN3D^z`KM6yR}mu>|soiHQMu`GNfW-1j-SUA-LKpfGL+ zSLQzp`MaDK=B}nL)=qBLjt&gJ%Y~Xay1Pj+G5uEbug{2LLTa$z9Uzc@%fxzD> zKt3K`;6I7ESzG*n#D1szDfY*8{i#m!cVXh{)-ZEB@C$4E`=-9Hnl!(#n3&`rdj3z+ zziaxZ=xbMV7g0+{}TGo*#DIP|D(iz#{RE_nv3;)LqLC5O`7j7 z4gVSUSAI$0@6P`ZWBAk3{)oLdHEC=~;J?gP8e3R+BO3+fDT>02XIe1SoeYe0L%EYK zwg!>s4DV5}8r}$6YXHDcwcsXbBt+C3Mz4romE|yKlO%E~V!V2|sUZtuI3|ln;dnoH zb(OVWf950MbJkeRGWEprw8C*MQ_R(3O=NW-Rp4xn$5ACqmqIk#Xk#iD#2!NUeX>ac z)J){`kOuXC4#w`!vbVQ1)PV)e3z(u0Vgmo?@IEY%tJ>?cX#YP7S3NUM`&QBQq(M!nTYHH&wuF(8VGETAm!3CjQSeEjbLllZ2Bo?{@7!)d@FOUU-Rq7)nS1S z9;5sec7vFmg{OK0g0o3>M=MWzb9E3HbCX6UE zB`>V~t$q7MqWeNd&nX5td{`Cwdlg->MV7SoN%Kx^p4eM1*;mdbBIf97nR26Stp|$W zMxY^mfi&%}p5KtK6)_qh$xC@o4b~FOMn1;R8_Fs8e#5)W}IqW^`^k0*n9O3A{xdE^>jdsjJrzCMPF0Mk3<&ztqXL?v!`A-RUN zAV{S)j;4)%t4+DkQnRn=UrifQ7_>!8yIBpAtk1vFhhy9d#@4&EC5ZPBbE^RLgp97K zcsUd9g*Cm}ml4-_PM;1nU8Z0o=H`(#kS2hDwa-Wdq=e>NYrmK^l9yj2xj}Wgd~uDV zqKvzQGC6AS)X9dR2f?L8r*e&~*v-APT#c03F2qCBCao#=^dLRk-E)t=Akue}s}6Ds zD@7pPXg_R=)NVT*Plm#llHj0tT~6v{bKm0A;q>6Ye(-9cv9}Wp-P;t z<{=f6=0{rfo#sVNeBqg^XSRPDU{GQ#ifwy1G27d5haHcr@ftO;2Az`3kNPzZWyiBi zZf!n`q2#SX69&YY-dkS|mLh>~qlKs0kN1B4s3#o9dv=YCEAzcT)`Gp3!r59?M1GNY z{Bobj@%`}%C?t2bE_3HK2@RutKHuoqi_L?4f@T3=$Z^i-C-^|K3HRtr;aeOA(c{h7 z*BI))JwLGQ|3JDOB#9i#u^G;h`{;AF$6*^;icH~!KCfMh;A%Y@l%c2dJ!mO4ZV4{! zVNGkVQH%_0$HvjI`icQfhkXqVXQqunUB#%mI9d=hu$9`X`fa%3T z!_DbTZr?}Qu(zwnA_*BtMSsOe+&p@{1mSd3QAV|sx19mZH)Oaa^+?1))7=eF(&7&7 z5iTY?l7HceK*Io6merI$w|F^8XBT7I#X~#!Xev@tgJ`M4R`PA7=JX9@6%I}+#LkJ*)E1zg)|^_ZFifgX_A4Yl$@W^-!D6U)yuD+wJwmd6< z96MJvjeKfErZgG9sy%8cX#E_w-65!y#Dh~4?Zt#kFWla!H{@pYScac7lqG8ql*VmX zEotDsoWh&!xX){*ezzoPw(4!Vb?kJr8ymtcZ*O&EEW-7pzwk+Sw?lkE8L1fJL_=)F za#Sa$zy%A3?XY(cG5X{q>{{2AEJV7&N6`$YiTmt^tTp|wVR)z*a|7ak_RBM@reW6} zT0rZGJ7ZU&QeUt&r>^$4Zf0fniPNC;m0gOYmkVtEYL1*-dH(jaCfDWJqwCz)xy_Hq z@!q=4_T^a_e@m3qwW-Y%afH-+wUtmenPq>rI?RiR$8d2*03nkEE*}qpY!JicLYjc< zW%@RmyNf}JywH=9fSYZnUhbL~AIMk_nU0t#m%CyK)TA%WU|kY(M5prscTUUEB1xl# zG@Rs2?6C-T${|g<;>A}}ScL$^HlEHY%Pc%wW1^~2Rf$ArExlD{nM5|RSAjPhmuF3P zep>M#afp$1yW{%Ig$N=bzf6Q|kk9#ISR0$nMNjP)r?EJY{HhNE&arrRyMM=|O@Gl1 zYDFhEAl&=0-^d;+w_EGHYyvj#c^8{Jw%Sgth8rt$3u}MJAHT2Dboul1i?&ZLT8acW zY5|v;S|-vbU(`Ah9?nahjCJ3}23#{|n=P9J2+DNeO&K3=6_&`;!QZvK!RX@klUmKA zTWQOotx4q=WN)r@&~~^KksQMcE0G53MX}$IDB`SM?KOy8pLfZ`XjKh=8<*Z9_<5j7 zqliU~d$m)c2D_s33AuOail{Hhe4daC9Wlyv>^E{kkfn}XK?J=Ko2dH8<{bwx5smcV z-QvSsHy*}2TKf^%FQi6*8pF?a=TjcxeR=fAj^Wcva@E=#x0{>&fLOu9j>x{)tqxYK z-F|}}`4*9;i~eSLO!EbL>8(%Y&MKncEF)wQN=XO7iLIX|D6#|8)uu5q3@H+LxMldY zKyar{CVc7J?UwDg)DD>I>8`5EY`Qvz?yqYPT5*_FQrhneUxN7TR*44id+ycD`!C+N z3I1%K6CAC;2WN4zI*%V)V(S5cIUycoi-!_9dOUQlw#~UyaYH1H4CK*WVPvzbQ=@Yq zd*%El0omLuwIq;rp*#xu7l`()uba3M20r$iucNJ4<73twL0E;xPnVR*UIyrmTN-R zvjY6HvzEpjQ%CDOm&cM0TLb>O8Pdjjpa&$NgLc|_z{Rzl<+G{-{cNK4&8nF>@ zdz1x317WpuMpSJK$r9k*o1c$CH?-<$+{dRzcb5~n9Wm%iBKqypRuO1|f=*;O_ikg9 z+Yy*?nHwuD&e?W0>#A0JG$668vLj1>sjf9!%3n4Fe~pJ8R$fNocke+aw?30hv|PM_ z#&UjVKjt$ubD1{Jmt$ke%*e*WXk1>N?>Yuhlb^ArJ3TjBc%;|+v2Um0Y;IT)2WSm! zJYRZw^|QpEbh{(RVr*l0(UUbR?RPIz#7Lb^zGF5A@tN>lXP(uw)t@!&N9&e%cTR`P zo#GgsKW|@5Zn`!%0N>9W5a+VvAM-an_1lK~*gku8mX(qY-#7DLNyBo^N3^?WT$S4s zs4tX&4J70~Mz_dh({wT{Yg&%G(-}wlnU#A34LDEaxCHn%9p?e%s=axkWfAE1L)p*D zWYUkqWZIFrzOTsPPBhd{?#es%%h+V_UICN*SYN*|Au?yr@tyO}#{B=5pD`Nog74Iw&e7$2SL){xQ!e=*G3bvdk>ifcVL(7F3am6Nm7=AG8Iw)s*ez4fqW*RF+ zCPLesfG!`BJ&76U*-w zqItZz&0fR)(M~+@(7B72Tm;B2;)*&hh&0RWX*)S+BZ$3V4ig{E3@B|ZM0fn=FZa<( zO*K!Q?l!ezL$lBJ7~>KjK@>rASIG=3Yt9t5*Aw0Rl)%&(WdwU=Hzg=>(2T~Mf53a^ zyc8(iNnu)iJ<)Va%3T%Zye2>+cqv%>%5iPF>3S9De9MTJCjMimT&akSjXVWJ5t(jg zERZnDwjgaY_Sv9*GTp>MR{93D_d?AdnJ^h=nWJW-Mr0p6-a>@A_NK9Coh# z-g*eOtJn1Y$gwqr(x$iU<&>oMrw^C3Z}GN>y-#+C@(0t2d72h)d41-BOE2gtmI@Z3PVsQS}%P~bH019?+zubXhg!tcFh8z`tm%^nR5~&yUSDdsM zU0i%eutQ7+FrX=Jyg;ppAE@~r>U11-hO>=JN0{kzQROrhK!>YuCkUt)v-Lk83i^>E z1bbr@?ti?g^KHp zXGHJ4)ZsLkJE$+=i5J%7I9NLTXj_kRzr3f>HbvCSd(!HLagjJ|kKBR&$gI|HC!};# zN-cz-$ubrOd|IQjzjCbGNwR$1Mt|#c{>I*E^lr3212gIFuZP1Tw}+LB?~0o{D{#qk zCJeJ{@&^F`NO}9-kI>-VT6s&Hj~g?56T#f&iet}P9Inyz4?1isU}ScvTCn>&Je+EZ zSV8?ha^<=xsQwdDyB5RJ&}S_koVkaEqbNY?kygdrs7P>uK<%Kd3~;% z=E)tUTaSS|powZs&PkJUW1Ng&4s3KZzH;?y8`aI-w_x5phNMwIOsJ#pGId#0H45jX z#nTqD3ceEh>jeyS{XkG$em0qMS@=mss96iyKDs^%xpEvJ#l7I*ej*@M=7_1UZswe1 z;x?(Dari;1j2h#n8IQdX$_&&TFiAN@379n+kSH;Z(6FP{G-2uod_kWveh2-@2$_s6 zw&&A6N9Z&@<|_-eu@ivVKyzUFFpx5P7DvTnBhlT;Q4<-$pzqVc64i|6)pGt(8e;9q zmxwo)^gcUf=rif;llZ==a);*6S+il9DA?7_9M? z!f4p}LnL;5Mzt&PN=!W6>Zzl=H*-Zr==#SXTuL@;-}>&0GUlN;n=}ISip=DzANJa$ zc2J{IIr|ns9eSta06hF%kp06K^&Gu-xFv&rd#-$Q!aCUbPda$PfjI7h=2GLahtGa2 zD-%WfrSW}{e&No}=(KhDQt+_b_C!8p}K#8*=0x6>1iWY&Fb3!T0uil#L5$5oMb zMGML;+_P4@9kZrMqc1BGNLQ;#@%dW)L&`X!&}T%$FS2}*J?NMGs)vV6>ma`*z5$vi zmTAw+V&mpiNlBE$BizmXWrbI-Z^YJLc&sVT7(_zXo?Jet4HPa8@Vi3`qQaYxMcDY2>*{-$Z{=swDf107LfmlgI49j9-S`79Ao z_=~0*5G{5k=@FePn=9E7-dR-E?Qy{>A1F(n?CfFxm+Bs!Qk4l9eQwrL^9I&7{Z{NT z*CqZk&e^6~fcVj;a*%6Z6Za3#!o zC8f#9d2ywJ2bj`P?KCj&$Z6o?N)*QBK%B<6LuSP6M`WzX?k``YMrUcVk z^3WiEx?-0!3RfAE&AZGASPpWf`)u}yZtue;S4h^Y)Aqb8op!kiNCqxuRM3~$n#3xc zCf=xZ)dPRrX0}#|M29c7sY=%z%qkI^*2UZ{%7s#DtHSpEYs1gJQtwCBXVskRuqszy zn0YN86&QhGw}}%t%SKsx=ZExnM9W#Q)5KOsp2lHBbuik8NfArH|gr!fb6f};fhKV&EvJa zZEf}Rcb6-YQ67&@6RSeq?K5bdZEHyNkJ9w5c;UbJ=lWOa2;q>VjAK3mXCU;{Rlv^v*&0vab9hObH4)M zUn%&WoJ`4M%nP5`mT}M#deWj76pGi2O2!nUK5fFHmsDz%(n=o7%w(EQYbmu5h=wW8 zmBL8WHbt*%B+66UUp*sV2poraJhEeaJ-Wr_RZeB>`~b}Z*+XxOk@NtNydzrb8XJn+ z#lx3G0(iOayDq`(0LCiApKRsV(=OXHuuJ0gh+kZ$j|>6W!8Ma8%}j1Ma=+g3}+@i87Cqgp*?oF?;| za464+*V|a(-pW%=O3mfak~D9$TB5qE0{e z2qnSXoAcF#5%wqqH}SWTZPTh(BVA>1Q@IRVHmdiLZP?rpfN;0}Pe241{6*xX*#(cD z?D85jd4|7JEr)gqGS*nJ-chL6{ zrVBGq@t4(=J_sUsL3M;p=6Z>xEj$8kvAj-kq3)WXPGFT2OSgNsYjQG#g)b#T5jsV1 z@|?{61?47ny2eMKEL)>c44*<%*GN}w`{Q>)9}aO@kHZWB^fbFYJ;@y7>nUBLq-|vi zm*h9GEB!b2vW}#bFb8-Hzk@5Q1CCBR0Cs1CQLZWAl57y0lFB$`Q&&NTE zNxGodl)xpb$GU<%#ISlsuwKyFhBr@4@(A&%^a?*MOzeof!_p~?fSN}1*7qb}=LRhy zzpD!@)>?nlx&4+~-q9*)c@J6`xBb=&hwMX#XX)a1KnlM-*~F%EpD8Mxn4S8h+wx)= z-POLJI0EK})L%TQ*_pbf-Y4*sx~`}7fzZJ+VMlSYZEv>;qU$ks1Uc89d3jFy$`&4# z^G>ZaO4}FbQ4>4VIog4%a|qY;bV0>3qR8Mu;oR{GBmldi|Er4Mj~UliuNZ$Ni6J#H z(q^fcE9sjQ=Y-vLFaGqkKgW$B=lcbli~4UDq6)oIv~1oDV&sFxuNT)kfnCl|WAw_b z7BHEC!O&+)Yi51Hk-7J#@738?l;RwON!z8A3tn*{4ho~jj#)MV41hmpt9LtxB%osg zpP00C9l@*H=*Zn?KRb6@l(jsML#K%piP7SKl&@?*dSnHV7DaYfyaM=xYt;!3*;O(L zWFqBaPRujl0&qgIHFzBQ6NChgI4_C_$7hAWGLbh#1Gnp>=^Z zRN=w}4`}_Ws5#1G*^18nflek%P9sfnt}lo5S0L!KE^aUu$m9z%wwzQ7!y7rqL5dvT zgTYr&vXAVzl1jb754x7%%(i6KOlqA_|Gc6bGowwbDmZh_m6X618!c@ zMOwsIxX!{m_y?^tWMW#D;4%oFUAdW&nr1qXexLw;Y9+mWZznD_3(cADR7?n+ZCAen zGvxdW*KYEu=^Exoe>d^NQ8>_7ARn;n;*1kRI%K(KJy^cElO^s;QEt- z;n&POY`pVV9$N}@QI2%e1q2@joj#>_FI#b4l5`n!;Mhk8y)PF5hL%cQ}Axf6R7jaPv(jdkbiHX(kv|E1o|im1ODeeM7}3=aox9&?yu z@C&-zJ?uz>U^D$zb5eKPNdN>lD^W8j!Is`|@Q*fz;Ff0d046to^o<@YGShd_MCCR; zO)%-D!S#>w5%v{rRgvk9;acplcvu@uo~FCdQD$i%1sfhP^h*?nO)?b5u*=h>chS zO&(;94$W=o4^mDZ2bA_U*^h$M*}WCB*pt>w7JL;*TY? z+lI!9Y@4vgq~#wjb{hae%C>Pz5|2p}v-5rZWSNQ!> zKB+m!;8cD{JaBTSbn4)s>}=mWEdVE{FH>q~&dMBcx(z9-m$Z#E%`DjYRWx_6*l+Uc zv^;k(@_Ea5IU^sjF%6}#rAU2?Rj2?;C=Ejzr2MBFq3%tb^dR#iJNU4pjJ;_{bw2PN z8}jOBktgvii(@@8uDVBqyU{R~ynLJgg_fc@ASI z#OBc!_h_twt#$Ivz(r|9Jh?kzthkXBNeY?6t&dxtlbe&tC9N-m0TmmT&O!X`0v_Nu zudw4f`myN4@-RaKlF(hEFz!L zh?sCoV&yh3v5O=bIOK!dN^?pVOj<&6!brpVACT>`V@kG#CZcbnV%KM;nZ~s*p>#dZ zI5l2WFijw%M<-Jvus*OxBf-wpM3a~f6YdfJd13-+usFGy8uTaQySQJ|r6u*BesHnW zo4@|yHqg}dK^}@Zrn2r>#XHdE!i5kC#>!1MoR2$rlm3`Kvt}h#3^2XImfF2aRbXis zTT|Ui70rUXO@%|crSm09aj-RcouusGJwXI}Boz%d>rJq~Y!-9ot;gHNX8~=mWG-3o zZSgOH_y!%mNU4iEvF~|5qx3_kWM2Tk@Ny>ef_^ihnTo4@hvWAS{X2pheTv{hU53}J zS-?X6gWR^y{GI=ft=-Ep7mmzh2{;SFDf~o17{|%(^MNGeP3UO>eXhE()Tg`h&z4ad zBAwLrcA_6w)Mbz;Ml{f+W>Xo7vS*Z=LZ)UbaIY&Pod_wckU@%}8C0;`YP(LRzs{nA3w`%eF5GMHf?U ziNz%qf|cBCPpp7N5tYDI({xS9rTE2ZRUOI2v4C*Kj#GV{xLLm`7yG8F&o+ZQuJxbQC~_ zzuyC`yLXBm@p+ZLLa9FZY}6IZB2$Uw%$|I;Cn|n@IFi;@0aV3Yhj`eEI_XG!G{N59 zHSK(hQ_|SBmv^+=-+3x;^TTz&rmK3fkqv@1*dQuBdowiJ5_2sd>a^8&k(8wf?!%Px zjTk;G8_D$O^n*_9ibVQ4Qqay~5bTgc{QdM`*Qq+Kt2L5T7X60C$E2qQJP40h_=>z~ z>IaRNoyXnxPcyM0J&yemtFsQrmy41<9^*0CVF5Bo#iEIU83!^})eKU)fXlpt?gZf5 z0!Rws{0lX)Rf|C`&J}~)%AC)RHLI-9xmK3NxUMV$HAw*;$;&aNGXK$?DMP5({1W-J zQqARLGHrfe3O%WVS>Ts+n6BecalKuvzfYBYU&Yijncyt{g@HfctsDPj$gcZvf|@q6 zf$`1R5Z39j5a?e$YE8zJ(7cPXsC+zIBsSie^G1$bBtVQT7NB+Vg_2BCjA;PA=v>6&)_)DOG>* zDiMvCtP0!;hR2cP_`wa3?d52VqLBIyCVZR+*R{^$kMuuC{wmU~EC(;0Gg1U%;S?X{ zuavVh6C7ZW!%bF#N@Cu~e@vz4eb!Te7mDTnqAt5Zt4X<>EEzy%t;xH3{)wy`3C zA&B%T5&{d}hsfQTjo_e56=4}NTH|+#Npehnpp&)&sS4|n);#B9Vkbr*iRp+y;G|YI zaKur)^5byhN|@T+8`U~%*-HWhsym7)9JYlkQ-5p<_ikN4w5FUs!kA7w4NR7ftxD)% z@uTY-L2~w`Y&+BzTdr!~a4`EZ(56{8kS5_?;vw*NpEhi=!SQ@Ka40HXm4-)8(C)Ic zEXSxMq2Y@%s(-9+IG$b6O3p*L9Ws9e6C;>&^cuVsV@KTAxup^;Te`O%8|g*9SV zA6t^xI-$wJu(rWGC&rLxsEcOJ;O(nEoOImmyI~%9K33pS-}kV_ zRj-(^K>ky5qXsx~*9-gY!|ig1NqvM#si`#>!`(@y7HDk(zK=)jk87<^J2p0FHQaCy2(i>PN!5RaXrKF zpCQ|Mo8iZ{4t}CE^>;I^`1jz5Gnd;SE2U;+*JldvL)W{9V)71uK{FvRI0t7 zkI(Pbs6j*%GsuB@h=Tf+$bzIS#AlM?Cusf#WcymGd6h%d3R!FwWGY~@qaG!lZ|T-F zud5rfEO@w@bj>gfKbd~i@N;NfKm1%dB26HD;d0(&N}w8pu}%(1{CWLOWc)z6gP16B zgaxo_EHF31nmLV~FW8vgjrJGk#D$02-)2|t`XCCZZ7fREFc++)Wk(dq%NjrYISNc!%ekkGkn-pnZjPssrhxuaEV_MBV>N`uVKGgtH)sq7$8X*w`p?$KGbTPmXY z+MWesli65N@G29|o`kM0iF4!la%OFHR<*+4+0s-B#yEW-kn|GV(8Vy)!(TeuidRW) z(DomCEz%kvIv5jWfFMwz;E+C9RB>kDDVeqYP+y8vKFTqOC&+Nx>ei8j%k!=t~2Bf%C*@vkegdM;_LsSW-Zel2<%Ee%2j42DkV^$BCs<(x%soT3=$V4ZdIAM1$9FV;f87WuxBZH?Vr|=DDUBa?|8L)&iP8#Gstv)s3^) z<<&5i?0!vR*nt_nEcmfNn`OI>VEkb_SEsn1NA#eQm>Bo2{1L~%%{VhkvDbL+xY9Aa zkoduD#d5U1$eW*E4ulXk^vTg=I+HoC>jcBbUXIu0C}Dfsl4)fWGC`>Rc-qjGc{nY8 z<`HX2oJYHyTy2ncyn0%}%Ov0fERj=M9(9sZL6_m_uSklrt1n(9XQ{raks=ATOLfaQ z86C-Y9@4baXsmwQgQ26)hyQDq zhpQcttXWw3a|-g-<&BDL-;1{o^%L^x>h9f`E~iKBf-BVakdw}6*{D)7_2&}u+;(_c ziO$8z%ddiB^tNfL+_I!XY+SR`hJU11Fugx)+vYHW>&he6-b{IQb>fS)u#uot>DU(~ zy*j77nEo|1`@HI2rT5XxRLQi|x{XXahaxHot4bxKP9GXIL=*MH*@~zg{YQ;aEwtRKgl7YB0?zr`S8MSYNd=5pT#Xm8V{Roy1b8`UPJ6xZ!(c zQkh}CO4e%%!P2IN&C1QXt|U8E=YPYF)l3JMD>bd|HIfwbG=2JCZMpfUKV%h@5TKr( z{P5hTl5suWYw*OJu^0N@7&5T>*V>Ua;YOp|W_jrl#G-wj57wjNcl9tM{~AL0H?EoO z%4|H%)iro^yl0-3oJ!mol|d*BE(ieI0L>}{h%$cc*eYz64xN?{VynPxRVSg5(XGPz zMWt24OG}&B%2<1U!4Be54-6q$$N8HT^ZogBC!uk`1Wr$vXZYN({wS-6 z19Qw*plM!k9G-vb{SQ2AsW-E_f=rbNSj$5^#~`)M^#2gCe_*mfiD6IYJQrO_^(m48 zhEz#20iHfS%=_@?0^=2c^IAzgMI8$I0=JMnYbDmov2Y$E=kG~CasQ-F_boV^;9&&F z*=xc&z4ePh&({~dom>RxM=NaRyAtd00EqY}+&!4gR-B-}{YfV)J| z8jfMzBM}SCYth+vXK941Qs}77Es+K&gD(}#pO3g_s?|HGnnz@gAkRn2^N|X%N~7;Y z@<90`u_Fb7p`>g^ZoXD72kGknb5U;**gDm6Fmu zB=n8v<>tdxE9-|AUK$tih4t-)w!S^8qtA5oIxMY!E-fZ19chUUh8dZ6UryC(RWH40 zOZFYE?NlgkjkA(jQuFJ0{j~trk$h6&#p&47i*(IMmOmEsLnJ3^78)#(XZa3~UXy62 zBbtSvbCCH8osyw%wxg&kz8&K!IshZ0NBBGRkB;}1ygmQ+g8yc(n>j(ooqbal?+l4# zato4gg}&4(9DWK{@+5a{U3&KSxbWXlw{adLLqny4kv&3Or;Ho4p2rUI{_h0z zYU$V&(zZiR%+DVGgQqND7I9<38`aVZ^0jsBY*C(QmQL0VjF7B1{tqJlH?XMv5Q$G# zqfoZG+w*1AHrcRF<<(*7KjnQ2Vj5!Y@VGqQgnsdR{L*2(NEf=;8j6bU*%3hsy+E!G z>qs_kX!sxAgNb@cY%2TEf4*7J$sTB@

CY1I(682TF~I{aSfr}_CF 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

C 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 KH)XF)g8mO!?RonE diff --git a/docs/en_US/images/users.png b/docs/en_US/images/users.png new file mode 100644 index 0000000000000000000000000000000000000000..46021c610708127b904895dcf0f8f2f580e69c3f GIT binary patch literal 63918 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%0A9S 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 { return !('catalog' in pgAdmin.Browser.tree.getTreeNodeHierarchy(item)); - } + }, + permission: AllPermissionTypes.TOOLS_ERD_TOOL, } ]); pgBrowser.Events.on( diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js index b6bf851e5..35d3378dc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js +++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js @@ -14,6 +14,7 @@ import DatabaseSchema from './database.ui'; import { showServerPassword } from '../../../../../../static/js/Dialogs/index'; import _ from 'lodash'; import getApiInstance, { parseApiError } from '../../../../../../static/js/api_instance'; +import { AllPermissionTypes } from '../../../../../static/js/constants'; define('pgadmin.node.database', [ 'sources/gettext', 'sources/url_for', @@ -122,7 +123,8 @@ define('pgadmin.node.database', [ priority: 5, label: gettext('ERD For Database'), enable: (node) => { return node.allowConn; - } + }, + permission: AllPermissionTypes.TOOLS_ERD_TOOL, }]); _.bindAll(this, 'connection_lost'); diff --git a/web/pgadmin/browser/server_groups/servers/static/js/server.js b/web/pgadmin/browser/server_groups/servers/static/js/server.js index 573bc7e25..fc4b25c16 100644 --- a/web/pgadmin/browser/server_groups/servers/static/js/server.js +++ b/web/pgadmin/browser/server_groups/servers/static/js/server.js @@ -12,6 +12,7 @@ import ServerSchema from './server.ui'; import { showServerPassword, showChangeServerPassword, showNamedRestorePoint } from '../../../../../static/js/Dialogs/index'; import _ from 'lodash'; import getApiInstance, { parseApiError } from '../../../../../static/js/api_instance'; +import { AllPermissionTypes } from '../../../../static/js/constants'; define('pgadmin.node.server', [ 'sources/gettext', 'sources/url_for', @@ -81,7 +82,7 @@ define('pgadmin.node.server', [ name: 'create_server_on_sg', node: 'server_group', module: this, applies: ['object', 'context'], callback: 'show_obj_properties', category: 'register', priority: 1, label: gettext('Server...'), - data: {action: 'create'}, enable: 'canCreate', + data: {action: 'create'}, enable: 'canCreate', permission: AllPermissionTypes.OBJECT_REGISTER_SERVER },{ name: 'disconnect_all_servers', node: 'server_group', module: this, applies: ['object','context'], callback: 'disconnect_all_servers', @@ -91,7 +92,7 @@ define('pgadmin.node.server', [ name: 'create_server', node: 'server', module: this, applies: ['object', 'context'], callback: 'show_obj_properties', category: 'register', priority: 3, label: gettext('Server...'), - data: {action: 'create'}, enable: 'canCreate', + data: {action: 'create'}, enable: 'canCreate', permission: AllPermissionTypes.OBJECT_REGISTER_SERVER },{ name: 'connect_server', node: 'server', module: this, applies: ['object', 'context'], callback: 'connect_server', @@ -167,7 +168,7 @@ define('pgadmin.node.server', [ name: 'copy_server', node: 'server', module: this, applies: ['object', 'context'], callback: 'show_obj_properties', label: gettext('Copy Server...'), data: {action: 'copy'}, - priority: 4, + priority: 4, permission: AllPermissionTypes.OBJECT_REGISTER_SERVER, }]); _.bindAll(this, 'connection_lost'); diff --git a/web/pgadmin/browser/static/js/MainMenuFactory.js b/web/pgadmin/browser/static/js/MainMenuFactory.js index 83e0d9aa8..54555809b 100644 --- a/web/pgadmin/browser/static/js/MainMenuFactory.js +++ b/web/pgadmin/browser/static/js/MainMenuFactory.js @@ -11,6 +11,7 @@ import pgAdmin from 'sources/pgadmin'; import Menu, { MenuItem } from '../../../static/js/helpers/Menu'; import getApiInstance from '../../../static/js/api_instance'; import url_for from 'sources/url_for'; +import withCheckPermission from './withCheckPermission'; const MAIN_MENUS = [ { label: gettext('File'), name: 'file', id: 'mnu_file', index: 0, addSeprator: true, hasDynamicMenuItems: false }, @@ -71,7 +72,7 @@ export default class MainMenuFactory { } static createMenuItem(options) { - return new MenuItem({...options, callback: () => { + const callback = () => { // Some callbacks registered in 'callbacks' check and call specifiec callback function if (options.module && 'callbacks' in options.module && options.module.callbacks[options.callback]) { options.module.callbacks[options.callback].apply(options.module, [options.data, pgAdmin.Browser.tree?.selected()]); @@ -89,7 +90,8 @@ export default class MainMenuFactory { pgAdmin.Browser.notifier.error(gettext('Error in opening window')); }); } - }}, (menu, item)=> { + }; + return new MenuItem({...options, callback: withCheckPermission(options, callback)}, (menu, item)=> { pgAdmin.Browser.Events.trigger('pgadmin:enable-disable-menu-items', menu, item); window.electronUI?.enableDisableMenuItems(menu?.serialize(), item?.serialize()); }); diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js index 0f51bf741..f6f1d6626 100644 --- a/web/pgadmin/browser/static/js/browser.js +++ b/web/pgadmin/browser/static/js/browser.js @@ -391,6 +391,7 @@ define('pgadmin.browser', [ checked: _m.checked, below: _m.below, applies: _m.applies, + permission: _m.permission, }; }; diff --git a/web/pgadmin/browser/static/js/collection.js b/web/pgadmin/browser/static/js/collection.js index a4935ffaa..caff5c3a4 100644 --- a/web/pgadmin/browser/static/js/collection.js +++ b/web/pgadmin/browser/static/js/collection.js @@ -7,6 +7,7 @@ // ////////////////////////////////////////////////////////////// import _ from 'lodash'; +import { AllPermissionTypes } from './constants'; define([ 'sources/gettext', 'sources/pgadmin', @@ -53,6 +54,7 @@ define([ name: 'show_query_tool', node: this.type, module: this, applies: ['context'], callback: 'show_query_tool', priority: 998, label: gettext('Query Tool'), + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }]); // show search objects same as query tool @@ -60,6 +62,7 @@ define([ name: 'search_objects', node: this.type, module: this, applies: ['context'], callback: 'show_search_objects', priority: 997, label: gettext('Search Objects...'), + permission: AllPermissionTypes.TOOLS_SEARCH_OBJECTS, }]); // show psql tool same as query tool. @@ -68,6 +71,7 @@ define([ name: 'show_psql_tool', node: this.type, module: this, applies: ['context'], callback: 'show_psql_tool', priority: 998, label: gettext('PSQL Tool'), + permission: AllPermissionTypes.TOOLS_PSQL_TOOL, }]); } } diff --git a/web/pgadmin/browser/static/js/constants.js b/web/pgadmin/browser/static/js/constants.js index 882e85e61..944752552 100644 --- a/web/pgadmin/browser/static/js/constants.js +++ b/web/pgadmin/browser/static/js/constants.js @@ -116,3 +116,21 @@ export const WEEKDAYS = [ ]; export const PGAGENT_MONTHDAYS = [...MONTHDAYS].concat([{label: gettext('Last day'), value: 'Last Day'}]); + +export const AllPermissionTypes = { + OBJECT_REGISTER_SERVER: 'object_register_server', + TOOLS_ERD_TOOL: 'tools_erd_tool', + TOOLS_QUERY_TOOL: 'tools_query_tool', + TOOLS_DEBUGGER: 'tools_debugger', + TOOLS_PSQL_TOOL: 'tools_psql_tool', + TOOLS_BACKUP: 'tools_backup', + TOOLS_RESTORE: 'tools_restore', + TOOLS_IMPORT_EXPORT_DATA: 'tools_import_export_data', + TOOLS_IMPORT_EXPORT_SERVERS: 'tools_import_export_servers', + TOOLS_SEARCH_OBJECTS: 'tools_search_objects', + TOOLS_MAINTENANCE: 'tools_maintenance', + TOOLS_SCHEMA_DIFF: 'tools_schema_diff', + TOOLS_GRANT_WIZARD: 'tools_grant_wizard', + STORAGE_ADD_FOLDER: 'storage_add_folder', + STORAGE_REMOVE_FOLDER: 'storage_remove_folder' +}; diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js index 8dfdd362f..8a35f3f66 100644 --- a/web/pgadmin/browser/static/js/node.js +++ b/web/pgadmin/browser/static/js/node.js @@ -9,7 +9,7 @@ import _ from 'lodash'; import getApiInstance from '../../../static/js/api_instance'; -import { BROWSER_PANELS } from './constants'; +import { AllPermissionTypes, BROWSER_PANELS } from './constants'; import React from 'react'; import ObjectNodeProperties from '../../../misc/properties/ObjectNodeProperties'; import ErrorBoundary from '../../../static/js/helpers/ErrorBoundary'; @@ -161,6 +161,7 @@ define('pgadmin.browser.node', [ function() { return !!(self.canDrop(...arguments)); } : (!!self.canDrop), + permission: self.type == 'server' ? 'object_regiter_server' : undefined, }]); if (self.canDropCascade) { @@ -202,6 +203,7 @@ define('pgadmin.browser.node', [ priority: 998, label: gettext('Query Tool'), enable: enable, + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }]); // show search objects same as query tool @@ -210,6 +212,7 @@ define('pgadmin.browser.node', [ applies: ['context'], callback: 'show_search_objects', priority: 997, label: gettext('Search Objects...'), icon: 'fa fa-search', enable: enable, + permission: AllPermissionTypes.TOOLS_SEARCH_OBJECTS, }]); if(pgAdmin['enable_psql']) { @@ -218,6 +221,7 @@ define('pgadmin.browser.node', [ name: 'show_psql_tool', node: this.type, module: this, applies: ['context'], callback: 'show_psql_tool', priority: 998, label: gettext('PSQL Tool'), + permission: AllPermissionTypes.TOOLS_PSQL_TOOL, }]); } } @@ -247,6 +251,7 @@ define('pgadmin.browser.node', [ data_disabled: gettext('The selected tree node does not support this option.'), }, enable: self.check_user_permission, + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }]); }); } diff --git a/web/pgadmin/browser/static/js/withCheckPermission.js b/web/pgadmin/browser/static/js/withCheckPermission.js new file mode 100644 index 000000000..7f118ef8c --- /dev/null +++ b/web/pgadmin/browser/static/js/withCheckPermission.js @@ -0,0 +1,27 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2025, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import pgAdmin from 'sources/pgadmin'; +import current_user from 'pgadmin.user_management.current_user'; +import gettext from 'sources/gettext'; + +export default function withCheckPermission(options, callback) { + // Check if the user has permission to access the menu item + return ()=>{ + // if the permission are not provided then no restrictions. + if(!options.permission || (options.permission && current_user.permissions?.includes(options.permission))) { + callback(); + } else { + pgAdmin.Browser.notifier.alert( + gettext('Permission Denied'), + gettext('You don’t have the necessary permissions to access this feature. Please contact your administrator for assistance') + ); + } + }; +} diff --git a/web/pgadmin/dashboard/static/js/components/SectionContainer.jsx b/web/pgadmin/dashboard/static/js/components/SectionContainer.jsx index dfffde7e1..4c4bdb717 100644 --- a/web/pgadmin/dashboard/static/js/components/SectionContainer.jsx +++ b/web/pgadmin/dashboard/static/js/components/SectionContainer.jsx @@ -29,6 +29,7 @@ const StyledBox = styled(Box)(({theme}) => ({ '& .SectionContainer-cardTitle': { padding: '0.25rem 0.5rem', fontWeight: 'bold', + width: '100%', } }, })); @@ -50,7 +51,7 @@ export default function SectionContainer({title, titleExtras, children, style}) } SectionContainer.propTypes = { - title: PropTypes.string.isRequired, + title: PropTypes.any.isRequired, titleExtras: PropTypes.node, children: PropTypes.node.isRequired, style: PropTypes.object, diff --git a/web/pgadmin/misc/file_manager/__init__.py b/web/pgadmin/misc/file_manager/__init__.py index 022f6d0cc..10d11f015 100644 --- a/web/pgadmin/misc/file_manager/__init__.py +++ b/web/pgadmin/misc/file_manager/__init__.py @@ -35,6 +35,7 @@ from pgadmin.utils.preferences import Preferences from pgadmin.utils.constants import PREF_LABEL_OPTIONS, MIMETYPE_APP_JS, \ MY_STORAGE from pgadmin.settings.utils import get_file_type_setting +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes # Checks if platform is Windows if _platform == "win32": @@ -345,6 +346,20 @@ class Filemanager(): return last_dir + @staticmethod + def check_capability_permission(capability): + """ + Check if the user has permission for the capability + """ + if capability == 'create': + return current_user.has_permission( + AllPermissionTypes.storage_add_folder) + elif capability == 'delete': + return current_user.has_permission( + AllPermissionTypes.storage_remove_folder) + + return True + @staticmethod def create_new_transaction(params): """ @@ -366,16 +381,20 @@ class Filemanager(): show_volumes = isinstance(storage_dir, list) or not storage_dir supp_types = allow_upload_files = params.get('supported_types', []) + allow_folder_create = ['create'] if \ + Filemanager.check_capability_permission('create') else [] + allow_folder_delete = ['delete'] if \ + Filemanager.check_capability_permission('delete') else [] # tuples with (capabilities, files_only, folders_only, title) capability_map = { 'select_file': ( - ['select_file', 'rename', 'upload', 'delete'], + ['select_file', 'rename', 'upload'] + allow_folder_delete, True, False, gettext("Select File") ), 'select_folder': ( - ['select_folder', 'rename', 'create'], + ['select_folder', 'rename'] + allow_folder_create, False, True, gettext("Select Folder") @@ -387,14 +406,14 @@ class Filemanager(): gettext("Select File") ), 'create_file': ( - ['select_file', 'rename', 'create'], + ['select_file', 'rename'] + allow_folder_create, True, False, gettext("Create File") ), 'storage_dialog': ( - ['select_folder', 'select_file', 'download', - 'rename', 'delete', 'upload', 'create'], + ['select_folder', 'select_file', 'download', 'rename', + 'upload'] + allow_folder_delete + allow_folder_create, True, False, gettext("Storage Manager") @@ -767,7 +786,9 @@ class Filemanager(): stored in the session """ trans_data = Filemanager.get_trasaction_selection(self.trans_id) - return False if capability not in trans_data['capabilities'] else True + # capability + return False if capability not in trans_data['capabilities'] \ + else Filemanager.check_capability_permission(capability) def getfolder(self, path=None, file_type="", show_hidden=False): """ diff --git a/web/pgadmin/misc/file_manager/static/js/components/FileManager.jsx b/web/pgadmin/misc/file_manager/static/js/components/FileManager.jsx index 9e341209f..4f521882b 100644 --- a/web/pgadmin/misc/file_manager/static/js/components/FileManager.jsx +++ b/web/pgadmin/misc/file_manager/static/js/components/FileManager.jsx @@ -873,4 +873,4 @@ FileManager.propTypes = { onCancel: PropTypes.func, sharedStorages: PropTypes.array, restrictedSharedStorage: PropTypes.array, -}; \ No newline at end of file +}; diff --git a/web/pgadmin/misc/workspaces/static/js/WorkspaceToolbar.jsx b/web/pgadmin/misc/workspaces/static/js/WorkspaceToolbar.jsx index 76022262c..9a094460b 100644 --- a/web/pgadmin/misc/workspaces/static/js/WorkspaceToolbar.jsx +++ b/web/pgadmin/misc/workspaces/static/js/WorkspaceToolbar.jsx @@ -17,10 +17,11 @@ import AccountTreeRoundedIcon from '@mui/icons-material/AccountTreeRounded'; import { PgIconButton } from '../../../../static/js/components/Buttons'; import PropTypes from 'prop-types'; import { styled } from '@mui/material/styles'; -import { WORKSPACES } from '../../../../browser/static/js/constants'; +import { AllPermissionTypes, WORKSPACES } from '../../../../browser/static/js/constants'; import { useWorkspace } from './WorkspaceProvider'; import { LAYOUT_EVENTS } from '../../../../static/js/helpers/Layout'; import gettext from 'sources/gettext'; +import withCheckPermission from '../../../../browser/static/js/withCheckPermission'; const StyledWorkspaceButton = styled(PgIconButton)(({theme}) => ({ '&.Buttons-iconButtonDefault': { @@ -44,7 +45,7 @@ const StyledWorkspaceButton = styled(PgIconButton)(({theme}) => ({ }, })); -function WorkspaceButton({menuItem, value, ...props}) { +function WorkspaceButton({menuItem, value, options, ...props}) { const {currentWorkspace, hasOpenTabs, getLayoutObj, onWorkspaceDisabled, changeWorkspace} = useWorkspace(); const active = value == currentWorkspace; const [disabled, setDisabled] = useState(); @@ -75,12 +76,16 @@ function WorkspaceButton({menuItem, value, ...props}) { }, [disabled]); return ( - { if(menuItem) { menuItem?.callback(); } else { - changeWorkspace(value); + // Check permission and call. + withCheckPermission(options, () => { + changeWorkspace(value); + })(); } }} disabled={disabled} @@ -91,7 +96,8 @@ WorkspaceButton.propTypes = { menuItem: PropTypes.object, active: PropTypes.bool, changeWorkspace: PropTypes.func, - value: PropTypes.string + value: PropTypes.string, + options: PropTypes.object, }; const Root = styled('div')(({theme}) => ({ @@ -124,9 +130,9 @@ export default function WorkspaceToolbar() { return ( } value={WORKSPACES.DEFAULT} title={gettext('Default Workspace')} tooltipPlacement="right" /> - } value={WORKSPACES.QUERY_TOOL} title={gettext('Query Tool Workspace')} tooltipPlacement="right" /> - {pgAdmin['enable_psql'] && } value={WORKSPACES.PSQL_TOOL} title={gettext('PSQL Tool Workspace')} tooltipPlacement="right" />} - } value={WORKSPACES.SCHEMA_DIFF_TOOL} title={gettext('Schema Diff Workspace')} tooltipPlacement="right" /> + } value={WORKSPACES.QUERY_TOOL} title={gettext('Query Tool Workspace')} tooltipPlacement="right" options={{permission: AllPermissionTypes.TOOLS_QUERY_TOOL}} /> + {pgAdmin['enable_psql'] && } value={WORKSPACES.PSQL_TOOL} title={gettext('PSQL Tool Workspace')} tooltipPlacement="right" options={{permission: AllPermissionTypes.TOOLS_PSQL_TOOL}} />} + } value={WORKSPACES.SCHEMA_DIFF_TOOL} title={gettext('Schema Diff Workspace')} tooltipPlacement="right" options={{permission: AllPermissionTypes.TOOLS_SCHEMA_DIFF}} /> } menuItem={menus['settings']} title={gettext('Preferences')} tooltipPlacement="right" /> diff --git a/web/pgadmin/model/__init__.py b/web/pgadmin/model/__init__.py index 057a2ab79..af1251f12 100644 --- a/web/pgadmin/model/__init__.py +++ b/web/pgadmin/model/__init__.py @@ -59,6 +59,29 @@ roles_users = db.Table( ) +class PgAdminDbArrayString(types.TypeDecorator): + cache_ok = True + impl = types.String + + def process_bind_param(self, value, dialect): + try: + if len(value) == 0: + return None + + return ",".join(value) + except Exception as _: + return None + + def process_result_value(self, value, dialect): + try: + if value == '': + return [] + + return value.split(',') + except Exception as _: + return [] + + class PgAdminDbBinaryString(types.TypeDecorator): """ To make binary string storing compatible with both @@ -92,6 +115,27 @@ class Role(db.Model, RoleMixin): id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(128), unique=True, nullable=False) description = db.Column(db.String(256), nullable=False) + # permissions needs to be an array, use custom type to support + # both SQLite and PostgreSQL + permissions = db.Column(PgAdminDbArrayString()) + + def get_permissions(self): + from pgadmin.tools.user_management.PgAdminPermissions \ + import AllPermissionTypes + if self.name == 'Administrator': + return AllPermissionTypes.list() + + return super().get_permissions() + + +# We override the default UserMixin to change behaviour of has_permission +# Administrator has all permissions +class CustomUserMixin(UserMixin): + def has_permission(self, permission: str) -> bool: + if 'Administrator' in self.roles: + return True + + return super().has_permission(permission) class User(db.Model, UserMixin): diff --git a/web/pgadmin/static/js/Theme/dark.js b/web/pgadmin/static/js/Theme/dark.js index 507e6835b..975ed6e4b 100644 --- a/web/pgadmin/static/js/Theme/dark.js +++ b/web/pgadmin/static/js/Theme/dark.js @@ -65,15 +65,16 @@ export default function(basicSettings) { primary: '#d4d4d4', muted: '#8A8A8A', }, - checkbox: { - disabled: '#6b6b6b' - }, background: { paper: '#1e1e1e', default: '#1e1e1e', } }, custom: { + checkbox: { + borderColor: '#4a4a4a', + disabled: '#6b6b6b' + }, icon: { main: '#6b6b6b', contrastText: '#fff', diff --git a/web/pgadmin/static/js/Theme/high_contrast.js b/web/pgadmin/static/js/Theme/high_contrast.js index 2042583c6..b5d53855a 100644 --- a/web/pgadmin/static/js/Theme/high_contrast.js +++ b/web/pgadmin/static/js/Theme/high_contrast.js @@ -63,15 +63,16 @@ export default function(basicSettings) { primary: '#fff', muted: '#8b9cac', }, - checkbox: { - disabled: '#6b6b6b' - }, background: { paper: '#010B15', default: '#010B15', }, }, custom: { + checkbox: { + borderColor: '#A6B7C8', + disabled: '#6b6b6b' + }, icon: { main: '#010B15', contrastText: '#fff', diff --git a/web/pgadmin/static/js/Theme/index.jsx b/web/pgadmin/static/js/Theme/index.jsx index 3d3454dd0..146864cce 100644 --- a/web/pgadmin/static/js/Theme/index.jsx +++ b/web/pgadmin/static/js/Theme/index.jsx @@ -644,12 +644,12 @@ function getFinalTheme(baseTheme) { styleOverrides: { root: { padding: '0px', - color: baseTheme.otherVars.inputBorderColor, + color: baseTheme.custom.checkbox.borderColor, }, colorPrimary: { '&.Mui-disabled': { - color: baseTheme.palette.checkbox.disabled + color: baseTheme.custom.checkbox.disabled } } } @@ -658,12 +658,12 @@ function getFinalTheme(baseTheme) { styleOverrides: { root: { padding: '0px', - color: baseTheme.otherVars.inputBorderColor, + color: baseTheme.custom.checkbox.borderColor, }, colorPrimary: { '&.Mui-disabled': { - color: baseTheme.palette.checkbox.disabled + color: baseTheme.custom.checkbox.disabled } } } diff --git a/web/pgadmin/static/js/Theme/light.js b/web/pgadmin/static/js/Theme/light.js index 504c28efe..875793ea8 100644 --- a/web/pgadmin/static/js/Theme/light.js +++ b/web/pgadmin/static/js/Theme/light.js @@ -63,15 +63,16 @@ export default function(basicSettings) { primary: '#222', muted: '#646B82', }, - checkbox: { - disabled: '#ebeef3' - }, background: { paper: '#fff', default: '#fff', }, }, custom: { + checkbox: { + borderColor: '#bac1cd', + disabled: '#ebeef3' + }, icon: { main: '#fff', contrastText: '#222', diff --git a/web/pgadmin/static/js/components/FormComponents.jsx b/web/pgadmin/static/js/components/FormComponents.jsx index 752287428..325043bd1 100644 --- a/web/pgadmin/static/js/components/FormComponents.jsx +++ b/web/pgadmin/static/js/components/FormComponents.jsx @@ -1280,7 +1280,8 @@ const StyledNotifierMessageBox = styled(Box)(({theme}) => ({ '& .FormFooter-message': { color: theme.palette.text.primary, marginLeft: theme.spacing(0.5), - whiteSpace: 'pre-line' + whiteSpace: 'pre-line', + userSelect: 'text' }, '& .FormFooter-messageCenter': { color: theme.palette.text.primary, diff --git a/web/pgadmin/static/js/helpers/Menu.js b/web/pgadmin/static/js/helpers/Menu.js index 7fd7413ff..6f5a57a29 100644 --- a/web/pgadmin/static/js/helpers/Menu.js +++ b/web/pgadmin/static/js/helpers/Menu.js @@ -122,6 +122,7 @@ export class MenuItem { 'name', 'label', 'priority', 'module', 'callback', 'data', 'enable', 'category', 'target', 'url', 'node', 'single', 'checked', 'below', 'menu_items', 'is_checkbox', 'action', 'applies', 'is_native_only', 'type', + 'permission', ]; let defaults = { url: '#', @@ -169,16 +170,12 @@ export class MenuItem { return this.menu_items; } - contextMenuCallback(self) { - self.callback(); - } - getContextItem(label, is_disabled, sub_ctx_item) { let self = this; return { name: label, disabled: is_disabled, - callback: () => { this.contextMenuCallback(self); }, + callback: self.callback.bind(self), ...(sub_ctx_item && Object.keys(sub_ctx_item).length > 0) && { items: sub_ctx_item } }; } diff --git a/web/pgadmin/tools/backup/__init__.py b/web/pgadmin/tools/backup/__init__.py index 571eee71d..bf19df86e 100644 --- a/web/pgadmin/tools/backup/__init__.py +++ b/web/pgadmin/tools/backup/__init__.py @@ -25,10 +25,11 @@ from config import PG_DEFAULT_DRIVER # This unused import is required as API test cases will fail if we remove it, # Have to identify the cause and then remove it. from pgadmin.model import Server, SharedServer -from flask_security import current_user +from flask_security import current_user, permissions_required from pgadmin.misc.bgprocess import escape_dquotes_process_arg from pgadmin.utils.constants import MIMETYPE_APP_JS, SERVER_NOT_FOUND from pgadmin.tools.grant_wizard import get_data +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes # set template path for sql scripts MODULE_NAME = 'backup' @@ -182,19 +183,6 @@ def index(): return bad_request(errormsg=gettext("This URL cannot be called directly.")) -@blueprint.route("/backup.js") -@pga_login_required -def script(): - """render own javascript""" - return Response( - response=render_template( - "backup/js/backup.js", _=_ - ), - status=200, - mimetype=MIMETYPE_APP_JS - ) - - def _get_args_params_values(data, conn, backup_obj_type, backup_file, server, manager): """ @@ -391,6 +379,7 @@ def _get_args_params_values(data, conn, backup_obj_type, backup_file, server, @blueprint.route( '/job//object', methods=['POST'], endpoint='create_object_job' ) +@permissions_required(AllPermissionTypes.tools_backup) @pga_login_required def create_backup_objects_job(sid): """ diff --git a/web/pgadmin/tools/backup/static/js/backup.js b/web/pgadmin/tools/backup/static/js/backup.js index ff1d41088..c50114dd5 100644 --- a/web/pgadmin/tools/backup/static/js/backup.js +++ b/web/pgadmin/tools/backup/static/js/backup.js @@ -12,6 +12,7 @@ import BackupGlobalSchema, {getMiscellaneousSchema as getMiscellaneousGlobalSche import getApiInstance from 'sources/api_instance'; import {retrieveAncestorOfTypeServer} from 'sources/tree/tree_utils'; import pgAdmin from 'sources/pgadmin'; +import { AllPermissionTypes } from '../../../../browser/static/js/constants'; // Backup dialog define([ @@ -66,6 +67,7 @@ define([ data: { data_disabled: gettext('Please select any server from the object explorer to take Backup of global objects.'), }, + permission: AllPermissionTypes.TOOLS_BACKUP, }, { name: 'backup_server', module: this, @@ -78,6 +80,7 @@ define([ data: { data_disabled: gettext('Please select any server from the object explorer to take Server Backup.'), }, + permission: AllPermissionTypes.TOOLS_BACKUP, }, { name: 'backup_global_ctx', module: this, @@ -91,6 +94,7 @@ define([ data: { data_disabled: gettext('Please select any database or schema or table from the object explorer to take Backup.'), }, + permission: AllPermissionTypes.TOOLS_BACKUP, }, { name: 'backup_server_ctx', module: this, @@ -104,6 +108,7 @@ define([ data: { data_disabled: gettext('Please select any server from the object explorer to take Server Backup.'), }, + permission: AllPermissionTypes.TOOLS_BACKUP, }, { name: 'backup_object', module: this, @@ -118,6 +123,7 @@ define([ data: { data_disabled: gettext('Please select any database or schema or table from the object explorer to take Backup.'), }, + permission: AllPermissionTypes.TOOLS_BACKUP, }]; for (let node_val of menuUtils.backupSupportedNodes) { diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py index ada149231..49eed7caf 100644 --- a/web/pgadmin/tools/debugger/__init__.py +++ b/web/pgadmin/tools/debugger/__init__.py @@ -16,6 +16,7 @@ import copy from flask import render_template, request, current_app from flask_babel import gettext +from flask_security import permissions_required from pgadmin.user_login_check import pga_login_required from werkzeug.user_agent import UserAgent @@ -34,6 +35,7 @@ from pgadmin.browser.server_groups.servers.databases.extensions.utils \ import get_extension_details from pgadmin.utils.constants import PREF_LABEL_KEYBOARD_SHORTCUTS, \ SERVER_CONNECTION_CLOSED +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes from pgadmin.preferences import preferences MODULE_NAME = 'debugger' @@ -375,6 +377,7 @@ def check_node_type(node_type, fid, trid, conn, ppas_server, '/init//////', methods=['GET'], endpoint='init_for_trigger' ) +@permissions_required(AllPermissionTypes.tools_debugger) @pga_login_required def init_function(node_type, sid, did, scid, fid, trid=None): """ diff --git a/web/pgadmin/tools/debugger/static/js/DebuggerModule.js b/web/pgadmin/tools/debugger/static/js/DebuggerModule.js index 5145e080c..d298c4eb8 100644 --- a/web/pgadmin/tools/debugger/static/js/DebuggerModule.js +++ b/web/pgadmin/tools/debugger/static/js/DebuggerModule.js @@ -24,7 +24,7 @@ import FunctionArguments from './debugger_ui'; import ModalProvider from '../../../../static/js/helpers/ModalProvider'; import DebuggerComponent from './components/DebuggerComponent'; import Theme from '../../../../static/js/Theme'; -import { BROWSER_PANELS } from '../../../../browser/static/js/constants'; +import { AllPermissionTypes, BROWSER_PANELS } from '../../../../browser/static/js/constants'; import { NotifierProvider } from '../../../../static/js/helpers/Notifier'; import usePreferences, { listenPreferenceBroadcast } from '../../../../preferences/static/js/store'; import pgAdmin from 'sources/pgadmin'; @@ -66,6 +66,7 @@ export default class DebuggerModule { object: 'function', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'global_debugger', node: 'function', @@ -80,6 +81,7 @@ export default class DebuggerModule { debug_type: 'indirect', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'procedure_direct_debugger', node: 'procedure', @@ -93,6 +95,7 @@ export default class DebuggerModule { object: 'procedure', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'procedure_indirect_debugger', node: 'procedure', @@ -107,6 +110,7 @@ export default class DebuggerModule { debug_type: 'indirect', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'trigger_function_indirect_debugger', node: 'trigger_function', @@ -121,6 +125,7 @@ export default class DebuggerModule { debug_type: 'indirect', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'trigger_indirect_debugger', node: 'trigger', @@ -135,6 +140,7 @@ export default class DebuggerModule { debug_type: 'indirect', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'package_function_direct_debugger', node: 'edbfunc', @@ -148,6 +154,7 @@ export default class DebuggerModule { object: 'edbfunc', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'package_function_global_debugger', node: 'edbfunc', @@ -162,6 +169,7 @@ export default class DebuggerModule { debug_type: 'indirect', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'package_procedure_direct_debugger', node: 'edbproc', @@ -175,6 +183,7 @@ export default class DebuggerModule { object: 'edbproc', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, }, { name: 'package_procedure_global_debugger', node: 'edbproc', @@ -189,6 +198,7 @@ export default class DebuggerModule { debug_type: 'indirect', }, enable: 'canDebug', + permission: AllPermissionTypes.TOOLS_DEBUGGER, } ]); } diff --git a/web/pgadmin/tools/erd/__init__.py b/web/pgadmin/tools/erd/__init__.py index 8416646e9..d934158f5 100644 --- a/web/pgadmin/tools/erd/__init__.py +++ b/web/pgadmin/tools/erd/__init__.py @@ -12,6 +12,7 @@ import json from flask import url_for, request, Response from flask import render_template, current_app as app +from flask_security import permissions_required from pgadmin.user_login_check import pga_login_required from flask_babel import gettext from werkzeug.user_agent import UserAgent @@ -32,6 +33,7 @@ from pgadmin.utils.constants import PREF_LABEL_KEYBOARD_SHORTCUTS, \ from .utils import ERDHelper from pgadmin.utils.exception import ConnectionLost from pgadmin.authenticate import socket_login_required +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes from ... import socketio MODULE_NAME = 'erd' @@ -451,6 +453,7 @@ blueprint = ERDModule(MODULE_NAME, __name__, static_url_path='/static') methods=["POST"], endpoint='panel' ) +@permissions_required(AllPermissionTypes.tools_erd_tool) @pga_login_required def panel(trans_id): """ diff --git a/web/pgadmin/tools/erd/static/js/ERDModule.js b/web/pgadmin/tools/erd/static/js/ERDModule.js index 012dc83d8..51b8378ef 100644 --- a/web/pgadmin/tools/erd/static/js/ERDModule.js +++ b/web/pgadmin/tools/erd/static/js/ERDModule.js @@ -16,7 +16,7 @@ import ReactDOM from 'react-dom/client'; import ERDTool from './erd_tool/components/ERDTool'; import ModalProvider from '../../../../static/js/helpers/ModalProvider'; import Theme from '../../../../static/js/Theme'; -import { BROWSER_PANELS } from '../../../../browser/static/js/constants'; +import { AllPermissionTypes, BROWSER_PANELS } from '../../../../browser/static/js/constants'; import { NotifierProvider } from '../../../../static/js/helpers/Notifier'; import usePreferences, { listenPreferenceBroadcast } from '../../../../preferences/static/js/store'; import pgAdmin from 'sources/pgadmin'; @@ -59,6 +59,7 @@ export default class ERDModule { data: { data_disabled: gettext('The selected tree node does not support this option.'), }, + permission: AllPermissionTypes.TOOLS_ERD_TOOL, }]); return this; } diff --git a/web/pgadmin/tools/grant_wizard/__init__.py b/web/pgadmin/tools/grant_wizard/__init__.py index 58501af15..5c7303a92 100644 --- a/web/pgadmin/tools/grant_wizard/__init__.py +++ b/web/pgadmin/tools/grant_wizard/__init__.py @@ -13,6 +13,7 @@ import json from flask import Response, url_for from flask import render_template, request, current_app from flask_babel import gettext +from flask_security import permissions_required from pgadmin.user_login_check import pga_login_required from urllib.parse import unquote @@ -27,6 +28,7 @@ from pgadmin.utils.ajax import precondition_required from functools import wraps from pgadmin.utils.preferences import Preferences from pgadmin.utils.constants import MIMETYPE_APP_JS +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes # set template path for sql scripts MODULE_NAME = 'grant_wizard' @@ -122,19 +124,10 @@ def index(): ) -@blueprint.route("/grant_wizard.js") -@pga_login_required -def script(): - """render own javascript""" - return Response(response=render_template( - "grant_wizard/js/grant_wizard.js", _=gettext), - status=200, - mimetype=MIMETYPE_APP_JS) - - @blueprint.route( '/acl///', methods=['GET'], endpoint='acl' ) +@permissions_required(AllPermissionTypes.tools_grant_wizard) @pga_login_required @check_precondition def acl_list(sid, did): diff --git a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js index 82b42221c..a1fe8d789 100644 --- a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js +++ b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js @@ -8,7 +8,7 @@ ////////////////////////////////////////////////////////////// import React from 'react'; import GrantWizard from './GrantWizard'; -import { BROWSER_PANELS } from '../../../../browser/static/js/constants'; +import { AllPermissionTypes, BROWSER_PANELS } from '../../../../browser/static/js/constants'; // Grant Wizard @@ -49,6 +49,7 @@ define([ data: { data_disabled: gettext('Please select any database, schema or schema objects from the object explorer to access Grant Wizard Tool.'), }, + permission: AllPermissionTypes.TOOLS_GRANT_WIZARD, }]; // Add supported menus into the menus list diff --git a/web/pgadmin/tools/import_export/__init__.py b/web/pgadmin/tools/import_export/__init__.py index dea029b9a..833d2d134 100644 --- a/web/pgadmin/tools/import_export/__init__.py +++ b/web/pgadmin/tools/import_export/__init__.py @@ -14,7 +14,7 @@ import copy from flask import Response, render_template, request, current_app from flask_babel import gettext as _ -from flask_security import current_user +from flask_security import current_user, permissions_required from pgadmin.user_login_check import pga_login_required from pgadmin.misc.bgprocess.processes import BatchProcess, IProcessDesc from pgadmin.utils import PgAdminModule, get_storage_directory, IS_WIN, \ @@ -25,6 +25,7 @@ from config import PG_DEFAULT_DRIVER from pgadmin.model import Server from pgadmin.utils.constants import MIMETYPE_APP_JS, SERVER_NOT_FOUND from pgadmin.settings import get_setting, store_setting +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes MODULE_NAME = 'import_export' @@ -227,6 +228,7 @@ def _save_import_export_settings(settings): @blueprint.route('/job/', methods=['POST'], endpoint="create_job") +@permissions_required(AllPermissionTypes.tools_import_export_data) @pga_login_required def create_import_export_job(sid): """ diff --git a/web/pgadmin/tools/import_export/static/js/import_export.js b/web/pgadmin/tools/import_export/static/js/import_export.js index b329cea63..fbaf34070 100644 --- a/web/pgadmin/tools/import_export/static/js/import_export.js +++ b/web/pgadmin/tools/import_export/static/js/import_export.js @@ -10,6 +10,7 @@ import getApiInstance from 'sources/api_instance'; import ImportExportSchema from './import_export.ui'; import { getNodeListByName, getNodeAjaxOptions } from '../../../../browser/static/js/node_ajax'; +import { AllPermissionTypes } from '../../../../browser/static/js/constants'; define([ 'sources/gettext', 'sources/url_for', @@ -51,6 +52,7 @@ define([ data: { data_disabled: gettext('Please select any table from the object explorer to Import/Export data.'), }, + permission: AllPermissionTypes.TOOLS_IMPORT_EXPORT_DATA, }]); }, getUISchema: function(treeItem) { diff --git a/web/pgadmin/tools/import_export_servers/__init__.py b/web/pgadmin/tools/import_export_servers/__init__.py index 1c6e1f76e..d02844e59 100644 --- a/web/pgadmin/tools/import_export_servers/__init__.py +++ b/web/pgadmin/tools/import_export_servers/__init__.py @@ -16,7 +16,7 @@ import secrets from flask import Response, render_template, request from flask_babel import gettext as _ -from flask_security import current_user +from flask_security import current_user, permissions_required from pgadmin.user_login_check import pga_login_required from pgadmin.utils import PgAdminModule from pgadmin.utils.ajax import bad_request @@ -27,7 +27,7 @@ from pgadmin.model import ServerGroup, Server from pgadmin.utils import clear_database_servers, dump_database_servers,\ load_database_servers, validate_json_data, filename_with_file_manager_path from urllib.parse import unquote -from pgadmin.utils.paths import get_storage_directory +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes MODULE_NAME = 'import_export_servers' @@ -60,18 +60,6 @@ def index(): return bad_request(errormsg=_("This URL cannot be called directly.")) -@blueprint.route("/js/import_export_servers.js") -@pga_login_required -def script(): - """render the import/export javascript file""" - return Response( - response=render_template( - "import_export_servers/js/import_export_servers.js", _=_), - status=200, - mimetype=MIMETYPE_APP_JS - ) - - @blueprint.route('/get_servers', methods=['GET'], endpoint='get_servers') @pga_login_required def get_servers(): @@ -169,6 +157,7 @@ def load_servers(): @blueprint.route('/save', methods=['POST'], endpoint='save') +@permissions_required(AllPermissionTypes.tools_import_export_servers) @pga_login_required def save(): """ diff --git a/web/pgadmin/tools/import_export_servers/static/js/import_export_servers.js b/web/pgadmin/tools/import_export_servers/static/js/import_export_servers.js index 6484ad1b3..c433157bc 100644 --- a/web/pgadmin/tools/import_export_servers/static/js/import_export_servers.js +++ b/web/pgadmin/tools/import_export_servers/static/js/import_export_servers.js @@ -38,6 +38,7 @@ export default class ImportExportServersModule { enable: isDefaultWorkspace, priority: 3, label: gettext('Import/Export Servers...'), + permission: 'tools_import_export_servers', }]; pgAdmin.Browser.add_menus(menus); diff --git a/web/pgadmin/tools/maintenance/__init__.py b/web/pgadmin/tools/maintenance/__init__.py index c2c8d2da6..ecc830d5e 100644 --- a/web/pgadmin/tools/maintenance/__init__.py +++ b/web/pgadmin/tools/maintenance/__init__.py @@ -13,6 +13,7 @@ import json from flask import Response, render_template, request, current_app from flask_babel import gettext as _ +from flask_security import permissions_required from pgadmin.user_login_check import pga_login_required from pgadmin.misc.bgprocess.processes import BatchProcess, IProcessDesc from pgadmin.utils import PgAdminModule, html, does_utility_exist, get_server @@ -22,6 +23,7 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER from pgadmin.model import Server, SharedServer from pgadmin.utils.constants import MIMETYPE_APP_JS, SERVER_NOT_FOUND +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes MODULE_NAME = 'maintenance' @@ -129,17 +131,6 @@ def index(): ) -@blueprint.route("/js/maintenance.js") -@pga_login_required -def script(): - """render the maintenance tool of vacuum javascript file""" - return Response( - response=render_template("maintenance/js/maintenance.js", _=_), - status=200, - mimetype=MIMETYPE_APP_JS - ) - - def get_index_name(data): """ Check and get index name from constraints. @@ -160,6 +151,7 @@ def get_index_name(data): @blueprint.route( '/job//', methods=['POST'], endpoint='create_job' ) +@permissions_required(AllPermissionTypes.tools_maintenance) @pga_login_required def create_maintenance_job(sid, did): """ diff --git a/web/pgadmin/tools/maintenance/static/js/maintenance.js b/web/pgadmin/tools/maintenance/static/js/maintenance.js index b8e6b942d..bfa50739d 100644 --- a/web/pgadmin/tools/maintenance/static/js/maintenance.js +++ b/web/pgadmin/tools/maintenance/static/js/maintenance.js @@ -10,6 +10,7 @@ import getApiInstance from 'sources/api_instance'; import MaintenanceSchema, {getVacuumSchema} from './maintenance.ui'; import { getNodeListByName } from '../../../../browser/static/js/node_ajax'; +import { AllPermissionTypes } from '../../../../browser/static/js/constants'; define([ 'sources/gettext', 'sources/url_for', 'sources/pgadmin', 'pgadmin.browser', @@ -51,6 +52,7 @@ define([ data: { data_disabled: gettext('Please select any database from the object explorer to do Maintenance.'), }, + permission: AllPermissionTypes.TOOLS_MAINTENANCE, }]; // Add supported menus into the menus list diff --git a/web/pgadmin/tools/psql/static/js/PsqlModule.js b/web/pgadmin/tools/psql/static/js/PsqlModule.js index b2d587179..cfe0309a0 100644 --- a/web/pgadmin/tools/psql/static/js/PsqlModule.js +++ b/web/pgadmin/tools/psql/static/js/PsqlModule.js @@ -10,7 +10,7 @@ import { getRandomInt, hasBinariesConfiguration } from 'sources/utils'; import { retrieveAncestorOfTypeServer } from 'sources/tree/tree_utils'; import { generateTitle } from 'tools/sqleditor/static/js/sqleditor_title'; -import { BROWSER_PANELS } from '../../../../browser/static/js/constants'; +import { AllPermissionTypes, BROWSER_PANELS } from '../../../../browser/static/js/constants'; import usePreferences,{ listenPreferenceBroadcast } from '../../../../preferences/static/js/store'; import 'pgadmin.browser.keyboard'; import pgWindow from 'sources/window'; @@ -93,6 +93,7 @@ export default class Psql { applies: 'tools', data_disabled: gettext('Please select a database from the object explorer to access Pql Tool.'), }, + permission: AllPermissionTypes.TOOLS_PSQL_TOOL, }]; diff --git a/web/pgadmin/tools/restore/__init__.py b/web/pgadmin/tools/restore/__init__.py index 74c5b45da..45d3d6393 100644 --- a/web/pgadmin/tools/restore/__init__.py +++ b/web/pgadmin/tools/restore/__init__.py @@ -15,7 +15,7 @@ from flask import render_template, request, current_app, Response from flask_babel import gettext as _ # This unused import is required as API test cases will fail if we remove it, # Have to identify the cause and then remove it. -from flask_security import current_user +from flask_security import current_user, permissions_required from pgadmin.user_login_check import pga_login_required from pgadmin.misc.bgprocess.processes import BatchProcess, IProcessDesc from pgadmin.utils import PgAdminModule, fs_short_path, does_utility_exist, \ @@ -25,6 +25,7 @@ from pgadmin.utils.ajax import make_json_response, bad_request, \ from config import PG_DEFAULT_DRIVER from pgadmin.utils.constants import MIMETYPE_APP_JS, SERVER_NOT_FOUND +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes # set template path for sql scripts MODULE_NAME = 'restore' @@ -117,19 +118,6 @@ def index(): return bad_request(errormsg=_("This URL cannot be called directly.")) -@blueprint.route("/restore.js") -@pga_login_required -def script(): - """render own javascript""" - return Response( - response=render_template( - "restore/js/restore.js", _=_ - ), - status=200, - mimetype=MIMETYPE_APP_JS - ) - - def _get_create_req_data(): """ Get data from request for create restore job. @@ -398,6 +386,7 @@ def use_sql_utility(data, manager, server, filepath): @blueprint.route('/job/', methods=['POST'], endpoint='create_job') +@permissions_required(AllPermissionTypes.tools_restore) @pga_login_required def create_restore_job(sid): """ diff --git a/web/pgadmin/tools/restore/static/js/restore.js b/web/pgadmin/tools/restore/static/js/restore.js index c262e5b83..b52845b0e 100644 --- a/web/pgadmin/tools/restore/static/js/restore.js +++ b/web/pgadmin/tools/restore/static/js/restore.js @@ -12,6 +12,7 @@ import getApiInstance from 'sources/api_instance'; import {retrieveAncestorOfTypeServer} from 'sources/tree/tree_utils'; import RestoreSchema, {getRestoreSaveOptSchema, getRestoreDisableOptionSchema, getRestoreMiscellaneousSchema, getRestoreTypeObjSchema, getRestoreSectionSchema} from './restore.ui'; import pgAdmin from 'sources/pgadmin'; +import { AllPermissionTypes } from '../../../../browser/static/js/constants'; define('tools.restore', [ 'sources/gettext', 'sources/url_for', 'pgadmin.browser', @@ -49,6 +50,7 @@ define('tools.restore', [ data: { data_disabled: gettext('Please select any schema or table from the object explorer to Restore data.'), }, + permission: AllPermissionTypes.TOOLS_RESTORE, }]; for (let sup_node_val of menuUtils.restoreSupportedNodes) { @@ -63,6 +65,7 @@ define('tools.restore', [ enable: supportedNodes.enabled.bind( null, pgBrowser.tree, menuUtils.restoreSupportedNodes ), + permission: AllPermissionTypes.TOOLS_RESTORE, }); } diff --git a/web/pgadmin/tools/schema_diff/__init__.py b/web/pgadmin/tools/schema_diff/__init__.py index 7ea45b268..0d4747de9 100644 --- a/web/pgadmin/tools/schema_diff/__init__.py +++ b/web/pgadmin/tools/schema_diff/__init__.py @@ -15,7 +15,7 @@ import copy from flask import Response, session, url_for, request from flask import render_template, current_app as app -from flask_security import current_user +from flask_security import current_user, permissions_required from pgadmin.user_login_check import pga_login_required from flask_babel import gettext from pgadmin.utils import PgAdminModule @@ -31,6 +31,7 @@ from pgadmin.utils.constants import PREF_LABEL_DISPLAY, MIMETYPE_APP_JS,\ from sqlalchemy import or_ from pgadmin.authenticate import socket_login_required from pgadmin import socketio +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes MODULE_NAME = 'schema_diff' COMPARE_MSG = gettext("Comparing objects...") @@ -123,6 +124,8 @@ def index(): methods=["GET"], endpoint='panel' ) +@permissions_required(AllPermissionTypes.tools_schema_diff) +@pga_login_required def panel(trans_id, editor_title): """ This method calls index.html to render the schema diff. diff --git a/web/pgadmin/tools/schema_diff/static/js/SchemaDiffModule.js b/web/pgadmin/tools/schema_diff/static/js/SchemaDiffModule.js index c4488e20f..7240d7aa5 100644 --- a/web/pgadmin/tools/schema_diff/static/js/SchemaDiffModule.js +++ b/web/pgadmin/tools/schema_diff/static/js/SchemaDiffModule.js @@ -19,7 +19,7 @@ import getApiInstance from '../../../../static/js/api_instance'; import Theme from '../../../../static/js/Theme'; import ModalProvider from '../../../../static/js/helpers/ModalProvider'; import SchemaDiffComponent from './components/SchemaDiffComponent'; -import { BROWSER_PANELS } from '../../../../browser/static/js/constants'; +import { AllPermissionTypes, BROWSER_PANELS } from '../../../../browser/static/js/constants'; import { NotifierProvider } from '../../../../static/js/helpers/Notifier'; import usePreferences, { listenPreferenceBroadcast } from '../../../../preferences/static/js/store'; import pgAdmin from 'sources/pgadmin'; @@ -57,6 +57,7 @@ export default class SchemaDiff { label: gettext('Schema Diff'), enable: true, below: true, + permission: AllPermissionTypes.TOOLS_SCHEMA_DIFF, }]); } diff --git a/web/pgadmin/tools/search_objects/__init__.py b/web/pgadmin/tools/search_objects/__init__.py index 091f612bb..553216058 100644 --- a/web/pgadmin/tools/search_objects/__init__.py +++ b/web/pgadmin/tools/search_objects/__init__.py @@ -11,6 +11,7 @@ from flask import request from flask_babel import gettext +from flask_security import permissions_required from pgadmin.user_login_check import pga_login_required from pgadmin.utils import PgAdminModule @@ -18,6 +19,7 @@ from pgadmin.utils.ajax import make_json_response, bad_request,\ internal_server_error from pgadmin.utils.preferences import Preferences from pgadmin.tools.search_objects.utils import SearchObjectsHelper +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes MODULE_NAME = 'search_objects' @@ -67,6 +69,7 @@ def types(sid, did): @blueprint.route("search//", endpoint='search') +@permissions_required(AllPermissionTypes.tools_search_objects) @pga_login_required def search(sid, did): """ diff --git a/web/pgadmin/tools/search_objects/static/js/index.js b/web/pgadmin/tools/search_objects/static/js/index.js index d71016c2f..231acdd25 100644 --- a/web/pgadmin/tools/search_objects/static/js/index.js +++ b/web/pgadmin/tools/search_objects/static/js/index.js @@ -47,6 +47,7 @@ export default class SearchObjectModule { data: { data_disabled: gettext('Please select a database from the object explorer to search the database objects.'), }, + permission: 'tools_search_objects', }]; pgBrowser.add_menus(menus); diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py index 152ae82a8..0a6ecf03d 100644 --- a/web/pgadmin/tools/sqleditor/__init__.py +++ b/web/pgadmin/tools/sqleditor/__init__.py @@ -29,7 +29,7 @@ from flask_babel import gettext from pgadmin.tools.sqleditor.utils.query_tool_connection_check \ import query_tool_connection_check from pgadmin.user_login_check import pga_login_required -from flask_security import current_user +from flask_security import current_user, permissions_required from pgadmin.misc.file_manager import Filemanager from pgadmin.tools.sqleditor.command import QueryToolCommand, ObjectRegistry, \ SQLFilter @@ -67,6 +67,7 @@ from pgadmin.settings import get_setting from pgadmin.utils.preferences import Preferences from pgadmin.tools.sqleditor.utils.apply_explain_plan_wrapper import \ get_explain_query_length +from pgadmin.tools.user_management.PgAdminPermissions import AllPermissionTypes from pgadmin.browser.server_groups.servers.utils import \ convert_connection_parameter, get_db_disp_restriction from pgadmin.misc.workspaces import check_and_delete_adhoc_server @@ -295,6 +296,7 @@ def initialize_viewdata(trans_id, cmd_type, obj_type, sgid, sid, did, obj_id): methods=["POST"], endpoint='panel' ) +@pga_login_required def panel(trans_id): """ This method calls index.html to render the data grid. @@ -375,6 +377,7 @@ def panel(trans_id): '/initialize/sqleditor///', methods=["POST"], endpoint='initialize_sqleditor' ) +@permissions_required(AllPermissionTypes.tools_query_tool) @pga_login_required def initialize_sqleditor(trans_id, sgid, sid, did=None): """ diff --git a/web/pgadmin/tools/sqleditor/static/js/SQLEditorModule.js b/web/pgadmin/tools/sqleditor/static/js/SQLEditorModule.js index 1a50bd7f4..75fb850c4 100644 --- a/web/pgadmin/tools/sqleditor/static/js/SQLEditorModule.js +++ b/web/pgadmin/tools/sqleditor/static/js/SQLEditorModule.js @@ -23,7 +23,7 @@ import ReactDOM from 'react-dom/client'; import QueryToolComponent from './components/QueryToolComponent'; import ModalProvider from '../../../../static/js/helpers/ModalProvider'; import Theme from '../../../../static/js/Theme'; -import { BROWSER_PANELS, WORKSPACES } from '../../../../browser/static/js/constants'; +import { AllPermissionTypes, BROWSER_PANELS, WORKSPACES } from '../../../../browser/static/js/constants'; import { NotifierProvider } from '../../../../static/js/helpers/Notifier'; import usePreferences, { listenPreferenceBroadcast } from '../../../../preferences/static/js/store'; import { PgAdminProvider } from '../../../../static/js/PgAdminProvider'; @@ -104,6 +104,7 @@ export default class SQLEditor { applies: 'tools', data_disabled: gettext('Please select a database from the object explorer to access Query Tool.'), }, + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }]; // Create context menu @@ -121,6 +122,7 @@ export default class SQLEditor { category: 'view_data', priority: 101, label: gettext('All Rows'), + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }, { name: 'view_first_100_rows_context_' + supportedNode, node: supportedNode, @@ -134,6 +136,7 @@ export default class SQLEditor { category: 'view_data', priority: 102, label: gettext('First 100 Rows'), + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }, { name: 'view_last_100_rows_context_' + supportedNode, node: supportedNode, @@ -147,6 +150,7 @@ export default class SQLEditor { category: 'view_data', priority: 103, label: gettext('Last 100 Rows'), + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }, { name: 'view_filtered_rows_context_' + supportedNode, node: supportedNode, @@ -160,6 +164,7 @@ export default class SQLEditor { category: 'view_data', priority: 104, label: gettext('Filtered Rows...'), + permission: AllPermissionTypes.TOOLS_QUERY_TOOL, }); } diff --git a/web/pgadmin/tools/user_management/PgAdminPermissions.py b/web/pgadmin/tools/user_management/PgAdminPermissions.py new file mode 100644 index 000000000..5a7fc594c --- /dev/null +++ b/web/pgadmin/tools/user_management/PgAdminPermissions.py @@ -0,0 +1,135 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2025, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from flask_babel import gettext + + +class AllPermissionTypes: + object_register_server = 'object_register_server' + tools_erd_tool = 'tools_erd_tool' + tools_query_tool = 'tools_query_tool' + tools_debugger = 'tools_debugger' + tools_psql_tool = 'tools_psql_tool' + tools_backup = 'tools_backup' + tools_restore = 'tools_restore' + tools_import_export_data = 'tools_import_export_data' + tools_import_export_servers = 'tools_import_export_servers' + tools_search_objects = 'tools_search_objects' + tools_maintenance = 'tools_maintenance' + tools_schema_diff = 'tools_schema_diff' + tools_grant_wizard = 'tools_grant_wizard' + storage_add_folder = 'storage_add_folder' + storage_remove_folder = 'storage_remove_folder' + + @staticmethod + def list(): + return filter(lambda x: not x.startswith('_'), + AllPermissionTypes.__dict__.keys()) + + +class AllPermissionCategories: + object_explorer = 'Object Explorer' + tools = 'Tools' + storage_manager = 'Storage Manager' + + +class PgAdminPermissions: + _all_permissions = [] + + def __init__(self): + self.add_permission( + AllPermissionCategories.object_explorer, + AllPermissionTypes.object_register_server, + gettext("Register/remove server") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_query_tool, + gettext("Query tool") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_debugger, + gettext("Debugger") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_psql_tool, + gettext("PSQL tool") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_backup, + gettext("Backup tool (including server and globals)") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_restore, + gettext("Restore tool") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_import_export_data, + gettext("Import/export data") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_import_export_servers, + gettext("Import/export servers") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_search_objects, + gettext("Search objects") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_maintenance, + gettext("Maintenance") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_schema_diff, + gettext("Schema diff") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_grant_wizard, + gettext("Grant wizard") + ) + self.add_permission( + AllPermissionCategories.tools, + AllPermissionTypes.tools_erd_tool, + gettext("ERD tool") + ) + self.add_permission( + AllPermissionCategories.storage_manager, + AllPermissionTypes.storage_add_folder, + gettext("Add folder") + ) + self.add_permission( + AllPermissionCategories.storage_manager, + AllPermissionTypes.storage_remove_folder, + gettext("Delete file/folder") + ) + + def add_permission(self, category: str, permission: str, label: str): + self._all_permissions.append({ + "category": category, + "name": permission, + "label": label, + }) + + @property + def all_permissions(self): + return sorted( + self._all_permissions, + key=lambda x: ( + x['category'], + x['label'])) diff --git a/web/pgadmin/tools/user_management/__init__.py b/web/pgadmin/tools/user_management/__init__.py index 1c6a78e44..3270ec41c 100644 --- a/web/pgadmin/tools/user_management/__init__.py +++ b/web/pgadmin/tools/user_management/__init__.py @@ -27,17 +27,21 @@ from pgadmin.utils import PgAdminModule from pgadmin.utils.ajax import make_response as ajax_response, \ make_json_response, bad_request, internal_server_error from pgadmin.utils.csrf import pgCSRFProtect -from pgadmin.utils.constants import MIMETYPE_APP_JS, INTERNAL,\ +from pgadmin.utils.constants import MIMETYPE_APP_JS, INTERNAL, \ SUPPORTED_AUTH_SOURCES from pgadmin.utils.validation_utils import validate_email from pgadmin.model import db, Role, User, UserPreference, Server, \ ServerGroup, Process, Setting, roles_users, SharedServer from pgadmin.utils.paths import create_users_storage_directory +from pgadmin.tools.user_management.PgAdminPermissions import PgAdminPermissions +from sqlalchemy import func # set template path for sql scripts MODULE_NAME = 'user_management' server_info = {} +permissions_obj = PgAdminPermissions() + class UserManagementModule(PgAdminModule): """ @@ -62,13 +66,21 @@ class UserManagementModule(PgAdminModule): list: URL endpoints for backup module """ return [ - 'user_management.roles', 'user_management.role', - 'user_management.users', 'user_management.user', + 'user_management.roles', + 'user_management.role', + 'user_management.role_save', + 'user_management.role_delete', + 'user_management.users', + 'user_management.user', current_app.login_manager.login_view, - 'user_management.auth_sources', 'user_management.change_owner', - 'user_management.shared_servers', 'user_management.admin_users', - 'user_management.save', 'user_management.save_id' - ] + 'user_management.auth_sources', + 'user_management.change_owner', + 'user_management.shared_servers', + 'user_management.admin_users', + 'user_management.save', + 'user_management.save_id', + 'user_management.all_permissions', + 'user_management.save_permissions'] # Create blueprint for BackupModule class @@ -83,35 +95,21 @@ def index(): return bad_request(errormsg=_("This URL cannot be called directly.")) -@blueprint.route("/user_management.js") -@pga_login_required -def script(): - """render own javascript""" - return Response( - response=render_template( - "user_management/js/user_management.js", _=_, - is_admin=current_user.has_role("Administrator"), - user_id=current_user.id - ), - status=200, - mimetype=MIMETYPE_APP_JS - ) - - @blueprint.route("/current_user.js") @pgCSRFProtect.exempt @pga_login_required def current_user_info(): + current_user.has_permission return Response( response=render_template( "user_management/js/current_user.js", is_admin='true' if current_user.has_role( "Administrator") else 'false', user_id=current_user.id, - email=current_user.email.replace("'","\\'") if current_user.email + email=current_user.email.replace("'", "\\'") if current_user.email else current_user.email, name=( - current_user.username.split('@')[0].replace("'","\\'") if + current_user.username.split('@')[0].replace("'", "\\'") if config.SERVER_MODE is True else 'postgres' ), @@ -124,8 +122,13 @@ def current_user_info(): session.get('allow_save_password', None) else 'false', auth_sources=config.AUTHENTICATION_SOURCES, current_auth_source=session['auth_source_manager'][ - 'current_source'] if config.SERVER_MODE is True else INTERNAL + 'current_source'] if config.SERVER_MODE is True else INTERNAL, + permissions=list({p for r in current_user.roles + for p in r.get_permissions()}) ), + headers={ + 'Cache-Control': 'no-cache, no-store, must-revalidate' + }, status=200, mimetype=MIMETYPE_APP_JS ) @@ -348,6 +351,81 @@ def admin_users(uid=None): ) +def create_role(data): + try: + validate_unique_role(data) + r = Role(name=data['name'], + description=data['description']) + db.session.add(r) + db.session.commit() + return ajax_response( + status=200 + ) + except Exception as e: + db.session.rollback() + current_app.logger.exception(e) + return internal_server_error(str(e)) + + +def update_role(rid, data): + try: + validate_unique_role(data) + r = Role.query.get(rid) + + if not r: + return ajax_response( + response=_('Role not found'), + status=404 + ) + + for key, value in data.items(): + setattr(r, key, value) + + db.session.commit() + return ajax_response( + status=200 + ) + except Exception as e: + db.session.rollback() + current_app.logger.exception(e) + return internal_server_error(str(e)) + + +def delete_role(rid): + r = Role.query.get(rid) + + if not r: + return ajax_response( + response=_('Role not found'), + status=404 + ) + + users = User.query.all() + + for u in users: + if u.has_role(r): + return make_json_response( + success=0, + status=400, + errormsg=_( + 'To proceed, ensure that all users assigned ' + 'the \'{0}\' role have been reassigned.'.format(r.name)) + ) + + try: + # Finally delete user + db.session.delete(r) + db.session.commit() + + return ajax_response( + status=200 + ) + except Exception as e: + db.session.rollback() + current_app.logger.exception(e) + return internal_server_error(str(e)) + + @blueprint.route( '/role/', methods=['GET'], defaults={'rid': None}, endpoint='roles' ) @@ -366,14 +444,21 @@ def role(rid): if rid: r = Role.query.get(rid) - res = {'id': r.id, 'name': r.name} + res = {'id': r.id, + 'name': r.name, + 'description': r.description, + 'permissions': r.permissions, + 'is_admin': r.name == "Administrator"} else: roles = Role.query.all() roles_data = [] for r in roles: roles_data.append({'id': r.id, - 'name': r.name}) + 'name': r.name, + 'description': r.description, + 'permissions': r.permissions, + 'is_admin': r.name == "Administrator"}) res = roles_data @@ -383,6 +468,32 @@ def role(rid): ) +@blueprint.route( + '/role/', methods=['POST'], defaults={'id': None}, endpoint='role_save' +) +@blueprint.route('/role/', methods=['DELETE'], endpoint='role_delete') +@roles_required('Administrator') +def role_save(id): + """ + + Args: + id: Role id + + """ + + if request.method == 'DELETE': + return delete_role(id) + + data = request.form if request.form else json.loads( + request.data + ) + + if 'id' not in data: + return create_role(data) + else: + return update_role(data['id'], data) + + @blueprint.route( '/auth_sources/', methods=['GET'], endpoint='auth_sources' ) @@ -446,6 +557,18 @@ def normalise_password(password): normalize(normalise_form, password) +def validate_unique_role(data): + if 'name' not in data: + return + + exist_roles = Role.query.filter( + func.lower(Role.name) == func.lower(data['name']) + ).count() + + if exist_roles != 0: + raise InternalServerError(_("Role name must be unique.")) + + def validate_password(data, new_data): """ Check password new and confirm password match. If both passwords are not @@ -652,3 +775,41 @@ def delete_user(uid): return False, str(e) return True, '' + + +@blueprint.route('/all_permissions', + methods=['GET'], + endpoint='all_permissions') +@roles_required('Administrator') +def get_all_permissions(): + return ajax_response( + status=200, + response=permissions_obj.all_permissions + ) + + +@blueprint.route('/save_permissions/', + methods=['PUT'], endpoint='save_permissions') +@roles_required('Administrator') +def save_permissions(id): + data = request.form if request.form else json.loads( + request.data + ) + + r = Role.query.get(id) + + try: + r.permissions = data['permissions'] + db.session.commit() + except Exception as e: + db.session.rollback() + return internal_server_error(errormsg=str(e)) + + return ajax_response( + status=200, + response={ + 'id': r.id, + 'name': r.name, + 'permissions': r.permissions + } + ) diff --git a/web/pgadmin/tools/user_management/static/js/Component.jsx b/web/pgadmin/tools/user_management/static/js/Component.jsx index 8b4046802..601154349 100644 --- a/web/pgadmin/tools/user_management/static/js/Component.jsx +++ b/web/pgadmin/tools/user_management/static/js/Component.jsx @@ -7,10 +7,14 @@ // ////////////////////////////////////////////////////////////// -import React from 'react'; +import React, { useEffect } from 'react'; import { Box, styled, Tab, Tabs } from '@mui/material'; import TabPanel from '../../../../static/js/components/TabPanel'; +import url_for from 'sources/url_for'; import Users from './Users'; +import Permissions from './Permissions'; +import getApiInstance from '../../../../static/js/api_instance'; +import Roles from './Roles'; const Root = styled('div')(({theme}) => ({ height: '100%', @@ -23,12 +27,33 @@ const Root = styled('div')(({theme}) => ({ flexGrow: 1, display: 'flex', flexDirection: 'column', + minHeight: 0, ...theme.mixins.panelBorder.all, } })); export default function Component() { const [tabValue, setTabValue] = React.useState(0); + const [roles, setRoles] = React.useState([]); + + const fetchRoles = async () => { + const url = url_for('user_management.roles'); + const response = await getApiInstance().get(url); + setRoles(response.data); + }; + + const updateRolePermissions = (rid, permissions) => { + setRoles(roles.map((r) => { + if (r.id === rid) { + return {...r, permissions}; + } + return r; + })); + }; + + useEffect(() => { + fetchRoles(); + }, []); return ( @@ -44,10 +69,18 @@ export default function Component() { action={(ref)=>ref?.updateIndicator()} > + + - + + + + + + + diff --git a/web/pgadmin/tools/user_management/static/js/Permissions.jsx b/web/pgadmin/tools/user_management/static/js/Permissions.jsx new file mode 100644 index 000000000..4316aae29 --- /dev/null +++ b/web/pgadmin/tools/user_management/static/js/Permissions.jsx @@ -0,0 +1,202 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2025, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import React, { useMemo, useEffect } from 'react'; +import url_for from 'sources/url_for'; +import gettext from 'sources/gettext'; +import getApiInstance, { parseApiError } from '../../../../static/js/api_instance'; +import { Box, FormLabel } from '@mui/material'; +import SectionContainer from '../../../../dashboard/static/js/components/SectionContainer'; +import { InputCheckbox, InputSelect, InputText } from '../../../../static/js/components/FormComponents'; +import { SearchRounded } from '@mui/icons-material'; +import { PgButtonGroup, PgIconButton, PrimaryButton } from '../../../../static/js/components/Buttons'; +import { usePgAdmin } from '../../../../static/js/PgAdminProvider'; +import Loader from 'sources/components/Loader'; +import SelectAllRoundedIcon from '@mui/icons-material/SelectAllRounded'; +import DeselectRoundedIcon from '@mui/icons-material/DeselectRounded'; +import PropTypes from 'prop-types'; + +function PermissionsForRole({sections, selectedPerms, setSelectedPerms}) { + return ( + + {Object.keys(sections).map(section => { + const items = sections[section]; + + return + {section} + + + } + aria-label="Select All" + title={gettext('Select All')} + onClick={() => { + setSelectedPerms((prev) => { + return Array.from(new Set([...prev, ...items.map(i => i.name)])); + }); + }} + > + } + aria-label="Deselect All" + title={gettext('Deselect All')} + onClick={() => { + setSelectedPerms((prev) => { + return prev.filter((p) => !items.map(i => i.name).includes(p)); + }); + }} + > + + + + } style={{minHeight: 0, height: 'auto'}}> + + {items.map(item => ( + { + let val = e.target.checked; + setSelectedPerms((prev) => { + if (val) { + return [...prev, item.name]; + } else { + return prev.filter((p) => p !== item.name); + } + }); + }} + sx={{widht: 'fit-content'}} + /> + ))} + + ; + })} + + ); +} +PermissionsForRole.propTypes = { + sections: PropTypes.object, + selectedPerms: PropTypes.array, + setSelectedPerms: PropTypes.func, +}; + +export default function Permissions({roles, updateRolePermissions}) { + const api = getApiInstance(); + const [allPermissions, setAllPermissions] = React.useState([]); + const [searchVal, setSearchVal] = React.useState(''); + const [selectedPerms, setSelectedPerms] = React.useState([]); + const [selectedRole, setSelectedRole] = React.useState(); + const [loading, setLoading] = React.useState(''); + const pgAdmin = usePgAdmin(); + + const isDirty = useMemo(() => { + return JSON.stringify(roles.find((r)=>r.id === selectedRole)?.permissions.sort() || []) !== JSON.stringify(selectedPerms.sort()); + }, [selectedRole, selectedPerms, roles]); + + const savePermissions = async () => { + const url = url_for('user_management.save_permissions', {id: selectedRole}); + try { + setLoading(gettext('Saving...')); + const resp = await api.put(url, {permissions: selectedPerms}); + updateRolePermissions(selectedRole, resp.data.permissions); + pgAdmin.Browser.notifier.success(gettext('Permissions saved successfully')); + } catch (error) { + pgAdmin.Browser.notifier.error(parseApiError(error)); + console.error(error); + } + setLoading(''); + }; + + useEffect(() => { + const url = url_for('user_management.all_permissions'); + api.get(url) + .then(response => { + setAllPermissions(response.data); + }) + .catch(error => { + pgAdmin.Browser.notifier.error(parseApiError(error)); + console.error(error); + }); + }, []); + + useEffect(() => { + setSelectedPerms(roles.find((r)=>r.id === selectedRole)?.permissions || []); + }, [selectedRole]); + + useEffect(() => { + if (selectedRole) { + const role = roles.find((r)=>r.id === selectedRole); + if (!role) { + setSelectedRole(undefined); + } + } + }, [roles]); + + const filteredAllPermissions = useMemo(() => { + return allPermissions.filter(perm => perm.label.toLowerCase().includes(searchVal.toLowerCase())); + }, [allPermissions, searchVal]); + + // Convert the permissions array to section based dict + const sections = useMemo(()=>{ + return filteredAllPermissions.reduce((acc, perm) => { + let section = perm.category; + if (!acc[section]) { + acc[section] = []; + } + acc[section].push(perm); + return acc; + }, {}); + }, [filteredAllPermissions]); + + return ( + + + + {gettext('Role')} + + r.name != 'Administrator').map((r) => ({ label: r.name, value: r.id }))} + optionsReloadBasis={roles.map((r)=>r.name).join('')} + onChange={(val) => {setSelectedRole(val);}} + value={selectedRole} + placeholder={gettext('Select Role')} + /> + + {gettext('Save')} + + { + setSearchVal(val); + }} + startAdornment={} + /> + + + {selectedRole && + + + } + + ); +} + +Permissions.propTypes = { + roles: PropTypes.array.isRequired, + updateRolePermissions: PropTypes.func.isRequired, +}; diff --git a/web/pgadmin/tools/user_management/static/js/RoleDialog.jsx b/web/pgadmin/tools/user_management/static/js/RoleDialog.jsx new file mode 100644 index 000000000..cef92c168 --- /dev/null +++ b/web/pgadmin/tools/user_management/static/js/RoleDialog.jsx @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2025, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import React, { useMemo } from 'react'; +import SchemaView from '../../../../static/js/SchemaView'; +import BaseUISchema from '../../../../static/js/SchemaView/base_schema.ui'; +import gettext from 'sources/gettext'; +import url_for from 'sources/url_for'; +import getApiInstance, { parseApiError } from '../../../../static/js/api_instance'; +import ErrorBoundary from '../../../../static/js/helpers/ErrorBoundary'; +import PropTypes from 'prop-types'; +import { usePgAdmin } from '../../../../static/js/PgAdminProvider'; + +class RoleSchema extends BaseUISchema { + constructor() { + super({ + name: '', + }); + } + + get baseFields() { + return [ + { + id: 'name', label: gettext('Name'), type: 'text', noEmpty: true, maxLength: 128, + }, + { + id: 'description', label: gettext('Description'), type: 'multiline', noEmpty: true, maxLength: 256, + } + ]; + } +} + +export default function RoleDialog({role, onClose}) { + const pgAdmin = usePgAdmin(); + const schema = useMemo(() => new RoleSchema(), []); + const isEdit = Boolean(role.id); + const api = getApiInstance(); + + const onSaveClick = (_isNew, changeData)=>{ + return new Promise((resolve, reject)=>{ + try { + api.post(url_for('user_management.role_save'), changeData) + .then(()=>{ + pgAdmin.Browser.notifier.success(gettext('Role Saved Successfully')); + resolve(); + onClose(null, true); + }) + .catch((err)=>{ + reject(err instanceof Error ? err : Error(gettext('Something went wrong'))); + }); + } catch (error) { + reject(Error(parseApiError(error))); + } + }); + }; + + return + { return Promise.resolve(role); }} + schema={schema} + viewHelperProps={{ + mode: isEdit ? 'edit' : 'create', + }} + onSave={onSaveClick} + onClose={onClose} + hasSQL={false} + disableSqlHelp={true} + disableDialogHelp={true} + isTabView={false} + /> + ; +} + +RoleDialog.propTypes = { + role: PropTypes.object, + onClose: PropTypes.func, +}; diff --git a/web/pgadmin/tools/user_management/static/js/Roles.jsx b/web/pgadmin/tools/user_management/static/js/Roles.jsx new file mode 100644 index 000000000..c9fc93bdf --- /dev/null +++ b/web/pgadmin/tools/user_management/static/js/Roles.jsx @@ -0,0 +1,177 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2025, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import React, { useMemo } from 'react'; +import gettext from 'sources/gettext'; +import PgTable from '../../../../static/js/components/PgTable'; +import { getDeleteCell, getEditCell } from '../../../../static/js/components/PgReactTableStyled'; +import RoleDialog from './RoleDialog'; +import Loader from 'sources/components/Loader'; + +import getApiInstance, { parseApiError } from '../../../../static/js/api_instance'; +import url_for from 'sources/url_for'; +import { BROWSER_PANELS } from '../../../../browser/static/js/constants'; +import ErrorBoundary from '../../../../static/js/helpers/ErrorBoundary'; +import { Box } from '@mui/material'; +import {Add as AddIcon, SyncRounded, Help as HelpIcon} from '@mui/icons-material'; +import PropTypes from 'prop-types'; +import { PgButtonGroup, PgIconButton } from '../../../../static/js/components/Buttons'; +import { usePgAdmin } from '../../../../static/js/PgAdminProvider'; + +function CustomHeader({updateRoles, pgAdmin}) { + return ( + + + } + aria-label="Create Role" + title={gettext('Create Role...')} + onClick={() => { + const panelTitle = gettext('Create Role'); + const panelId = BROWSER_PANELS.USER_MANAGEMENT + '-new-role'; + pgAdmin.Browser.docker.default_workspace.openDialog({ + id: panelId, + title: panelTitle, + content: ( + + { + pgAdmin.Browser.docker.default_workspace.close(panelId, true); + reload && updateRoles(); + }} + /> + + ) + }, pgAdmin.Browser.stdW.md, pgAdmin.Browser.stdH.md); + }} + > + } + aria-label="Refresh" + title={gettext('Refresh')} + onClick={updateRoles} + > + } + aria-label="Help" + title={gettext('Help')} + onClick={() => { + window.open(url_for('help.static', { 'filename': 'user_management.html' })); + }} + > + + + ); +} +CustomHeader.propTypes = { + updateRoles: PropTypes.func, + pgAdmin: PropTypes.object, +}; + +export default function Roles({roles, updateRoles}) { + const [loading, setLoading] = React.useState(''); + const api = getApiInstance(); + const pgAdmin = usePgAdmin(); + + const onDeleteClick = (row) => { + pgAdmin.Browser.notifier.confirm(gettext('Delete Role'), gettext('Are you sure you want to delete the role %s?', row.original.name), + async () => { + setLoading(gettext('Deleting role...')); + try { + await api.delete(url_for('user_management.role_delete', { id: row.original.id })); + pgAdmin.Browser.notifier.success(gettext('Role deleted successfully.')); + updateRoles(); + } catch (error) { + pgAdmin.Browser.notifier.error(parseApiError(error)); + } + setLoading(''); + }); + }; + + const onEditClick = (row) => { + const role = row.original; + const panelTitle = gettext('Edit Role - %s', role.name); + const panelId = BROWSER_PANELS.USER_MANAGEMENT + '-edit-role' + role.id; + pgAdmin.Browser.docker.default_workspace.openDialog({ + id: panelId, + title: panelTitle, + content: ( + + { + pgAdmin.Browser.docker.default_workspace.close(panelId, true); + reload && updateRoles(); + }} + /> + + ) + }, pgAdmin.Browser.stdW.md, pgAdmin.Browser.stdH.md); + }; + + const columns = useMemo(() => [{ + header: () => null, + enableSorting: false, + enableResizing: false, + enableFilters: false, + size: 35, + maxSize: 35, + minSize: 35, + id: 'btn-delete', + cell: getDeleteCell({ title: gettext('Delete Role'), onClick: onDeleteClick, isDisabled: (row) => row.original.is_admin }), + },{ + header: () => null, + enableSorting: false, + enableResizing: false, + enableFilters: false, + size: 35, + maxSize: 35, + minSize: 35, + id: 'btn-edit', + cell: getEditCell({ title: gettext('Edit Role'), onClick: onEditClick, isDisabled: (row) => row.original.is_admin }), + }, + { + header: gettext('Name'), + accessorKey: 'name', + size: 50, + minSize: 50, + }, + { + header: gettext('Decscription'), + accessorKey: 'description', + size: 100, + minSize: 100, + }], []); + + return ( + + + { + return row.id; + } + }} + customHeader={} + > + + ); +} + +Roles.propTypes = { + roles: PropTypes.array, + updateRoles: PropTypes.func, +}; diff --git a/web/pgadmin/tools/user_management/static/js/Users.jsx b/web/pgadmin/tools/user_management/static/js/Users.jsx index 93ff905c1..1d6083774 100644 --- a/web/pgadmin/tools/user_management/static/js/Users.jsx +++ b/web/pgadmin/tools/user_management/static/js/Users.jsx @@ -10,7 +10,6 @@ import React, { useEffect, useMemo, useRef } from 'react'; import { getDeleteCell, getEditCell, getSwitchCell } from '../../../../static/js/components/PgReactTableStyled'; import gettext from 'sources/gettext'; -import pgAdmin from 'sources/pgadmin'; import getApiInstance, { parseApiError } from '../../../../static/js/api_instance'; import PgTable from 'sources/components/PgTable'; import url_for from 'sources/url_for'; @@ -24,8 +23,9 @@ import PropTypes from 'prop-types'; import { PgButtonGroup, PgIconButton } from '../../../../static/js/components/Buttons'; import { showChangeOwnership } from '../../../../static/js/Dialogs'; import { isEmptyString } from '../../../../static/js/validators'; +import { usePgAdmin } from '../../../../static/js/PgAdminProvider'; -function CustomHeader({updateUsers, options}) { +function CustomHeader({updateUsers, options, pgAdmin}) { return ( @@ -77,15 +77,15 @@ function CustomHeader({updateUsers, options}) { CustomHeader.propTypes = { updateUsers: PropTypes.func, options: PropTypes.object, + pgAdmin: PropTypes.object, }; -export default function Users() { +export default function Users({roles}) { const authSources = useRef([]); - const roles = useRef([]); const [loading, setLoading] = React.useState(''); const [tableData, setTableData] = React.useState([]); - const [selectedRows, setSelectedRows] = React.useState({}); const api = getApiInstance(); + const pgAdmin = usePgAdmin(); const onDeleteClick = (row) => { const deleteRow = async () => { @@ -144,6 +144,7 @@ export default function Users() { const user = row.original; const panelTitle = gettext('Edit User - %s', user.username); const panelId = BROWSER_PANELS.USER_MANAGEMENT + '-edit-' + user.id; + pgAdmin.Browser.docker.default_workspace.openDialog({ id: panelId, title: panelTitle, @@ -152,7 +153,7 @@ export default function Users() { ({ label: s.label, value: s.value })), - roles: roles.current.map((r) => ({ label: r.name, value: r.id })), + roles: roles.map((r) => ({ label: r.name, value: r.id })), }} user={user} onClose={(_e, reload) => { @@ -216,7 +217,7 @@ export default function Users() { }, { header: gettext('Role'), - accessorFn: (row) => roles.current.find((r)=>r.id == row.role).name, + accessorFn: (row) => roles.find((r)=>r.id == row.role)?.name, enableSorting: true, enableResizing: true, size: 100, @@ -243,7 +244,7 @@ export default function Users() { enableFilters: true, cell: getSwitchCell(), }]; - }, []); + }, [roles]); const updateList = async () => { setLoading(gettext('Fetching users...')); @@ -259,12 +260,8 @@ export default function Users() { const initialize = async () => { setLoading(gettext('Loading...')); try { - const res = await Promise.all([ - api.get(url_for('user_management.auth_sources')), - api.get(url_for('user_management.roles')), - ]); - authSources.current = res[0].data; - roles.current = res[1].data; + const res = await api.get(url_for('user_management.auth_sources')); + authSources.current = res.data; updateList(); } catch (error) { setLoading(''); @@ -284,8 +281,6 @@ export default function Users() { columns={columns} data={tableData} sortOptions={[{ id: 'username', desc: true }]} - selectedRows={selectedRows} - setSelectedRows={setSelectedRows} caveTable={false} tableNoBorder={false} tableProps={{ @@ -295,9 +290,13 @@ export default function Users() { }} customHeader={ ({ label: s.label, value: s.value })), - roles: roles.current.map((r) => ({ label: r.name, value: r.id })), - }} />} + roles: roles.map((r) => ({ label: r.name, value: r.id })), + }} pgAdmin={pgAdmin} />} > ); -} \ No newline at end of file +} + +Users.propTypes = { + roles: PropTypes.array, +}; diff --git a/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js b/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js index 31d38aebb..70fc98241 100644 --- a/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js +++ b/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js @@ -16,6 +16,7 @@ define('pgadmin.user_management.current_user', [], function() { 'allow_save_password': {{ allow_save_password }}, 'allow_save_tunnel_password': {{ allow_save_tunnel_password }}, 'auth_sources': {{ auth_sources }}, - 'current_auth_source': '{{ current_auth_source }}' + 'current_auth_source': '{{ current_auth_source }}', + 'permissions': {{ permissions }} } }); diff --git a/web/regression/javascript/fake_endpoints.js b/web/regression/javascript/fake_endpoints.js index e9ab2ec27..3b7d91d40 100644 --- a/web/regression/javascript/fake_endpoints.js +++ b/web/regression/javascript/fake_endpoints.js @@ -42,4 +42,6 @@ module.exports = { 'user_management.auth_sources': '/user_management/auth_sources', 'user_management.roles': '/user_management/roles', 'user_management.users': '/user_management/users', + 'user_management.all_permissions': '/user_management/all_permissions', + 'user_management.save_permissions': '/user_management/save_permissions', }; diff --git a/web/regression/javascript/user_management/Permissions.spec.js b/web/regression/javascript/user_management/Permissions.spec.js new file mode 100644 index 000000000..3bf8885d8 --- /dev/null +++ b/web/regression/javascript/user_management/Permissions.spec.js @@ -0,0 +1,113 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2025, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + + +import React from 'react'; + +import { act, render, screen, fireEvent, waitFor } from '@testing-library/react'; +import MockAdapter from 'axios-mock-adapter'; +import axios from 'axios'; +import { withBrowser } from '../genericFunctions'; +import Permissions from '../../../pgadmin/tools/user_management/static/js/Permissions'; +import { withTheme } from '../fake_theme'; + +describe('Permissions Component', () => { + let networkMock; + let ctrl; + const PermissionsWithBrowser = withBrowser(withTheme(Permissions)); + const mockRoles = [ + { id: 1, name: 'Administrator', permissions: [] }, + { id: 2, name: 'User', permissions: ['p1', 'p2', 'p3'] }, + { id: 3, name: 'Other', permissions: ['p1', 'p2'] }, + ]; + const mockPermissions = [ + { name: 'p1', label: 'Permission 1', category: 'Category 1' }, + { name: 'p2', label: 'Permission 2', category: 'Category 1' }, + { name: 'p3', label: 'Permission 3', category: 'Category 2' }, + ]; + const mockUpdateRolePermissions = jest.fn(); + + const renderComponent = async () => { + await act( async () => { + if(ctrl) { + ctrl.unmount(); + } + ctrl = render( + + ); + }); + }; + + beforeEach(async ()=>{ + networkMock = new MockAdapter(axios); + networkMock.onGet('/user_management/all_permissions').reply(200, mockPermissions); + + await renderComponent(); + }); + + afterEach(() => { + networkMock.restore(); + }); + + it('renders the component and loads permissions', async () => { + expect(screen.getByText('Role')).toBeInTheDocument(); + expect(screen.getByPlaceholderText('Search')).toBeInTheDocument(); + }); + + it('allows selecting a role and displays permissions', async () => { + fireEvent.focus(screen.getByRole('combobox')); + fireEvent.keyDown(screen.getByRole('combobox'), { key: 'ArrowDown', code: 40 }); + fireEvent.click(screen.getByText('Other')); + await waitFor(() => { + expect(screen.getByText('Category 1')).toBeInTheDocument(); + expect(screen.getByText('Permission 1')).toBeInTheDocument(); + expect(screen.getByText('Permission 2')).toBeInTheDocument(); + }); + }); + + it('filters permissions based on search input', async () => { + fireEvent.focus(screen.getByRole('combobox')); + fireEvent.keyDown(screen.getByRole('combobox'), { key: 'ArrowDown', code: 40 }); + fireEvent.click(screen.getByText('Other')); + fireEvent.change(screen.getByPlaceholderText('Search'), { target: { value: 'Permission 3' } }); + await waitFor(() => { + expect(screen.getByText('Permission 3')).toBeInTheDocument(); + expect(screen.queryByText('Permission 1')).not.toBeInTheDocument(); + }); + }); + + it('saves permissions', async () => { + fireEvent.focus(screen.getByRole('combobox')); + fireEvent.keyDown(screen.getByRole('combobox'), { key: 'ArrowDown', code: 40 }); + fireEvent.click(screen.getByText('Other')); + fireEvent.click(screen.getByText('Permission 3')); + networkMock.onPut('/user_management/save_permissions').reply(200, { + permissions: ['p1', 'p2', 'p3'] + }); + + await waitFor(() => { + expect(screen.getByText('Save')).not.toBeDisabled(); + }); + + await act(async () => { + fireEvent.click(screen.getByText('Save')); + mockRoles[2].permissions = ['p1', 'p2', 'p3']; + }); + + await renderComponent(); + + await waitFor(() => { + expect(screen.getByText('Save')).toBeDisabled(); + expect(mockUpdateRolePermissions).toHaveBeenCalledWith(3, ['p1', 'p2', 'p3']); + }); + }); +}); diff --git a/web/regression/javascript/user_management/Roles.spec.js b/web/regression/javascript/user_management/Roles.spec.js new file mode 100644 index 000000000..e2881090a --- /dev/null +++ b/web/regression/javascript/user_management/Roles.spec.js @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2025, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import React from 'react'; + +import { act, render } from '@testing-library/react'; +import MockAdapter from 'axios-mock-adapter'; +import axios from 'axios'; +import { withBrowser } from '../genericFunctions'; +import Roles from '../../../pgadmin/tools/user_management/static/js/Roles'; + +describe('Roles', () => { + let networkMock; + + beforeEach(() => { + networkMock = new MockAdapter(axios); + networkMock.onGet('/user_management/auth_sources').reply(200, [ + { id: 1, label: 'internal', value: 'internal' }, + ]); + networkMock.onGet('/user_management/roles').reply(200, [ + { id: 1, name: 'Administrator' }, + { id: 2, name: 'User' }, + ]); + networkMock.onGet('/user_management/users').reply(200, [ + { id: 1, label: 'postgres', value: 'postgres', auth_source: 'internal', role: 1 }, + ]); + }); + + afterEach(() => { + networkMock.restore(); + }); + + describe('Component', () => { + const RolesWithBrowser = withBrowser(Roles); + + it('init', async () => { + let ctrl; + await act(() => { + ctrl = render(); + }); + expect(ctrl.container.querySelectorAll('[data-test="roles"]').length).toBe(1); + }); + + it('renders role list', async () => { + let ctrl; + await act(() => { + ctrl = render(); + }); + const roleItems = ctrl.container.querySelectorAll('.pgrt-row-content '); + expect(roleItems.length).toBe(2); + expect(roleItems[0].querySelector('.pgrd-row-cell:not(.btn-cell) .pgrd-row-cell-content').textContent).toContain('Administrator'); + expect(roleItems[1].querySelector('.pgrd-row-cell:not(.btn-cell) .pgrd-row-cell-content').textContent).toContain('User'); + }); + }); +}); diff --git a/web/regression/javascript/user_management/Users.spec.js b/web/regression/javascript/user_management/Users.spec.js index 11f7b1b60..1dd1b520c 100644 --- a/web/regression/javascript/user_management/Users.spec.js +++ b/web/regression/javascript/user_management/Users.spec.js @@ -44,8 +44,11 @@ describe('Users', ()=>{ it('init', async ()=>{ let ctrl; - await act(async ()=>{ - ctrl = await render(); + await act(()=>{ + ctrl = render(); }); expect(ctrl.container.querySelectorAll('[data-test="users"]').length).toBe(1); }); diff --git a/web/setup.py b/web/setup.py index 947802cfc..a125d9ec9 100644 --- a/web/setup.py +++ b/web/setup.py @@ -37,7 +37,7 @@ if 'SERVER_MODE' in globals(): else: builtins.SERVER_MODE = None -from pgadmin.model import db, Version, User, \ +from pgadmin.model import db, Version, User, Role, \ SCHEMA_VERSION as CURRENT_SCHEMA_VERSION from pgadmin import create_app from pgadmin.utils import clear_database_servers, dump_database_servers, \ @@ -148,13 +148,27 @@ class AuthType(str, Enum): internal = INTERNAL +class ManageRoles: + @staticmethod + def get_role(role: str): + app = create_app(config.APP_NAME + '-cli') + usr = None + with app.test_request_context(): + usr = Role.query.filter_by(name=role).first() + + if not usr: + return None + return usr.id + + class ManageUsers: @app.command() @update_sqlite_path def add_user(email: str, password: str, - role: Annotated[Optional[bool], typer.Option( - "--admin/--nonadmin")] = False, + admin: Annotated[Optional[bool], + typer.Option("--admin")] = False, + role: Optional[str] = None, active: Annotated[Optional[bool], typer.Option("--active/--inactive")] = True, console: Optional[bool] = True, @@ -165,7 +179,7 @@ class ManageUsers: data = { 'email': email, - 'role': 1 if role else 2, + 'role': 'Administrator' if admin else role, 'active': active, 'auth_source': INTERNAL, 'newPassword': password, @@ -178,9 +192,9 @@ class ManageUsers: def add_external_user(username: str, auth_source: AuthExtTypes = AuthExtTypes.oauth2, email: Optional[str] = None, - role: Annotated[Optional[bool], - typer.Option( - "--admin/--nonadmin")] = False, + admin: Annotated[Optional[bool], + typer.Option("--admin")] = False, + role: Optional[str] = None, active: Annotated[Optional[bool], typer.Option( "--active/--inactive")] = True, @@ -194,7 +208,7 @@ class ManageUsers: data = { 'username': username, 'email': email, - 'role': 1 if role else 2, + 'role': 'Administrator' if admin else role, 'active': active, 'auth_source': auth_source } @@ -231,9 +245,9 @@ class ManageUsers: @update_sqlite_path def update_user(email: str, password: Optional[str] = None, - role: Annotated[Optional[bool], - typer.Option("--admin/--nonadmin" - )] = None, + admin: Annotated[Optional[bool], typer.Option( + "--admin")] = False, + role: Optional[str] = None, active: Annotated[Optional[bool], typer.Option("--active/--inactive" )] = None, @@ -254,12 +268,21 @@ class ManageUsers: data['confirmPassword'] = password if role is not None: - data['role'] = 1 if role else 2 + data['role'] = role + if admin: + data['role'] = 'Administrator' if active is not None: data['active'] = active app = create_app(config.APP_NAME + '-cli') with app.test_request_context(): + rid = ManageRoles.get_role(data['role']) + if rid is None: + print("Role '{0}' does not exists.".format(data['role'])) + exit() + + data['role'] = rid + uid = ManageUsers.get_user(username=email, auth_source=INTERNAL) if not uid: @@ -308,7 +331,7 @@ class ManageUsers: 'username': u.username, 'email': u.email, 'active': u.active, - 'role': u.roles[0].id, + 'role': u.roles[0].name, 'auth_source': u.auth_source, 'locked': u.locked } @@ -323,9 +346,9 @@ class ManageUsers: def update_external_user(username: str, auth_source: AuthExtTypes = AuthExtTypes.oauth2, email: Optional[str] = None, - role: Annotated[Optional[bool], - typer.Option("--admin/--nonadmin" - )] = None, + admin: Annotated[Optional[bool], typer.Option( + "--admin")] = False, + role: Optional[str] = None, active: Annotated[ Optional[bool], typer.Option("--active/--inactive")] = None, @@ -340,12 +363,21 @@ class ManageUsers: if email: data['email'] = email if role is not None: - data['role'] = 1 if role else 2 + data['role'] = role + if admin: + data['role'] = 'Administrator' if active is not None: data['active'] = active app = create_app(config.APP_NAME + '-cli') with app.test_request_context(): + rid = ManageRoles.get_role(data['role']) + if rid is None: + print("Role '{0}' does not exists.".format(data['role'])) + exit() + + data['role'] = rid + uid = ManageUsers.get_user(username=username, auth_source=auth_source) if not uid: @@ -367,6 +399,14 @@ class ManageUsers: with app.test_request_context(): username = data['username'] if 'username' in data else \ data['email'] + + rid = ManageRoles.get_role(data['role']) + if rid is None: + print("Role '{0}' does not exists.".format(data['role'])) + exit() + + data['role'] = rid + uid = ManageUsers.get_user(username=username, auth_source=data['auth_source']) if uid: @@ -379,7 +419,10 @@ class ManageUsers: status, msg = create_user(data) if status: - ManageUsers.display_user(data, console, json) + _user = ManageUsers.get_users_from_db( + username=data['email'], + auth_source=data['auth_source'], + console=console) else: print(SOMETHING_WENT_WRONG + str(msg)) @@ -412,10 +455,7 @@ class ManageUsers: if 'email' in _data: table.add_row("Email", _data['email']) table.add_row("auth_source", _data['auth_source']) - table.add_row("role", - "Admin" if _data['role'] and - _data['role'] != 2 else - "Non-admin") + table.add_row("role", _data['role']) table.add_row("active", 'True' if _data['active'] else 'False') console.print(table)