PageRenderTime 58ms CodeModel.GetById 32ms RepoModel.GetById 1ms app.codeStats 0ms

/includes/util.php

https://bitbucket.org/dt167glabgroup3/part2
PHP | 326 lines | 251 code | 45 blank | 30 comment | 48 complexity | 82e47cc04e5388e2869a4de630fabfd0 MD5 | raw file
  1. <?php
  2. /*******************************************************************************
  3. * Projekt, Kurs: DT16/G
  4. * File: util.php
  5. * Desc: Util file for Projekt
  6. *
  7. * erho0903
  8. ******************************************************************************/
  9. // GENERAL FUNCTIONS HERE -----------------------------------------------------------------
  10. function login($name, $pass){
  11. $db = Database_read::getInstance();
  12. if($db->countRow("member","name",$name) == 1){
  13. $user = ($db->getRow("member","name",$name))[0];
  14. $user_id = $user["id"];
  15. $db_password = $user["password"];
  16. // If user exists, check login-status. You are only allowerd 5 login-attempts in 30 minutes.
  17. if(!validateLogin($user_id)){
  18. return "Account Locked out! Try again later.";
  19. }
  20. else{
  21. // Check password
  22. if(password_verify($pass,$db_password)){
  23. // If password is correct. Set session variables.
  24. $_SESSION["user"] = serialize($user);
  25. $_SESSION["user_id"] = $user_id;
  26. $_SESSION['timestamp'] = time();
  27. return false; // returning flase when everything is ok, else text of error
  28. }
  29. else{
  30. // If the password is wrong, insert the user-id and login-time in the database.
  31. logfile("wrongpassword",$user_id);
  32. return "Wrong username or password"; // Same error message as wrong name
  33. }
  34. }
  35. }
  36. else {
  37. // If the user doesn't exist in database!
  38. return "Wrong username or password"; // Same error message as wrong password
  39. }
  40. }
  41. // Check login attempts from the past 30 minutes
  42. function validateLogin($user_id){
  43. $db = Database_read::getInstance();
  44. $badLogins = $db->getRow("logs",array("event","result"),array("wrongpassword",$user_id),"stamp",5,"stamp","DESC");
  45. // If Total bad logins are below 5
  46. if(count($badLogins) < 5){
  47. return true;
  48. }else{
  49. $badLogin = $badLogins[4]["stamp"]; // the 5th bad login, (2018-05-23 13:13:0)
  50. $badTime = strtotime($badLogin);
  51. $valid_logins = time() - (60*30); // for 30 minutes (60*30)
  52. if($badTime > $valid_logins){
  53. return false;
  54. }else{
  55. return true;
  56. }
  57. }
  58. }
  59. function logout(){
  60. // Unset all of the session variables.
  61. $_SESSION = array();
  62. if (ini_get("session.use_cookies")) {
  63. $params = session_get_cookie_params();
  64. setcookie(session_name(), '', time() - 42000,
  65. $params["path"], $params["domain"],
  66. $params["secure"], $params["httponly"]
  67. );
  68. }
  69. // Destroy the session.
  70. session_destroy();
  71. }
  72. function addNewMember($name, $phone, $password)
  73. {
  74. $db = database_admin::getInstance();
  75. if($db->insertRow("member", array("name", "phone" ,"password"), array($name, $phone , $password))){
  76. return false; // no errors
  77. }else{
  78. return "Database error.";
  79. }
  80. }
  81. function checkNewMember($name){
  82. $db = database_read::getInstance();
  83. $result = $db->getRow("member", "name", $name);
  84. if(!$result){ //not already exist
  85. return false;
  86. }
  87. else
  88. {
  89. return "Name already in use!";
  90. }
  91. }
  92. function getUserInfo($name)
  93. {
  94. $db = database_read::getInstance();
  95. $result = $db->getRow("member", "name", $name);
  96. if($result){ //not already exist
  97. return $result;
  98. }
  99. else
  100. {
  101. return "Database error!";
  102. }
  103. }
  104. // returns false if valid, else text of whats wrong
  105. // note: only one error will be found and returned, even if there are many
  106. function checkPassword($pass){
  107. $settings = config::getInstance();
  108. if(strlen($pass) < $settings->passGetMax()){
  109. if(strlen($pass) >= $settings->passGetMin()){
  110. $commonPwArray = file("includes/Top10k-probable.txt");
  111. if(!in_array($pass, $commonPwArray)){
  112. if (preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-!.]/', $pass) || !$settings->passSpecialNeeded()){
  113. if (preg_match('/[abcdefghijklmnopqrstuvxyzåäö]/', $pass) || !$settings->passLowerNeeded()){
  114. if (preg_match('/[ABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ]/', $pass) || !$settings->passUpperNeeded()){
  115. return false; // password is ok
  116. }
  117. }
  118. }
  119. }
  120. }
  121. }
  122. // The password didn't pass the tests
  123. return "Password not saved. Check requirements.";
  124. }
  125. // log an event, maybe logfile("User creation","Successful creation");
  126. function logfile($event,$value){
  127. $db = Database_write::getInstance();
  128. return $db->insertRow("logs",array("event","result"),array($event,$value));
  129. }
  130. function clean($var) {
  131. $var = strip_tags($var);
  132. $var = preg_replace('/[^A-Öa-ö0-9\. -]@/', '', $var);
  133. $var = preg_replace('/ */', ' ', $var);
  134. return htmlspecialchars($var);
  135. }
  136. // Functions for message system
  137. function uploadMessage($message,$userId){
  138. $db = Database_write::getInstance();
  139. if(!($db->insertRow("messages",array("member","message"),array($userId,$message)))){
  140. return "Error uploading message";
  141. }else{
  142. return false; // can add a upladed ok message here
  143. }
  144. }
  145. function deleteMessage($messageId,$userId){
  146. $db = Database_admin::getInstance();
  147. $message = $db->getrow("messages","id",$messageId);
  148. if($message){
  149. $messageOwner = $message[0]["member"];
  150. if($messageOwner == $userId){
  151. return $db->deleteRow("messages","id",$messageId);
  152. }else{
  153. return false; // user not same as owner, dont delete.
  154. }
  155. }else{
  156. return false; // invalid ID
  157. }
  158. }
  159. function downvoteMessage($messageId,$userId){
  160. voteMessage($messageId,$userId,0);
  161. }
  162. function upvoteMessage($messageId,$userId){
  163. voteMessage($messageId,$userId,1);
  164. }
  165. function voteMessage($messageId,$userId,$vote){
  166. $db = Database_read::getInstance();
  167. $message = $db->getRow("messages","id",$messageId);
  168. if($message){ // check message exists
  169. if($message[0]["member"] != $userId){ // never vote on your own post
  170. if(0 == $db->countRow("vote",array("post","member"),array($messageId,$userId))){ // not voted on this one before
  171. $dbWrite = Database_write::getInstance();
  172. $dbWrite->insertRow("vote",array("member","post","type"),array($userId,$messageId,$vote));
  173. }
  174. }
  175. }
  176. }
  177. function getMessages($wordSearch,$memberSearch,$orderSearch,$firstSearch){
  178. $newMessageArray = array();
  179. $db = Database_read::getInstance();
  180. if($firstSearch == "asc"){
  181. $fallOrder = "ASC";
  182. }else{
  183. $fallOrder = "DESC";
  184. }
  185. if(!is_null($memberSearch)){
  186. $user = $db->getRow("member","name",$memberSearch,"id",1);
  187. if($user){
  188. $messages = $db->getRow("messages","member",$user[0]["id"],"*",999,"stamp",$fallOrder);
  189. }else{
  190. //user dont exist
  191. return array();
  192. }
  193. }
  194. else{
  195. $messages = $db->getRow("messages",false,false,"*",999,"stamp",$fallOrder);
  196. if(!$messages){
  197. return array(); // no hits, return empty array
  198. }
  199. }
  200. if($messages && count($messages)>0){
  201. if(!is_null($wordSearch)){
  202. //filter on that word
  203. foreach ($messages as $key => $value){
  204. if(stripos($value["message"],$wordSearch) === false){
  205. unset($messages[$key]);
  206. }
  207. }
  208. }
  209. // Add the votes for each post to the array
  210. foreach ($messages as $key => $value){
  211. $positive = $db->countRow("vote",array("post","type"),array($value["id"],1));
  212. $negative = $db->countRow("vote",array("post","type"),array($value["id"],0));
  213. array_push($newMessageArray,array($value,$positive,$negative));
  214. }
  215. if($orderSearch == "score"){
  216. //sort on score
  217. usort($newMessageArray, function($a, $b) {
  218. return ($b[1]-$b[2]) - ($a[1]-$a[2]);
  219. });
  220. }
  221. //flip if needed
  222. if($firstSearch == "asc"){
  223. $newMessageArray = array_reverse($newMessageArray);
  224. }
  225. }
  226. return $newMessageArray;
  227. }
  228. function resetAvailable(){
  229. $db = Database_read::getInstance();
  230. $pass = false; // passing the test, start as false
  231. // If Total bad reset codes are below 5
  232. $badResets = $db->getRow("logs",array("event","result"),array("ResetpassBadCode",$_SERVER['REMOTE_ADDR']),"stamp",5,"stamp","DESC");
  233. if(count($badResets) < 5){
  234. $pass = true;
  235. }else{
  236. $badReset = $badResets[4]["stamp"]; // the 5th bad login, (2018-05-23 13:13:0)
  237. $badTime = strtotime($badReset);
  238. $valid_logs = time() - (60*30); // for 30 minutes (60*30)
  239. if($badTime > $valid_logs){
  240. $pass = false;
  241. }else{
  242. $pass = true;
  243. }
  244. }
  245. if($pass){
  246. // If Total bad reset on wrong phone/account are below 5
  247. $badResets = $db->getRow("logs",array("event","result"),array("ResetpassNotFound",$_SERVER['REMOTE_ADDR']),"stamp",5,"stamp","DESC");
  248. if(count($badResets) < 5){
  249. $pass = true;
  250. }else{
  251. $badReset = $badResets[4]["stamp"]; // the 5th bad login, (2018-05-23 13:13:0)
  252. $badTime = strtotime($badReset);
  253. $valid_logs = time() - (60*30); // for 30 minutes (60*30)
  254. if($badTime > $valid_logs){
  255. $pass = false;
  256. }else{
  257. $pass = true;
  258. }
  259. }
  260. }
  261. return $pass;
  262. }
  263. // Function to make random code
  264. function randomCode($lenght) {
  265. $alphabet = "abcdefghijkmnopqrstuwxyzABCDEFGHIJKMNOPQRSTUWXYZ0123456789";
  266. $pass = array();
  267. $alphaLength = strlen($alphabet) - 1;
  268. for ($i = 0; $i < $lenght; $i++) {
  269. $n = rand(0, $alphaLength);
  270. $pass[] = $alphabet[$n];
  271. }
  272. return implode($pass);
  273. }
  274. function killItWithFire(){
  275. $SESSION_["user_id"] = null;
  276. $SESSION_["user"] = null;
  277. $_SESSION['timestamp'] = null;
  278. session_unset();
  279. session_destroy();
  280. }
  281. ?>