api-functions.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  1. <?php
  2. function login($array){
  3. // Grab username and Password from login form
  4. foreach ($array['data'] as $items) {
  5. foreach ($items as $key => $value) {
  6. if($key == 'name'){
  7. $newKey = $value;
  8. }
  9. if($key == 'value'){
  10. $newValue = $value;
  11. }
  12. if(isset($newKey) && isset($newValue)){
  13. $$newKey = $newValue;
  14. }
  15. }
  16. }
  17. $username = strtolower($username);
  18. $days = (isset($remember)) ? 7 : 1;
  19. try {
  20. $database = new Dibi\Connection([
  21. 'driver' => 'sqlite3',
  22. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  23. ]);
  24. $result = $database->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE',$username,$username);
  25. if(password_verify($password, $result['password'])){
  26. if(createToken($result['username'],$result['email'],$result['image'],$result['group'],$result['group_id'],$GLOBALS['organizrHash'],$days)){
  27. writeLoginLog($username, 'success');
  28. writeLog('success', 'Login Function - A User has logged in', $username);
  29. return true;
  30. }
  31. }else{
  32. writeLoginLog($username, 'error');
  33. writeLog('error', 'Login Function - Wrong Password', $username);
  34. return 'mismatch';
  35. }
  36. } catch (Dibi\Exception $e) {
  37. return 'error';
  38. }
  39. }
  40. function createDB($path,$filename) {
  41. if(file_exists($path.$filename)){
  42. unlink($path.$filename);
  43. }
  44. try {
  45. $createDB = new Dibi\Connection([
  46. 'driver' => 'sqlite3',
  47. 'database' => $path.$filename,
  48. ]);
  49. // Create Users
  50. $users = $createDB->query('CREATE TABLE `users` (
  51. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  52. `username` TEXT UNIQUE,
  53. `password` TEXT,
  54. `email` TEXT,
  55. `plex_token` TEXT,
  56. `group` TEXT,
  57. `group_id` INTEGER,
  58. `image` TEXT,
  59. `register_date` DATE,
  60. `auth_service` TEXT DEFAULT \'internal\'
  61. );');
  62. $groups = $createDB->query('CREATE TABLE `groups` (
  63. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  64. `group` TEXT UNIQUE,
  65. `group_id` INTEGER,
  66. `image` TEXT,
  67. `default` INTEGER
  68. );');
  69. $categories = $createDB->query('CREATE TABLE `categories` (
  70. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  71. `order` INTEGER,
  72. `category` TEXT UNIQUE,
  73. `category_id` INTEGER,
  74. `image` TEXT,
  75. `default` INTEGER
  76. );');
  77. // Create Tabs
  78. $tabs = $createDB->query('CREATE TABLE `tabs` (
  79. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  80. `order` INTEGER,
  81. `category_id` INTEGER,
  82. `name` TEXT,
  83. `url` TEXT,
  84. `url_local` TEXT,
  85. `default` INTEGER,
  86. `enabled` INTEGER,
  87. `group_id` INTEGER,
  88. `image` TEXT,
  89. `type` INTEGER,
  90. `splash` INTEGER,
  91. `ping` INTEGER,
  92. `ping_url` TEXT
  93. );');
  94. // Create Options
  95. $options = $createDB->query('CREATE TABLE `options` (
  96. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  97. `users_id` INTEGER UNIQUE,
  98. `title` TEXT UNIQUE,
  99. `topbar` TEXT,
  100. `bottombar` TEXT,
  101. `sidebar` TEXT,
  102. `hoverbg` TEXT,
  103. `topbartext` TEXT,
  104. `activetabBG` TEXT,
  105. `activetabicon` TEXT,
  106. `activetabtext` TEXT,
  107. `inactiveicon` TEXT,
  108. `inactivetext` TEXT,
  109. `loading` TEXT,
  110. `hovertext` TEXT
  111. );');
  112. // Create Invites
  113. $invites = $createDB->query('CREATE TABLE `invites` (
  114. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  115. `code` TEXT UNIQUE,
  116. `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  117. `email` TEXT,
  118. `username` TEXT,
  119. `dateused` TIMESTAMP,
  120. `usedby` TEXT,
  121. `ip` TEXT,
  122. `valid` TEXT,
  123. `type` TEXT
  124. );');
  125. return true;
  126. } catch (Dibi\Exception $e) {
  127. return false;
  128. }
  129. }
  130. // Upgrade Database
  131. function updateDB($path,$filename,$oldVerNum = false) {
  132. try {
  133. $connect = new Dibi\Connection([
  134. 'driver' => 'sqlite3',
  135. 'database' => $path.$filename,
  136. ]);
  137. // Cache current DB
  138. $cache = array();
  139. foreach($connect->query('SELECT name FROM sqlite_master WHERE type="table";') as $table) {
  140. foreach($connect->query('SELECT * FROM '.$table['name'].';') as $key => $row) {
  141. foreach($row as $k => $v) {
  142. if (is_string($k)) {
  143. $cache[$table['name']][$key][$k] = $v;
  144. }
  145. }
  146. }
  147. }
  148. // Remove Current Database
  149. /*
  150. $pathDigest = pathinfo($path.$filename);
  151. if (file_exists($path.$filename)) {
  152. rename($path.$filename, $pathDigest['dirname'].'/'.$pathDigest['filename'].'['.date('Y-m-d_H-i-s').']'.($oldVerNum?'['.$oldVerNum.']':'').'.bak.db');
  153. }
  154. // Create New Database
  155. $success = createSQLiteDB($path.$filename);
  156. // Restore Items
  157. if ($success) {
  158. foreach($cache as $table => $tableData) {
  159. if ($tableData) {
  160. $queryBase = 'INSERT INTO '.$table.' (`'.implode('`,`',array_keys(current($tableData))).'`) values ';
  161. $insertValues = array();
  162. reset($tableData);
  163. foreach($tableData as $key => $value) {
  164. $insertValues[] = '('.implode(',',array_map(function($d) {
  165. return (isset($d)?$GLOBALS['file_db']->quote($d):'null');
  166. }, $value)).')';
  167. }
  168. $GLOBALS['file_db']->query($queryBase.implode(',',$insertValues).';');
  169. }
  170. }
  171. //writeLog("success", "database values have been updated");
  172. return true;
  173. } else {
  174. //writeLog("error", "database values unable to be updated");
  175. return false;
  176. }
  177. */
  178. return $cache;
  179. } catch (Dibi\Exception $e) {
  180. return $e;
  181. }
  182. }
  183. function createFirstAdmin($path,$filename,$username,$password,$email) {
  184. try {
  185. $createDB = new Dibi\Connection([
  186. 'driver' => 'sqlite3',
  187. 'database' => $path.$filename,
  188. ]);
  189. $userInfo = [
  190. 'username' => $username,
  191. 'password' => password_hash($password, PASSWORD_BCRYPT),
  192. 'email' => $email,
  193. 'group' => 'Admin',
  194. 'group_id' => 0,
  195. 'image' => gravatar($email),
  196. 'register_date' => $GLOBALS['currentTime'],
  197. ];
  198. $groupInfo0 = [
  199. 'group' => 'Admin',
  200. 'group_id' => 0,
  201. 'default' => false,
  202. 'image' => 'plugins/images/groups/admin.png',
  203. ];
  204. $groupInfo1 = [
  205. 'group' => 'Co-Admin',
  206. 'group_id' => 1,
  207. 'default' => false,
  208. 'image' => 'plugins/images/groups/coadmin.png',
  209. ];
  210. $groupInfo2 = [
  211. 'group' => 'Super User',
  212. 'group_id' => 2,
  213. 'default' => false,
  214. 'image' => 'plugins/images/groups/superuser.png',
  215. ];
  216. $groupInfo3 = [
  217. 'group' => 'Power User',
  218. 'group_id' => 3,
  219. 'default' => false,
  220. 'image' => 'plugins/images/groups/poweruser.png',
  221. ];
  222. $groupInfo4 = [
  223. 'group' => 'User',
  224. 'group_id' => 4,
  225. 'default' => true,
  226. 'image' => 'plugins/images/groups/user.png',
  227. ];
  228. $groupInfoGuest = [
  229. 'group' => 'Guest',
  230. 'group_id' => 999,
  231. 'default' => false,
  232. 'image' => 'plugins/images/groups/guest.png',
  233. ];
  234. $settingsInfo = [
  235. 'order' => 1,
  236. 'category_id' => 0,
  237. 'name' => 'Settings',
  238. 'url' => 'api/?v1/settings/page',
  239. 'default' => false,
  240. 'enabled' => true,
  241. 'group_id' => 1,
  242. 'image' => 'fontawesome::cog',
  243. 'type' => 0
  244. ];
  245. $homepageInfo = [
  246. 'order' => 2,
  247. 'category_id' => 0,
  248. 'name' => 'Homepage',
  249. 'url' => 'api/?v1/homepage/page',
  250. 'default' => false,
  251. 'enabled' => false,
  252. 'group_id' => 4,
  253. 'image' => 'fontawesome::home',
  254. 'type' => 0
  255. ];
  256. $unsortedInfo = [
  257. 'order' => 1,
  258. 'category' => 'Unsorted',
  259. 'category_id' => 0,
  260. 'image' => 'plugins/images/categories/unsorted.png',
  261. 'default' => true
  262. ];
  263. $createDB->query('INSERT INTO [users]', $userInfo);
  264. $createDB->query('INSERT INTO [groups]', $groupInfo0);
  265. $createDB->query('INSERT INTO [groups]', $groupInfo1);
  266. $createDB->query('INSERT INTO [groups]', $groupInfo2);
  267. $createDB->query('INSERT INTO [groups]', $groupInfo3);
  268. $createDB->query('INSERT INTO [groups]', $groupInfo4);
  269. $createDB->query('INSERT INTO [groups]', $groupInfoGuest);
  270. $createDB->query('INSERT INTO [tabs]', $settingsInfo);
  271. $createDB->query('INSERT INTO [tabs]', $homepageInfo);
  272. $createDB->query('INSERT INTO [categories]', $unsortedInfo);
  273. return true;
  274. } catch (Dibi\Exception $e) {
  275. return false;
  276. }
  277. }
  278. function defaultUserGroup(){
  279. try {
  280. $connect = new Dibi\Connection([
  281. 'driver' => 'sqlite3',
  282. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  283. ]);
  284. $all = $connect->fetch('SELECT * FROM groups WHERE `default` = 1');
  285. return $all;
  286. } catch (Dibi\Exception $e) {
  287. return false;
  288. }
  289. }
  290. function defaulTabCategory(){
  291. try {
  292. $connect = new Dibi\Connection([
  293. 'driver' => 'sqlite3',
  294. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  295. ]);
  296. $all = $connect->fetch('SELECT * FROM categories WHERE `default` = 1');
  297. return $all;
  298. } catch (Dibi\Exception $e) {
  299. return false;
  300. }
  301. }
  302. function getGuest(){
  303. if(isset($GLOBALS['dbLocation'])){
  304. try {
  305. $connect = new Dibi\Connection([
  306. 'driver' => 'sqlite3',
  307. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  308. ]);
  309. $all = $connect->fetch('SELECT * FROM groups WHERE `group` = "Guest"');
  310. return $all;
  311. } catch (Dibi\Exception $e) {
  312. return false;
  313. }
  314. }else{
  315. return array(
  316. 'group' => 'Guest',
  317. 'group_id' => 999,
  318. 'image' => 'plugins/images/groups/guest.png'
  319. );
  320. }
  321. }
  322. function adminEditGroup($array){
  323. switch ($array['data']['action']) {
  324. case 'changeDefaultGroup':
  325. try {
  326. $connect = new Dibi\Connection([
  327. 'driver' => 'sqlite3',
  328. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  329. ]);
  330. $connect->query('UPDATE groups SET `default` = 0');
  331. $connect->query('
  332. UPDATE groups SET', [
  333. 'default' => 1
  334. ], '
  335. WHERE id=?', $array['data']['id']);
  336. writeLog('success', 'Group Management Function - Changed Default Group from ['.$array['data']['oldGroupName'].'] to ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
  337. return true;
  338. } catch (Dibi\Exception $e) {
  339. return false;
  340. }
  341. break;
  342. case 'deleteUserGroup':
  343. try {
  344. $connect = new Dibi\Connection([
  345. 'driver' => 'sqlite3',
  346. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  347. ]);
  348. $connect->query('DELETE FROM groups WHERE id = ?', $array['data']['id']);
  349. writeLog('success', 'Group Management Function - Deleted Group ['.$array['data']['groupName'].']', $GLOBALS['organizrUser']['username']);
  350. return true;
  351. } catch (Dibi\Exception $e) {
  352. return false;
  353. }
  354. break;
  355. case 'addUserGroup':
  356. try {
  357. $connect = new Dibi\Connection([
  358. 'driver' => 'sqlite3',
  359. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  360. ]);
  361. $newGroup = [
  362. 'group' => $array['data']['newGroupName'],
  363. 'group_id' => $array['data']['newGroupID'],
  364. 'default' => false,
  365. 'image' => $array['data']['newGroupImage'],
  366. ];
  367. $connect->query('INSERT INTO [groups]', $newGroup);
  368. writeLog('success', 'Group Management Function - Added Group ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
  369. return true;
  370. } catch (Dibi\Exception $e) {
  371. return false;
  372. }
  373. break;
  374. case 'editUserGroup':
  375. try {
  376. $connect = new Dibi\Connection([
  377. 'driver' => 'sqlite3',
  378. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  379. ]);
  380. $connect->query('
  381. UPDATE groups SET', [
  382. 'group' => $array['data']['groupName'],
  383. 'image' => $array['data']['groupImage'],
  384. ], '
  385. WHERE id=?', $array['data']['id']);
  386. writeLog('success', 'Group Management Function - Edited Group Info for ['.$array['data']['oldGroupName'].']', $GLOBALS['organizrUser']['username']);
  387. return true;
  388. } catch (Dibi\Exception $e) {
  389. return false;
  390. }
  391. break;
  392. default:
  393. # code...
  394. break;
  395. }
  396. }
  397. function adminEditUser($array){
  398. switch ($array['data']['action']) {
  399. case 'changeGroup':
  400. try {
  401. $connect = new Dibi\Connection([
  402. 'driver' => 'sqlite3',
  403. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  404. ]);
  405. $connect->query('
  406. UPDATE users SET', [
  407. 'group' => $array['data']['newGroupName'],
  408. 'group_id' => $array['data']['newGroupID'],
  409. ], '
  410. WHERE id=?', $array['data']['id']);
  411. writeLog('success', 'User Management Function - User: '.$array['data']['username'].'\'s group was changed from ['.$array['data']['oldGroup'].'] to ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
  412. return true;
  413. } catch (Dibi\Exception $e) {
  414. writeLog('error', 'User Management Function - Error - User: '.$array['data']['username'].'\'s group was changed from ['.$array['data']['oldGroup'].'] to ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
  415. return false;
  416. }
  417. break;
  418. case 'addNewUser':
  419. $defaults = defaultUserGroup();
  420. if(createUser($array['data']['username'],$array['data']['password'],$defaults,$array['data']['email'])){
  421. writeLog('success', 'Create User Function - Acount created for ['.$array['data']['username'].']', $GLOBALS['organizrUser']['username']);
  422. return true;
  423. }else{
  424. writeLog('error', 'Registration Function - An error occured', $GLOBALS['organizrUser']['username']);
  425. return 'username taken';
  426. }
  427. break;
  428. case 'deleteUser':
  429. try {
  430. $connect = new Dibi\Connection([
  431. 'driver' => 'sqlite3',
  432. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  433. ]);
  434. $connect->query('DELETE FROM users WHERE id = ?', $array['data']['id']);
  435. writeLog('success', 'User Management Function - Deleted User ['.$array['data']['username'].']', $GLOBALS['organizrUser']['username']);
  436. return true;
  437. } catch (Dibi\Exception $e) {
  438. return false;
  439. }
  440. break;
  441. default:
  442. # code...
  443. break;
  444. }
  445. }
  446. function editTabs($array){
  447. switch ($array['data']['action']) {
  448. case 'changeGroup':
  449. try {
  450. $connect = new Dibi\Connection([
  451. 'driver' => 'sqlite3',
  452. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  453. ]);
  454. $connect->query('
  455. UPDATE tabs SET', [
  456. 'group_id' => $array['data']['newGroupID'],
  457. ], '
  458. WHERE id=?', $array['data']['id']);
  459. writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s group was changed to ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
  460. return true;
  461. } catch (Dibi\Exception $e) {
  462. return false;
  463. }
  464. break;
  465. case 'changeCategory':
  466. try {
  467. $connect = new Dibi\Connection([
  468. 'driver' => 'sqlite3',
  469. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  470. ]);
  471. $connect->query('
  472. UPDATE tabs SET', [
  473. 'category_id' => $array['data']['newCategoryID'],
  474. ], '
  475. WHERE id=?', $array['data']['id']);
  476. writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s category was changed to ['.$array['data']['newCategoryName'].']', $GLOBALS['organizrUser']['username']);
  477. return true;
  478. } catch (Dibi\Exception $e) {
  479. return false;
  480. }
  481. break;
  482. case 'changeType':
  483. try {
  484. $connect = new Dibi\Connection([
  485. 'driver' => 'sqlite3',
  486. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  487. ]);
  488. $connect->query('
  489. UPDATE tabs SET', [
  490. 'type' => $array['data']['newTypeID'],
  491. ], '
  492. WHERE id=?', $array['data']['id']);
  493. writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s type was changed to ['.$array['data']['newTypeName'].']', $GLOBALS['organizrUser']['username']);
  494. return true;
  495. } catch (Dibi\Exception $e) {
  496. return false;
  497. }
  498. break;
  499. case 'changeEnabled':
  500. try {
  501. $connect = new Dibi\Connection([
  502. 'driver' => 'sqlite3',
  503. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  504. ]);
  505. $connect->query('
  506. UPDATE tabs SET', [
  507. 'enabled' => $array['data']['tabEnabled'],
  508. ], '
  509. WHERE id=?', $array['data']['id']);
  510. writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s enable status was changed to ['.$array['data']['tabEnabledWord'].']', $GLOBALS['organizrUser']['username']);
  511. return true;
  512. } catch (Dibi\Exception $e) {
  513. return false;
  514. }
  515. break;
  516. case 'changeSplash':
  517. try {
  518. $connect = new Dibi\Connection([
  519. 'driver' => 'sqlite3',
  520. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  521. ]);
  522. $connect->query('
  523. UPDATE tabs SET', [
  524. 'splash' => $array['data']['tabSplash'],
  525. ], '
  526. WHERE id=?', $array['data']['id']);
  527. writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s splash status was changed to ['.$array['data']['tabSplashWord'].']', $GLOBALS['organizrUser']['username']);
  528. return true;
  529. } catch (Dibi\Exception $e) {
  530. return false;
  531. }
  532. break;
  533. case 'changeDefault':
  534. try {
  535. $connect = new Dibi\Connection([
  536. 'driver' => 'sqlite3',
  537. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  538. ]);
  539. $connect->query('UPDATE tabs SET `default` = 0');
  540. $connect->query('
  541. UPDATE tabs SET', [
  542. 'default' => 1
  543. ], '
  544. WHERE id=?', $array['data']['id']);
  545. writeLog('success', 'Tab Editor Function - Changed Default Tab to ['.$array['data']['tab'].']', $GLOBALS['organizrUser']['username']);
  546. return true;
  547. } catch (Dibi\Exception $e) {
  548. return false;
  549. }
  550. break;
  551. case 'deleteTab':
  552. try {
  553. $connect = new Dibi\Connection([
  554. 'driver' => 'sqlite3',
  555. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  556. ]);
  557. $connect->query('DELETE FROM tabs WHERE id = ?', $array['data']['id']);
  558. writeLog('success', 'Tab Editor Function - Deleted Tab ['.$array['data']['tab'].']', $GLOBALS['organizrUser']['username']);
  559. return true;
  560. } catch (Dibi\Exception $e) {
  561. return false;
  562. }
  563. break;
  564. case 'editTab':
  565. try {
  566. $connect = new Dibi\Connection([
  567. 'driver' => 'sqlite3',
  568. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  569. ]);
  570. $connect->query('
  571. UPDATE tabs SET', [
  572. 'name' => $array['data']['tabName'],
  573. 'url' => $array['data']['tabURL'],
  574. 'image' => $array['data']['tabImage'],
  575. ], '
  576. WHERE id=?', $array['data']['id']);
  577. writeLog('success', 'Tab Editor Function - Edited Tab Info for ['.$array['data']['tabName'].']', $GLOBALS['organizrUser']['username']);
  578. return true;
  579. } catch (Dibi\Exception $e) {
  580. return false;
  581. }
  582. case 'changeOrder':
  583. try {
  584. $connect = new Dibi\Connection([
  585. 'driver' => 'sqlite3',
  586. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  587. ]);
  588. foreach ($array['data']['tabs']['tab'] as $key => $value) {
  589. if($value['order'] != $value['originalOrder']){
  590. $connect->query('
  591. UPDATE tabs SET', [
  592. 'order' => $value['order'],
  593. ], '
  594. WHERE id=?', $value['id']);
  595. writeLog('success', 'Tab Editor Function - '.$value['name'].' Order Changed From '.$value['order'].' to '.$value['originalOrder'], $GLOBALS['organizrUser']['username']);
  596. }
  597. }
  598. writeLog('success', 'Tab Editor Function - Tab Order Changed', $GLOBALS['organizrUser']['username']);
  599. return true;
  600. } catch (Dibi\Exception $e) {
  601. return false;
  602. }
  603. break;
  604. case 'addNewTab':
  605. try {
  606. $default = defaulTabCategory()['category_id'];
  607. $connect = new Dibi\Connection([
  608. 'driver' => 'sqlite3',
  609. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  610. ]);
  611. $newTab = [
  612. 'order' => $array['data']['tabOrder'],
  613. 'category_id' => $default,
  614. 'name' => $array['data']['tabName'],
  615. 'url' => $array['data']['tabURL'],
  616. 'default' => $array['data']['tabDefault'],
  617. 'enabled' => 1,
  618. 'group_id' => $array['data']['tabGroupID'],
  619. 'image' => $array['data']['tabImage'],
  620. 'type' => $array['data']['tabType']
  621. ];
  622. $connect->query('INSERT INTO [tabs]', $newTab);
  623. writeLog('success', 'Tab Editor Function - Created Tab for: '.$array['data']['tabName'], $GLOBALS['organizrUser']['username']);
  624. return true;
  625. } catch (Dibi\Exception $e) {
  626. return false;
  627. }
  628. break;
  629. case 'deleteTab':
  630. try {
  631. $connect = new Dibi\Connection([
  632. 'driver' => 'sqlite3',
  633. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  634. ]);
  635. $connect->query('DELETE FROM tabs WHERE id = ?', $array['data']['id']);
  636. writeLog('success', 'Tab Editor Function - Deleted Tab ['.$array['data']['name'].']', $GLOBALS['organizrUser']['username']);
  637. return true;
  638. } catch (Dibi\Exception $e) {
  639. return false;
  640. }
  641. break;
  642. default:
  643. # code...
  644. break;
  645. }
  646. }
  647. function editCategories($array){
  648. switch ($array['data']['action']) {
  649. case 'changeDefault':
  650. try {
  651. $connect = new Dibi\Connection([
  652. 'driver' => 'sqlite3',
  653. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  654. ]);
  655. $connect->query('UPDATE categories SET `default` = 0');
  656. $connect->query('
  657. UPDATE categories SET', [
  658. 'default' => 1
  659. ], '
  660. WHERE id=?', $array['data']['id']);
  661. writeLog('success', 'Category Editor Function - Changed Default Category from ['.$array['data']['oldCategoryName'].'] to ['.$array['data']['newCategoryName'].']', $GLOBALS['organizrUser']['username']);
  662. return true;
  663. } catch (Dibi\Exception $e) {
  664. return false;
  665. }
  666. break;
  667. case 'deleteCategory':
  668. try {
  669. $connect = new Dibi\Connection([
  670. 'driver' => 'sqlite3',
  671. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  672. ]);
  673. $connect->query('DELETE FROM categories WHERE id = ?', $array['data']['id']);
  674. writeLog('success', 'Category Editor Function - Deleted Category ['.$array['data']['category'].']', $GLOBALS['organizrUser']['username']);
  675. return true;
  676. } catch (Dibi\Exception $e) {
  677. return false;
  678. }
  679. break;
  680. case 'addNewCategory':
  681. try {
  682. $connect = new Dibi\Connection([
  683. 'driver' => 'sqlite3',
  684. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  685. ]);
  686. $newCategory = [
  687. 'category' => $array['data']['categoryName'],
  688. 'order' => $array['data']['categoryOrder'],
  689. 'category_id' => $array['data']['categoryID'],
  690. 'default' => false,
  691. 'image' => $array['data']['categoryImage'],
  692. ];
  693. $connect->query('INSERT INTO [categories]', $newCategory);
  694. writeLog('success', 'Category Editor Function - Added Category ['.$array['data']['categoryName'].']', $GLOBALS['organizrUser']['username']);
  695. return true;
  696. } catch (Dibi\Exception $e) {
  697. return $e;
  698. }
  699. break;
  700. case 'editCategory':
  701. try {
  702. $connect = new Dibi\Connection([
  703. 'driver' => 'sqlite3',
  704. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  705. ]);
  706. $connect->query('
  707. UPDATE categories SET', [
  708. 'category' => $array['data']['name'],
  709. 'image' => $array['data']['image'],
  710. ], '
  711. WHERE id=?', $array['data']['id']);
  712. writeLog('success', 'Category Editor Function - Edited Category Info for ['.$array['data']['name'].']', $GLOBALS['organizrUser']['username']);
  713. return true;
  714. } catch (Dibi\Exception $e) {
  715. return false;
  716. }
  717. break;
  718. case 'changeOrder':
  719. try {
  720. $connect = new Dibi\Connection([
  721. 'driver' => 'sqlite3',
  722. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  723. ]);
  724. foreach ($array['data']['categories']['category'] as $key => $value) {
  725. if($value['order'] != $value['originalOrder']){
  726. $connect->query('
  727. UPDATE categories SET', [
  728. 'order' => $value['order'],
  729. ], '
  730. WHERE id=?', $value['id']);
  731. writeLog('success', 'Category Editor Function - '.$value['name'].' Order Changed From '.$value['order'].' to '.$value['originalOrder'], $GLOBALS['organizrUser']['username']);
  732. }
  733. }
  734. writeLog('success', 'Category Editor Function - Category Order Changed', $GLOBALS['organizrUser']['username']);
  735. return true;
  736. } catch (Dibi\Exception $e) {
  737. return false;
  738. }
  739. break;
  740. default:
  741. # code...
  742. break;
  743. }
  744. }
  745. function editAppearance($array){
  746. switch ($array['data']['value']) {
  747. case 'true':
  748. $array['data']['value'] = (bool) true;
  749. break;
  750. case 'false':
  751. $array['data']['value'] = (bool) false;
  752. break;
  753. default:
  754. $array['data']['value'] = $array['data']['value'];
  755. }
  756. //return gettype($array['data']['value']).' - '.$array['data']['value'];
  757. switch ($array['data']['action']) {
  758. case 'editCustomizeAppearance':
  759. $newItem = array(
  760. $array['data']['name'] => $array['data']['value']
  761. );
  762. return (updateConfig($newItem)) ? true : false;
  763. break;
  764. default:
  765. # code...
  766. break;
  767. }
  768. }
  769. function allUsers(){
  770. try {
  771. $connect = new Dibi\Connection([
  772. 'driver' => 'sqlite3',
  773. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  774. ]);
  775. $users = $connect->fetchAll('SELECT * FROM users');
  776. $groups = $connect->fetchAll('SELECT * FROM groups ORDER BY group_id ASC');
  777. foreach ($users as $k => $v) {
  778. // clear password from array
  779. unset($users[$k]['password']);
  780. }
  781. $all['users'] = $users;
  782. $all['groups'] = $groups;
  783. return $all;
  784. } catch (Dibi\Exception $e) {
  785. return false;
  786. }
  787. }
  788. function usernameTaken($username,$email){
  789. try {
  790. $connect = new Dibi\Connection([
  791. 'driver' => 'sqlite3',
  792. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  793. ]);
  794. $all = $connect->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE',$username,$email);
  795. return ($all) ? true : false;
  796. } catch (Dibi\Exception $e) {
  797. return false;
  798. }
  799. }
  800. function createUser($username,$password,$defaults,$email=null) {
  801. $email = ($email) ? $email : random_ascii_string(10).'@placeholder.eml';
  802. try {
  803. if(!usernameTaken($username,$email)){
  804. $createDB = new Dibi\Connection([
  805. 'driver' => 'sqlite3',
  806. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  807. ]);
  808. $userInfo = [
  809. 'username' => $username,
  810. 'password' => password_hash($password, PASSWORD_BCRYPT),
  811. 'email' => $email,
  812. 'group' => $defaults['group'],
  813. 'group_id' => $defaults['group_id'],
  814. 'image' => gravatar($email),
  815. 'register_date' => $GLOBALS['currentTime'],
  816. ];
  817. $createDB->query('INSERT INTO [users]', $userInfo);
  818. return true;
  819. }else{
  820. return false;
  821. }
  822. } catch (Dibi\Exception $e) {
  823. return false;
  824. }
  825. }
  826. function allTabs(){
  827. if(file_exists('config'.DIRECTORY_SEPARATOR.'config.php')){
  828. try {
  829. $connect = new Dibi\Connection([
  830. 'driver' => 'sqlite3',
  831. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  832. ]);
  833. $all['tabs'] = $connect->fetchAll('SELECT * FROM tabs ORDER BY `order` ASC');
  834. $all['categories'] = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  835. $all['groups'] = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
  836. return $all;
  837. } catch (Dibi\Exception $e) {
  838. return false;
  839. }
  840. }
  841. }
  842. function loadTabs(){
  843. if(file_exists('config'.DIRECTORY_SEPARATOR.'config.php')){
  844. try {
  845. $connect = new Dibi\Connection([
  846. 'driver' => 'sqlite3',
  847. 'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
  848. ]);
  849. $tabs = $connect->fetchAll('SELECT * FROM tabs WHERE `group_id` >= ? AND `enabled` = 1 ORDER BY `order` DESC',$GLOBALS['organizrUser']['groupID']);
  850. $categories = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  851. $all['tabs'] = $tabs;
  852. foreach ($tabs as $k => $v) {
  853. $v['access_url'] = isset($v['url_local']) && $_SERVER['SERVER_ADDR'] == userIP() ? $v['url_local'] : $v['url'];
  854. }
  855. $count = array_map(function($element){
  856. return $element['category_id'];
  857. }, $tabs);
  858. $count = (array_count_values($count));
  859. foreach ($categories as $k => $v) {
  860. $v['count'] = isset($count[$v['category_id']]) ? $count[$v['category_id']] : 0;
  861. }
  862. $all['categories'] = $categories;
  863. return $all;
  864. } catch (Dibi\Exception $e) {
  865. return false;
  866. }
  867. }
  868. }