PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/api/rest/user.php

https://gitlab.com/x33n/respond
PHP | 668 lines | 359 code | 168 blank | 141 comment | 48 complexity | be096f2116acef33d8f819c5df740a47 MD5 | raw file
  1. <?php
  2. /**
  3. * A protected API call to login a user
  4. * @uri /user/login
  5. */
  6. class UserLoginResource extends Tonic\Resource {
  7. /**
  8. * @method POST
  9. */
  10. function login() {
  11. // parse request
  12. parse_str($this->request->data, $request);
  13. $email = $request['email'];
  14. $password = $request['password'];
  15. // get site
  16. $site = null;
  17. $first_login = false;
  18. if(isset($request['friendlyId'])){
  19. $friendlyId = $request['friendlyId'];
  20. // get site by its friendly id
  21. $site = Site::GetByFriendlyId($friendlyId);
  22. }
  23. else if(isset($request['siteId'])){
  24. $siteId = $request['siteId'];
  25. // get site by its friendly id
  26. $site = Site::GetBySiteId($siteId);
  27. }
  28. else{
  29. // return an unauthorized exception (401)
  30. $response = new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  31. $response->body = 'Access denied';
  32. return $response;
  33. }
  34. // set first_login if the last login is null
  35. if($site['LastLogin'] == NULL){
  36. $first_login = true;
  37. }
  38. // get the user from the credentials
  39. $user = User::GetByEmailPassword($email, $site['SiteId'], $password);
  40. // determine if the user is authorized
  41. $is_auth = false;
  42. // permissions
  43. $canEdit = '';
  44. $canPublish = '';
  45. $canRemove = '';
  46. $canCreate = '';
  47. $canView = '';
  48. if($user!=null){
  49. if($user['Role'] == 'Admin'){
  50. $is_auth = true;
  51. $canEdit = 'All';
  52. $canPublish = 'All';
  53. $canRemove = 'All';
  54. $canCreate = 'All';
  55. $canView= 'All';
  56. }
  57. else if($user['Role'] == 'Contributor'){
  58. $is_auth = true;
  59. $canEdit = 'All';
  60. $canPublish = '';
  61. $canRemove = '';
  62. $canCreate = '';
  63. $canView= 'All';
  64. }
  65. else if($user['Role'] == 'Member'){
  66. $is_auth = true;
  67. $canEdit = '';
  68. $canPublish = '';
  69. $canRemove = '';
  70. $canCreate = '';
  71. $canView= 'All';
  72. }
  73. else{
  74. // try to get a role by its name
  75. $role = Role::GetByName($user['Role'], $user['SiteId']);
  76. if($role!=null){
  77. $canEdit = trim($role['CanEdit']);
  78. $canPublish = trim($role['CanPublish']);
  79. $canRemove = trim($role['CanRemove']);
  80. $canCreate = trim($role['CanCreate']);
  81. $canView = trim($role['CanView']);
  82. }
  83. else{
  84. $is_auth = false;
  85. }
  86. }
  87. }
  88. else{
  89. // return an unauthorized exception (401)
  90. $response = new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  91. $response->body = 'Access denied';
  92. return $response;
  93. }
  94. // login if authorized
  95. if($is_auth = true){
  96. try{
  97. $fullPhotoUrl = '';
  98. // set photo url
  99. if($user['PhotoUrl'] != '' && $user['PhotoUrl'] != NULL){
  100. // build the full URL for the photo
  101. $site = Site::GetBySiteId($user['SiteId']);
  102. // set images URL
  103. if(FILES_ON_S3 == true){
  104. $bucket = $site['Bucket'];
  105. $imagesURL = str_replace('{{bucket}}', $bucket, S3_URL);
  106. $imagesURL = str_replace('{{site}}', $site['FriendlyId'], $imagesURL);
  107. }
  108. else{
  109. $imagesURL = $site['Domain'];
  110. }
  111. $fullPhotoUrl = $imagesURL.'/files/thumbs/'.$user['PhotoUrl'];
  112. }
  113. // set last login
  114. Site::SetLastLogin($user['SiteId']);
  115. // return a subset of the user array
  116. $returned_user = array(
  117. 'Email' => $user['Email'],
  118. 'FirstName' => $user['FirstName'],
  119. 'LastName' => $user['LastName'],
  120. 'PhotoUrl' => $user['PhotoUrl'],
  121. 'FullPhotoUrl' => $fullPhotoUrl,
  122. 'Language' => $user['Language'],
  123. 'Role' => $user['Role'],
  124. 'SiteAdmin' => $user['SiteAdmin'],
  125. 'SiteId' => $user['SiteId'],
  126. 'UserId' => $user['UserId'],
  127. 'CanEdit' => $canEdit,
  128. 'CanPublish' => $canPublish,
  129. 'CanRemove' => $canRemove,
  130. 'CanCreate' => $canCreate,
  131. 'CanView' => $canView
  132. );
  133. // send token
  134. $params = array(
  135. 'start' => START_PAGE,
  136. 'user' => $returned_user,
  137. 'firstLogin' => $first_login,
  138. 'token' => Utilities::CreateJWTToken($user['UserId'], $user['SiteId'])
  139. );
  140. // return a json response
  141. $response = new Tonic\Response(Tonic\Response::OK);
  142. $response->contentType = 'application/json';
  143. $response->body = json_encode($params);
  144. }
  145. catch (Exception $e) {
  146. $response = new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  147. $response->body = $e->getMessage();
  148. return $response;
  149. }
  150. return $response;
  151. }
  152. else{
  153. // return an unauthorized exception (401)
  154. $response = new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  155. $response->body = 'Access denied';
  156. return $response;
  157. }
  158. }
  159. }
  160. /**
  161. * A protected API call to send an email if you forgot your password
  162. * @uri /user/forgot
  163. */
  164. class UserForgotResource extends Tonic\Resource {
  165. /**
  166. * @method POST
  167. */
  168. function post() {
  169. // parse request
  170. parse_str($this->request->data, $request);
  171. $email = $request['email'];
  172. $friendlyId = $request['friendlyId'];
  173. // get site
  174. $site = Site::GetByFriendlyId($friendlyId);
  175. // get user
  176. $user = User::GetByEmail($email, $site['SiteId']);
  177. // send email
  178. if($user!=null){
  179. // set token
  180. $token = urlencode(User::SetToken($user['UserId']));
  181. // send email
  182. $to = $email;
  183. $from = REPLY_TO;
  184. $fromName = REPLY_TO_NAME;
  185. $subject = BRAND.': Reset Password';
  186. $file = APP_LOCATION.'/emails/reset-password.html';
  187. // create strings to replace
  188. $resetUrl = APP_URL.'/#/reset/'.$site['FriendlyId'].'/'.$token;
  189. $replace = array(
  190. '{{brand}}' => BRAND,
  191. '{{reply-to}}' => REPLY_TO,
  192. '{{reset-url}}' => $resetUrl
  193. );
  194. // send email from file
  195. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  196. // return a successful response (200)
  197. return new Tonic\Response(Tonic\Response::OK);
  198. }
  199. else{
  200. // return an unauthorized exception (401)
  201. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  202. }
  203. }
  204. }
  205. /**
  206. * A protected API call to reset a user's password
  207. * @uri /user/reset
  208. */
  209. class UserResetResource extends Tonic\Resource {
  210. /**
  211. * @method POST
  212. */
  213. function post() {
  214. // parse request
  215. parse_str($this->request->data, $request);
  216. $token = $request['token'];
  217. $password = $request['password'];
  218. $friendlyId = $request['friendlyId'];
  219. // get site
  220. $site = Site::GetByFriendlyId($friendlyId);
  221. // get the user from the credentials
  222. $user = User::GetByToken($token, $site['SiteId']);
  223. if($user!=null){
  224. User::EditPassword($user['UserId'], $password);
  225. // return a successful response (200)
  226. return new Tonic\Response(Tonic\Response::OK);
  227. }
  228. else{
  229. // return a bad request
  230. return new Tonic\Response(Tonic\Response::BADREQUEST);
  231. }
  232. }
  233. }
  234. /**
  235. * A protected API call to add a user
  236. * @uri /user/add
  237. */
  238. class UserAddResource extends Tonic\Resource {
  239. /**
  240. * @method POST
  241. */
  242. function post() {
  243. // get token
  244. $token = Utilities::ValidateJWTToken(apache_request_headers());
  245. // check if token is not null
  246. if($token != NULL){
  247. parse_str($this->request->data, $request); // parse request
  248. $email = $request['email'];
  249. $password = $request['password'];
  250. $firstName = $request['firstName'];
  251. $lastName = $request['lastName'];
  252. $role = $request['role'];
  253. $language = $request['language'];
  254. $isActive = $request['isActive'];
  255. $user = User::Add($email, $password, $firstName, $lastName, $role, $language, $isActive, $token->SiteId);
  256. // return a json response
  257. $response = new Tonic\Response(Tonic\Response::OK);
  258. $response->contentType = 'application/json';
  259. $response->body = json_encode($user);
  260. return $response;
  261. } else{ // unauthorized access
  262. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  263. }
  264. }
  265. }
  266. /**
  267. * A protected API call to add a user
  268. * @uri /user/add/member
  269. */
  270. class UserAddMemberResource extends Tonic\Resource {
  271. /**
  272. * @method POST
  273. */
  274. function post() {
  275. parse_str($this->request->data, $request); // parse request
  276. $siteId = $request['siteId'];
  277. $email = $request['email'];
  278. $password = $request['password'];
  279. $firstName = $request['firstName'];
  280. $lastName = $request['lastName'];
  281. $role = 'Member';
  282. // get a reference to the site
  283. $site = Site::GetBySiteId($siteId);
  284. // set default language
  285. $language = $site['Language'];
  286. $isActive = 0;
  287. $user = User::Add($email, $password, $firstName, $lastName, $role, $language, $isActive, $siteId);
  288. // send welcome email
  289. $subject = SITE_WELCOME_EMAIL_SUBJECT;
  290. $subject = str_replace('{{site}}', $site['Name'], $subject);
  291. $content = $site['WelcomeEmail'];
  292. // send site email
  293. Utilities::SendSiteEmail($site, $email, $site['PrimaryEmail'], $site['Name'], $subject, $content);
  294. // return a json response
  295. $response = new Tonic\Response(Tonic\Response::OK);
  296. $response->contentType = 'application/json';
  297. $response->body = json_encode($user);
  298. return $response;
  299. }
  300. }
  301. /**
  302. * A protected API call to get the current user
  303. * @uri /user/current
  304. */
  305. class UserCurrentResource extends Tonic\Resource {
  306. /**
  307. * @method GET
  308. */
  309. function get() {
  310. // get token
  311. $token = Utilities::ValidateJWTToken(apache_request_headers());
  312. // check if token is not null
  313. if($token != NULL){
  314. $user = User::GetByUserId($token->UserId);
  315. // return a json response
  316. $response = new Tonic\Response(Tonic\Response::OK);
  317. $response->contentType = 'application/json';
  318. $response->body = json_encode($user);
  319. return $response;
  320. }
  321. else{
  322. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  323. }
  324. }
  325. }
  326. /**
  327. * A protected API call to add a user
  328. * @uri /user/photo
  329. */
  330. class UserPhotoResource extends Tonic\Resource {
  331. /**
  332. * @method POST
  333. */
  334. function add() {
  335. // get token
  336. $token = Utilities::ValidateJWTToken(apache_request_headers());
  337. // check if token is not null
  338. if($token != NULL){
  339. parse_str($this->request->data, $request); // parse request
  340. $userId = $request['userId'];
  341. $photoUrl = $request['photoUrl'];
  342. $user = User::EditPhoto($userId, $photoUrl);
  343. // build full photo url
  344. $site = Site::GetBySiteId($token->SiteId);
  345. // set images URL
  346. if(FILES_ON_S3 == true){
  347. $bucket = $site['Bucket'];
  348. $imagesURL = str_replace('{{bucket}}', $bucket, S3_URL);
  349. $imagesURL = str_replace('{{site}}', $site['FriendlyId'], $imagesURL);
  350. }
  351. else{
  352. $imagesURL = $site['Domain'];
  353. }
  354. $fullPhotoUrl = $imagesURL.'/files/thumbs/'.$photoUrl;
  355. // return a json response
  356. $response = new Tonic\Response(Tonic\Response::OK);
  357. $response->contentType = 'text/html';
  358. $response->body = $fullPhotoUrl;
  359. return $response;
  360. } else{ // unauthorized access
  361. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  362. }
  363. }
  364. }
  365. /**
  366. * A protected API call to edit, delete an existing user
  367. * @uri /user/retrieve
  368. */
  369. class UserRetrieveResource extends Tonic\Resource {
  370. /**
  371. * @method POST
  372. */
  373. function post() {
  374. // get token
  375. $token = Utilities::ValidateJWTToken(apache_request_headers());
  376. // check if token is not null
  377. if($token != NULL){
  378. parse_str($this->request->data, $request); // parse request
  379. $userId = $request['userId'];
  380. $user = User::GetByUserId($userId);
  381. // return a json response
  382. $response = new Tonic\Response(Tonic\Response::OK);
  383. $response->contentType = 'application/json';
  384. $response->body = json_encode($user);
  385. return $response;
  386. }
  387. else{
  388. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  389. }
  390. }
  391. }
  392. /**
  393. * A protected API call to edit, delete an existing user
  394. * @uri /user/edit
  395. */
  396. class UserEditResource extends Tonic\Resource {
  397. /**
  398. * @method POST
  399. */
  400. function post() {
  401. // get token
  402. $token = Utilities::ValidateJWTToken(apache_request_headers());
  403. // check if token is not null
  404. if($token != NULL){
  405. parse_str($this->request->data, $request); // parse request
  406. $userId = $request['userId'];
  407. $email = $request['email'];
  408. $password = $request['password'];
  409. $firstName = $request['firstName'];
  410. $lastName = $request['lastName'];
  411. $language = $request['language'];
  412. if(isset($request['isActive'])){
  413. $isActive = $request['isActive'];
  414. }
  415. if(isset($request['role'])){
  416. $role = $request['role'];
  417. User::Edit($userId, $email, $password, $firstName, $lastName, $role, $language, $isActive);
  418. }
  419. else{
  420. User::EditProfile($userId, $email, $password, $firstName, $lastName, $language);
  421. }
  422. return new Tonic\Response(Tonic\Response::OK);
  423. } else{ // unauthorized access
  424. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  425. }
  426. }
  427. }
  428. /**
  429. * A protected API call to edit, delete an existing user
  430. * @uri /user/remove
  431. */
  432. class UserRemoveResource extends Tonic\Resource {
  433. /**
  434. * @method POST
  435. */
  436. function post() {
  437. // get token
  438. $token = Utilities::ValidateJWTToken(apache_request_headers());
  439. // check if token is not null
  440. if($token != NULL){
  441. parse_str($this->request->data, $request); // parse request
  442. $userId = $request['userId'];
  443. User::Remove($userId);
  444. return new Tonic\Response(Tonic\Response::OK);
  445. }
  446. else{
  447. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  448. }
  449. }
  450. }
  451. /**
  452. * A protected API call that shows all pages
  453. * @uri /user/list
  454. */
  455. class UserList extends Tonic\Resource {
  456. /**
  457. * @method GET
  458. */
  459. function get() {
  460. // get token
  461. $token = Utilities::ValidateJWTToken(apache_request_headers());
  462. // check if token is not null
  463. if($token != NULL){
  464. // get users
  465. $list = User::GetUsersForSite($token->SiteId, true);
  466. $site = Site::GetBySiteId($token->SiteId);
  467. $updated_list = array();
  468. //print each file name
  469. foreach($list as $user){
  470. $hasPhoto = false;
  471. $fullPhotoUrl = '';
  472. if($user['PhotoUrl'] != '' && $user['PhotoUrl'] != ''){
  473. $hasPhoto = true;
  474. // set images URL
  475. if(FILES_ON_S3 == true){
  476. $bucket = $site['Bucket'];
  477. $imagesURL = str_replace('{{bucket}}', $bucket, S3_URL);
  478. $imagesURL = str_replace('{{site}}', $site['FriendlyId'], $imagesURL);
  479. }
  480. else{
  481. $imagesURL = $site['Domain'];
  482. }
  483. $fullPhotoUrl = $imagesURL.'/files/thumbs/'.$user['PhotoUrl'];
  484. }
  485. $user['HasPhoto'] = $hasPhoto;
  486. $user['FullPhotoUrl'] = $fullPhotoUrl;
  487. array_push($updated_list, $user);
  488. }
  489. // return a json response
  490. $response = new Tonic\Response(Tonic\Response::OK);
  491. $response->contentType = 'application/json';
  492. $response->body = json_encode($updated_list);
  493. return $response;
  494. }
  495. else{ // unauthorized access
  496. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  497. }
  498. }
  499. }
  500. ?>