From e482c77bff2b6ca6d8fedc746cce83bf2998a9bb Mon Sep 17 00:00:00 2001 From: root Date: Sun, 23 May 2021 01:12:45 +0200 Subject: [PATCH] added admin against SPs and avatars on api --- admin/docker/Dockerfile | 2 +- admin/src/{api => admin}/__init__.py | 5 +- .../admin/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1053 bytes .../lib/__pycache__/admin.cpython-38.pyc | Bin 0 -> 2235 bytes .../lib/__pycache__/keycloak.cpython-38.pyc | Bin 0 -> 2445 bytes .../__pycache__/load_config.cpython-38.pyc | Bin 676 -> 680 bytes .../lib/__pycache__/menu.cpython-38.pyc | Bin .../lib/__pycache__/moodle.cpython-38.pyc | Bin 0 -> 3127 bytes .../lib/__pycache__/nextcloud.cpython-38.pyc | Bin 0 -> 8275 bytes .../__pycache__/nextcloud_exc.cpython-38.pyc | Bin 0 -> 1371 bytes admin/src/admin/lib/admin.py | 58 ++++ admin/src/admin/lib/keycloak.py | 65 +++++ admin/src/{api => admin}/lib/load_config.py | 2 +- admin/src/admin/lib/moodle.py | 73 +++++ admin/src/admin/lib/nextcloud.py | 253 ++++++++++++++++++ admin/src/admin/lib/nextcloud_exc.py | 29 ++ .../static/_templates/apps.html | 0 .../static/_templates/navbar_nextcloud.html | 0 .../static/_templates/nextcloud.html | 0 .../static/css/bootstrap.min.css | 0 admin/src/{api => admin}/static/css/dd.css | 0 .../{api => admin}/static/img/background.png | Bin admin/src/{api => admin}/static/img/logo.png | Bin admin/src/{api => admin}/static/js/navbar.js | 0 .../{api => admin}/static/templates/.gitkeep | 0 .../static/templates/header.html | 0 .../static/templates/header.json | 0 .../static/templates/header_nextcloud.html | 0 admin/src/admin/views/MenuViews.py | 28 ++ admin/src/{api => admin}/views/__init__.py | 0 .../__pycache__/MenuViews.cpython-38.pyc | Bin 0 -> 428 bytes .../views/__pycache__/__init__.cpython-38.pyc | Bin .../api/__pycache__/__init__.cpython-38.pyc | Bin 987 -> 0 bytes admin/src/api/lib/menu.py | 65 ----- admin/src/api/views/MenuViews.py | 28 -- .../__pycache__/MenuViews.cpython-38.pyc | Bin 1006 -> 0 bytes admin/src/start.py | 5 +- admin/src/system.yaml.example | 55 ---- admin/src/tests/test_lib.py | 5 +- docker-compose-parts/admin.yml | 1 + isard-sso | 2 +- 41 files changed, 518 insertions(+), 158 deletions(-) rename admin/src/{api => admin}/__init__.py (93%) create mode 100644 admin/src/admin/__pycache__/__init__.cpython-38.pyc create mode 100644 admin/src/admin/lib/__pycache__/admin.cpython-38.pyc create mode 100644 admin/src/admin/lib/__pycache__/keycloak.cpython-38.pyc rename admin/src/{api => admin}/lib/__pycache__/load_config.cpython-38.pyc (62%) rename admin/src/{api => admin}/lib/__pycache__/menu.cpython-38.pyc (100%) create mode 100644 admin/src/admin/lib/__pycache__/moodle.cpython-38.pyc create mode 100644 admin/src/admin/lib/__pycache__/nextcloud.cpython-38.pyc create mode 100644 admin/src/admin/lib/__pycache__/nextcloud_exc.cpython-38.pyc create mode 100644 admin/src/admin/lib/admin.py create mode 100644 admin/src/admin/lib/keycloak.py rename admin/src/{api => admin}/lib/load_config.py (93%) create mode 100644 admin/src/admin/lib/moodle.py create mode 100644 admin/src/admin/lib/nextcloud.py create mode 100644 admin/src/admin/lib/nextcloud_exc.py rename admin/src/{api => admin}/static/_templates/apps.html (100%) rename admin/src/{api => admin}/static/_templates/navbar_nextcloud.html (100%) rename admin/src/{api => admin}/static/_templates/nextcloud.html (100%) rename admin/src/{api => admin}/static/css/bootstrap.min.css (100%) rename admin/src/{api => admin}/static/css/dd.css (100%) rename admin/src/{api => admin}/static/img/background.png (100%) rename admin/src/{api => admin}/static/img/logo.png (100%) rename admin/src/{api => admin}/static/js/navbar.js (100%) rename admin/src/{api => admin}/static/templates/.gitkeep (100%) rename admin/src/{api => admin}/static/templates/header.html (100%) rename admin/src/{api => admin}/static/templates/header.json (100%) rename admin/src/{api => admin}/static/templates/header_nextcloud.html (100%) create mode 100644 admin/src/admin/views/MenuViews.py rename admin/src/{api => admin}/views/__init__.py (100%) create mode 100644 admin/src/admin/views/__pycache__/MenuViews.cpython-38.pyc rename admin/src/{api => admin}/views/__pycache__/__init__.cpython-38.pyc (100%) delete mode 100644 admin/src/api/__pycache__/__init__.cpython-38.pyc delete mode 100644 admin/src/api/lib/menu.py delete mode 100644 admin/src/api/views/MenuViews.py delete mode 100644 admin/src/api/views/__pycache__/MenuViews.cpython-38.pyc delete mode 100644 admin/src/system.yaml.example diff --git a/admin/docker/Dockerfile b/admin/docker/Dockerfile index d534cd7..aba1d63 100644 --- a/admin/docker/Dockerfile +++ b/admin/docker/Dockerfile @@ -12,7 +12,7 @@ COPY admin/docker/requirements.pip3 /requirements.pip3 RUN pip3 install --no-cache-dir -r requirements.pip3 RUN apk del .build_deps -RUN apk add curl +RUN apk add curl py3-yaml # SSH configuration ARG SSH_ROOT_PWD diff --git a/admin/src/api/__init__.py b/admin/src/admin/__init__.py similarity index 93% rename from admin/src/api/__init__.py rename to admin/src/admin/__init__.py index 1abe5ec..672bb99 100644 --- a/admin/src/api/__init__.py +++ b/admin/src/admin/__init__.py @@ -20,13 +20,14 @@ app.secret_key = "Change this key!//\xf7\x83\xbe\x17\xfa\xa3zT\n\\]m\xa6\x8bF\xd print('Starting isard-sso api...') -from api.lib.load_config import loadConfig +from admin.lib.load_config import loadConfig try: loadConfig(app) except: print('Could not get environment variables...') - +from admin.lib.admin import Admin +app.admin=Admin() ''' Debug should be removed on production! diff --git a/admin/src/admin/__pycache__/__init__.cpython-38.pyc b/admin/src/admin/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ffb775f8ffe89fa7aae5f220564d49be5ddf12f GIT binary patch literal 1053 zcmY*X&2Aev5GJYJ)k=|8vaC39fuh?>TA`?P$Snwh1`d2{F6l4Pf~7@Drn5^5B;~+L za#C+WAEAMb04Z|mwLlL&$Uq-rkL@Y1kW+{27)eR&$C=^G?96=py4!6dSikMR`swc& zp?`z&{z^dk0zUT-fItElh+dqS63|J}C?gt`F^$WFCK$;`Hbp~3zYv<%ax9V{i>6GE zTC6QnnX)UgBU)>WL#B4oEi;;7wCc!Aros9x(nE~G2EQx8@;%bzyWrg^dS##X;ikVv zkZB9D4(#ueoNkNm=`d(#_zWWS0Bl$PZyii=!yQ%XpQMLu_Xq@^>UZ)LM`|K z8g0LZKGFSAql)(n?jBa#PHMqs)|5;rE2rMrld5OIC@u4{Tol~P3XL%BInTYCvZXE9 zg8Rca{R_k7(#r*>ONGr$0V(#EH{pMKhg{EP?hlpAAIg)DCzJC(HtWq_*UtakyjXqJ z{^7@R^K$cS|NPf3Ts;5qqv0p3-3Ojquk<`uj$84$b0+5tH6D*gxM~-Mi#?-fYQDO$ zXO@M?wek5}`dsQ`WsNSS_W3cliXRlxT|~uqMXB^EyC)Bp^Sm@d-pU_8UG2QrftyrS+xM%Wsr?=@~Fs#S5#nr&sHO$Avl=2S(Vmro=Wwp5D8=TC!>QSzOCi zECL5r^AWc?l$XqmExE5ErDul5)-1iOTch!D=*MnBa6P5>APWi8+d$;9kat2a?o)si er(}pbu+vsTQqsW$&;n7bHVaU31-7XHr6@wA#8e0vP(oU9B{ZG*PQsM&gFEB4 zvBs;g=&tIXMY7CanoSp7@fTVa{mvcRc>puHXU=_{bNzkaJ=r*Qs>1O2e;)k&cZsoo zsB`o&(Yb?`d=Dd;h)wC!Yg~>?3^(s<2;DNSkNi=#*fUt1zMzK$&82$kGkk)5d9rjtw_7mkB=7cKb%M)DDY zjSOjy5Nw1{BRgdo&y38>tjylEGv;&YjPMJw(jApjBXclc+BGp_%JO)B1^Z{P*BbA& zcP-4@sgtq2(mvY-mfClZ_~pWv49A`Ih8JI?Y5!Ke9wmX2SCgc7_2n46TT6|lMm-p$ zFY37+(616_CUcXoa5_PfhU%$U46ezg&E~h)m%?j7Gi+`yHNU%g{l<+(Q*JfFW^iM8 zi83Wf)zOU9lAxR7uh)%ga?pM$yGgC5wuhhBe+xI0Q2iRU!@3HSv`(E+)%q{`!^@Kx z-3gZ;2_wp0lh|$y>~Ikh6?*mP$xSaowN3FEEY+*o@k+>Q0tnz!<(CEO<~>+3%~URxFRT5ILuBQf)1YwiBM zXa3#R+EZaZXgw2d%UgZ&_`dh_fT>S#ihmdC8uzh{qs_vr^>=dD_oHr<`aW(JOD@7N zZcX2Lqwwd(UyGkHX89~1&S`npCYz7xlt3adv`!b{Wb7BV$4U76(CPw%>Y&xvQ0gkQ z1^qZ)Zik&9iigIfOS!FqdM_l&e;qApz-%Mv^UEWi;Z7|ekmTAL+9Cx;tOX|RH}+q~ zD~nR(MkI5WLU)5sD9T%rN>XxjH-`4eQ=cO8fvwKrqt3(RwqBK6v_j8nJP(ZAs5Npv z(7nRU)AGu493^SH*XiG0L_e8>actv1hmYTP!*2@UPRgRT9QWEmoZN;p2~jl^6+SUT zi|OG0=FWkkPGd}cMuxaO%&un9{Sqx9q!^#)lzMpX!wKJmmsrz`U4T0a)`(ATlf(Q%7`P%6ABWwi2liZr!e+4+8Fstf&7J! zWjY3-jeV3uWADK^#D1HN0NE;geshF+jXQ+8zRyQiX6&K9YspV6gfAJ!Abn}QvG-B2 zU(II*gl~Hq)qF-qNk0yDra~`JwA2i8in-|z^htlho%C}j==Z~}tlEdd6BT_!^~&5L zUy<%kqC)DYyPD8_VnE;GE@}tR!E12mUBw5b@8=aCRa6dQ@@IYj z)gXwA8Fd!1we%ISpeX5)gXk+lcT-V)qmrySa=ClnExTns>Q!Au4Cv~vubeLI8W>&G bbt%_NKNLB4my4s_rhnEtJe9~<6w3brFfj%} literal 0 HcmV?d00001 diff --git a/admin/src/admin/lib/__pycache__/keycloak.cpython-38.pyc b/admin/src/admin/lib/__pycache__/keycloak.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d889a60139f11be2ae761c7634e31dd5885f390 GIT binary patch literal 2445 zcmbVOOK&7K5N`KtdS1ySn+>}HM0nGOonb*p2mt~imcyc4He7sZoVGLZq+hsu5+=-z zNN~wN*aLga58+Sv%89=K2vOzk&Q2a2z%9FMce(1Tm%G0i4to}~pMJjh_Se9&e#6CT zb71iq^zsx2ZgG-W6set%)TR!>xs$l5OWo9?o>`N`r@rCs(2k)24GitluAx2J1L`LI zbU+8`kPgi`FIh|1={m8#vbfJXXBO}LXwwlVPpmNb9rRnfA<+&iiqO^pXO*aADs&e| zE|QADcK^%lSgJfrMONw2BbkUNi?R~w*E!=t!SUf^v51qL9evJInZ+n|wO!gvVOLm` zaEscUP={}Ghr4Hly4>UbnMFO`;Q>&ecXd_M*zRQ8+x=?3Uw@0G*^iZ=CH^Z#3LwJS)SyI)1DG6Nh7oC z1EV}xgtkHjdaXqfF^og#Yqu21fp$Qa>H>$tywskNp!zVsu+#|1A1_VJiDpdX{-hN( zE*3h7BALl5inf5a9Kc`^m)Q05*XhRN*1auXY$H$8aE=*Z?8n1PYi9jImgE`a;04(Q z^th}0Q&B}|a3neG4PmbajR*})wShAP@iO$%C?Tg?m+Dsp!~{6nhVxqxNDC3DJMgx} z&}~JO7oF-zuxcA@HuTrstP;CdouvJNcmh>Yzgg6r;qRAsemawcKTtRE{V z=B$z|DH~HM?m@L1kB9zqcWci`&@P@<_W`njQU}0z1EZh=#<@BBI;={JiDd_EPSo^o z|Id}&X!&Cgd7FlFtPkTJ6oT%Vfor&pPT}6UYuur`aU#J0NDbX-azuAjo(SA=D=6a7 zRXZR+y^6zYFzBv%kA>3Oya`1lr&-hp!}p~w zY4|=|LG$8mXd1r%9-$qO+(u}Gifc(GC9t;4wS`RAofN{}C(v6b-M<2BRSG1+UO2>C z7jrj?bT5k1oX;WIBRzH8ybBaw20A!uJ}Bn1W)$Cs dSqC52Zuu0Imgs_j49JKCa1#Y&WRL8D{SVWoFEaoD literal 0 HcmV?d00001 diff --git a/admin/src/api/lib/__pycache__/load_config.cpython-38.pyc b/admin/src/admin/lib/__pycache__/load_config.cpython-38.pyc similarity index 62% rename from admin/src/api/lib/__pycache__/load_config.cpython-38.pyc rename to admin/src/admin/lib/__pycache__/load_config.cpython-38.pyc index 3383d3316eb3d1a503620e7f3a5244c65423c5ae..f16472eeac1a23b751b806a61e4fb98841146536 100644 GIT binary patch delta 51 ycmZ3&x`LHAl$V!_0SI=xtxSm7$UB*lS6)9cB{wqFbEHK%RDGUH=xer_b delta 47 zcmZ3%x`dTCl$V!_0SH1&mnKAQQpIDGNc`f677G@A5h$##J9AgbW diff --git a/admin/src/api/lib/__pycache__/menu.cpython-38.pyc b/admin/src/admin/lib/__pycache__/menu.cpython-38.pyc similarity index 100% rename from admin/src/api/lib/__pycache__/menu.cpython-38.pyc rename to admin/src/admin/lib/__pycache__/menu.cpython-38.pyc diff --git a/admin/src/admin/lib/__pycache__/moodle.cpython-38.pyc b/admin/src/admin/lib/__pycache__/moodle.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df413a4420c9fda0a209caa06ba50d56816c3965 GIT binary patch literal 3127 zcmai0OOM>f5oYr>+}V}9mgHSqFapLgFk&L_Xq_O3g(BE+93u#{Fd#btC@tF5bkB-f z4ms-P>}p1wORR$t!2du8Es#S5d-ct~HZAMlG+BQfOg_P@KL8PyV3{>yF&o*j&8#mhVGHNEC7f^V*b(kMEAoB- zpB34)b1ci+9T&PB(8~I=)OmF+c zbi^fb87qO<5!>QztZaxY;wo0U!o&A>YyWOhh)mA@{-`X+`k>!GPRmD=hkJu!)E}uq znxFPZhJz>LbZ0j^f_hsJyTBrFjKU=A3BnR$VU}$XP{S2?(0jXGJajUXHS>=G*!h(43bl)CT^3yxvd5D9u}%r4QRUAO>~7d77ss=Y$4L zq89V|WJBa7yUen_Qc13dg&Kt-HCav6w4W%IOha9&$)KDl z8J0zugu^T;*O+dGXTVm7OoVwdk}EI>IYc<~8PUuXpK8*&J%U4Yk#Z|tfz5MOiFGPI;nVCyTsi9nZRoh ztO%UyZIHL{>YssFLBL$L&4>o9YX@u#vv&>MVYBNkdf#BzfGTbAP{9!B|Abe60|J}@ zq33MwRL)CO;bZitiV6FLbIzCrR9cT+yxuP19i8ucXYN)m;co7hoyrC317Pt1);5H9 z&eVglD}1cme`OW*$jrYIByS+aCu4!swKLsYL&>5qUi@#782&D7p&0Jp412>#mMs8z zcNz|p(?TJGVZ#k3=z4y6Ng$l_%s$2Hq z3rXVnk$p5Uy_VSUP-W2EG}8|;Kra10@LoG}Z{UX9lmB3SmGLm@uec zV65m0pvbJaYgBThbAxm?Ll;m=YL^te9+SoYy^fXk^+NjL|{;hO<-)3{MtKBvWbkZuAIj0Wa)7*Agro1 zQIxbc^9^b~!h+f(@+%@2TT#8a(83>1Z)3kbIJelEGixkAkOLP^PfGUEqYx7$yYb0^ zPt;+^C)fDoRdl~WvYpshMJ7`LfFshWh=ZogFnU+!*yE!lpClP?CT(Klu9=#a(KzZi z5bqEJhww(*5}>(5U%;CBC5(#E;xQ-5*CX(b*~v^Od0Dh=C_0n|#O&0AKL2wS^>!U*OCzEu>mjO;n6z{myksbTA1MBypq4Cu< zzQ!FRf}M}CQwIx?*WKDCrG~ZT_yX*jjI(gO%ywIUUgwH%?*Ypp{(p{tLn5YbVH|DJ z9g7Nv^SaA9%%32_yx!vYP-2=VW*yFP{p4KXF5VniI@gm4daX8nPf?ATy*H_>gWHX*cW_g(G&Ra?=YNiV BCRYFe literal 0 HcmV?d00001 diff --git a/admin/src/admin/lib/__pycache__/nextcloud.cpython-38.pyc b/admin/src/admin/lib/__pycache__/nextcloud.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86c6e38458fe0edaf0260543153a1be66a01291b GIT binary patch literal 8275 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 rest_api_parameters({'courses':[{'id':1,'name': 'course1'}]}) + {'courses[0][id]':1, + 'courses[0][name]':'course1'} + """ + if out_dict==None: + out_dict = {} + if not type(in_args) in (list,dict): + out_dict[prefix] = in_args + return out_dict + if prefix == '': + prefix = prefix + '{0}' + else: + prefix = prefix + '[{0}]' + if type(in_args)==list: + for idx, item in enumerate(in_args): + self.rest_api_parameters(item, prefix.format(idx), out_dict) + elif type(in_args)==dict: + for key, item in in_args.items(): + self.rest_api_parameters(item, prefix.format(key), out_dict) + return out_dict + + def call(self, fname, **kwargs): + """Calls moodle API function with function name fname and keyword arguments. + Example: + >>> call_mdl_function('core_course_update_courses', + courses = [{'id': 1, 'fullname': 'My favorite course'}]) + """ + parameters = self.rest_api_parameters(kwargs) + parameters.update({"wstoken": self.key, 'moodlewsrestformat': 'json', "wsfunction": fname}) + response = post(self.url+self.endpoint, parameters, verify=False) + response = response.json() + if type(response) == dict and response.get('exception'): + raise SystemError("Error calling Moodle API\n", response) + return response + + def create_user(self, email, username, password, first_name='-', last_name='-'): + data = [{'username': username, 'email':email, + 'password': password, 'firstname':first_name, 'lastname':last_name}] + user = self.call('core_user_create_users', users=data) + return user + + def get_user_by(self, key, value): + criteria = [{'key': key, 'value': value}] + user = self.call('core_user_get_users', criteria=criteria) + return user + + def enroll_user_to_course(self, user_id, course_id, role_id=5): + # 5 is student + data = [{'roleid': role_id, 'userid': user_id, 'courseid': course_id}] + enrolment = self.call('enrol_manual_enrol_users', enrolments=data) + return enrolment + + def get_quiz_attempt(self, quiz_id, user_id): + attempts = self.call('mod_quiz_get_user_attempts', quizid=quiz_id, userid=user_id) + return attempts \ No newline at end of file diff --git a/admin/src/admin/lib/nextcloud.py b/admin/src/admin/lib/nextcloud.py new file mode 100644 index 0000000..d731f24 --- /dev/null +++ b/admin/src/admin/lib/nextcloud.py @@ -0,0 +1,253 @@ +#!/usr/bin/env python +# coding=utf-8 + +#from ..lib.log import * +import time,requests,json,pprint +import traceback +import logging as log +from .nextcloud_exc import * + +class Nextcloud(): + def __init__(self,url,username,password,verify): + self.verify_cert=verify + self.apiurl=url+'/ocs/v1.php/cloud/' + self.shareurl=url+'/ocs/v2.php/apps/files_sharing/api/v1/' + self.davurl=url+'/remote.php/dav/files/' + self.auth=(username,password) + self.user=username + + def _request(self,method,url,data={},headers={'OCS-APIRequest':'true'},auth=False): + if auth == False: auth=self.auth + try: + return requests.request(method, url, data=data, auth=auth, verify=self.verify_cert, headers=headers).text + + ## At least the ProviderSslError is not being catched or not raised correctly + except requests.exceptions.HTTPError as errh: + raise ProviderConnError + except requests.exceptions.Timeout as errt: + raise ProviderConnTimeout + except requests.exceptions.SSLError as err: + raise ProviderSslError + except requests.exceptions.ConnectionError as errc: + raise ProviderConnError + # except requests.exceptions.RequestException as err: + # raise ProviderError + except Exception as e: + if str(e) == 'an integer is required (got type bytes)': + raise ProviderConnError + raise ProviderError + + def check_connection(self): + url = self.apiurl + "users/"+self.user+"?format=json" + try: + result = self._request('GET',url) + if json.loads(result)['ocs']['meta']['statuscode'] == 100: return True + raise ProviderError + except requests.exceptions.HTTPError as errh: + raise ProviderConnError + except requests.exceptions.ConnectionError as errc: + raise ProviderConnError + except requests.exceptions.Timeout as errt: + raise ProviderConnTimeout + except requests.exceptions.SSLError as err: + raise ProviderSslError + except requests.exceptions.RequestException as err: + raise ProviderError + except Exception as e: + if str(e) == 'an integer is required (got type bytes)': + raise ProviderConnError + raise ProviderError + + def get_user(self,userid): + url = self.apiurl + "users/"+userid+"?format=json" + try: + result = json.loads(self._request('GET',url)) + if result['ocs']['meta']['statuscode'] == 100: return result['ocs']['data'] + raise ProviderItemNotExists + except: + log.error(traceback.format_exc()) + raise + # 100 - successful + + def get_users_list(self): + url = self.apiurl + "users?format=json" + try: + result = json.loads(self._request('GET',url)) + if result['ocs']['meta']['statuscode'] == 100: return result['ocs']['data']['users'] + log.error('Get Nextcloud provider users list error: '+str(result)) + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + + def add_user(self,userid,userpassword,quota,group='',email='',displayname=''): + data={'userid':userid,'password':userpassword,'quota':quota,'groups[]':group,'email':email,'displayname':displayname} + url = self.apiurl + "users?format=json" + headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'OCS-APIRequest': 'true', + } + try: + result = json.loads(self._request('POST',url,data=data,headers=headers)) + if result['ocs']['meta']['statuscode'] == 100: return True + if result['ocs']['meta']['statuscode'] == 102: raise ProviderItemExists + if result['ocs']['meta']['statuscode'] == 104: raise ProviderGroupNotExists + log.error('Get Nextcloud provider user add error: '+str(result)) + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + # 100 - successful + # 101 - invalid input data + # 102 - username already exists + # 103 - unknown error occurred whilst adding the user + # 104 - group does not exist + # 105 - insufficient privileges for group + # 106 - no group specified (required for subadmins) + # 107 - all errors that contain a hint - for example “Password is among the 1,000,000 most common ones. Please make it unique.” (this code was added in 12.0.6 & 13.0.1) + + def delete_user(self,userid): + url = self.apiurl + "users/"+userid+"?format=json" + try: + result = json.loads(self._request('DELETE',url)) + if result['ocs']['meta']['statuscode'] == 100: return True + if result['ocs']['meta']['statuscode'] == 101: raise ProviderUserNotExists + log.error(traceback.format_exc()) + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + # 100 - successful + # 101 - failure + + def enable_user(self,userid): + None + + def disable_user(self,userid): + None + + def exists_user_folder(self,userid,userpassword,folder='IsardVDI'): + auth=(userid,userpassword) + url = self.davurl + userid +"/" + folder+"?format=json" + headers = { + 'Depth': '0', + 'Content-Type': 'application/x-www-form-urlencoded', + 'OCS-APIRequest': 'true', + } + try: + result = self._request('PROPFIND',url,auth=auth,headers=headers) + if 'HTTP/1.1 200 OK' in result: return True + return False + except: + log.error(traceback.format_exc()) + raise + + def add_user_folder(self,userid,userpassword,folder='IsardVDI'): + auth=(userid,userpassword) + url = self.davurl + userid +"/" + folder+"?format=json" + headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'OCS-APIRequest': 'true', + } + try: + result = self._request('MKCOL',url,auth=auth,headers=headers) + if result=='': return True + if 'The resource you tried to create already exists' in result: raise ProviderItemExists + log.error(result.split('message>')[1].split('<')[0]) + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + + def exists_user_share_folder(self,userid,userpassword,folder='IsardVDI'): + auth=(userid,userpassword) + url = self.shareurl + "shares?format=json" + headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'OCS-APIRequest': 'true', + } + try: + result = json.loads(self._request('GET', url, auth=auth, headers=headers)) + if result['ocs']['meta']['statuscode']==200: + share=[s for s in result['ocs']['data'] if s['path'] == '/'+folder] + if len(share) >= 1: + # Should we delete all but the first (0) one? + return {'token': share[0]['token'], + 'url': share[0]['url']} + raise ProviderItemNotExists + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + + def add_user_share_folder(self,userid,userpassword,folder='IsardVDI'): + auth=(userid,userpassword) + data={'path':'/'+folder,'shareType':3} + url = self.shareurl + "shares?format=json" + headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'OCS-APIRequest': 'true', + } + try: + result = json.loads(self._request('POST',url, data=data, auth=auth, headers=headers)) + if result['ocs']['meta']['statuscode'] == 100 or result['ocs']['meta']['statuscode'] == 200: + return {'token': result['ocs']['data']['token'], + 'url': result['ocs']['data']['url']} + log.error('Add user share folder error: '+result['ocs']['meta']['message']) + raise ProviderFolderNotExists + except: + log.error(traceback.format_exc()) + raise + + def get_group(self,userid): + None + + def get_groups_list(self): + url = self.apiurl + "groups?format=json" + try: + result = json.loads(self._request('GET',url)) + if result['ocs']['meta']['statuscode'] == 100: return [g for g in result['ocs']['data']['groups'] if '-' in g] + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + + def add_group(self,groupid): + data={'groupid':groupid} + url = self.apiurl + "groups?format=json" + headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'OCS-APIRequest': 'true', + } + try: + result = json.loads(self._request('POST',url, data=data, auth=self.auth, headers=headers)) + if result['ocs']['meta']['statuscode'] == 100: return True + if result['ocs']['meta']['statuscode'] == 102: raise ProviderItemExists + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + # 100 - successful + # 101 - invalid input data + # 102 - group already exists + # 103 - failed to add the group + + def delete_group(self,groupid): + url = self.apiurl + "groups/"+groupid+"?format=json" + headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'OCS-APIRequest': 'true', + } + try: + result = json.loads(self._request('DELETE',url, auth=self.auth, headers=headers)) + if result['ocs']['meta']['statuscode'] == 100: return True + log.error(traceback.format_exc()) + raise ProviderOpError + except: + log.error(traceback.format_exc()) + raise + # 100 - successful + # 101 - invalid input data + # 102 - group already exists + # 103 - failed to add the group + diff --git a/admin/src/admin/lib/nextcloud_exc.py b/admin/src/admin/lib/nextcloud_exc.py new file mode 100644 index 0000000..32baf33 --- /dev/null +++ b/admin/src/admin/lib/nextcloud_exc.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# coding=utf-8 +class ProviderConnError(Exception): + pass + +class ProviderSslError(Exception): + pass + +class ProviderConnTimeout(Exception): + pass + +class ProviderError(Exception): + pass + +class ProviderItemExists(Exception): + pass + +class ProviderItemNotExists(Exception): + pass + +class ProviderGroupNotExists(Exception): + pass + +class ProviderFolderNotExists(Exception): + pass + + +class ProviderOpError(Exception): + pass diff --git a/admin/src/api/static/_templates/apps.html b/admin/src/admin/static/_templates/apps.html similarity index 100% rename from admin/src/api/static/_templates/apps.html rename to admin/src/admin/static/_templates/apps.html diff --git a/admin/src/api/static/_templates/navbar_nextcloud.html b/admin/src/admin/static/_templates/navbar_nextcloud.html similarity index 100% rename from admin/src/api/static/_templates/navbar_nextcloud.html rename to admin/src/admin/static/_templates/navbar_nextcloud.html diff --git a/admin/src/api/static/_templates/nextcloud.html b/admin/src/admin/static/_templates/nextcloud.html similarity index 100% rename from admin/src/api/static/_templates/nextcloud.html rename to admin/src/admin/static/_templates/nextcloud.html diff --git a/admin/src/api/static/css/bootstrap.min.css b/admin/src/admin/static/css/bootstrap.min.css similarity index 100% rename from admin/src/api/static/css/bootstrap.min.css rename to admin/src/admin/static/css/bootstrap.min.css diff --git a/admin/src/api/static/css/dd.css b/admin/src/admin/static/css/dd.css similarity index 100% rename from admin/src/api/static/css/dd.css rename to admin/src/admin/static/css/dd.css diff --git a/admin/src/api/static/img/background.png b/admin/src/admin/static/img/background.png similarity index 100% rename from admin/src/api/static/img/background.png rename to admin/src/admin/static/img/background.png diff --git a/admin/src/api/static/img/logo.png b/admin/src/admin/static/img/logo.png similarity index 100% rename from admin/src/api/static/img/logo.png rename to admin/src/admin/static/img/logo.png diff --git a/admin/src/api/static/js/navbar.js b/admin/src/admin/static/js/navbar.js similarity index 100% rename from admin/src/api/static/js/navbar.js rename to admin/src/admin/static/js/navbar.js diff --git a/admin/src/api/static/templates/.gitkeep b/admin/src/admin/static/templates/.gitkeep similarity index 100% rename from admin/src/api/static/templates/.gitkeep rename to admin/src/admin/static/templates/.gitkeep diff --git a/admin/src/api/static/templates/header.html b/admin/src/admin/static/templates/header.html similarity index 100% rename from admin/src/api/static/templates/header.html rename to admin/src/admin/static/templates/header.html diff --git a/admin/src/api/static/templates/header.json b/admin/src/admin/static/templates/header.json similarity index 100% rename from admin/src/api/static/templates/header.json rename to admin/src/admin/static/templates/header.json diff --git a/admin/src/api/static/templates/header_nextcloud.html b/admin/src/admin/static/templates/header_nextcloud.html similarity index 100% rename from admin/src/api/static/templates/header_nextcloud.html rename to admin/src/admin/static/templates/header_nextcloud.html diff --git a/admin/src/admin/views/MenuViews.py b/admin/src/admin/views/MenuViews.py new file mode 100644 index 0000000..b858891 --- /dev/null +++ b/admin/src/admin/views/MenuViews.py @@ -0,0 +1,28 @@ +#!flask/bin/python +# coding=utf-8 +from admin import app +import logging as log +import traceback + +from uuid import uuid4 +import time,json +import sys,os +from flask import render_template, Response, request, redirect, url_for, jsonify + +# from ..lib.admin import Admin +# menu = Menu() + +# @app.route('/header/', methods=['GET']) +# @app.route('/header//', methods=['GET']) +# def api_v2_header(format,application=False): +# if application == False: +# if format == 'json': +# if application == False: +# return json.dumps(menu.get_header()), 200, {'Content-Type': 'application/json'} +# if format == 'html': +# if application == False: +# return render_template('header.html') +# if application == 'nextcloud': +# return render_template('header_nextcloud.html') +# if application == 'wordpress': +# return render_template('header_wordpress.html') \ No newline at end of file diff --git a/admin/src/api/views/__init__.py b/admin/src/admin/views/__init__.py similarity index 100% rename from admin/src/api/views/__init__.py rename to admin/src/admin/views/__init__.py diff --git a/admin/src/admin/views/__pycache__/MenuViews.cpython-38.pyc b/admin/src/admin/views/__pycache__/MenuViews.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2a7a3e8174ba4b3623e7365271e35ae784550a6 GIT binary patch literal 428 zcmYk2y-ve06ou{l*(phX5Ib`gx-cTd3%~#Z2`?oyw^gW}1Uo6}BlVT8*qC?)Caxm} zZ23Fq>e@cCAM<>|Xgu$aFP|Y}U%vQ10xE83IZdco#WgcraqfMf0~L-MsfaYxu}M_& z*Aq&NJ*niVsY*wks0nGLPfVsVldIfJ)zr+?%*@r?EYyO|2M?@>zbTOw9K*8f?nvWd zsH@8&!I_1o0=w$Lbh_*TDU$5i%~h3^G2a`3nF} BZ*Bkp literal 0 HcmV?d00001 diff --git a/admin/src/api/views/__pycache__/__init__.cpython-38.pyc b/admin/src/admin/views/__pycache__/__init__.cpython-38.pyc similarity index 100% rename from admin/src/api/views/__pycache__/__init__.cpython-38.pyc rename to admin/src/admin/views/__pycache__/__init__.cpython-38.pyc diff --git a/admin/src/api/__pycache__/__init__.cpython-38.pyc b/admin/src/api/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 82ea2c51bccd9811ed9bb01892dd07879a6d9322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 987 zcmY*XPj3@D5VxJ(%_dE@B@ICw5c{O3_mn4*91s_T5K>WZaN)njlW}7wb=kEe+bL>* zQ@J4yT#-Pn5J-FiBn}+XJ0D=LocIcy7>8Fqu;ua0cxF8Q{d}w4ZXy^rFT8v3GDhfY zFn%2g7*}AqFCYXGxIpyhjwu0~6tyy|Z zB9$pykuA~K$2e4K7VR>l8AkJ#%w!t8caZL46eh&21kXLB$z22$R_!ZE4%S5L;6$(v z@gbb*4){91`(%2sF4~7!WMcIh+Q+mj*2Ib8WZ9!VxEJ3*{mwUd6T057Rq-2LVZkEo#$SS*vuAe%Ki5DwV#gRag+-|#|9gl z0!nPo&cl5h+gwj%?zff8AIiNyhQp(ei~YstQ%9c`Z|66g_x~*y?-$QEk6yRo;LVw{ z-M{CjZ+LFK(vw^{ZpAt0OwOljFc|c4)hrAb8%B@SWd7HNnH3_}#^)31bE$WgHM*4A z=eyi0zEwyES@Z0w+?q}D(g=AmfBbab`@iwwrSPDOL0lf;fY5&<=8i%3Q`)e`_$6|EY#R{v0ofL8 z-+MzYN~MSJx*=mqE6>sdOYK{SQ|3IuGAP}(`$Zw%Jz@l+Y>e+22AG!W1n}V;Z z7iKa6', methods=['GET']) -@app.route('/header//', methods=['GET']) -def api_v2_header(format,application=False): - if application == False: - if format == 'json': - if application == False: - return json.dumps(menu.get_header()), 200, {'Content-Type': 'application/json'} - if format == 'html': - if application == False: - return render_template('header.html') - if application == 'nextcloud': - return render_template('header_nextcloud.html') - if application == 'wordpress': - return render_template('header_wordpress.html') \ No newline at end of file diff --git a/admin/src/api/views/__pycache__/MenuViews.cpython-38.pyc b/admin/src/api/views/__pycache__/MenuViews.cpython-38.pyc deleted file mode 100644 index 5e86e4673a0b68b8790a988d4a88ff0244944fad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1006 zcmZ8gy>1jS5VrUK{x1pnX+X4Bkc}efq6jG>(2#-zgxnmPv+r&bdv~$D33o~tTHYZk zkl+n?1fIbyRbGLL@$Mx$Vaqe~&5Xx0WBYxl(?l>%UVQ)b%SGsq1duEhJ%Oi%3-Q25D5hNt(bt-V$xn79G+NUD6dj(i45s z7b|21_WLy8t746;VZ_$15qZS$**XnrG{Lm-&8blH9?>ps)6Q3X4U=q8=NJuocaSX_ zVB;o5aRl5i%alGJ1g0lhMwuLHCJLTtW}bTxpmX-5C!o!y zIbnKO2b8uy1IGk)!%b@`ub)V6fc5X=IH4lV;-pC9iEbT_2SBU}QUCw| diff --git a/admin/src/start.py b/admin/src/start.py index 2a09cf8..c754f13 100644 --- a/admin/src/start.py +++ b/admin/src/start.py @@ -3,11 +3,8 @@ from gevent import monkey monkey.patch_all() -import yaml -from api import app +from admin import app -# import pprint -# pprint.pprint(app.yaml) if __name__ == '__main__': app.run(host='0.0.0.0', port=9000, debug=False) #, logger=logger, engineio_logger=engineio_logger) diff --git a/admin/src/system.yaml.example b/admin/src/system.yaml.example deleted file mode 100644 index 226fd04..0000000 --- a/admin/src/system.yaml.example +++ /dev/null @@ -1,55 +0,0 @@ -apps_internal: -- subdomain: nextcloud - href: / - icon: fa fa-cloud - name: Núvol + crear arxius - shortname: cloud -- subdomain: nextcloud - href: /apps/mail/setup - icon: fa fa-envelope-o - name: Correu - shortname: email -- subdomain: pad - href: / - icon: fa fa-file-text-o - name: Pads - shortname: pads -- subdomain: nextcloud - href: /apps/forms - icon: fa fa-check-square-o - name: Formularis - shortname: forms -- subdomain: nextcloud - href: /apps/polls - icon: fa fa-bar-chart - name: Enquestes - shortname: feedback -- subdomain: nextcloud - href: /apps/spreed - icon: fa fa-commenting-o - name: Xat - shortname: chat -- subdomain: nextcloud - href: /apps/calendar - icon: fa fa-calendar - name: Calendari - shortname: schedule -- subdomain: wp - href: /wp-login.php?saml_sso - icon: fa fa-rss - name: Webs - shortname: webs -- subdomain: nextcloud - href: /apps/bbb - icon: fa fa-video-camera - name: Reunions BBB - shortname: meets_bbb -- subdomain: nextcloud - href: /apps/photos - icon: fa fa-file-image-o - name: Fotos - shortname: photos -user: - account: /auth/realms/master/account - avatar: /auth/realms/master/avatar-provider - password: /auth/realms/master/password diff --git a/admin/src/tests/test_lib.py b/admin/src/tests/test_lib.py index cf52403..57cef0d 100644 --- a/admin/src/tests/test_lib.py +++ b/admin/src/tests/test_lib.py @@ -28,4 +28,7 @@ new_user = keycloak_admin.create_user({"email": "example@example.com", "enabled": True, "firstName": "Example", "lastName": "Example"}) -print(new_user) \ No newline at end of file +print(new_user) + +user_id_keycloak = keycloak_admin.get_user_id("admin") +print(user_id_keycloak) \ No newline at end of file diff --git a/docker-compose-parts/admin.yml b/docker-compose-parts/admin.yml index 4b16cfe..6ff59d8 100644 --- a/docker-compose-parts/admin.yml +++ b/docker-compose-parts/admin.yml @@ -19,6 +19,7 @@ services: - /etc/localtime:/etc/localtime:ro - ${BUILD_ROOT_PATH}/admin/src:/admin # Revome in production - ${BUILD_ROOT_PATH}/custom:/admin/custom #:ro in production + - ${DATA_FOLDER}/avatars:/admin/avatars:ro env_file: - .env command: sleep infinity diff --git a/isard-sso b/isard-sso index 790afd2..7a0176a 160000 --- a/isard-sso +++ b/isard-sso @@ -1 +1 @@ -Subproject commit 790afd2a9c70618e422b0e69ffa702f80a4ee1a6 +Subproject commit 7a0176a6e31ced64dc32fdcc175a21601747c0f7