api-functions.php 34 KB

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