From 62a2b32c959154274aa71c8c312801da0f642f1a Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 12:12:48 +0100 Subject: [PATCH 01/26] Changed Alerts to Exceptions. --- website/public/settings.php | 39 ++++++----- website/queries/settings.php | 112 ++++++++++++++++---------------- website/views/settings-view.php | 4 +- 3 files changed, 82 insertions(+), 73 deletions(-) diff --git a/website/public/settings.php b/website/public/settings.php index b473f99..41affe6 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -12,23 +12,30 @@ getClass(); + $alertMessage = $w->getMessage(); } } include("../views/main.php"); diff --git a/website/queries/settings.php b/website/queries/settings.php index 1a5dacf..ef718a3 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -1,35 +1,34 @@ message = $message; - switch ($type) { - case "happy": - $this->class = "settings-message-happy"; - break; - case "angry": - $this->class = "settings-message-angry"; - break; - default: - $this->class = "settings-message"; - break; - } + abstract public function getClass(); +} + +class HappyWarning extends SettingsWarning { + + public function __construct($message = "Gelukt!", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); } public function getClass() { - return $this->class; + return "settings-message-happy"; + } +} + +class AngryWarning extends SettingsWarning { + public function __construct($message = "Er is iets fout gegaan.", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); } - public function getMessage() { - return $this->message; + public function getClass() { + return "settings-message-angry"; } } @@ -94,24 +93,19 @@ function updateSettings() { $stmt->bindValue(":bio", test_input($_POST["bio"])); $stmt->bindValue(":userID", $_SESSION["userID"]); $stmt->execute(); - - return new settingsMessage("happy", "Instellingen zijn opgeslagen."); + throw new HappyWarning("Instellingen zijn opgeslagen."); } function changePassword() { $user = getPasswordHash(); if (password_verify($_POST["password-old"], $user["password"])) { if ($_POST["password-new"] == $_POST["password-confirm"] && (strlen($_POST["password-new"]) >= 8)) { - if (doChangePassword()) { - return new settingsMessage("happy", "Wachtwoord gewijzigd."); - } else { - return new settingsMessage("angry", "Er is iets mis gegaan."); - } + doChangePassword(); } else { - return new settingsMessage("angry", "Wachtwoorden komen niet oveen."); + throw new AngryWarning("Wachtwoorden komen niet overeen."); } } else { - return new settingsMessage("angry", "Oud wachtwoord niet correct."); + throw new AngryWarning("Oud wachtwoord niet correct."); } } @@ -129,7 +123,12 @@ function doChangePassword() { $stmt->bindParam(":new_password", $hashed_password); $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); - return $stmt->rowCount(); + + if ($stmt->rowCount()) { + throw new HappyWarning("Wachtwoord gewijzigd."); + } else { + throw new AngryWarning(); + } } function changeEmail() { @@ -138,20 +137,13 @@ function changeEmail() { $email = strtolower($_POST["email"]); if (filter_var($email, FILTER_VALIDATE_EMAIL)) { //check if email exists - if (emailIsAvailableInDatabase($email)) { - if (doChangeEmail($email)) { - return new settingsMessage("happy", "Emailadres is veranderd."); - } else { - return new settingsMessage("angry", "Er is iets mis gegaan."); - } - } else { - return new settingsMessage("angry", "Emailadres bestaat al."); - } + emailIsAvailableInDatabase($email); + doChangeEmail($email); } else { - return new settingsMessage("angry", "Geef een geldig emailadres."); + throw new AngryWarning("Geef een geldig emailadres"); } } else { - return new settingsMessage("angry", "Emailadressen komen niet overeen."); + throw new AngryWarning("Emailadressen komen niet overeen."); } } @@ -167,7 +159,9 @@ function emailIsAvailableInDatabase($email) { $stmt->bindParam(":email", $email); $stmt->execute(); - return !$stmt->rowCount(); + if ($stmt->rowCount()) { + throw new AngryWarning("Emailadres wordt al gebruikt."); + } } function doChangeEmail($email) { @@ -182,18 +176,24 @@ function doChangeEmail($email) { $stmt->bindParam(":email", $email); $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); - return $stmt->rowCount(); +// return $stmt->rowCount(); + + if ($stmt->rowCount()) { + throw new HappyWarning("Emailadres is veranderd."); + } else { + throw new AngryWarning(); + } } -function updateProfilePicture() { +function updateAvatar() { $profilePictureDir = "/var/www/html/public/"; $relativePath = "uploads/profilepictures/" . $_SESSION["userID"] . "_" . basename($_FILES["pp"]["name"]); - removeOldProfilePicture(); + removeOldAvatar(); move_uploaded_file($_FILES['pp']['tmp_name'], $profilePictureDir . $relativePath); - setProfilePictureToDatabase("../" . $relativePath); + setAvatarToDatabase("../" . $relativePath); } -function removeOldProfilePicture() { +function removeOldAvatar() { $stmt = $GLOBALS["db"]->prepare(" SELECT `profilepicture` @@ -205,20 +205,22 @@ function removeOldProfilePicture() { $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); $old_avatar = $stmt->fetch()["profilepicture"]; - unlink("/var/www/html/public/uploads/" . $old_avatar); + if ($old_avatar != NULL) { + unlink("/var/www/html/public/uploads/" . $old_avatar); + } } -function setProfilePictureToDatabase($url) { +function setAvatarToDatabase($url) { $stmt = $GLOBALS["db"]->prepare(" UPDATE `user` SET - `profilepicture` = :profilePicture + `profilepicture` = :avatar WHERE `userID` = :userID "); - $stmt->bindParam(":profilePicture", $url); + $stmt->bindParam(":avatar", $url); $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); } \ No newline at end of file diff --git a/website/views/settings-view.php b/website/views/settings-view.php index 1fa5278..fe9c6da 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -6,8 +6,8 @@ $settings = getSettings();
getClass()."'>". - $result->getMessage(). + echo "
". + $alertMessage . "
"; } ?> From 4579b98eb832a53d6fbca0f7a3d2902ad6c6f712 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 13:54:08 +0100 Subject: [PATCH 02/26] Checks and resize on profile pictures :) --- website/public/settings.php | 10 +++---- website/queries/settings.php | 54 ++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/website/public/settings.php b/website/public/settings.php index 41affe6..e40f042 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -12,28 +12,26 @@ getClass(); $alertMessage = $w->getMessage(); } diff --git a/website/queries/settings.php b/website/queries/settings.php index ef718a3..965665a 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -1,6 +1,5 @@ bindValue(":bio", test_input($_POST["bio"])); $stmt->bindValue(":userID", $_SESSION["userID"]); $stmt->execute(); - throw new HappyWarning("Instellingen zijn opgeslagen."); + throw new HappyAlert("Instellingen zijn opgeslagen."); } function changePassword() { @@ -102,10 +101,10 @@ function changePassword() { if ($_POST["password-new"] == $_POST["password-confirm"] && (strlen($_POST["password-new"]) >= 8)) { doChangePassword(); } else { - throw new AngryWarning("Wachtwoorden komen niet overeen."); + throw new AngryAlert("Wachtwoorden komen niet overeen."); } } else { - throw new AngryWarning("Oud wachtwoord niet correct."); + throw new AngryAlert("Oud wachtwoord niet correct."); } } @@ -125,9 +124,9 @@ function doChangePassword() { $stmt->execute(); if ($stmt->rowCount()) { - throw new HappyWarning("Wachtwoord gewijzigd."); + throw new HappyAlert("Wachtwoord gewijzigd."); } else { - throw new AngryWarning(); + throw new AngryAlert(); } } @@ -140,10 +139,10 @@ function changeEmail() { emailIsAvailableInDatabase($email); doChangeEmail($email); } else { - throw new AngryWarning("Geef een geldig emailadres"); + throw new AngryAlert("Geef een geldig emailadres"); } } else { - throw new AngryWarning("Emailadressen komen niet overeen."); + throw new AngryAlert("Emailadressen komen niet overeen."); } } @@ -160,7 +159,7 @@ function emailIsAvailableInDatabase($email) { $stmt->bindParam(":email", $email); $stmt->execute(); if ($stmt->rowCount()) { - throw new AngryWarning("Emailadres wordt al gebruikt."); + throw new AngryAlert("Emailadres wordt al gebruikt."); } } @@ -179,18 +178,22 @@ function doChangeEmail($email) { // return $stmt->rowCount(); if ($stmt->rowCount()) { - throw new HappyWarning("Emailadres is veranderd."); + throw new HappyAlert("Emailadres is veranderd."); } else { - throw new AngryWarning(); + throw new AngryAlert(); } } function updateAvatar() { $profilePictureDir = "/var/www/html/public/"; - $relativePath = "uploads/profilepictures/" . $_SESSION["userID"] . "_" . basename($_FILES["pp"]["name"]); + $relativePath = "uploads/profilepictures/" . $_SESSION["userID"] . "_avatar.png"; + + checkAvatarSize($_FILES["pp"]["tmp_name"]); + $scaledImg = scaleAvatar($_FILES["pp"]["tmp_name"]); removeOldAvatar(); - move_uploaded_file($_FILES['pp']['tmp_name'], $profilePictureDir . $relativePath); + imagepng($scaledImg, $profilePictureDir . $relativePath); setAvatarToDatabase("../" . $relativePath); + throw new HappyAlert("Profielfoto veranderd."); } function removeOldAvatar() { @@ -210,7 +213,7 @@ function removeOldAvatar() { } } -function setAvatarToDatabase($url) { +function setAvatarToDatabase(string $url) { $stmt = $GLOBALS["db"]->prepare(" UPDATE `user` @@ -223,4 +226,21 @@ function setAvatarToDatabase($url) { $stmt->bindParam(":avatar", $url); $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); +} + +function checkAvatarSize(string $img) { + $minResolution = 200; + $imgSize = getimagesize($img); + if ($imgSize[0] < $minResolution or $imgSize[1] < $minResolution) { + throw new AngryAlert("Afbeelding te klein, minimaal 200x200 pixels."); + } +} + +function scaleAvatar(string $imgLink, int $newWidth = 600) { + $img = imagecreatefromstring(file_get_contents($imgLink)); + if ($img) { + return imagescale($img, $newWidth); + } else { + throw new AngryAlert("Afbeelding wordt niet ondersteund."); + } } \ No newline at end of file From c1359920e067347e3fe0ed15b108e91cc43b9148 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 14:00:55 +0100 Subject: [PATCH 03/26] New Standard avatar --- website/public/img/avatar-standard.png | Bin 0 -> 100475 bytes website/public/img/notbad.jpg | Bin 24079 -> 0 bytes website/queries/friendship.php | 4 ++-- website/queries/header.php | 2 +- website/queries/user.php | 2 +- website/views/chat-view.php | 2 +- website/views/menu.php | 4 ++-- 7 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 website/public/img/avatar-standard.png delete mode 100644 website/public/img/notbad.jpg diff --git a/website/public/img/avatar-standard.png b/website/public/img/avatar-standard.png new file mode 100644 index 0000000000000000000000000000000000000000..21ab818f1c31fc72ae9088b3620386b5cd28d7be GIT binary patch literal 100475 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 literal 0 HcmV?d00001 diff --git a/website/public/img/notbad.jpg b/website/public/img/notbad.jpg deleted file mode 100644 index eeea126059e5143b8eda2a1cc77cbc04ff3150e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24079 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 Date: Tue, 24 Jan 2017 14:26:15 +0100 Subject: [PATCH 04/26] FINALLY FIXED THE UNREAD CHAT MESSAGES! --- website/public/API/loadChatNotifications.php | 2 +- website/public/API/loadMessages.php | 2 ++ website/public/js/chat.js | 4 +-- website/public/js/notifications.js | 33 ++++++++++++++--- website/public/styles/chat.css | 38 ++++++++++++-------- website/public/styles/main.css | 20 +++++++++++ website/public/styles/menu.css | 10 ------ website/queries/friendship.php | 33 +++++++++++++++++ website/queries/private_message.php | 35 ++++++++++++++++++ website/views/chat-view.php | 13 ++++--- website/views/menu.php | 6 +++- website/views/notification-center.php | 10 +++++- 12 files changed, 167 insertions(+), 39 deletions(-) diff --git a/website/public/API/loadChatNotifications.php b/website/public/API/loadChatNotifications.php index 3b5835f..1415a2e 100644 --- a/website/public/API/loadChatNotifications.php +++ b/website/public/API/loadChatNotifications.php @@ -3,6 +3,6 @@ session_start(); require_once ("../../queries/connect.php"); -require_once ("../../queries/friendship.php"); +require_once ("../../queries/private_message.php"); echo selectAllUnreadChat(); \ No newline at end of file diff --git a/website/public/API/loadMessages.php b/website/public/API/loadMessages.php index e30acc8..a02de26 100644 --- a/website/public/API/loadMessages.php +++ b/website/public/API/loadMessages.php @@ -5,9 +5,11 @@ session_start(); require_once("../../queries/connect.php"); require_once("../../queries/private_message.php"); require_once("../../queries/checkInput.php"); +require_once("../../queries/friendship.php"); if (isset($_POST["lastID"]) && $_POST["lastID"] != "") { echo getNewChatMessages(test_input($_POST["lastID"]), test_input($_POST["destination"])); } else { echo getOldChatMessages(test_input($_POST["destination"])); + setLastVisited(test_input($_POST["destination"])); } \ No newline at end of file diff --git a/website/public/js/chat.js b/website/public/js/chat.js index 6c420a1..3c839e4 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -53,8 +53,8 @@ function switchUser(userID) { $(".destinationID").val(userID); $("#chat-history").html(""); $("#lastID").val(""); - $(".chat-left .friend-item").removeClass("active-friend-chat"); - $(".chat-left #friend-item-" + userID).addClass("active-friend-chat"); + $("#chat-recent-panel .friend-item").removeClass("active-friend-chat"); + $("#chat-left #friend-item-" + userID).addClass("active-friend-chat"); } function sayEmpty() { diff --git a/website/public/js/notifications.js b/website/public/js/notifications.js index 51a8c06..e3476b2 100644 --- a/website/public/js/notifications.js +++ b/website/public/js/notifications.js @@ -1,7 +1,7 @@ -function showNotifications(notifications, id) { - $("#" + id).html(""); +function showFriendNotifications(notifications) { + $("#friendrequestslist").html(""); for (i in notifications) { - $("#" + id).append(" \ + $("#friendrequestslist").append(" \

  • \
    \ \ +
    \ +
  • \ + "); + } +} + function loadNotifications() { $.post( "API/loadFriendRequestNotifications.php" ).done(function(data) { if (data && data != "[]") { - showNotifications(JSON.parse(data), "friendrequestslist"); + showFriendNotifications(JSON.parse(data)); } }); $.post( "API/loadChatNotifications.php" ).done(function(data) { if (data && data != "[]") { - showNotifications(JSON.parse(data), "unreadChatlist"); + showChatNotifications(JSON.parse(data)); } }); diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index 16505f5..6822d21 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -1,34 +1,38 @@ /* Overall chat-screen */ .chat { position: fixed; + top: 80px; left: 256px; - padding: 20px 0; width: calc(100% - 256px); height: calc(100% - 120px); - display: inline-flex; + + padding: 20px 0; + + display: inline-block; } -.chat-left { +#chat-recent-panel { width: 256px; height: calc(100% - 100px); - margin: 0 10px; - overflow-y: auto; -} -.chat-right { - width: calc(100% - 256px - 40px); - height: calc(100% - 80px); - margin-right: 10px; + display: inline-block; + + overflow-y: auto; } /* Chat history. */ -.chat-history { +#chat-history { overflow-y: auto; overflow-x: hidden; - height: 100%; + + width: calc(100% - 256px - 75px); + height: calc(100% - 80px); + padding: 10px; + display: inline-block; + word-wrap: break-word; } @@ -36,7 +40,13 @@ .chat-message { width: 100%; min-height: 40px; - padding-top: 10px; + padding: 10px 0; + clear: both; +} + +.chat-message::after { + content: ''; + display: table; clear: both; } @@ -63,7 +73,7 @@ /* Chat reply field */ .chat-field { - width: 100%; + width: calc(100% - 10px); display: table; } diff --git a/website/public/styles/main.css b/website/public/styles/main.css index 3e9b51d..8c50b19 100644 --- a/website/public/styles/main.css +++ b/website/public/styles/main.css @@ -242,3 +242,23 @@ div[data-title]:hover:after { line-height: normal; font-family: Arial, sans-serif; } + +.friend { + +} + + +.friend-item, .group-item { + cursor: pointer; + transition-duration: 250ms; +} + +.friend-item:hover, .group-item:hover { + background: #FBC02D; + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); +} + +.friend-name { + display: inline-block; + vertical-align: middle; +} diff --git a/website/public/styles/menu.css b/website/public/styles/menu.css index 25e4b91..ce294da 100644 --- a/website/public/styles/menu.css +++ b/website/public/styles/menu.css @@ -34,16 +34,6 @@ cursor: pointer; } -.friend-item, .group-item { - cursor: pointer; - transition-duration: 250ms; -} - -.friend-item:hover, .group-item:hover { - background: #FBC02D; - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); -} - .menu button { background: none; color: inherit; diff --git a/website/queries/friendship.php b/website/queries/friendship.php index 9a3a37c..fff3754 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -5,6 +5,7 @@ function selectAllFriends($userID) { SELECT `userID`, `username`, + LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 20) as `name`, IFNULL( `profilepicture`, '../img/notbad.jpg' @@ -36,6 +37,7 @@ function selectAllFriendRequests() { SELECT `userID`, `username`, + LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 20) as `name`, IFNULL( `profilepicture`, '../img/notbad.jpg' @@ -60,4 +62,35 @@ function selectAllFriendRequests() { $stmt->execute(); return json_encode($stmt->fetchAll()); +} + + +function setLastVisited($friend) { + $stmt = $GLOBALS["db"]->prepare(" + UPDATE + `friendship` + SET `friendship`.chatLastVisted1=( + CASE `user1ID` = :sessionUser + WHEN TRUE THEN NOW() + WHEN FALSE THEN `chatLastVisted1` + END + ), + `friendship`.`chatLastVisted2`=( + CASE `user2ID` = :sessionUser + WHEN TRUE THEN NOW() + WHEN FALSE THEN `chatLastVisted2` + END + ) + WHERE + `user1ID` = :sessionUser AND + `user2ID` = :friend OR + `user2ID` = :sessionUser AND + `user1ID` = :friend; + "); + + $stmt->bindParam(':sessionUser', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->bindParam(':friend', $friend, PDO::PARAM_INT); + $stmt->execute(); + + return $stmt; } \ No newline at end of file diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 46c21a3..2bb89ab 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -74,3 +74,38 @@ function getNewChatMessages($lastID, $destination) { return json_encode($stmt->fetchAll()); } + + +function selectAllUnreadChat() { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 20) as `name`, + IFNULL( + `profilepicture`, + '../img/notbad.jpg' + ) AS profilepicture, + LEFT(`private_message`.`content`, 20) as `content` + FROM + `private_message`, + `friendship`, + `user` + WHERE + (`friendship`.user2ID = `private_message`.`origin` AND + `friendship`.user1ID = `private_message`.`destination` AND + `friendship`.chatLastVisted1 < `private_message`.`creationdate` OR + `friendship`.user1ID = `private_message`.`origin` AND + `friendship`.user2ID = `private_message`.`destination` AND + `friendship`.chatLastVisted2 < `private_message`.`creationdate`) AND + `private_message`.`origin` = `user`.`userID` AND + `private_message`.`destination` = :userID AND + `user`.`role` != 'banned' + + GROUP BY `user`.`userID` + "); + + $stmt->bindParam(':userID', $_SESSION["userID"]); + + $stmt->execute(); + + return json_encode($stmt->fetchAll()); +} \ No newline at end of file diff --git a/website/views/chat-view.php b/website/views/chat-view.php index 549a5ff..135f7f4 100644 --- a/website/views/chat-view.php +++ b/website/views/chat-view.php @@ -1,6 +1,6 @@
    - \ No newline at end of file From dc11830c80472bbb2006473b995df2cc28754c94 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 14:32:43 +0100 Subject: [PATCH 05/26] Fixed name length --- website/queries/friendship.php | 4 ++-- website/queries/private_message.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/website/queries/friendship.php b/website/queries/friendship.php index dc1ce46..be0401a 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -5,7 +5,7 @@ function selectAllFriends($userID) { SELECT `userID`, `username`, - LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 20) as `name`, + LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 15) as `name`, IFNULL( `profilepicture`, '../img/avatar-standard.png' @@ -37,7 +37,7 @@ function selectAllFriendRequests() { SELECT `userID`, `username`, - LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 20) as `name`, + LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 15) as `name`, IFNULL( `profilepicture`, '../img/avatar-standard.png' diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 2bb89ab..4fbb55d 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -79,12 +79,12 @@ function getNewChatMessages($lastID, $destination) { function selectAllUnreadChat() { $stmt = $GLOBALS["db"]->prepare(" SELECT - LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 20) as `name`, + LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 15) as `name`, IFNULL( `profilepicture`, '../img/notbad.jpg' ) AS profilepicture, - LEFT(`private_message`.`content`, 20) as `content` + LEFT(`private_message`.`content`, 15) as `content` FROM `private_message`, `friendship`, From d44ddf2793168c126329e31f9e1c30bb9804343a Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 14:36:27 +0100 Subject: [PATCH 06/26] Added functionality for add friend buttons. --- website/public/edit_friendship.php | 30 ++++++++++++ website/public/profile.php | 5 +- website/public/styles/profile.css | 3 +- website/queries/friendship.php | 78 +++++++++++++++++++++++++++++- website/queries/user.php | 52 +++++++++++++++----- website/views/profile.php | 25 +++++++--- 6 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 website/public/edit_friendship.php diff --git a/website/public/edit_friendship.php b/website/public/edit_friendship.php new file mode 100644 index 0000000..d88e264 --- /dev/null +++ b/website/public/edit_friendship.php @@ -0,0 +1,30 @@ +prepare(" SELECT @@ -21,8 +23,8 @@ function selectAllFriends($userID) { `friendship`.`user2ID` = `user`.`userID` OR `friendship`.`user2ID` = :userID AND `friendship`.`user1ID` = `user`.`userID`) AND - `role` != 5 AND - `status` = 1 + `role` != 'banned' AND + `status` = 'confirmed' "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); @@ -60,4 +62,76 @@ function selectAllFriendRequests() { $stmt->execute(); return json_encode($stmt->fetchAll()); +} + +function getFriendshipStatus($userID) { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + CASE `status` IS NULL + WHEN TRUE THEN 0 + WHEN FALSE THEN + CASE `status` = 'confirmed' + WHEN TRUE THEN + 1 + WHEN FALSE THEN + CASE `user1ID` = :me AND `user2ID` = :other + WHEN TRUE THEN + 2 + WHEN FALSE THEN + 3 + END + END + END AS `friend_state` + FROM + `friendship` + WHERE + `user1ID` = :other AND `user2ID` = :me OR + `user1ID` = :me AND `user2ID` = :other + "); + + $stmt->bindParam(':me', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->bindParam(':other', $userID, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetch()["friend_state"]; +} + +function requestFriendship($userID) { + $stmt = $GLOBALS["db"]->prepare(" + INSERT INTO `friendship` (user1ID, user2ID) + VALUES (:user1, :user2) + "); + + $stmt->bindParam(':user1', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->bindParam(':user2', $userID, PDO::PARAM_INT); + $stmt->execute(); +} + +function removeFriendship($userID) { + $stmt = $GLOBALS["db"]->prepare(" + DELETE FROM `friendship` + WHERE + `user1ID` = :user1 AND + `user2ID` = :user2 OR + `user1ID` = :user2 AND + `user2ID` = :user1 + "); + + $stmt->bindParam(':user1', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->bindParam(':user2', $userID, PDO::PARAM_INT); + $stmt->execute(); +} + +function acceptFriendship($userID) { + $stmt = $GLOBALS["db"]->prepare(" + UPDATE `friendship` + SET `status`='confirmed' + WHERE + `user1ID` = :user1 AND + `user2ID` = :user2 + LIMIT 1 + "); + + $stmt->bindParam(':user1', $userID, PDO::PARAM_INT); + $stmt->bindParam(':user2', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->execute(); } \ No newline at end of file diff --git a/website/queries/user.php b/website/queries/user.php index 114d673..04f379e 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -17,27 +17,53 @@ function getUserID($username) { return $stmt->fetch()["userID"]; } -function selectUser($userID) { +function getUsername($userID) { $stmt = $GLOBALS["db"]->prepare(" SELECT - `username`, - IFNULL( - `profilepicture`, - '../img/notbad.jpg' - ) AS profilepicture, - `bio`, - `role`, - `onlinestatus`, - `loggedin`, - `fname`, - `lname` + `username` FROM `user` WHERE `userID` = :userID "); - $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); + $stmt->bindParam(':userID', $userID, PDO::PARAM_STR); + $stmt->execute(); + return $stmt->fetch()["username"]; +} + +function selectUser($me, $other) { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + `username`, `birthdate`, `location`, `profilepicture`, `bio`, `user`.`creationdate`, `onlinestatus`, `fname`, `lname`, + CASE `status` IS NULL + WHEN TRUE THEN 0 + WHEN FALSE THEN + CASE `status` = 'confirmed' + WHEN TRUE THEN + 1 + WHEN FALSE THEN + CASE `user1ID` = `userID` AND `user2ID` = :me + WHEN TRUE THEN + 2 + WHEN FALSE THEN + 3 + END + END + END AS `friend_status` + FROM + `user` + LEFT JOIN + `friendship` + ON + `user1ID` = `userID` AND `user2ID` = :me OR + `user1ID` = :me AND `user2ID` = `userID` + WHERE + `user`.`userID` = :other + "); + + $stmt->bindParam(':me', $me, PDO::PARAM_INT); + $stmt->bindParam(':other', $other, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetch(); } diff --git a/website/views/profile.php b/website/views/profile.php index 19bd908..83dbca7 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -1,11 +1,24 @@
    "> -
    -

    Als vriend toevoegen

    -
    -

    -
    + +
    + + "; + } else if($user["friend_status"] == 1) { + echo ""; + } else if($user["friend_status"] == 2) { + echo ""; + echo ""; + } else if($user["friend_status"] == 3) { + echo ""; + } + ?> +
    +

    +

    @@ -14,7 +27,7 @@

    fetch()) { - echo "${friend["username"]}"; + echo "${friend["username"]}"; } From 86b97cc186efe69bcbc4b04b2092ed77b5a11931 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 14:47:38 +0100 Subject: [PATCH 07/26] Max file size for gifs. --- website/queries/settings.php | 17 +++++++++++++---- website/views/settings-view.php | 9 +++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/website/queries/settings.php b/website/queries/settings.php index 965665a..d3985c7 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -186,12 +186,21 @@ function doChangeEmail($email) { function updateAvatar() { $profilePictureDir = "/var/www/html/public/"; - $relativePath = "uploads/profilepictures/" . $_SESSION["userID"] . "_avatar.png"; + $tmpImg = $_FILES["pp"]["tmp_name"]; - checkAvatarSize($_FILES["pp"]["tmp_name"]); - $scaledImg = scaleAvatar($_FILES["pp"]["tmp_name"]); + checkAvatarSize($tmpImg); removeOldAvatar(); - imagepng($scaledImg, $profilePictureDir . $relativePath); + if (getimagesize($tmpImg)["mime"] == "image/gif") { + if ($_FILES["pp"]["size"] > 4000000) { + throw new AngryAlert("Bestand is te groot, maximaal 4MB toegestaan."); + } + $relativePath = "uploads/profilepictures/" . $_SESSION["userID"] . "_avatar.gif"; + move_uploaded_file($tmpImg, $profilePictureDir . $relativePath); + } else { + $relativePath = "uploads/profilepictures/" . $_SESSION["userID"] . "_avatar.png"; + $scaledImg = scaleAvatar($tmpImg); + imagepng($scaledImg, $profilePictureDir . $relativePath); + } setAvatarToDatabase("../" . $relativePath); throw new HappyAlert("Profielfoto veranderd."); } diff --git a/website/views/settings-view.php b/website/views/settings-view.php index fe9c6da..66513fc 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -6,9 +6,9 @@ $settings = getSettings();

    ". - $alertMessage . - "
    "; + echo "
    + $alertMessage +
    "; } ?>
    @@ -81,7 +81,8 @@ $settings = getSettings();
  • From 4967ab6ea07ed2d20d4bd4909f946ae90ccb9936 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 15:01:55 +0100 Subject: [PATCH 08/26] Made some small changes for Lars. --- website/queries/user.php | 13 ++++++++++++- website/views/profile.php | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/website/queries/user.php b/website/queries/user.php index 15b7fb1..ed431f6 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -35,7 +35,18 @@ function getUsername($userID) { function selectUser($me, $other) { $stmt = $GLOBALS["db"]->prepare(" SELECT - `username`, `birthdate`, `location`, `profilepicture`, `bio`, `user`.`creationdate`, `onlinestatus`, `fname`, `lname`, + `username`, + `birthdate`, + `location`, + IFNULL( + `profilepicture`, + '../img/avatar-standard.png' + ) AS profilepicture, + `bio`, + `user`.`creationdate`, + `onlinestatus`, + `fname`, + `lname`, CASE `status` IS NULL WHEN TRUE THEN 0 WHEN FALSE THEN diff --git a/website/views/profile.php b/website/views/profile.php index 83dbca7..2bc0341 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -27,7 +27,7 @@

    fetch()) { - echo "${friend["username"]}"; + echo "${friend["username"]}"; } From 7a19fea5f9d8ce126d4fa6bb3f995eab036f8625 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Tue, 24 Jan 2017 15:08:24 +0100 Subject: [PATCH 09/26] Redesigned register functions --- website/public/register.php | 93 +++++++++++--- website/public/styles/index.css | 64 ++++------ website/queries/checkInput.php | 206 ++++++++++++++++++++++++-------- website/views/login_head.php | 1 + website/views/register-view.php | 22 ++-- 5 files changed, 267 insertions(+), 119 deletions(-) diff --git a/website/public/register.php b/website/public/register.php index 8c0f8e4..99af6c0 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -10,33 +10,90 @@ getMessage(); } - checkInputChoice("username", "username"); - checkInputChoice("password", "longerEight"); - checkInputChoice("confirmpassword", ""); - matchPassword(); - checkInputChoice("location", "lettersAndSpace"); - checkInputChoice("email", "email"); - registerCheck(); + try { + $surname = test_input(($_POST["surname"])); + checkInputChoice($surname, "lettersAndSpaces"); + } + catch(lettersAndSpacesException $e){ + $correct = false; + $surnameErr = $e->getMessage(); + } + + try{ + $bday = test_input(($_POST["bday"])); + checkInputChoice($bday, "bday"); + } catch(bdayException $e){ + $correct = false; + $bdayErr = $e->getMessage(); + } + + try{ + $username = test_input(($_POST["username"])); + checkInputChoice($username, "username"); + } catch(usernameException $e){ + $correct = false; + $usernameErr = $e->getMessage(); + } + + try{ + $password = test_input(($_POST["password"])); + checkInputChoice($password, "longerEight"); + matchPassword(); + } catch(passwordException $e){ + $correct = false; + $passwordErr = $e->getMessage(); + } catch(confirmPasswordException $e){ + $correct = false; + $confirmPasswordErr = $e->getMessage(); + } + + try{ + $location = test_input(($_POST["location"])); + checkInputChoice($location, "lettersAndSpaces"); + } catch(lettersAndSpacesException $e){ + $correct = false; + $locationErr = $e->getMessage(); + } + + try{ + $email = test_input(($_POST["email"])); + checkInputChoice($email, "email"); + } catch(emailException $e){ + $correct = false; + $emailErr = $e->getMessage(); + } + + try{ + $captcha = $_POST['g-recaptcha-response']; + checkCaptcha($captcha); + } catch(captchaException $e){ + $correct = false; + $captchaErr = $e->getMessage(); + } + + try { + getIp(); + registerCheck($correct); + } catch(registerException $e){ + $genericErr = $e->getMessage(); + } } /* This view adds register view */ include("../views/register-view.php"); diff --git a/website/public/styles/index.css b/website/public/styles/index.css index a24bdd0..8482cea 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -4,17 +4,16 @@ a.button { color: black; cursor: pointer; height: 50%; - margin: 8px 0; - padding: 14px 20px; - width: 25%; + padding: 8px 20px; + width: 50%; font-family: Arial; - font-size: 16px; + font-size: 20px; } /* Body */ body { height: 100%; - background-color: #C8CABD; + background-color: #FBC02D; /*background-image: url(http://play.pokemonshowdown.com/fx/client-bg-shaymin.jpg); background-size: cover; background-attachment: fixed;*/ @@ -24,31 +23,14 @@ body { font-family: Arial, sans-serif; } -/* The Close Button */ -.close { - /* Position it in the top right corner outside of the modal */ - color: white; - font-size: 100px; - font-weight: bold; - position: absolute; - right: 25px; - top: 0; -} - -/* Close button on hover */ -.close:hover, -.close:focus { - color: red; - cursor: pointer; -} /* inlogform */ form { /*background-color: #a87a87;*/ border-radius: 12px; - height: 70%; + height: 75%; margin: auto; - width: 70%; + width: 80%; overflow-y:auto; } @@ -72,24 +54,20 @@ input[type=text], input[type=password], input[type=email], input[type="date"] { border-color: #C8CABD; display: inline-block; height: 60%; + font-size: 16px; padding: 8px 20px; margin: 4px 0; - width: 70%; + width: 55%; } -/* -input[type=text], input[type=password], input[type=email], input[type="date"] { - border: 0px; - border-bottom: 4px solid lightgray; - border-radius: 0px; -}*/ button[type=submit] { background-color: #C8CABD; - color: black ; + color: black; cursor: pointer; font-family: Arial; - font-size: 16px; - width: 50%; + font-size: 22px; + height: 30px; + width: 120px; } .error { @@ -106,12 +84,12 @@ label { display: inline-block; position: relative; background-color: #C8CABD; - height: 30px; - width: 90px; - padding: 3px 3px 3px 0px; + height: 25px; + width: 120px; + padding: 3px 3px 3px 3px; text-align: center; - border-radius: 0px 10px 10px 0px; - font-size: 24px; + border-radius: 0px 5px 5px 0px; + font-size: 22px; } .left-arrow:after { @@ -121,9 +99,9 @@ label { right: 100%; top: 0; bottom: 0; - border-top: 15px solid transparent; + border-top: 12px solid transparent; border-right: 20px solid #C8CABD; - border-bottom: 15px solid transparent; + border-bottom: 12px solid transparent; border-left: 0px solid transparent; } @@ -135,7 +113,7 @@ label { /* padding voor login_containers */ .login_containerlogin { - padding:25px; + padding:16px; text-align: center; } @@ -163,7 +141,7 @@ label { margin: 34px auto; overflow-y: auto; padding: 20px; - width: 50%; + width: 45%; } /*.platform { diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index f711676..cc32626 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -1,97 +1,138 @@ format($format) == $date; +} + /* checks if username exist and if its longer than 6 characters. */ function username($variable){ - if (strlen($GLOBALS[$variable]) < 6) { - $GLOBALS[$variable . "Err"] = "Gebruikersnaam moet minstens 6 karakters bevatten"; - $correct = false; + if (empty($variable)) { + throw new usernameException("Verplicht!"); + } else if (strlen($variable) < 6) { + throw new usernameException("Moet minstens 6 karakters bevatten"); } else if (getExistingUsername() == 1) { - $GLOBALS[$variable . "Err"] = "Gebruikersnaam bestaat al"; - $correct = false; + throw new usernameException("Gebruikersnaam bestaal al"); } } /* checks if an input is longer that 8 characters. */ function longerEight($variable){ - if (strlen($GLOBALS[$variable]) < 8) { - $GLOBALS[$variable . "Err"] = "Moet minstens 8 karakters bevatten"; - $correct = false; + if (empty($variable)) { + throw new passwordException("Verplicht!"); + } else if (strlen($variable) < 8) { + throw new passwordException("Moet minstens 8 karakters bevatten"); } } /* checks if an input is a valid email. */ function validateEmail($variable){ - if (!filter_var($GLOBALS[$variable], FILTER_VALIDATE_EMAIL)) { - $GLOBALS[$variable . "Err"] = "Geldige email invullen!"; - $correct = false; - + if (empty($variable)) { + throw new emailException("Verplicht!"); + } else if (!filter_var($variable, FILTER_VALIDATE_EMAIL)) { + throw new emailException("Geldige email invullen"); } else if (getExistingEmail() == 1){ - $GLOBALS[$variable . "Err"] = "Email bestaat al"; - $correct = false; - + throw new emailException("Email bestaal al!"); } } /* checks if two passwords matches. */ function matchPassword(){ if ($_POST["password"] != $_POST["confirmpassword"]) { - $GLOBALS["confirmpasswordErr"] = "Wachtwoorden matchen niet"; - $GLOBALS["correct"] = false; - + throw new confirmPasswordException("Wachtwoorden matchen niet!"); } } -// Checks if everything is filled in correctly -function registerCheck(){ - if ($GLOBALS["correct"] == false){ - $GLOBALS["genericErr"] = "Bepaalde velden zijn verkeerd of niet ingevuld!"; +/* Checks if captcha is correctly filled in */ +function checkCaptcha($captcha){ + if(!$captcha){ + throw new captchaException("Captcha needs to be filled in!"); + } else { + $response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=6Lc72xIUAAAAAPizuF3nUbklCPljVCVzgYespz8o&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR'])); + if($response->success==false) { + throw new captchaException("You are a spammer!"); + } + } +} +/* Get ip adres */ +function getIp(){ + if (!empty($_SERVER['HTTP_CLIENT_IP'])) { + $GLOBALS["ip"] = $_SERVER['HTTP_CLIENT_IP']; + } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $GLOBALS["ip"] = $_SERVER['HTTP_X_FORWARDED_FOR']; + } else { + $GLOBALS["ip"] = $_SERVER['REMOTE_ADDR']; + } +} + +/* Checks if everything is filled in correctly */ +function registerCheck($status){ + if ($status == false){ + throw new registerException("Bepaalde velden zijn verkeerd of niet ingevuld"); } else { registerAccount(); header("location: login.php"); - } } @@ -102,4 +143,69 @@ function test_input($data) { $data = htmlspecialchars($data); return $data; } + +class lettersAndSpacesException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} + + +class bdayException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} + +class usernameException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} + +class passwordException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} + +class confirmPasswordException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} + +class emailException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} + +class captchaException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} + +class registerException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} ?> diff --git a/website/views/login_head.php b/website/views/login_head.php index 26d439e..e983fab 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -9,4 +9,5 @@ href="styles/index.css"> + diff --git a/website/views/register-view.php b/website/views/register-view.php index 7d1843b..4c660c9 100644 --- a/website/views/register-view.php +++ b/website/views/register-view.php @@ -41,11 +41,12 @@

    @@ -117,18 +118,23 @@ *
  • - + + + + +
    -
    From fd055e8355e0ad46e43e120dfb6c49f24b35d49b Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 15:16:15 +0100 Subject: [PATCH 10/26] Fixed bugs --- website/public/API/loadMessages.php | 1 + website/views/chat-view.php | 1 + 2 files changed, 2 insertions(+) diff --git a/website/public/API/loadMessages.php b/website/public/API/loadMessages.php index a02de26..0fdc740 100644 --- a/website/public/API/loadMessages.php +++ b/website/public/API/loadMessages.php @@ -9,6 +9,7 @@ require_once("../../queries/friendship.php"); if (isset($_POST["lastID"]) && $_POST["lastID"] != "") { echo getNewChatMessages(test_input($_POST["lastID"]), test_input($_POST["destination"])); + setLastVisited(test_input($_POST["destination"])); } else { echo getOldChatMessages(test_input($_POST["destination"])); setLastVisited(test_input($_POST["destination"])); diff --git a/website/views/chat-view.php b/website/views/chat-view.php index 9b40f71..598b3ee 100644 --- a/website/views/chat-view.php +++ b/website/views/chat-view.php @@ -16,6 +16,7 @@ // Set default values of a friend. $username = $friend["username"]; + $name = $friend["name"]; $userID = $friend["userID"]; $pf = "img/avatar-standard.png"; From f9f1e2bf173ee75f6eb9dbb8c94e0bd9ef078cf3 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 16:40:30 +0100 Subject: [PATCH 11/26] Changed select posts query. --- website/queries/user.php | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/website/queries/user.php b/website/queries/user.php index 18cd3f6..25bbf0e 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -68,18 +68,24 @@ function selectAllUserGroups($userID) { function selectAllUserPosts($userID) { $stmt = $GLOBALS["db"]->prepare(" SELECT - `postID`, - `author`, - `title`, - `content`, - `creationdate` + `postID`, + `author`, + `title`, + CASE LENGTH(`content`) >= 150 + WHEN TRUE THEN + CONCAT(LEFT(`content`, 150), '...') + WHEN FALSE THEN + `content` + END + AS `content`, + `creationdate` FROM - `post` + `post` WHERE - `author` = :userID AND - `groupID` IS NULL + `author` = :userID AND + `groupID` IS NULL ORDER BY - `creationdate` DESC + `creationdate` DESC "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); From 70957015ceb57b7d363b9277c17942dee03cd74e Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 16:51:34 +0100 Subject: [PATCH 12/26] Fixed links to friends on profile page. --- website/views/profile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/views/profile.php b/website/views/profile.php index 19bd908..1080290 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -14,7 +14,7 @@

    fetch()) { - echo "${friend["username"]}"; + echo "${friend["username"]}"; } From de03d8799a2ce018e3f62ac8da30459ef76787ee Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 16:58:51 +0100 Subject: [PATCH 13/26] Fixed placeholder for new post. --- website/views/profile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/views/profile.php b/website/views/profile.php index 2bc0341..0b2f4f2 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -60,7 +60,7 @@

    - +
    From 7144d700e4c3d805b4d85f68b7d20e93e68d966b Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 17:02:49 +0100 Subject: [PATCH 14/26] Removed debug echo from profile page. --- website/public/profile.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/website/public/profile.php b/website/public/profile.php index 439f74a..4f9d680 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -20,8 +20,6 @@ if(empty($_GET["username"])) { $userID = getUserID($_GET["username"]); } -echo "User ID: $userID"; - $user = selectUser($_SESSION["userID"], $userID); $profile_friends = selectAllFriends($userID); $profile_groups = selectAllUserGroups($userID); From 7bf8a16cf0c306303db1b1ae3179beb71fe3e39c Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 17:06:39 +0100 Subject: [PATCH 15/26] Dingen door elkaar --- website/public/{ => API}/edit_friendship.php | 5 ++-- website/public/js/notifications.js | 24 ++++++++++++++--- website/public/styles/menu.css | 28 ++++++++++++++++++++ website/queries/private_message.php | 1 + website/views/chat-view.php | 7 ++++- website/views/loadFriends.php | 3 +++ 6 files changed, 61 insertions(+), 7 deletions(-) rename website/public/{ => API}/edit_friendship.php (91%) create mode 100644 website/views/loadFriends.php diff --git a/website/public/edit_friendship.php b/website/public/API/edit_friendship.php similarity index 91% rename from website/public/edit_friendship.php rename to website/public/API/edit_friendship.php index d88e264..0a08066 100644 --- a/website/public/edit_friendship.php +++ b/website/public/API/edit_friendship.php @@ -1,7 +1,8 @@ \ -
    \ +
  • \ + \
  • \ \ \ +
    \ +
    \ + \ + \ + \ + \ + \ +
    \ \ "); } @@ -22,10 +38,10 @@ function showChatNotifications(notifications) { $("#unreadChatlist").html(""); for (i in notifications) { $("#unreadChatlist").append(" \ -
  • \ +
  • \ \
  • - "; + "; + } + + $chatID = $_GET["chatID"]; + if (isset($chatID) && $chatID != "") { + echo ""; } ?> diff --git a/website/views/loadFriends.php b/website/views/loadFriends.php new file mode 100644 index 0000000..b4cbaca --- /dev/null +++ b/website/views/loadFriends.php @@ -0,0 +1,3 @@ +fetchAll()); \ No newline at end of file From 12ed710369ce6b0e469eee00a856b19eacd3ee8a Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 17:10:12 +0100 Subject: [PATCH 16/26] Fixed API --- website/public/profile.php | 1 - website/views/profile.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/website/public/profile.php b/website/public/profile.php index 4f9d680..be71023 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -15,7 +15,6 @@ include("../queries/nicetime.php"); if(empty($_GET["username"])) { $userID = $_SESSION["userID"]; - echo "USERNAME NOT GIVEN"; } else { $userID = getUserID($_GET["username"]); } diff --git a/website/views/profile.php b/website/views/profile.php index 0b2f4f2..07ccbee 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -2,7 +2,7 @@
    "> - + Date: Tue, 24 Jan 2017 17:31:39 +0100 Subject: [PATCH 17/26] In notification bar accept or deny --- website/public/API/edit_friendship.php | 2 +- website/public/js/notifications.js | 22 ++++++++++++++-------- website/queries/friendship.php | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/website/public/API/edit_friendship.php b/website/public/API/edit_friendship.php index 0a08066..52aacf5 100644 --- a/website/public/API/edit_friendship.php +++ b/website/public/API/edit_friendship.php @@ -28,4 +28,4 @@ if(!empty($_POST["request"]) AND $friendship_status == 0) { $username = getUsername($_POST["userID"]); -header("Location: profile.php?username=$username"); \ No newline at end of file +header("Location: ../profile.php?username=$username"); \ No newline at end of file diff --git a/website/public/js/notifications.js b/website/public/js/notifications.js index aacff71..afcaca0 100644 --- a/website/public/js/notifications.js +++ b/website/public/js/notifications.js @@ -1,9 +1,19 @@ function showFriendNotifications(notifications) { $("#friendrequestslist").html(""); for (i in notifications) { + var outgoing = ""; + if (notifications[i].friend_state == "3") { + outgoing = " \ + \ + "; + } + $("#friendrequestslist").append(" \
  • \ - \ + \ \ - \ \ - \ + \ \
  • \ \ diff --git a/website/queries/friendship.php b/website/queries/friendship.php index d0279c9..cb35640 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -39,6 +39,21 @@ function selectAllFriendRequests() { SELECT `userID`, `username`, + CASE `status` IS NULL + WHEN TRUE THEN 0 + WHEN FALSE THEN + CASE `status` = 'confirmed' + WHEN TRUE THEN + 1 + WHEN FALSE THEN + CASE `user1ID` = :userID + WHEN TRUE THEN + 2 + WHEN FALSE THEN + 3 + END + END + END AS `friend_state`, LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 15) as `name`, IFNULL( `profilepicture`, From f7da87596a513cf8ae421e97e2123aa7a771bc88 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 25 Jan 2017 09:30:05 +0100 Subject: [PATCH 18/26] Added emailconfirm.php --- website/public/emailconfirm.php | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 website/public/emailconfirm.php diff --git a/website/public/emailconfirm.php b/website/public/emailconfirm.php new file mode 100644 index 0000000..97eb2f6 --- /dev/null +++ b/website/public/emailconfirm.php @@ -0,0 +1,49 @@ +prepare(" + SELECT + `email`, + `role` + FROM + `user` + WHERE + `userID` = :userID + "); + $checkHash->bindParam(":userID", $_GET["u"]); + $checkHash->execute(); + $result = $checkHash->fetch(); + $email = $result["email"]; + $role = $result["role"]; + if ($role == "unconfirmed") { + doActivate($email); + } else { + echo "Ongeldige link."; + } + +} else { + echo "Ongeldige link."; +} + +function doActivate(string $email) { + if (password_verify($email, $_GET["h"])) { + $confirmUser = $GLOBALS["db"]->prepare(" + UPDATE + `user` + SET + `role` = :role + WHERE + `userID` = :userID + "); + $confirmUser->bindValue(":role", "user"); + $confirmUser->bindParam(":userID", $_GET["u"]); + $confirmUser->execute(); + if ($confirmUser->rowCount()) { + echo "Email bevestigd
    + U wordt automatisch doorgestuurd naar de login pagina over 5 seconden. "; + header("refresh:5;url=login.php"); + } + } else { + echo "Ongeldige link."; + } +} \ No newline at end of file From 28f31d749bf4dc5a920939c55d37a0f9f9a2b2f3 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 25 Jan 2017 11:16:53 +0100 Subject: [PATCH 19/26] Email confirm (: --- website/queries/emailconfirm.php | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 website/queries/emailconfirm.php diff --git a/website/queries/emailconfirm.php b/website/queries/emailconfirm.php new file mode 100644 index 0000000..8b0031c --- /dev/null +++ b/website/queries/emailconfirm.php @@ -0,0 +1,43 @@ +prepare(" + SELECT + `userID` + FROM + `user` + WHERE + `username` = :username + "); + $stmt->bindParam(":username", $username); + $stmt->execute(); + $userID = $stmt->fetch()["username"]; + sendConfirmEmail($userID); +} + +function sendConfirmEmail(int $userID) { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + `email`, + `fname` + FROM + `user` + WHERE + `userID` = :userID + "); + $stmt->bindParam(":userID", $userID); + $user = $stmt->fetch(); + + $email = $user["email"]; + $fname = $user["fname"]; + $hash = password_hash($email, PASSWORD_DEFAULT); + $confirmLink = "https://myhyvesbookplus.nl/emailconfirm.php?u=$userID&h=$hash"; + + $subject = "Bevestig uw emailadres"; + $body = "Hallo $fname,\r\n\r\n + Klik op de onderstaande link om uw emailadres te bevestigen.\r\n\r\n + $confirmLink\r\n\r\n + Groeten MyHyvesbook+"; + $header = "From: MyHyvesbook+ "; + mail($email, $subject, $body, $header); +} \ No newline at end of file From 981e34c95082d1bffe8b4a0ca18f5a19239d5829 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Wed, 25 Jan 2017 11:19:01 +0100 Subject: [PATCH 20/26] redesigned code --- website/public/js/registerAndLogin.js | 5 +++- website/public/login.php | 23 +++------------ website/public/register.php | 4 +-- website/public/styles/index.css | 2 +- website/queries/checkInput.php | 3 +- website/queries/login.php | 40 ++++++++++++++++++++++++++- website/views/login_head.php | 4 +-- website/views/register-view.php | 2 +- 8 files changed, 55 insertions(+), 28 deletions(-) diff --git a/website/public/js/registerAndLogin.js b/website/public/js/registerAndLogin.js index 0452d15..4e68a07 100644 --- a/website/public/js/registerAndLogin.js +++ b/website/public/js/registerAndLogin.js @@ -4,5 +4,8 @@ function checkLoggedIn() { } else { window.location.href = "profile.php"; } - document.getElementById("demo").innerHTML = x; } + +function bannedAlert(){ + alert("Your account is banned"); +} \ No newline at end of file diff --git a/website/public/login.php b/website/public/login.php index 0d07413..b3a00b0 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -22,26 +22,11 @@ // Trying to login if ($_SERVER["REQUEST_METHOD"] == "POST") { - // Empty username or password field - if (empty($_POST["uname"]) || empty($_POST["psw"])) { - $loginErr = "Gebruikersnaam of wachtwoord is niet ingevuld"; - - } - else { + try{ $uname = strtolower(test_input($_POST["uname"])); - $psw = test_input($_POST["psw"]); - $hash = getUser()["password"]; - $userid = getUser()["userID"]; - - // If there's an account, go to the profile page - if(password_verify($psw, $hash)) { - $_SESSION["userID"] = $userid; - header("location: profile.php"); - - } else { - $loginErr = "Inloggegevens zijn niet correct"; - } - + validateLogin($_POST["uname"], $_POST["psw"]); + } catch(loginException $e) { + $loginErr = $e->getMessage(); } } diff --git a/website/public/register.php b/website/public/register.php index 99af6c0..84d6873 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -45,7 +45,7 @@ } try{ - $username = test_input(($_POST["username"])); + $username = str_replace(' ', '', test_input(($_POST["username"]))); checkInputChoice($username, "username"); } catch(usernameException $e){ $correct = false; @@ -53,7 +53,7 @@ } try{ - $password = test_input(($_POST["password"])); + $password = str_replace(' ', '', test_input(($_POST["password"]))); checkInputChoice($password, "longerEight"); matchPassword(); } catch(passwordException $e){ diff --git a/website/public/styles/index.css b/website/public/styles/index.css index 8482cea..fc9d3d6 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -1,6 +1,6 @@ a.button { background-color: #C8CABD; - border-radius: 10px; + border-radius: 5px; color: black; cursor: pointer; height: 50%; diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index cc32626..5f72f10 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -38,7 +38,8 @@ function checkName($variable){ if (empty($variable)) { throw new lettersAndSpacesException("Verplicht!"); } else if (!preg_match("/^[a-zA-Z ]*$/", $variable)) { - throw new lettersAndSpacesException("Alleen letters en spaties zijn toegestaan!"); + + throw new lettersAndSpacesException("Alleen letters en spaties zijn toegestaan!"); } } diff --git a/website/queries/login.php b/website/queries/login.php index 180b431..8605e67 100644 --- a/website/queries/login.php +++ b/website/queries/login.php @@ -4,7 +4,8 @@ function getUser() { $stmt = $GLOBALS["db"]->prepare(" SELECT `password`, - `userID` + `userID`, + `role` FROM `user` WHERE @@ -15,3 +16,40 @@ function getUser() { $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } + +function validateLogin($username, $password){ + // Empty username or password field + if (empty($username) || empty($password)) { + throw new loginException("Gebruikersnaam of wachtwoord is niet ingevuld"); + } + else { + $psw = test_input($password); + $hash = getUser()["password"]; + $userID = getUser()["userID"]; + $role = getUser()["role"]; + + // If there's an account, go to the profile page + if(password_verify($psw, $hash)) { + if ($role == "banned"){ + echo ""; + } else { + $_SESSION["userID"] = $userID; + header("location: profile.php"); + } + } else { + throw new loginException("Inloggevens zijn niet correct"); + } + + } +} + +class loginException extends Exception +{ + public function __construct($message = "", $code = 0, Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} +?> \ No newline at end of file diff --git a/website/views/login_head.php b/website/views/login_head.php index e983fab..e831cd2 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -7,7 +7,7 @@ - - + + diff --git a/website/views/register-view.php b/website/views/register-view.php index 4c660c9..f970a6f 100644 --- a/website/views/register-view.php +++ b/website/views/register-view.php @@ -96,7 +96,7 @@