api.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. <?php
  2. require_once('php/include.php');
  3. // TODO - Add API handling.
  4. $method = $_SERVER['REQUEST_METHOD'];
  5. $ret = array();
  6. if(isset($_GET['type'])){
  7. if(isset($_GET['id'])){
  8. $id = $_GET['id'];
  9. switch($_GET['type']){
  10. case 'user':
  11. back(true);
  12. $ret['template'] = array(
  13. 'type'=>'pages',
  14. 'name'=>'user'
  15. );
  16. $ret['topbar'] = 'back';
  17. if($user = userObj($id)){
  18. $context = array(
  19. 'name'=>$user['name'],
  20. 'email'=>$user['email']
  21. );
  22. if($LOGGEDIN){
  23. $context['key'] = true;
  24. $context['user'] = userObj($_SESSION['username']);
  25. };
  26. $ret['context'] = $context;
  27. }else{
  28. $ret['state'] = array(
  29. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  30. );
  31. }
  32. retj($ret,'User - '.$context['name']);
  33. break;
  34. case 'group':
  35. back(true);
  36. // TODO - handle group requests
  37. if(false){
  38. // TODO
  39. }else{
  40. $ret['state'] = array(
  41. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  42. );
  43. }
  44. retj($ret);
  45. break;
  46. case 'issue':
  47. back(true);
  48. $ret['template'] = array(
  49. 'type'=>'pages',
  50. 'name'=>'issue'
  51. );
  52. if($context = issueObj($id)){
  53. $context['user'] = userObj($context['user']);
  54. if($LOGGEDIN){
  55. $context['key'] = true;
  56. $context['user'] = userObj($_SESSION['username']);
  57. };
  58. $ret['context'] = $context;
  59. }else{
  60. $ret['state'] = array(
  61. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  62. );
  63. }
  64. retj($ret,'Issue #'.$id. ' - '.$context['title']);
  65. break;
  66. case 'scrum':
  67. back(true);
  68. $ret['template'] = array(
  69. 'type'=>'pages',
  70. 'name'=>'scrum'
  71. );
  72. if($context = scrumObj($id)){
  73. $context['user'] = userObj($context['user']);
  74. if($LOGGEDIN){
  75. $context['key'] = true;
  76. $context['user'] = userObj($_SESSION['username']);
  77. };
  78. $ret['context'] = $context;
  79. }else{
  80. $ret['state'] = array(
  81. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  82. );
  83. }
  84. retj($ret,'Scrum - '.$context['title']);
  85. break;
  86. case 'project':
  87. back(true);
  88. $ret['template'] = array(
  89. 'type'=>'pages',
  90. 'name'=>'project'
  91. );
  92. if($context = projectObj($id)){
  93. $context['user'] = userObj($context['user']);
  94. if($LOGGEDIN){
  95. $context['key'] = true;
  96. $context['user'] = userObj($_SESSION['username']);
  97. };
  98. $ret['context'] = $context;
  99. }else{
  100. $ret['state'] = array(
  101. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  102. );
  103. }
  104. retj($ret,'Project - '.$context['title']);
  105. break;
  106. case 'message':
  107. // TODO - handle message requests
  108. $context = array();
  109. if(false){
  110. // TODO
  111. }else{
  112. $ret['state'] = array(
  113. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  114. );
  115. }
  116. retj($ret,'Project - '.$context['title']);
  117. break;
  118. case 'admin':
  119. back(true);
  120. // TODO - handle admin requests
  121. if(false){
  122. // TODO
  123. }else{
  124. $ret['state'] = array(
  125. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  126. );
  127. }
  128. retj($ret);
  129. break;
  130. case 'page':
  131. $title = $id;
  132. if(file_exists(PATH_DATA.'pages/'.$id.'.template')){
  133. $context = array();
  134. $ret['template'] = array(
  135. 'type'=>'pages',
  136. 'name'=>$id
  137. );
  138. if($LOGGEDIN){
  139. $context['key'] = true;
  140. $context['user'] = userObj($_SESSION['username']);
  141. };
  142. if(file_exists(PATH_DATA.'pages/'.$id.'.options')){
  143. $options = objectToarray(json_decode(file_get_contents(PATH_DATA.'pages/'.$id.'.options'),true));
  144. if(isset($options['secure'])&&$options['secure']&&!$LOGGEDIN){
  145. back(true);
  146. }
  147. if(isset($options['title'])){
  148. $title = $options['title'];
  149. }
  150. if(isset($options['topbar'])){
  151. $ret['topbar'] = $options['topbar'];
  152. }
  153. if(isset($options['context'])){
  154. foreach($options['context'] as $key){
  155. switch($key){
  156. case 'users':
  157. if($res = query("SELECT name FROM `users`;")){
  158. $context['users'] = fetch_all($res,MYSQLI_ASSOC);
  159. }
  160. break;
  161. case 'projects':
  162. if($res = query("SELECT p.title,p.id,p.description,u.name as user FROM `projects` p JOIN `users` u ON u.id = p.u_id")){
  163. $context['projects'] = fetch_all($res,MYSQLI_ASSOC);
  164. foreach($context['projects'] as $key => $project){
  165. $context['projects'][$key]['user'] = userObj($project['user']);
  166. }
  167. }
  168. break;
  169. case 'messages':
  170. if($LOGGEDIN){
  171. $context['messages'] = messages($context['user']['id'],'user');
  172. }else{
  173. $context['messages'] = array();
  174. }
  175. break;
  176. case 'issues':
  177. if($res = query("SELECT i.id,i.title,i.description,u.name as user,s.name as status,p.name as priority,p.color FROM `issues` i JOIN `users` u ON u.id = i.u_id LEFT JOIN `statuses` s ON s.id = i.st_id LEFT JOIN `priorities` p ON p.id = i.pr_id")){
  178. $context['issues'] = fetch_all($res,MYSQLI_ASSOC);
  179. foreach($context['issues'] as $key => $issue){
  180. $context['issues'][$key]['user'] = userObj($issue['user']);
  181. }
  182. }
  183. break;
  184. }
  185. }
  186. }
  187. if(isset($options['actions'])){
  188. foreach($options['actions'] as $key){
  189. switch($key){
  190. case 'pm_mark_read':
  191. query("UPDATE `users` SET last_pm_check=CURRENT_TIMESTAMP WHERE id='%d'; ",array(userId($_SESSION['username'])));
  192. break;
  193. }
  194. }
  195. }
  196. }
  197. $ret['context'] = $context;
  198. }else{
  199. $ret['error'] = 'That page does not exist';
  200. $ret['state'] = array(
  201. 'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
  202. );
  203. }
  204. retj($ret,$title);
  205. break;
  206. case 'manifest':
  207. case 'pages':
  208. if(isset($_GET['id'])){
  209. if($_GET['id'] != 'emails'){
  210. $manifest = array();
  211. $files = array_diff(scandir(PATH_DATA.'/'.$_GET['id']),array('..', '.','.htaccess','version'));
  212. foreach($files as $k => $file){
  213. if(pathinfo(PATH_DATA.'/'.$_GET['id'].'/'.$file,PATHINFO_EXTENSION) == 'template'){
  214. array_push($manifest,array(
  215. 'name'=>basename($file,'.template'),
  216. 'hash'=>md5_file(PATH_DATA.'/'.$_GET['id'].'/'.$file)
  217. ));
  218. }
  219. }
  220. retj(array(
  221. 'manifest'=>$manifest,
  222. 'type'=>$_GET['id']
  223. ));
  224. }else{
  225. retj(array(
  226. 'error'=>'Cannot return that manifest'
  227. ));
  228. }
  229. }else{
  230. retj(array(
  231. 'error'=>'Manifest ID not defined'
  232. ));
  233. }
  234. break;
  235. break;
  236. case 'template':
  237. if(isset($_GET['name'])){
  238. if($_GET['id'] != 'emails'){
  239. retj(array(
  240. 'template'=>file_get_contents(PATH_DATA.'/'.$_GET['id'].'/'.$_GET['name'].'.template'),
  241. 'name'=>$_GET['name'],
  242. 'type'=>$_GET['id'],
  243. 'hash'=>md5_file(PATH_DATA.'/'.$_GET['id'].'/'.$_GET['name'].'.template')
  244. ));
  245. }else{
  246. retj(array(
  247. 'error'=>'Cannot return that type of template'
  248. ));
  249. }
  250. }else{
  251. retj(array(
  252. 'error'=>'Template name missing'
  253. ));
  254. }
  255. break;
  256. case 'action':
  257. switch($id){
  258. case 'login':
  259. $ret['state'] = array(
  260. 'data'=>array(
  261. 'type'=>'page',
  262. 'id'=>'login',
  263. )
  264. );
  265. if(isset($_GET['username'])&&isset($_GET['password'])){
  266. $key = login($_GET['username'],$_GET['password']);
  267. if($key){
  268. $_SESSION['username'] = $_GET['username'];
  269. }else{
  270. $ret['error'] = "Login failed. Username or Password didn't match.";
  271. }
  272. }else{
  273. $ret['error'] = "Please provide a valid username and password.";
  274. }
  275. retj($ret,$id);
  276. break;
  277. case 'register':
  278. $ret['state'] = array(
  279. 'data'=>array(
  280. 'type'=>'page',
  281. 'id'=>'register'
  282. )
  283. );
  284. if(is_valid('username')&& strpos($_GET['username'],' ') === false&&is_valid('password')&&is_valid('password1')&&is_valid('email')&&is_valid('captcha')){
  285. if($_GET['password']==$_GET['password1']){
  286. if(compare_captcha($_GET['captcha'])){
  287. if(addUser($_GET['username'],$_GET['password'],$_GET['email'])){
  288. $key = login($_GET['username'],$_GET['password']);
  289. $_SESSION['username'] = $_GET['username'];
  290. sendMail('welcome','Welcome!',$_GET['email'],get('email'),array($_GET['username'],$_GET['password'],get('email')));
  291. }else{
  292. $ret['error'] = "Could not add user. ".$mysqli->error;
  293. }
  294. }else{
  295. $ret['error'] = "Captcha did not match.";
  296. }
  297. }else{
  298. $ret['error'] = "Passwords didn't match.";
  299. }
  300. }else{
  301. $ret['error'] = "Please fill in all the fields.";
  302. }
  303. retj($ret,$id);
  304. break;
  305. case 'project':
  306. back(true);
  307. $ret['state'] = array(
  308. 'data'=>array(
  309. 'type'=>'page',
  310. 'id'=>$id,
  311. )
  312. );
  313. if(isset($_GET['pid'])){
  314. $ret['error'] = 'Invalid Action';
  315. }elseif(is_valid('title')&&is_valid('description')){
  316. if(!newProject($_GET['title'],$_GET['description'])){
  317. $ret['error'] = 'Unable to create project.';
  318. }
  319. }else{
  320. $ret['error'] = 'Fill in all the details.';
  321. }
  322. retj($ret,$id);
  323. break;
  324. case 'issue':
  325. back(true);
  326. $ret['state'] = array(
  327. 'data'=>array(
  328. 'type'=>'page',
  329. 'id'=>$id,
  330. )
  331. );
  332. if(isset($_GET['pid'])){
  333. $ret['error'] = 'Invalid Action';
  334. }elseif(is_valid('title')&&is_valid('description')){
  335. if(!newIssue($_GET['title'],$_GET['description'])){
  336. $ret['error'] = 'Unable to create issue. ';
  337. }
  338. }else{
  339. $ret['error'] = 'Fill in all the details.';
  340. }
  341. retj($ret,$id);
  342. break;
  343. case 'message':
  344. back(true);
  345. if(isset($_GET['to'])&&isset($_GET['message'])){
  346. if($uid = userId($_GET['to'])){
  347. if(!personal_message($uid,$_GET['message'])){
  348. $ret['error'] = 'Could not send message';
  349. }
  350. }else{
  351. $ret['error'] = "That user doesn't exist";
  352. }
  353. }else{
  354. $ret['error'] = 'Empty details';
  355. }
  356. retj($ret,$id);
  357. break;
  358. case 'notifications':
  359. if($LOGGEDIN){
  360. if($res = query("SELECT count(m.id) as notifications,UNIX_TIMESTAMP(max(m.timestamp)) as timestamp FROM `messages` m JOIN `users` u ON u.id = m.to_id WHERE u.id = %d AND u.last_pm_check < m.timestamp;",array(userId($_SESSION['username'])))){
  361. $res = $res->fetch_assoc();
  362. $ret['count'] = $res['notifications'];
  363. $ret['timestamp'] = $res['timestamp'];
  364. }
  365. }
  366. retj($ret,$_GET['title']);
  367. break;
  368. case 'comment':
  369. if(isset($_GET['comment_type'])&&isset($_GET['comment_id'])&&isset($_GET['message'])){
  370. $cid = $_GET['comment_id'];
  371. $ret = array(
  372. 'state'=>stateObj($_GET['comment_type'],$cid)
  373. );
  374. switch($_GET['comment_type']){
  375. case 'project':
  376. if(!function_exists('project_comment')){
  377. $ret['error'] = "fn doesn't exist!";
  378. }
  379. if(!project_comment($cid,$_GET['message'])){
  380. $ret = array(
  381. 'error'=>'Could not comment on project'
  382. );
  383. }
  384. break;
  385. case 'issue':
  386. if(!function_exists('issue_comment')){
  387. $ret['error'] = "fn doesn't exist!";
  388. }
  389. if(!issue_comment($cid,$_GET['message'])){
  390. $ret = array(
  391. 'error'=>'Could not comment on project'
  392. );
  393. }
  394. break;
  395. default:
  396. $ret['error'] = 'Comment type not implemented';
  397. }
  398. }else{
  399. $ret['error'] = 'Missing comment paremeters';
  400. $ret['state'] = array(
  401. 'title'=>'error'
  402. );
  403. }
  404. retj($ret,$ret['state']['title']);
  405. break;
  406. case 'more':
  407. if(isset($_GET['of']) && isset($_GET['pid'])){
  408. $ret = array();
  409. $limit = array(
  410. isset($_GET['at'])?$_GET['at']:0,
  411. isset($_GET['amount'])?$_GET['amount']:10
  412. );
  413. $ret['messages'] = messages($_GET['pid'],$_GET['of'],$limit[0],$limit[1]);
  414. $ret['params'] = array($_GET['pid'],$_GET['of'],$limit[0],$limit[1]);
  415. }else{
  416. $ret['error'] = 'Missing comment parameters';
  417. }
  418. retj($ret);
  419. break;
  420. default:
  421. retj(array(
  422. 'error'=>'Invalid action.'
  423. ));
  424. }
  425. break;
  426. default:
  427. retj(array(
  428. 'error'=>'Invalid type.'
  429. ));
  430. }
  431. }else{
  432. retj(array(
  433. 'error'=>'ID missing.'
  434. ));
  435. }
  436. }else{
  437. $_GET['type'] = '';
  438. retj(array(
  439. 'error'=>'Type missing.'
  440. ));
  441. }
  442. ?>