AccountController.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <?php
  2. namespace app\Controllers;
  3. use app\Exceptions\UnauthenticatedException;
  4. use app\Exceptions\VideoNotFoundException;
  5. use app\Hajeebtok;
  6. use app\Logger;
  7. use app\Types\DatabaseObjects\Account;
  8. use app\Types\DatabaseObjects\Session;
  9. use FFMpeg\FFMpeg;
  10. use Hajeebtok\Types\Exceptions\SecurityFaultException;
  11. use Mimey\MimeTypes;
  12. use Pecee\SimpleRouter\SimpleRouter;
  13. use app\Interfaces\IRouteController;
  14. class AccountController implements IRouteController
  15. {
  16. public static function getToken(): string
  17. {
  18. $username = input("username");
  19. $password = password_hash(input("password"), PASSWORD_DEFAULT);
  20. $account = new Account(
  21. username: $username,
  22. password: $password,
  23. picture_hash: "default",
  24. verified: false
  25. );
  26. if ($account->Exists()) { // Account already exists
  27. $account->Load();
  28. if (password_verify($password, $account->password)) throw new UnauthenticatedException($account->id, 401);
  29. $session = new Session(account_id: $account->id);
  30. } else { // Create a new account
  31. $session = new Session(account_id: $account->Save());
  32. }
  33. return api_json([
  34. "token" => $session->Save(),
  35. "auth_date" => $session->date_authenticated
  36. ]);
  37. }
  38. public static function getAccount($id): string
  39. {
  40. $account = new Account(id: $id);
  41. $account->Load();
  42. return api_json([
  43. "id" => $id,
  44. "username" => $account->username,
  45. "verified" => $account->verified,
  46. "bio" => $account->bio,
  47. "pictureHash" => $account->picture_hash
  48. ]);
  49. }
  50. public static function search(): string
  51. {
  52. $query = input("query");
  53. $account = new Account(username: $query);
  54. $accounts = $account->LoadMany();
  55. return api_json($accounts);
  56. }
  57. public static function getVideos($id): string
  58. {
  59. $account = new Account(id: $id);
  60. $data = Hajeebtok::$Database->Query("SELECT * FROM videos WHERE author_id = :author_id", ["author_id" => $account->id]);
  61. if (empty($data)) throw new VideoNotFoundException(0, 404);
  62. return api_json($data);
  63. }
  64. public static function getPicture($id): string
  65. {
  66. $signedIn = signed_in(request());
  67. if($signedIn) {
  68. $account = new Account(id: $id);
  69. $account->Load();
  70. $picturePath = APP_ROOT . "/usercontent/pictures/$account->picture_hash.png";
  71. } else {
  72. // this is hardcoded because i dont care
  73. $picturePath = APP_ROOT . "/usercontent/pictures/premium_" . rand(1, 57) . ".png";
  74. }
  75. $mimeTypes = new MimeTypes();
  76. $pictureContents = file_get_contents($picturePath);
  77. $pictureSize = filesize($picturePath);
  78. $mime = $mimeTypes->getMimeType(pathinfo($picturePath, PATHINFO_EXTENSION));
  79. $response = response();
  80. $response->header("Content-Type: $mime");
  81. $response->header("Content-Length: $pictureSize");
  82. $response->header("Cache-Control: max-age=3600, public");
  83. return $pictureContents;
  84. }
  85. public static function getAvailablePremiumProfilePictures(): string
  86. {
  87. $pictures = [];
  88. for ($i = 1; $i <= 57; $i++) {
  89. $pictures[] = $i;
  90. }
  91. return api_json($pictures);
  92. }
  93. public static function getPremiumProfilePicture($id): string
  94. {
  95. $picturePath = APP_ROOT . "/usercontent/pictures/premium_$id.png";
  96. $mimeTypes = new MimeTypes();
  97. $pictureContents = file_get_contents($picturePath);
  98. $pictureSize = filesize($picturePath);
  99. $mime = $mimeTypes->getMimeType(pathinfo($picturePath, PATHINFO_EXTENSION));
  100. $response = response();
  101. $response->header("Content-Type: $mime");
  102. $response->header("Content-Length: $pictureSize");
  103. $response->header("Cache-Control: max-age=3600, public");
  104. return $pictureContents;
  105. }
  106. public static function updateAccount(): string
  107. {
  108. if(!signed_in(request())) throw new UnauthenticatedException(0, 401);
  109. $id = get_token_id(request());
  110. $picture_hash = input("picture_hash");
  111. $picture = request()->getInputHandler()->file("picture");
  112. $bio = input("bio");
  113. if(empty($picture) && !empty($picture_hash)) {
  114. $validPictureHashList = [
  115. "default",
  116. "premium_1",
  117. "premium_2",
  118. "premium_3",
  119. "premium_4",
  120. "premium_5",
  121. "premium_6",
  122. "premium_7",
  123. "premium_8",
  124. "premium_9",
  125. "premium_10",
  126. "premium_11",
  127. "premium_12",
  128. "premium_13",
  129. "premium_14",
  130. "premium_15",
  131. "premium_16",
  132. "premium_17",
  133. "premium_18",
  134. "premium_19",
  135. "premium_20",
  136. "premium_21",
  137. "premium_22",
  138. "premium_23",
  139. "premium_24",
  140. "premium_25",
  141. "premium_26",
  142. "premium_27",
  143. "premium_28",
  144. "premium_29",
  145. "premium_30",
  146. "premium_31",
  147. "premium_32",
  148. "premium_33",
  149. "premium_34",
  150. "premium_35",
  151. "premium_36",
  152. "premium_37",
  153. "premium_38",
  154. "premium_39",
  155. "premium_40",
  156. "premium_41",
  157. "premium_42",
  158. "premium_43",
  159. "premium_44",
  160. "premium_45",
  161. "premium_46",
  162. "premium_47",
  163. "premium_48",
  164. "premium_49",
  165. "premium_50",
  166. "premium_51",
  167. "premium_52",
  168. "premium_53",
  169. "premium_54",
  170. "premium_55",
  171. "premium_56",
  172. "premium_57"
  173. ];
  174. if(!in_array($picture_hash, $validPictureHashList)) throw new SecurityFaultException("Attempt to path trace on /update endpoint.",400);
  175. } else if (!empty($picture) && empty($picture_hash)) {
  176. $picture_hash = hash("sha256", $picture);
  177. $picturePath = APP_ROOT . "/usercontent/pictures/$picture_hash.png";
  178. imagepng(imagecreatefromstring(file_get_contents($picture), $picturePath)); // save image
  179. }
  180. $old_account = new Account(id: $id);
  181. $old_account->Load();
  182. $new_account = new Account(
  183. id: $id,
  184. username: $old_account->username,
  185. password: $old_account->password,
  186. picture_hash: $picture_hash ?? $old_account->picture_hash,
  187. verified: $old_account->verified,
  188. bio: $bio ?? $old_account->bio,
  189. );
  190. $new_account->Update();
  191. return api_json([
  192. "id" => $new_account->id,
  193. "username" => $new_account->username,
  194. "pictureHash" => $new_account->picture_hash,
  195. "bio" => $new_account->bio,
  196. "verified" => $new_account->verified,
  197. ]);
  198. }
  199. // todo turn this into middleware
  200. public static function corsBullshit() {
  201. $response = response();
  202. $response->header("Access-Control-Allow-Origin: *");
  203. $response->header("Access-Control-Allow-Headers: Authorization, Content-Type");
  204. }
  205. public static function RegisterRoutes(): void
  206. {
  207. SimpleRouter::group([
  208. "prefix" => "/account/",
  209. ], function () {
  210. SimpleRouter::get("/{id}/get", [AccountController::class, "getAccount"]);
  211. SimpleRouter::get("/{id}/videos", [AccountController::class, "getVideos"]);
  212. SimpleRouter::get("/{id}/picture", [AccountController::class, "getPicture"]);
  213. SimpleRouter::post("/token", [AccountController::class, "getToken"]);
  214. SimpleRouter::post("/search", [AccountController::class, "search"]);
  215. SimpleRouter::post("/update", [AccountController::class, "updateAccount"]);
  216. SimpleRouter::options("/update", [AccountController::class, "corsBullshit"]);
  217. SimpleRouter::get("/availablePremiumProfilePictures", [AccountController::class, "getAvailablePremiumProfilePictures"]);
  218. SimpleRouter::get("/getPremiumProfilePicture/{id}", [AccountController::class, "getPremiumProfilePicture"]);
  219. });
  220. }
  221. }