From 4bc2bcedd101a17281068cae0df36e50206a131a Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 13 Jan 2017 15:47:59 +0100 Subject: [PATCH 001/322] Fixed bugs Bug 1: If you clicked "En nog 2 anderen..." in the menu it send you tot he top of the page Bug 2: Span didnt close in the footer --- website/public/styles/menu.css | 1 + website/views/footer.php | 2 +- website/views/menu.php | 99 +++++++++++++++++++++------------- 3 files changed, 63 insertions(+), 39 deletions(-) diff --git a/website/public/styles/menu.css b/website/public/styles/menu.css index 3aa47a7..7778545 100644 --- a/website/public/styles/menu.css +++ b/website/public/styles/menu.css @@ -23,4 +23,5 @@ padding: 5px 20px; color: #666; font-size: 14px; + cursor: pointer; } diff --git a/website/views/footer.php b/website/views/footer.php index a7bed4e..02dc0cd 100644 --- a/website/views/footer.php +++ b/website/views/footer.php @@ -1,3 +1,3 @@ diff --git a/website/views/menu.php b/website/views/menu.php index f2fc2ad..bf8b1d7 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -4,51 +4,64 @@ Vrienden
@@ -56,36 +69,46 @@ Groepen +
+
+
- -- 2.49.1 From bb0f32ffd91fdde2e9b92dbcbcf5d841ce42c8b7 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Mon, 16 Jan 2017 13:10:34 +0100 Subject: [PATCH 002/322] Made some pages html valid with a validator --- website/public/styles/settings.css | 24 ++-- website/views/footer.php | 2 +- website/views/settings-view.php | 196 +++++++++++++++++------------ 3 files changed, 129 insertions(+), 93 deletions(-) diff --git a/website/public/styles/settings.css b/website/public/styles/settings.css index 9a2c753..da55ec4 100644 --- a/website/public/styles/settings.css +++ b/website/public/styles/settings.css @@ -1,6 +1,17 @@ -.settings input, -.settings textarea { +.settings .item-box { + display: inline-flex; +} + +.settings-password { + margin-right: 15px; +} + + +.settings li { margin: 5px; +} + +.settings textarea { resize: none; } @@ -14,15 +25,10 @@ .settings input[type="password"], .settings input[type="text"], .settings input[type="date"], -.settings input[type="email"], -.settings textarea { +.settings input[type="email"] { width: 200px; } .settings textarea { - width: 400px; -} - -.settings label[for="bio"] { - vertical-align: middle; + width: calc(100% - 350px); } \ No newline at end of file diff --git a/website/views/footer.php b/website/views/footer.php index 02dc0cd..c43a80c 100644 --- a/website/views/footer.php +++ b/website/views/footer.php @@ -1,3 +1,3 @@
-

Copyright © 2017 MyHyvesbook+ Like ons op Facebook!

+

Copyright © 2017 MyHyvesbook+ Like ons op Facebook!

diff --git a/website/views/settings-view.php b/website/views/settings-view.php index 797217e..cb22af5 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -1,95 +1,125 @@
-
Profiel Instllingen
- -
- -
- -
- -
- -
- - -
- - - +
Profiel Instellingen
+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
-
+
Verander Wachtwoord
-
- -
- -
- -
- - +
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
-
+
Verander Email
-
- -
- -
- - +
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
\ No newline at end of file -- 2.49.1 From c6bdf349a8217ecd77b5c0308591581cf310630b Mon Sep 17 00:00:00 2001 From: Hendrik Date: Tue, 17 Jan 2017 10:34:30 +0100 Subject: [PATCH 003/322] fixed forms for php, user status and page type --- website/styles/adminpanel.css | 7 +++--- website/views/adminpanel.php | 47 ++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/website/styles/adminpanel.css b/website/styles/adminpanel.css index e761592..edeb9c8 100644 --- a/website/styles/adminpanel.css +++ b/website/styles/adminpanel.css @@ -1,6 +1,6 @@ .admin-panel { margin: auto; - min-width: 800px; + /*min-width: 800px;*/ } .admin-title { @@ -32,11 +32,12 @@ margin-bottom: 10px; } -.admin-filter { +.admin-filter, .admin-filtertype { display: inline-block; margin: 10px; vertical-align: top; - margin-right: 100px; + margin-left: 20px; + margin-right: 20px; } .admin-users { diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index b789aad..96c02d3 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -21,26 +21,43 @@

User Management Panel


-
+ " method="post">
- + " method="post">
-

Show users:

- Active
- Muted
- Banned +

Show:

+ +
+ +
+ +
+ +
+ + +
+
+

Page Type:

+ +
+ +

Batch Actions:

- Mute
- Ban
- Unban

+ +
+ +
+ +

@@ -63,11 +80,11 @@ Banned unregulated time travel -
+ " method="post">
@@ -79,11 +96,11 @@ Banned l33t h4xx -
+ " method="post">
-- 2.49.1 From 31d50356dede8200e07fdc5c31da2d289bd3b1c5 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 17 Jan 2017 12:10:36 +0100 Subject: [PATCH 004/322] Added "Niet slecht." button. --- website/public/external/nietslecht_button.png | Bin 0 -> 62512 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 website/public/external/nietslecht_button.png diff --git a/website/public/external/nietslecht_button.png b/website/public/external/nietslecht_button.png new file mode 100644 index 0000000000000000000000000000000000000000..53ca6a8464afa3502089d4921dd196e232583ab5 GIT binary patch literal 62512 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 Date: Tue, 17 Jan 2017 12:25:04 +0100 Subject: [PATCH 005/322] New button --- website/public/external/nietslecht_button.png | Bin 62512 -> 62172 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/website/public/external/nietslecht_button.png b/website/public/external/nietslecht_button.png index 53ca6a8464afa3502089d4921dd196e232583ab5..4fca19ad6673ce8b2209286055d930a0d8ce14fd 100644 GIT binary patch literal 62172 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 Date: Tue, 17 Jan 2017 12:40:41 +0100 Subject: [PATCH 006/322] added form complete on search in adminpanel --- website/public/styles/adminpanel.css | 6 +- website/views/adminpanel.php | 261 ++++++++++++++++----------- 2 files changed, 156 insertions(+), 111 deletions(-) diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index edeb9c8..019924e 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -1,6 +1,6 @@ .admin-panel { margin: auto; - /*min-width: 800px;*/ + min-width: 800px; } .admin-title { @@ -36,8 +36,8 @@ display: inline-block; margin: 10px; vertical-align: top; - margin-left: 20px; - margin-right: 20px; + margin-right: 50px; + margin-left: 50px; } .admin-users { diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index 96c02d3..95d518d 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -1,115 +1,160 @@ - - - Admin Panel - - - -
-
-
-

User Management Panel

-

-
" method="post"> -
- " method="post"> - -
-

Show:

- -
- -
- -
- -
- - -
-
-

Page Type:

- -
- - -
- -
-

Batch Actions:

- -
- -
- -

- -
-
-
-
-

Users:

- - - - - - - - - - - - - - - - - - - - - - -
- - UserStatusCommentAction
John SmithBannedunregulated time travel -
" method="post"> - - -
-
poey jokeaimBannedl33t h4xx -
" method="post"> - - -
-
-
- + } + + + + + + + +
+
+
+

User Management Panel

+

+
" + method="post"> +
+ " + method="post"> + +
+

Show:

+ > +
+ > +
+ > +
+ > +
+ > + +
+
+

Page Type:

+ > +
+ > + +
+ +
+

Batch Actions:

+ +
+ +
+ +

+ +
-
- +
+
+

Users:

+ + + + + + + + + + + + + + + + + + + + + + +
+ + UserStatusCommentAction
John SmithBannedunregulated time travel +
" + method="post"> + + +
+
poey jokeaimBannedl33t h4xx +
" + method="post"> + + +
+
+
+ +
+
+ -- 2.49.1 From 10d3e177ae48f0f2c6c79b5a4431995d03feab6c Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 17 Jan 2017 12:48:01 +0100 Subject: [PATCH 007/322] Begin with the connection between php and mysql. It has a template that loads all the friends of userID 666. It uses a connect.php and a friendship.php --- website/connect.php | 14 -------------- website/mysql_config.xml | 7 +++++++ website/public/template_sql.php | 18 ++++++++++++++++++ website/queries/connect.php | 13 +++++++++++++ website/queries/friendship.php | 24 ++++++++++++++++++++++++ website/views/head.php | 5 +++++ 6 files changed, 67 insertions(+), 14 deletions(-) delete mode 100644 website/connect.php create mode 100644 website/mysql_config.xml create mode 100644 website/public/template_sql.php create mode 100644 website/queries/connect.php create mode 100644 website/queries/friendship.php diff --git a/website/connect.php b/website/connect.php deleted file mode 100644 index a3ae861..0000000 --- a/website/connect.php +++ /dev/null @@ -1,14 +0,0 @@ -connect_error) { - die("Connection failed: " . $conn->connect_error); -} - -?> diff --git a/website/mysql_config.xml b/website/mysql_config.xml new file mode 100644 index 0000000..de2d929 --- /dev/null +++ b/website/mysql_config.xml @@ -0,0 +1,7 @@ + + + localhost + myhyvesbookplus + mhbp + qdtboXhCHJyL2szC + \ No newline at end of file diff --git a/website/public/template_sql.php b/website/public/template_sql.php new file mode 100644 index 0000000..3ef5b97 --- /dev/null +++ b/website/public/template_sql.php @@ -0,0 +1,18 @@ + + + + +fetch(PDO::FETCH_ASSOC)) { + echo $friend['username'].' '.$friend['onlinestatus'] . "
"; +} + +?> + + \ No newline at end of file diff --git a/website/queries/connect.php b/website/queries/connect.php new file mode 100644 index 0000000..36d1001 --- /dev/null +++ b/website/queries/connect.php @@ -0,0 +1,13 @@ +mysql_host;dbname=$dbconf->mysql_database;charset=utf8", + "$dbconf->mysql_username", "$dbconf->mysql_password") + or die('Error connecting to mysql server'); +} + +?> diff --git a/website/queries/friendship.php b/website/queries/friendship.php new file mode 100644 index 0000000..45a599e --- /dev/null +++ b/website/queries/friendship.php @@ -0,0 +1,24 @@ +query(" + SELECT + `user`.`username`, + `user`.`profilepicture`, + `user`.`onlinestatus`, + `user`.`role` + FROM + `user` + INNER JOIN + `friendship` + WHERE + `friendship`.`user1ID` = $userID AND + `friendship`.`user2ID` = `user`.`userID` OR + `friendship`.`user2ID` = $userID AND + `friendship`.`user1ID` = `user`.`userID`" + ); +} + + + +?> \ No newline at end of file diff --git a/website/views/head.php b/website/views/head.php index 4da866c..94ad215 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -12,3 +12,8 @@ @import url("styles/menu.css"); @import url("styles/footer.css"); + \ No newline at end of file -- 2.49.1 From f00b3d9a231ff7073c3fc77ea8d1b8600ce60d02 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Tue, 17 Jan 2017 12:55:15 +0100 Subject: [PATCH 008/322] add page selector in adminpanel --- website/public/styles/adminpanel.css | 6 ++++++ website/views/adminpanel.php | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index 019924e..5a9fb7e 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -44,6 +44,12 @@ margin: 10px; } +.admin-userpage { + width: 170px; + margin-bottom: 20px; + float: right; +} + .usertable { width: 100%; } diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index 95d518d..9c1c818 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -105,6 +105,11 @@ function test_input($data) {

Users:

+
+ + 1 / 1 + +

+ fetch(PDO::FETCH_ASSOC)) { $userID = $user['userID']; @@ -135,6 +182,7 @@ function test_input($data) { $role = $user['role']; $bancomment = $user['bancomment']; $thispage = htmlspecialchars($_SERVER['PHP_SELF']); + echo(" - - - - - + + + + + - "); + "); + } + } else { + $q = search20GroupsFromNByStatus($db, $listnr, $search, $groupstatus); + + while ($group = $q->fetch(PDO::FETCH_ASSOC)) { + $groupID = $group['groupID']; + $name = $group['name']; + $role = $group['status']; + $description = $group['description']; + $thispage = htmlspecialchars($_SERVER['PHP_SELF']); + + echo(" + + + + + + + + "); + } } ?>
-- 2.49.1 From be26e89dbf43e6a482d8124c24e27779298b2c9b Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 17 Jan 2017 13:43:00 +0100 Subject: [PATCH 009/322] Added profile picture part in settings --- website/views/settings-view.php | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/website/views/settings-view.php b/website/views/settings-view.php index cb22af5..15ee39c 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -60,7 +60,29 @@ - +
+
Verander profielfoto
+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
+
Verander Wachtwoord
-- 2.49.1 From eb2a343d5fe5d4dc1ab44fbb3fb792579fbfca46 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 18 Jan 2017 12:08:53 +0100 Subject: [PATCH 022/322] added live sending messages from user 2 to user 2 --- website/public/chat.php | 1 + website/public/js/sendMessage.js | 14 ++++++++ website/public/sendMessage.php | 16 +++++++++ website/queries/private_message.php | 51 +++++++++++++++++++++++++++++ website/views/chat-view.php | 12 ++++--- 5 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 website/public/js/sendMessage.js create mode 100644 website/public/sendMessage.php create mode 100644 website/queries/private_message.php diff --git a/website/public/chat.php b/website/public/chat.php index f077a4d..150638d 100644 --- a/website/public/chat.php +++ b/website/public/chat.php @@ -5,6 +5,7 @@ + prepare(" + SELECT + * + FROM + `private_message` + WHERE + `origin` = :user1 AND + `destination` = :user2 OR + `origin` = :user2 AND + `destination` = :user1 + ORDER BY + `creationdate` DESC + LIMIT + :n, 100 + "); + + $stmt->bindParam(":user1", $user1ID); + $stmt->bindParam(":user2", $user2ID); + $stmt->bindParam(":n", $n); + + return $stmt->execute(); +} + +function sendMessage($destination, $content) { + $db = $GLOBALS["db"]; + $stmt = $db->prepare(" + INSERT INTO + `private_message` + ( + `origin`, + `destination`, + `content` + ) + VALUES + ( + :origin, + :destination, + :content + ) + "); + + return $stmt->execute(array( + "origin" => 2, + "destination" => $destination, + "content" => $content + )); +} \ No newline at end of file diff --git a/website/views/chat-view.php b/website/views/chat-view.php index a23a1c5..6b6aecd 100644 --- a/website/views/chat-view.php +++ b/website/views/chat-view.php @@ -37,16 +37,20 @@
-
+ + + /> + />
-- 2.49.1 From afcd048260123e1a150ec76b5d65de64eff8a2b8 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Wed, 18 Jan 2017 12:35:41 +0100 Subject: [PATCH 023/322] Almost finished login/register page --- website/public/login.php | 39 +++-------------- website/public/register.php | 77 +++++++++------------------------ website/public/styles/index.css | 3 +- website/queries/login.php | 18 ++++++++ website/queries/register.php | 57 ++++++++++++++++++++++++ website/queries/settings.php | 6 +-- website/views/register-view.php | 24 +++------- 7 files changed, 113 insertions(+), 111 deletions(-) create mode 100644 website/queries/login.php create mode 100644 website/queries/register.php diff --git a/website/public/login.php b/website/public/login.php index e20c204..40907a7 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -1,7 +1,9 @@ diff --git a/website/public/register.php b/website/public/register.php index 1d65102..8b8f4e6 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -3,6 +3,7 @@ @@ -10,8 +11,8 @@ session_start(); // define variables and set to empty values - $name = $surname = $bday = $username = $password = $confirmpassword = $streetname = $housenumber = $email = ""; - $genericErr = $nameErr = $surnameErr = $bdayErr = $usernameErr = $passwordErr = $confirmpasswordErr = $streetnameErr = $housenumberErr = $emailErr = ""; + $name = $surname = $bday = $username = $password = $confirmpassword = $location = $housenumber = $email = ""; + $genericErr = $nameErr = $surnameErr = $bdayErr = $usernameErr = $passwordErr = $confirmpasswordErr = $locationErr = $housenumberErr = $emailErr = ""; $correct = true; // Saves information of filling in the form @@ -35,8 +36,8 @@ $password = $_POST["password"]; } - if (isset($_POST["streetname"])) { - $streetname = $_POST["streetname"]; + if (isset($_POST["location"])) { + $location = $_POST["location"]; } if (isset($_POST["housenumber"])) { @@ -87,6 +88,10 @@ $usernameErr = "Gebruikersnaam moet minstens 6 karakters bevatten"; $correct = false; + } else if (getExistingUser() == 1 ){ + $usernameErr = "Gebruikersnaam bestaat al"; + $correct = false; + } } @@ -108,30 +113,24 @@ } - if ($_POST["password"]!= $_POST["confirmpassword"]) { + if ($_POST["password"] != $_POST["confirmpassword"]) { $confirmpasswordErr = "Wachtwoorden matchen niet"; $correct = false; } - if (empty($_POST["streetname"])) { - $streetnameErr = "Straatnaam is verplicht!"; + if (empty($_POST["location"])) { + $locationErr = "Straatnaam is verplicht!"; $correct = false; } else { - if (!preg_match("/^[a-zA-Z ]*$/",$streetname)) { - $streetnameErr = "Alleen letters en spaties zijn toegestaan!"; + if (!preg_match("/^[a-zA-Z ]*$/",$location)) { + $locationErr = "Alleen letters en spaties zijn toegestaan!"; $correct = false; } } - if (empty($_POST["housenumber"])) { - $housenumberErr = "Huisnummer is verplicht!"; - $correct = false; - - } - if (empty($_POST["email"])) { $emailErr = "Email is verplicht!"; $correct = false; @@ -140,6 +139,11 @@ if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $emailErr = "Geldige email invullen!"; $correct = false; + + } else if (getExistingEmail() == 1){ + $emailErr = "Email bestaat al"; + $correct = false; + } } @@ -148,48 +152,9 @@ $genericErr = "Bepaalde velden zijn verkeerd of niet ingevuld!"; } else { - $servername = "agile136.science.uva.nl"; - $username = "mhbp"; - $password = "qdtboXhCHJyL2szC"; + registerAccount(); + // header("location: login.php"); - // Creates connection - $conn = new mysqli($servername, $username, $password); - - // Checks connection - if ($conn->connect_error) { - die("Connection failed: " . $conn->connect_error); - } - - // Query for inserting all the data in the database - $sql = "INSERT INTO - VALUES ($name, $surname, $bday, $username, $password, - $confirmpassword, $streetname, $housenumber, $email)"; - - // Checks if able to insert into database - if (mysqli_query($conn, $sql)) { - echo "New record created successfully"; - } else { - echo "Error: " . $sql . "
" . mysqli_error($conn); - } - - - - prepare('SELECT name, colour, calories - FROM fruit - WHERE calories < :calories AND colour = :colour'); - $sth->bindParam(':calories', $calories, PDO::PARAM_INT); - $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); - $sth->execute(); - ?> - - - - // Closing connection - mysql_close($connection); } } diff --git a/website/public/styles/index.css b/website/public/styles/index.css index 5978f9d..a368066 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -59,8 +59,9 @@ div[data-title]:hover:after{ body { height: 900px; - background-image: url(https://images2.pixlis.com/background-image-plaid-checkered-seamless-tileable-235ftm.png); + background-image: url(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTEnqKdVtLbxjKuNsCSCxFRhTOpp3Gm0gsU8bMgA_MeUYyzrUFy); background-size: contain; + background-repeat: repeat-x; background-attachment: fixed; /*background-color: #B78996;*/ diff --git a/website/queries/login.php b/website/queries/login.php new file mode 100644 index 0000000..23cdbcd --- /dev/null +++ b/website/queries/login.php @@ -0,0 +1,18 @@ +prepare(" + SELECT + `password` + FROM + `user` + WHERE + `username` = :username + "); + + $stmt->bindParam(":username", $_POST["uname"]); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); +} + +?> diff --git a/website/queries/register.php b/website/queries/register.php new file mode 100644 index 0000000..4d7d593 --- /dev/null +++ b/website/queries/register.php @@ -0,0 +1,57 @@ +prepare(" + SELECT * FROM `user` WHERE `username` = :username + "); + + $stmt->bindParam(":username", $_POST["username"]); + $stmt->execute(); + return $stmt->rowCount(); + +} + +function getExistingEmail() { + $stmt = $GLOBALS["db"]->prepare(" + SELECT * FROM `user` WHERE `email` = :email + "); + + $stmt->bindParam(":email", $_POST["email"]); + $stmt->execute(); + return $stmt->rowCount(); +} + +function registerAccount() { + $stmt = $GLOBALS["db"]->prepare(" + INSERT INTO + `user`(fname, + lname, + birthdate, + username, + password, + location, + email) + VALUES( + :fname, + :lname, + :bday, + :username, + :password, + :location, + :email + )"); + + $hash=password_hash($_POST["password"], PASSWORD_DEFAULT); + + $stmt->bindParam(":fname", $_POST["name"]); + $stmt->bindParam(":lname", $_POST["surname"]); + $stmt->bindParam(":bday", $_POST["bday"]); + $stmt->bindParam(":username", $_POST["username"]); + $stmt->bindParam(":password", $hash); + $stmt->bindParam(":location", $_POST["location"]); + $stmt->bindParam(":email", $_POST["email"]); + + print("execute".$stmt->execute()); + print("count".$stmt->rowCount()); +} +?> diff --git a/website/queries/settings.php b/website/queries/settings.php index 66ddda8..bd9e542 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -10,9 +10,9 @@ function getSettings() { `birthdate`, `bio`, `profilepicture` - FROM + FROM `user` - WHERE + WHERE `userID` = :userID "); @@ -43,4 +43,4 @@ function updateSettings() { $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); -} \ No newline at end of file +} diff --git a/website/views/register-view.php b/website/views/register-view.php index a184f71..3ccc978 100644 --- a/website/views/register-view.php +++ b/website/views/register-view.php @@ -94,28 +94,16 @@ * - + - - - -- 2.49.1 From ed0d0990adf858a985cd4b0918dbd2f3bd99d98d Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 13:14:06 +0100 Subject: [PATCH 024/322] Removed LaTeX pdf frop git --- .gitignore | 2 +- projectplan/projectplan.pdf | Bin 44839 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 projectplan/projectplan.pdf diff --git a/.gitignore b/.gitignore index b1a2ad1..49adb33 100644 --- a/.gitignore +++ b/.gitignore @@ -117,7 +117,7 @@ Temporary Items # *.pdf ## Generated if empty string is given at "Please type another file name for output:" -projectplan.pdf +projectplan/projectplan.pdf ## Bibliography auxiliary files (bibtex/biblatex/biber): *.bbl diff --git a/projectplan/projectplan.pdf b/projectplan/projectplan.pdf deleted file mode 100644 index e41b19d7edf00e6d51fc296410aa7724192b642f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44839 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 k7{FE%3AO(HT-@AET;080EiBn+a -- 2.49.1 From b201d8287856990da373e2e936c94bef0566a2d9 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 13:14:43 +0100 Subject: [PATCH 025/322] Projectplan now has the "Planning" --- projectplan/projectplan.tex | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/projectplan/projectplan.tex b/projectplan/projectplan.tex index 42c6475..8605209 100644 --- a/projectplan/projectplan.tex +++ b/projectplan/projectplan.tex @@ -14,6 +14,9 @@ \documentclass{uva-inf-article} \usepackage[dutch]{babel} \usepackage{enumitem} +\usepackage{pgfgantt} +\usepackage{pdflscape} +\usepackage{geometry} %------------------------------------------------------------------------------- % GEGEVENS VOOR IN DE TITEL @@ -173,6 +176,82 @@ Voor deze opdracht hebben we met 5 mensen 4 weken de tijd. %Zet de planning indien gewenst in een apart document %\input{planning} +\newgeometry{top=20mm, bottom=20mm, left=10mm, right=10mm} +\begin{landscape} +\begin{ganttchart}[ + vgrid, + hgrid, + x unit=1cm, + y unit title=.6cm, + y unit chart=.7cm, + group left peak width=.2, + group right peak width=.2 + ]{1}{21} + \gantttitle{MyHyvesBook+}{21} \ganttnewline + \gantttitle{Week 1}{5} + \gantttitle{Week 2}{5} + \gantttitle{Week 3}{5} + \gantttitle{Week 4}{5} \ganttnewline + \gantttitlelist{9,...,13}{1} + \gantttitlelist{16,...,20}{1} + \gantttitlelist{23,...,27}{1} + \gantttitlelist{30,31,1,2,3}{1} \ganttnewline + + \ganttbar{Inleiden}{1}{1} \ganttnewline + + \ganttlinkedgroup{Frontend}{2}{5} \ganttnewline + + \ganttbar{html/views}{2}{5} \ganttnewline + \ganttbar{css/styles}{2}{5} \ganttnewline + \ganttbar{javascript}{2}{5} \ganttnewline + \ganttmilestone{Week 1}{5} \ganttnewline + + \ganttlink[link mid=.833]{elem2}{elem5} + \ganttlink[link mid=.75]{elem3}{elem5} + \ganttlink[link mid=.5]{elem4}{elem5} + + \ganttlinkedgroup{Backend}{6}{10} \ganttnewline + + \ganttbar{Database/PhpMyAdmin}{6}{6} \ganttnewline + \ganttbar{SQL-queries/MySql}{7}{10} \ganttnewline + \ganttbar{Forms/php}{6}{10} \ganttnewline + \ganttbar{Livechat/AJAX, PHP}{6}{10} \ganttnewline + \ganttmilestone{Week 2}{10} \ganttnewline + + \ganttlink[link mid=.5]{elem7}{elem8} + \ganttlink[link mid=.833]{elem8}{elem11} + \ganttlink[link mid=.75]{elem9}{elem11} + \ganttlink[link mid=.5]{elem10}{elem11} + + \ganttbar{Beveiliging/testen}{6}{15} \ganttnewline + + \ganttgroup{Gebruiksvriendleijk}{11}{15} \ganttnewline + \ganttbar{Mobileformaat}{11}{15} \ganttnewline + \ganttbar{Restyle}{11}{15} \ganttnewline + \ganttbar{Extra's}{11}{15} \ganttnewline + \ganttbar{Code opschonen}{14}{15} \ganttnewline + + \ganttmilestone{Week 3}{15} \ganttnewline + \ganttlink[link mid=.75]{elem11}{elem13} + \ganttlink[link mid=.917]{elem12}{elem18} + \ganttlink[link mid=.875]{elem14}{elem18} + \ganttlink[link mid=.833]{elem15}{elem18} + \ganttlink[link mid=.75]{elem16}{elem18} + \ganttlink[link mid=.5]{elem17}{elem18} + + \ganttlinkedgroup{Afronding}{16}{20} \ganttnewline + \ganttbar{Rapport}{16}{20} \ganttnewline + \ganttbar{Documentatie}{16}{20} \ganttnewline + \ganttbar{Demo}{18}{20} \ganttnewline + + \ganttmilestone{Finshed!}{20} + \ganttlink[link mid=.833]{elem20}{elem23} + \ganttlink[link mid=.75]{elem21}{elem23} + \ganttlink[link mid=.5]{elem22}{elem23} + +\end{ganttchart} +\end{landscape} + %------------------------------------------------------------------------------- % BIJLAGEN EN EINDE -- 2.49.1 From d627c8a83742360c3c79d6057ace31f5a0727147 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 13:46:50 +0100 Subject: [PATCH 026/322] Projectplan --- projectplan/projectplan.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/projectplan/projectplan.tex b/projectplan/projectplan.tex index 8605209..bcd0fce 100644 --- a/projectplan/projectplan.tex +++ b/projectplan/projectplan.tex @@ -178,6 +178,7 @@ Voor deze opdracht hebben we met 5 mensen 4 weken de tijd. %\input{planning} \newgeometry{top=20mm, bottom=20mm, left=10mm, right=10mm} \begin{landscape} +\section{Planning} \begin{ganttchart}[ vgrid, hgrid, -- 2.49.1 From b5ceb1b5e0fe7edee7d0dcec754e68ac03fbabe1 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Wed, 18 Jan 2017 14:20:32 +0100 Subject: [PATCH 027/322] add pagetype selector, add search filter --- website/public/styles/adminpanel.css | 10 +++- website/queries/user.php | 28 +++++++++ website/views/adminpanel.php | 88 +++++++++++++++++++++------- 3 files changed, 104 insertions(+), 22 deletions(-) diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index 5a9fb7e..c8e29b6 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -32,7 +32,7 @@ margin-bottom: 10px; } -.admin-filter, .admin-filtertype { +.admin-filter, .admin-filtertype, .admin-groupfilter { display: inline-block; margin: 10px; vertical-align: top; @@ -40,6 +40,14 @@ margin-left: 50px; } +.admin-filter, .admin-groupfilter { + width: 120px; +} + +.admin-groupfilter { + display: none; +} + .admin-users { margin: 10px; } diff --git a/website/queries/user.php b/website/queries/user.php index 8029154..42d90bc 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -41,4 +41,32 @@ function search20UsersFromN($db, $n, $keyword) { return $q; } +function search20UsersFromNByStatus($db, $n, $keyword, $status) { + $q = $db->prepare(" + SELECT + `userID`, + `username`, + `role`, + `bancomment` + FROM + `user` + WHERE + `username` LIKE :keyword AND + FIND_IN_SET (`role`, :statuses) + ORDER BY + `username` + LIMIT + :n, 20 + "); + + $keyword = "%$keyword%"; + $q->bindParam(':keyword', $keyword); + $q->bindParam(':n', $n, PDO::PARAM_INT); + $statuses = implode(',', $status); + $q->bindParam(':statuses', $statuses); + $q->execute(); + return $q; +} + + ?> diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index a8cdb73..8ce9fb1 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -4,6 +4,10 @@ Admin Panel @@ -20,13 +35,14 @@ ">
-
+ +

Show:

- > + + >
- > + >
- > + >
- > + >
- > - + > +
+ > +
+ +
+

Show:

+ + > +
+ > +
+ > +
+
+

Page Type:

> + + onchange="changeFilter()">
> + + onchange="changeFilter()">
+

Batch Actions:

@@ -107,8 +151,10 @@ function test_input($data) {

+

Users:

+
1 / 1 @@ -126,8 +172,9 @@ function test_input($data) {
Action
- -
-- 2.49.1 From e80ce3b793adee1844f826f7aa8aa41b91fd20af Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Wed, 18 Jan 2017 14:22:03 +0100 Subject: [PATCH 028/322] Improved selectAllFriends query --- website/queries/friendship.php | 46 +++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/website/queries/friendship.php b/website/queries/friendship.php index 45a599e..94cd123 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -1,24 +1,30 @@ query(" - SELECT - `user`.`username`, - `user`.`profilepicture`, - `user`.`onlinestatus`, - `user`.`role` - FROM - `user` - INNER JOIN - `friendship` - WHERE - `friendship`.`user1ID` = $userID AND - `friendship`.`user2ID` = `user`.`userID` OR - `friendship`.`user2ID` = $userID AND - `friendship`.`user1ID` = `user`.`userID`" - ); + $stmt = $db->prepare(" + SELECT + `username`, + IFNULL( + `profilepicture`, + 'img/notbad.png' + ) AS profilepicture, + `onlinestatus`, + `role` + FROM + `user` + INNER JOIN + `friendship` + WHERE + (`friendship`.`user1ID` = :userID AND + `friendship`.`user2ID` = `user`.`userID` OR + `friendship`.`user2ID` = :userID AND + `friendship`.`user1ID` = `user`.`userID`) AND + `role` != 5 AND + `status` = 1 + "); + + $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); + $stmt->execute(); + return $stmt; } - - - -?> \ No newline at end of file -- 2.49.1 From bdf5c221a7026fcd4e9a4477664e41bb776d37e1 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Wed, 18 Jan 2017 14:23:36 +0100 Subject: [PATCH 029/322] Added queries related to users. --- website/queries/user.php | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 website/queries/user.php diff --git a/website/queries/user.php b/website/queries/user.php new file mode 100644 index 0000000..a73c16c --- /dev/null +++ b/website/queries/user.php @@ -0,0 +1,72 @@ +prepare(" + SELECT + `username`, + IFNULL( + `profilepicture`, + 'img/notbad.png' + ) AS profilepicture, + `bio`, + `role`, + `onlinestatus`, + `loggedin`, + `fname`, + `lname` + FROM + `user` + WHERE + `userID` = :userID + "); + + $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetch(); +} + +function selectAllUserGroups($db, $userID) { + $stmt = $db->prepare(" + SELECT + `group_page`.`groupID`, + `name`, + `picture`, + `userID` + FROM + `group_page` + INNER JOIN + `group_member` + ON + `group_page`.`groupID` = `group_member`.`groupID` + WHERE + `userID` = :userID AND + `status` = 1 + "); + + $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); + $stmt->execute(); + return $stmt; +} + +function selectAllUserPosts($db, $userID) { + $stmt = $db->prepare(" + SELECT + `postID`, + `author`, + `title`, + `content`, + `creationdate` + FROM + `post` + WHERE + `author` = :userID AND + `groupID` IS NULL + ORDER BY + `creationdate` DESC + "); + + $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); + $stmt->execute(); + return $stmt; +} \ No newline at end of file -- 2.49.1 From 19f525d168703a217ba6dfc981b3e91c05511388 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 18 Jan 2017 14:34:15 +0100 Subject: [PATCH 030/322] Live chatting now shows up in the chat-history --- website/public/chat.php | 2 +- website/public/js/chat.js | 50 +++++++++++++++++++++++ website/public/js/sendMessage.js | 14 ------- website/public/sendMessage.php | 2 +- website/queries/private_message.php | 46 ++++++++++++++++++--- website/views/chat-view.php | 63 +++++++++++++++++------------ website/views/head.php | 2 + 7 files changed, 132 insertions(+), 47 deletions(-) create mode 100644 website/public/js/chat.js delete mode 100644 website/public/js/sendMessage.js diff --git a/website/public/chat.php b/website/public/chat.php index 150638d..09be336 100644 --- a/website/public/chat.php +++ b/website/public/chat.php @@ -5,7 +5,7 @@ - + \ +
\ + ' + messages[i].content + '\ +
\ + \ + '); + } +} \ No newline at end of file diff --git a/website/public/js/sendMessage.js b/website/public/js/sendMessage.js deleted file mode 100644 index 1c300b2..0000000 --- a/website/public/js/sendMessage.js +++ /dev/null @@ -1,14 +0,0 @@ -// $("#sendMessageForm").submit(function(e) { -function sendMessage() { - console.log($("#sendMessageForm").serialize()); - $.post( - "sendMessage.php", - $("#sendMessageForm").serialize() - ).done(function( data ) { - alert( "Data Loaded: " + data ); - }); -} - -function loadMessages() { - -} \ No newline at end of file diff --git a/website/public/sendMessage.php b/website/public/sendMessage.php index c0dde12..e555e2a 100644 --- a/website/public/sendMessage.php +++ b/website/public/sendMessage.php @@ -5,7 +5,7 @@ include_once("../queries/private_message.php"); if (isset($_POST["destination"]) && isset($_POST["content"])) { - if (sendMessage($db, $_POST["destination"], $_POST["content"])) { + if (sendMessage($_POST["destination"], $_POST["content"])) { echo $_POST["content"] . " is naar " . $_POST["destination"] . " gestuurd"; } else { echo "YOU FAILED!!!"; diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 22fb085..56c0c26 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -1,7 +1,13 @@ prepare(" SELECT * @@ -13,16 +19,15 @@ function get100ChatMessagesFromN($n, $user1ID, $user2ID) { `origin` = :user2 AND `destination` = :user1 ORDER BY - `creationdate` DESC - LIMIT - :n, 100 + `messageID` ASC "); $stmt->bindParam(":user1", $user1ID); $stmt->bindParam(":user2", $user2ID); - $stmt->bindParam(":n", $n); - return $stmt->execute(); + $stmt->execute(); + + return json_encode($stmt->fetchAll()); } function sendMessage($destination, $content) { @@ -48,4 +53,33 @@ function sendMessage($destination, $content) { "destination" => $destination, "content" => $content )); +} + +function getNewChatMessages($lastID, $destination) { + $db = $GLOBALS["db"]; + $origin = 2; + + $stmt = $db->prepare(" + SELECT + * + FROM + `private_message` + WHERE + ( + `origin` = :user1 AND + `destination` = :user2 OR + `origin` = :user2 AND + `destination` = :user1) AND + `messageID` > :lastID + ORDER BY + `messageID` ASC + "); + + $stmt->bindParam(':user1', $origin); + $stmt->bindParam(':user2', $destination); + $stmt->bindParam(':lastID', $lastID); + + $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 6b6aecd..dabd348 100644 --- a/website/views/chat-view.php +++ b/website/views/chat-view.php @@ -10,32 +10,43 @@
-
-
-
Hi!
-
-
-
Hi!
-
-
-
How it's going?
-
-
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
Hi!
-
-
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
diff --git a/website/views/head.php b/website/views/head.php index 9306edf..39e29af 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -17,4 +17,6 @@ include_once("../queries/connect.php"); +session_start(); + ?> \ No newline at end of file -- 2.49.1 From 0808d46d9ec52a70af07bc0f7d22ec4c99291301 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Wed, 18 Jan 2017 14:46:32 +0100 Subject: [PATCH 031/322] Added salting and no similar username --- website/public/login.php | 10 ++++++---- website/public/register.php | 6 +++--- website/queries/login.php | 5 +++-- website/queries/register.php | 15 ++++++++++----- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/website/public/login.php b/website/public/login.php index 40907a7..82570a6 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -21,14 +21,16 @@ } else { - $uname=$_POST["uname"]; + $uname=strtolower($_POST["uname"]); $psw=$_POST["psw"]; $hash=hashPassword()["password"]; - + $userid=hashPassword()["userID"]; + // If there's an account, go to the profile page - if(password_verify($psw, $hash)) { + if(password_verify($psw.$uname, $hash)) { + $_SESSION["userID"] = $userid; + header("location: /profile.php"); - header("location: myhyvesbookplus.nl/profile.php"); } else { $loginErr = "Inloggegevens zijn niet correct"; } diff --git a/website/public/register.php b/website/public/register.php index 8b8f4e6..2299cf0 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -88,9 +88,9 @@ $usernameErr = "Gebruikersnaam moet minstens 6 karakters bevatten"; $correct = false; - } else if (getExistingUser() == 1 ){ + } else if (getExistingUsername() == 1){ $usernameErr = "Gebruikersnaam bestaat al"; - $correct = false; + $correct = false; } } @@ -153,7 +153,7 @@ } else { registerAccount(); - // header("location: login.php"); + header("location: login.php"); } } diff --git a/website/queries/login.php b/website/queries/login.php index 23cdbcd..c710833 100644 --- a/website/queries/login.php +++ b/website/queries/login.php @@ -3,11 +3,12 @@ function hashPassword() { $stmt = $GLOBALS["db"]->prepare(" SELECT - `password` + `password`, + `userID` FROM `user` WHERE - `username` = :username + `username` LIKE :username "); $stmt->bindParam(":username", $_POST["uname"]); diff --git a/website/queries/register.php b/website/queries/register.php index 4d7d593..9881872 100644 --- a/website/queries/register.php +++ b/website/queries/register.php @@ -1,8 +1,13 @@ prepare(" - SELECT * FROM `user` WHERE `username` = :username + SELECT + `username` + FROM + `user` + WHERE + `username` LIKE :username "); $stmt->bindParam(":username", $_POST["username"]); @@ -41,7 +46,7 @@ function registerAccount() { :email )"); - $hash=password_hash($_POST["password"], PASSWORD_DEFAULT); + $hash=password_hash($_POST["password"].(strtolower($_POST["username"])), PASSWORD_DEFAULT); $stmt->bindParam(":fname", $_POST["name"]); $stmt->bindParam(":lname", $_POST["surname"]); @@ -51,7 +56,7 @@ function registerAccount() { $stmt->bindParam(":location", $_POST["location"]); $stmt->bindParam(":email", $_POST["email"]); - print("execute".$stmt->execute()); - print("count".$stmt->rowCount()); + $stmt->execute(); + $stmt->rowCount(); } ?> -- 2.49.1 From 4fe142eb51aa82d0600f17bae7031caddce6eff3 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 14:50:11 +0100 Subject: [PATCH 032/322] Projectplan added to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b1a2ad1..49adb33 100644 --- a/.gitignore +++ b/.gitignore @@ -117,7 +117,7 @@ Temporary Items # *.pdf ## Generated if empty string is given at "Please type another file name for output:" -projectplan.pdf +projectplan/projectplan.pdf ## Bibliography auxiliary files (bibtex/biblatex/biber): *.bbl -- 2.49.1 From e73fcd420c70124544a27438775a3774b15a7df4 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 14:51:03 +0100 Subject: [PATCH 033/322] settings succes mesages --- website/public/settings.php | 4 ++-- website/public/styles/settings.css | 11 +++++++++ website/queries/settings.php | 37 ++++++++++++++++++++++++------ website/views/settings-view.php | 7 ++++++ 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/website/public/settings.php b/website/public/settings.php index e21ce9b..97c47e4 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -19,10 +19,10 @@ include("../views/main.php"); if ($_SERVER["REQUEST_METHOD"] == "POST") { switch ($_POST["form"]) { case "profile": - updateSettings(); + $result = updateSettings(); break; case "password": - updatePassword(); + $result = updatePassword(); break; case "email": break; diff --git a/website/public/styles/settings.css b/website/public/styles/settings.css index f1648c8..933e7fd 100644 --- a/website/public/styles/settings.css +++ b/website/public/styles/settings.css @@ -5,6 +5,17 @@ .settings-password { margin-right: 15px; } +.settings-message { + color: white; +} +.settings-message-angry { + background-color: firebrick; +} + +.settings-message-happy { + background-color: forestgreen; + +} .settings li { diff --git a/website/queries/settings.php b/website/queries/settings.php index ee37688..1d47d32 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -24,7 +24,8 @@ function getSettings() { function getPasswordHash() { $stmt = $GLOBALS["db"]->prepare(" SELECT - `password` + `password`, + `username` FROM `user` WHERE @@ -57,19 +58,40 @@ function updateSettings() { $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); + + return array ( + "type" => "settings-message-happy", + "message" => "Instellingen zijn opgeslagen." + ); } function updatePassword() { - if (password_verify($_POST["password-old"], getPasswordHash()["password"])) { - if ($_POST["password-new"] == $_POST["password-confirm"]) { - changePassword(); + $user = getPasswordHash(); + if (password_verify($_POST["password-old"].strtolower($user["username"]), $user["password"])) { + if ($_POST["password-new"] == $_POST["password-confirm"] && (strlen($_POST["password-new"]) >= 8)) { + if (changePassword($user)) { + return array ("type" => "settings-message-happy", + "message" => "Wachtwoord gewijzigd."); + } else { + return array ( + "type" => "settings-message-angry", + "message" => "Er is iets mis gegaan."); + } + } else { + return array ( + "type" => "settings-message-angry", + "message" => "Wachtwoorden komen niet oveeen." + ); } } else { - print("Did not match"); + return array( + "type" => "settings-message-angry", + "message" => "Oud wachtwoord niet correct." + ); } } -function changePassword() { +function changePassword($user) { $stmt =$GLOBALS["db"]->prepare(" UPDATE `user` @@ -79,8 +101,9 @@ function changePassword() { `userID` = :userID "); - $hashed_password = password_hash($_POST["password-new"], PASSWORD_DEFAULT); + $hashed_password = password_hash($_POST["password-new"].strtolower($user["username"]), PASSWORD_DEFAULT); $stmt->bindParam(":new_password", $hashed_password); $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); + return $stmt->rowCount(); } \ No newline at end of file diff --git a/website/views/settings-view.php b/website/views/settings-view.php index ffc7c74..a4fc139 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -4,6 +4,13 @@ $settings = getSettings();
+ + ${result["message"]} +
"; + } + ?>
Profiel Instellingen
    -- 2.49.1 From e7ceb254ce09d62537d1e203913fd78909798cc3 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 14:57:16 +0100 Subject: [PATCH 034/322] No standard marijn user --- website/public/settings.php | 1 - 1 file changed, 1 deletion(-) diff --git a/website/public/settings.php b/website/public/settings.php index 97c47e4..22ae99c 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -3,7 +3,6 @@ -- 2.49.1 From 37ad2e0ea48424c54508ceb240c38a6893a22cc1 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 15:08:48 +0100 Subject: [PATCH 035/322] New placeholder for date --- website/views/settings-view.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/views/settings-view.php b/website/views/settings-view.php index a4fc139..3e68fe4 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -47,7 +47,7 @@ $settings = getSettings(); " > -- 2.49.1 From 95fd3c0040abd55e1e0e90b409d8d8283a931976 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 18 Jan 2017 15:09:52 +0100 Subject: [PATCH 036/322] chat is done? --- website/public/js/chat.js | 7 ++ website/public/styles/chat.css | 4 ++ website/queries/friendship.php | 1 + website/queries/private_message.php | 6 +- website/views/chat-view.php | 100 +++++++++++++++++++--------- 5 files changed, 84 insertions(+), 34 deletions(-) diff --git a/website/public/js/chat.js b/website/public/js/chat.js index 5b56586..dd0b00f 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -12,6 +12,7 @@ function loadMessages() { messages = JSON.parse(data); addMessages(messages); $("#lastID").val(messages[messages.length - 1].messageID); + $("#chat-history").scrollTop($("#chat-history")[0].scrollHeight); } }); @@ -47,4 +48,10 @@ function addMessages(messages) {
\ '); } +} + +function switchUser(userID) { + $(".destinationID").val(userID); + $("#chat-history").html(""); + $("#lastID").val(""); } \ No newline at end of file diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index 8f486bb..132c750 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -16,6 +16,10 @@ overflow-y: auto; } +.chat-left .friend-item { + cursor: pointer; +} + .chat-right { width: calc(100% - 256px - 40px); height: calc(100% - 80px); diff --git a/website/queries/friendship.php b/website/queries/friendship.php index 56ce274..dc7a669 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -3,6 +3,7 @@ function selectAllFriends($db, $userID) { return $db->query(" SELECT + `user`.`userID`, `user`.`username`, `user`.`profilepicture`, `user`.`onlinestatus`, diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 56c0c26..6cf8b16 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -6,7 +6,7 @@ session_start(); function getOldChatMessages($user2ID) { $db = $GLOBALS["db"]; - $user1ID = 2; + $user1ID = $_SESSION["userID"]; $stmt = $db->prepare(" SELECT @@ -49,7 +49,7 @@ function sendMessage($destination, $content) { "); return $stmt->execute(array( - "origin" => 2, + "origin" => $_SESSION["userID"], "destination" => $destination, "content" => $content )); @@ -57,7 +57,7 @@ function sendMessage($destination, $content) { function getNewChatMessages($lastID, $destination) { $db = $GLOBALS["db"]; - $origin = 2; + $origin = $_SESSION["userID"]; $stmt = $db->prepare(" SELECT diff --git a/website/views/chat-view.php b/website/views/chat-view.php index dabd348..1f9a0d8 100644 --- a/website/views/chat-view.php +++ b/website/views/chat-view.php @@ -1,40 +1,76 @@
-
- $username$role$bancomment -
- - - -
-
+ $username$role$bancomment +
+ + + +
+
+ $name$role$description +
+ + + +
+
+
+            
+        
-- 2.49.1 From 097ccf49b3e1d29a90823444b57d33aa291b7f42 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 15:27:51 +0100 Subject: [PATCH 039/322] New Button --- website/public/external/nietslecht_button.png | Bin 62172 -> 64763 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/website/public/external/nietslecht_button.png b/website/public/external/nietslecht_button.png index 4fca19ad6673ce8b2209286055d930a0d8ce14fd..74b6baa407bcd931e3cb5e988bf69f91c82441bd 100644 GIT binary patch literal 64763 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 M85QYbN#p1L2U(Tw(*OVf literal 62172 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 Y-t4_rCU%hGC>j1!lvBQtea_hTf0a@4!T Date: Wed, 18 Jan 2017 15:37:49 +0100 Subject: [PATCH 040/322] Fixed Chat! --- website/public/js/chat.js | 2 +- website/public/styles/chat.css | 4 ---- website/queries/private_message.php | 2 +- website/views/chat-view.php | 28 ++-------------------------- 4 files changed, 4 insertions(+), 32 deletions(-) diff --git a/website/public/js/chat.js b/website/public/js/chat.js index dd0b00f..cf33f69 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -34,7 +34,7 @@ function sendMessage() { function addMessages(messages) { for(i in messages) { - if (messages[i].origin == 2) { + if (messages[i].destination == $(".destinationID").val()) { type = "chat-message-self"; } else { type = "chat-message-other"; diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index 132c750..8f486bb 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -16,10 +16,6 @@ overflow-y: auto; } -.chat-left .friend-item { - cursor: pointer; -} - .chat-right { width: calc(100% - 256px - 40px); height: calc(100% - 80px); diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 6cf8b16..2d953c5 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -49,7 +49,7 @@ function sendMessage($destination, $content) { "); return $stmt->execute(array( - "origin" => $_SESSION["userID"], + "origin" => $_SESSION["userID"], "destination" => $destination, "content" => $content )); diff --git a/website/views/chat-view.php b/website/views/chat-view.php index 1f9a0d8..a3acd4c 100644 --- a/website/views/chat-view.php +++ b/website/views/chat-view.php @@ -47,30 +47,6 @@
- - - - - - - - - - - - - - - - - - - - - - - -
@@ -89,7 +65,7 @@ Date: Wed, 18 Jan 2017 15:53:10 +0100 Subject: [PATCH 041/322] Fixed login link --- website/public/login.php | 6 +++--- website/public/styles/index.css | 14 +++++++------- website/queries/register.php | 10 ++++++++-- website/views/login-view.php | 8 +++++--- website/views/register-view.php | 6 ++++-- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/website/public/login.php b/website/public/login.php index 82570a6..09dce8c 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -15,21 +15,21 @@ // Trying to login if ($_SERVER["REQUEST_METHOD"] == "POST") { + $uname=strtolower($_POST["uname"]); // Empty username or password field if (empty($_POST["uname"]) || empty($_POST["psw"])) { $loginErr = "Gebruikersnaam of wachtwoord is niet ingevuld"; } else { - $uname=strtolower($_POST["uname"]); $psw=$_POST["psw"]; $hash=hashPassword()["password"]; $userid=hashPassword()["userID"]; - + // If there's an account, go to the profile page if(password_verify($psw.$uname, $hash)) { $_SESSION["userID"] = $userid; - header("location: /profile.php"); + header("location: profile.php"); } else { $loginErr = "Inloggegevens zijn niet correct"; diff --git a/website/public/styles/index.css b/website/public/styles/index.css index a368066..c7d482f 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -60,7 +60,7 @@ body { height: 900px; background-image: url(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTEnqKdVtLbxjKuNsCSCxFRhTOpp3Gm0gsU8bMgA_MeUYyzrUFy); - background-size: contain; + background-size: cover; background-repeat: repeat-x; background-attachment: fixed; @@ -109,10 +109,10 @@ form { border: 5px solid #325da3; background-color: #a87a87; border-radius: 12px; - height: 57%; - margin: 8px auto; + height: 55%; + margin: 35px auto; width: 45%; - overflow: auto; + overflow-y:auto; } /* inlog titel */ @@ -135,14 +135,14 @@ input[type=text], input[type=password], input[type=email], input[type="date"] { box-sizing: border-box; display: inline-block; height: 50%; - padding: 12px 20px; - margin: 8px 0; + padding: 8px 20px; + margin: 4px 0; width: 50%; font-family: Arial; font-size: 16px; } -input[type=submit] { +button[type=submit] { background-color: #845663; border: 2px solid black; border-radius: 12px; diff --git a/website/queries/register.php b/website/queries/register.php index 9881872..893bb3a 100644 --- a/website/queries/register.php +++ b/website/queries/register.php @@ -18,12 +18,18 @@ function getExistingUsername() { function getExistingEmail() { $stmt = $GLOBALS["db"]->prepare(" - SELECT * FROM `user` WHERE `email` = :email + SELECT + `email` + FROM + `user` + WHERE + `email` LIKE :email "); $stmt->bindParam(":email", $_POST["email"]); $stmt->execute(); return $stmt->rowCount(); + } function registerAccount() { @@ -54,7 +60,7 @@ function registerAccount() { $stmt->bindParam(":username", $_POST["username"]); $stmt->bindParam(":password", $hash); $stmt->bindParam(":location", $_POST["location"]); - $stmt->bindParam(":email", $_POST["email"]); + $stmt->bindParam(":email", (strtolower($_POST["email"]))); $stmt->execute(); $stmt->rowCount(); diff --git a/website/views/login-view.php b/website/views/login-view.php index e70d96b..df29cbc 100644 --- a/website/views/login-view.php +++ b/website/views/login-view.php @@ -27,7 +27,7 @@
@@ -36,10 +36,12 @@ diff --git a/website/views/register-view.php b/website/views/register-view.php index 3ccc978..b7efbc8 100644 --- a/website/views/register-view.php +++ b/website/views/register-view.php @@ -120,10 +120,12 @@ -- 2.49.1 From df9f782809173e2d42c3e431fd234c60741d64e2 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 18 Jan 2017 15:54:13 +0100 Subject: [PATCH 042/322] Friends in the menu now redirects to the users profile. --- website/public/styles/menu.css | 13 +++++++++++++ website/views/menu.php | 20 ++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/website/public/styles/menu.css b/website/public/styles/menu.css index 7778545..45163de 100644 --- a/website/public/styles/menu.css +++ b/website/public/styles/menu.css @@ -25,3 +25,16 @@ font-size: 14px; cursor: pointer; } + +.friend-item { + cursor: pointer; +} + +.menu button { + background: none; + color: #333; + width: 100%; + height: 100%; + padding: 0; + text-align: left; +} \ No newline at end of file diff --git a/website/views/menu.php b/website/views/menu.php index 5486cd6..731b284 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -34,14 +34,18 @@ // Echo the friend. echo " - -
  • -
    - PF - $username -
    -
  • -
    +
  • +
    + +
    +
  • "; } if ($i > 1) { -- 2.49.1 From 62d77fc61664fca1ca266cbe753dd481e7e2bfa1 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Wed, 18 Jan 2017 15:56:59 +0100 Subject: [PATCH 043/322] Added query needed to get userID --- website/queries/user.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/website/queries/user.php b/website/queries/user.php index a73c16c..fee8fe8 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -1,6 +1,21 @@ prepare(" + SELECT + `userID` + FROM + `user` + WHERE + LOWER(`username`) = LOWER(:username) + "); + + $stmt->bindParam(':username', $username, PDO::PARAM_STR); + $stmt->execute(); + return $stmt->fetch()["userID"]; +} + function selectUser($db, $userID) { $stmt = $db->prepare(" SELECT @@ -41,7 +56,7 @@ function selectAllUserGroups($db, $userID) { `group_page`.`groupID` = `group_member`.`groupID` WHERE `userID` = :userID AND - `status` = 1 + `role` = 1 "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); -- 2.49.1 From e7e3ae9c8be3492b20fcddd0c16d444099ee17b9 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Wed, 18 Jan 2017 15:57:39 +0100 Subject: [PATCH 044/322] add changing single group status --- website/queries/group_page.php | 14 ++++++++++++++ website/queries/user.php | 1 + website/views/adminpanel.php | 8 +++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/website/queries/group_page.php b/website/queries/group_page.php index 8f04ca3..c6db01b 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -80,6 +80,20 @@ function search20GroupsFromNByStatus($db, $n, $keyword, $status) { return $q; } +function changeGroupStatusByID($db, $id, $status) { + $q = $db->query(" + UPDATE + `group_page` + SET + `status` = $status + WHERE + `groupID` = $id + "); + + return $q; +} + + ?> diff --git a/website/queries/user.php b/website/queries/user.php index de8c52b..bfd9579 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -54,6 +54,7 @@ function search20UsersFromNByStatus($db, $n, $keyword, $status) { `username` LIKE :keyword AND FIND_IN_SET (`role`, :statuses) ORDER BY + `role`, `username` LIMIT :n, 20 diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index d478003..5a3ba97 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -62,6 +62,8 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { if (!empty($_POST["actions"]) && !empty($_POST["userID"])) { changeUserStatusByID($db, $_POST["userID"], $_POST["actions"]); + } elseif (!empty($_POST["actions"]) && !empty($_POST["groupID"])) { + changeGroupStatusByID($db, $_POST["groupID"], $_POST["actions"]); } } @@ -239,9 +241,9 @@ function test_input($data) { action='$thispage' method='post'> -- 2.49.1 From e86a6a6d6f27f187d2c74e065ebd53a0cdd42610 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Wed, 18 Jan 2017 16:01:26 +0100 Subject: [PATCH 045/322] Changed queries include --- website/views/head.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/views/head.php b/website/views/head.php index fc28320..9306edf 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -15,6 +15,6 @@ \ No newline at end of file -- 2.49.1 From 3ee5488a88ad92cd7a5fddcaeb570459b8995768 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Wed, 18 Jan 2017 16:02:11 +0100 Subject: [PATCH 046/322] Improved profile page, profile now takes data from the DB! --- website/public/profile.php | 57 +++++++++++++++++ website/views/profile.php | 125 ++++++++++--------------------------- 2 files changed, 90 insertions(+), 92 deletions(-) diff --git a/website/public/profile.php b/website/public/profile.php index d82fe48..4854080 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -1,3 +1,60 @@ + $unix_date) { + $difference = $now - $unix_date; + $tense = "geleden"; + } else { + $difference = $unix_date - $now; + $tense = "vanaf nu"; + } + + for($i = 0; $difference >= $lengths[$i] && $i < count($lengths) - 1; $i++) { + $difference /= $lengths[$i]; + } + + $difference = round($difference); + + if($difference != 1) { + $period = $multiple_periods[$i]; + } else { + $period = $single_periods[$i]; + } + + return "$difference $period $tense"; +} + +if(empty($_GET["username"])) { + echo "User does not exist!"; + return; +} + +$userID = getUserID($db, $_GET["username"]); + +$user = selectUser($db, $userID); +$friends = selectAllFriends($db, $userID); +$groups = selectAllUserGroups($db, $userID); +$posts = selectAllUserPosts($db, $userID); + +?> + diff --git a/website/views/profile.php b/website/views/profile.php index 8f5efe2..395dd15 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -1,113 +1,54 @@
    - + ">

    Als vriend toevoegen

    -

    [gebruikersnaam]

    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec dictum turpis quam, eu ultrices sapien hendrerit tincidunt. Nunc aliquam neque turpis, id porta quam iaculis id. Sed suscipit, nisl a fermentum congue, nunc augue finibus lectus, id varius nunc purus nec dolor. Integer laoreet tellus sit amet sapien auctor congue. Mauris laoreet eu elit vel rhoncus. Nam et tortor arcu. Maecenas sit amet leo quis tellus varius gravida. Sed quis fermentum odio, sed dictum nulla. Donec aliquam rutrum orci cursus tempus. Quisque sit amet ipsum eget velit aliquam facilisis ultricies quis ligula. Nunc nisi lacus, luctus non bibendum quis, sagittis sit amet odio.

    +

    +

    Vrienden

    - [gebruikersnaam]'s profielfoto - [gebruikersnaam]'s profielfoto - [gebruikersnaam]'s profielfoto - [gebruikersnaam]'s profielfoto - [gebruikersnaam]'s profielfoto - ...en nog 25 anderen! + fetch()) { + echo "" . $friend["username"] . ""; + } + + if($friends->rowCount() === 0) { + echo "

    Deze gebruiker heeft nog geen vrienden gemaakt.

    "; + } + ?>

    Groepen

    - [groepsnaam]'s logo - [groepsnaam]'s logo - [groepsnaam]'s logo - [groepsnaam]'s logo - [groepsnaam]'s logo - ...en nog 6 anderen! + fetch()) { + echo "${group["name"]}s logo"; + } + + if($groups->rowCount() === 0) { + echo "

    Deze gebruiker is nog geen lid van een groep.

    "; + } + ?>

    -
    -

    Lorem

    -

    Lorem ipsum dolor sit amet, consectetur.

    -

    Enkele minuten geleden geplaatst

    -
    -
    -

    Image

    - Olympic Mountains, Washington -

    Gisteren geplaatst

    -
    -
    -

    Ipsum

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem nihil alias amet dolores fuga totam sequi a cupiditate ipsa voluptas id facilis nobis.

    -

    Maandag geplaatst

    -
    -
    -

    Dolor

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit.

    -

    4 Januari geplaatst

    -
    -
    -

    Sit

    -

    Lorem ipsum dolor sit.

    -

    4 Januari geplaatst

    -
    -
    -

    Image

    - Nunobiki Falls, Kobe Japan -

    4 Januari geplaatst

    -
    -
    -

    Amet

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima asperiores eveniet vero velit eligendi aliquid in.

    -

    4 Januari geplaatst

    -
    -
    -

    Consectetur

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error aliquid reprehenderit expedita odio beatae est.

    -

    4 Januari geplaatst

    -
    -
    -

    Adipisicing

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat architecto quis tenetur fugiat veniam iste molestiae fuga labore!

    -

    4 Januari geplaatst

    -
    -
    -

    Elit

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem ut debitis dolorum earum expedita eveniet voluptatem quibusdam facere eos numquam commodi ad iusto laboriosam rerum aliquam.

    -

    4 Januari geplaatst

    -
    -
    -

    Geen error

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus dolorem maxime minima animi cum.

    -

    4 Januari geplaatst

    -
    -
    -

    Image

    - Oregon cliffs are no joke. -

    4 Januari geplaatst

    -
    -
    -

    Aliquid

    -

    Lorem ipsum dolor sit amet, consectetur.

    -

    4 Januari geplaatst

    -
    -
    -

    Odit

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit accusamus tempore at porro officia rerum est impedit ea ipsa tenetur. Labore libero hic error sunt laborum expedita.

    -

    4 Januari geplaatst

    -
    -
    -

    Accusamus

    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis quaerat suscipit ad.

    -

    4 Januari geplaatst

    -
    -
    - + fetch()) { + $nicetime = nicetime($post["creationdate"]); + echo " +
    +

    ${post["title"]}

    +

    ${post["content"]}

    +

    ${nicetime} geplaatst.

    +
    + "; + } + ?>
    \ No newline at end of file -- 2.49.1 From d06ad5a44d094501f9b3a49124cc1ea106ea7fe5 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 18 Jan 2017 16:12:38 +0100 Subject: [PATCH 047/322] fixed menu more friends bug --- website/public/js/menu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/public/js/menu.js b/website/public/js/menu.js index d4471eb..32b048a 100644 --- a/website/public/js/menu.js +++ b/website/public/js/menu.js @@ -6,7 +6,7 @@ $(document).ready(function() { $("#more-friends-click").click(function() { // Show only friends $("#groups-menu-section").slideUp(); - $("#friends-menu-section a").show(); + $("#friends-menu-section li").show(); // Change buttons $("#more-friends-click").hide(); @@ -17,7 +17,7 @@ $(document).ready(function() { $("#more-groups-click").click(function() { // Show only groups $("#friends-menu-section").slideUp(); - $("#groups-menu-section a").show(); + $("#groups-menu-section li").show(); // Change buttons $("#more-groups-click").hide(); -- 2.49.1 From 380b256d292630a028a0096036c6568d2b351343 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 18 Jan 2017 16:20:33 +0100 Subject: [PATCH 048/322] added this file because it is needed --- website/public/loadMessages.php | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 website/public/loadMessages.php diff --git a/website/public/loadMessages.php b/website/public/loadMessages.php new file mode 100644 index 0000000..fb9f129 --- /dev/null +++ b/website/public/loadMessages.php @@ -0,0 +1,11 @@ + Date: Wed, 18 Jan 2017 16:22:27 +0100 Subject: [PATCH 049/322] Added personal Header --- website/queries/header.php | 17 +++++++++++++++++ website/views/header.php | 10 ++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 website/queries/header.php diff --git a/website/queries/header.php b/website/queries/header.php new file mode 100644 index 0000000..5e78291 --- /dev/null +++ b/website/queries/header.php @@ -0,0 +1,17 @@ +prepare(" + SELECT + `fname`, + `lname`, + `profilepicture` + FROM + `user` + WHERE + `userID` = :userID + "); + $stmt->bindParam(":userID", $_SESSION["userID"]); + $stmt->execute(); + return $stmt->fetch(); + +} \ No newline at end of file diff --git a/website/views/header.php b/website/views/header.php index af3d0f0..12877b6 100644 --- a/website/views/header.php +++ b/website/views/header.php @@ -1,3 +1,9 @@ +
    - + "/>
    -- 2.49.1 From 1fb6c90fa6748f2dd91112a812f289278fd1329d Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 18 Jan 2017 16:41:45 +0100 Subject: [PATCH 050/322] Session Start doubble fixes --- website/views/header.php | 1 - 1 file changed, 1 deletion(-) diff --git a/website/views/header.php b/website/views/header.php index 12877b6..bb809ee 100644 --- a/website/views/header.php +++ b/website/views/header.php @@ -1,5 +1,4 @@ Date: Thu, 19 Jan 2017 11:00:55 +0100 Subject: [PATCH 051/322] Ignore .idea folder --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 49adb33..9479d1a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - +.idea/* # User-specific stuff: .idea/workspace.xml .idea/tasks.xml -- 2.49.1 From ff19b5e1b9d33ae2f3d6c374a1e762997f52c2e9 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 19 Jan 2017 11:01:29 +0100 Subject: [PATCH 052/322] Settings messages now uses a Class (: --- website/public/settings.php | 12 ++---- website/queries/settings.php | 67 ++++++++++++++++++++++----------- website/views/settings-view.php | 6 +-- 3 files changed, 53 insertions(+), 32 deletions(-) diff --git a/website/public/settings.php b/website/public/settings.php index 2f91690..c3645f1 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -5,6 +5,7 @@ include("../views/head.php"); include_once("../queries/connect.php"); include_once("../queries/settings.php"); + $_SESSION["userID"] = 2; ?> "; } + + $randomUser = selectRandomNotFriendUser($_SESSION["userID"])["username"]; + + echo " +
  • +
    + +
    +
  • + "; if ($i > 1) { $i -= 1; echo " -
  • - En nog $i anderen... -
  • "; +
  • + En nog $i anderen... +
  • + "; } + ?> @@ -87,17 +106,28 @@ // Echo the friend. echo " - -
  • -
    - PF - $name -
    -
  • -
    +
  • +
    + +
    +
  • "; } - if ($i > 3) { + + if ($i == 0) { + echo "
  • +
    + Je hoort nergens bij. +
    +
  • "; + } else if ($i > 3) { $i -= 3; echo "
  • -- 2.49.1 From daff2f41faf4b0f8b7def9edc294aace9976f068 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 20 Jan 2017 12:29:34 +0100 Subject: [PATCH 078/322] minor fix --- website/views/adminpanel.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index 86c674a..52681a4 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -99,15 +99,8 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { changeMultipleGroupStatusByID($db, $_POST["checkbox-group"], $_POST["groupbatchactions"]); } -<<<<<<< HEAD if (isset($_POST["pageselect"])) { $currentpage = $_POST["pageselect"]; -======= - if (!empty($_POST["actions"]) && !empty($_POST["userID"])) { - changeUserStatusByID($_POST["userID"], $_POST["actions"]); - } elseif (!empty($_POST["actions"]) && !empty($_POST["groupID"])) { - changeGroupStatusByID($_POST["groupID"], $_POST["actions"]); ->>>>>>> master } } -- 2.49.1 From eb1fc154015d8477041aee70a05c2561f8983196 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 20 Jan 2017 12:32:39 +0100 Subject: [PATCH 079/322] script on right lines --- website/public/login.php | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/website/public/login.php b/website/public/login.php index 65babdf..3d37da7 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -7,6 +7,18 @@ include_once("../queries/checkInput.php") ?> + + - - - -- 2.49.1 From 6c41e825fe4527ca83949d647183d70eb34466c4 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 20 Jan 2017 12:53:23 +0100 Subject: [PATCH 080/322] Removed absolute path --- website/views/head.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/website/views/head.php b/website/views/head.php index e267d61..bb6eec4 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -1,17 +1,17 @@ MyHyvesbook+ - - - - + + + + Date: Fri, 20 Jan 2017 12:58:34 +0100 Subject: [PATCH 081/322] fix queries for global and prepared --- website/queries/group_page.php | 43 ++++++++++++++++++++-------------- website/queries/user.php | 29 ++++++++++++++--------- website/views/adminpanel.php | 16 ++++++------- 3 files changed, 52 insertions(+), 36 deletions(-) diff --git a/website/queries/group_page.php b/website/queries/group_page.php index 44d346c..ef7af07 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -1,7 +1,7 @@ query(" + $q = $GLOBALS["db"]->prepare(" SELECT `group_page`.`name`, `group_page`.`picture`, @@ -11,12 +11,16 @@ function selectGroupById($groupID) { FROM `group_page` WHERE - `group_page`.`groupID` = $groupID + `group_page`.`groupID` = :groupID "); + + $q->bindParam(':groupID', $groupID); + $q->execute(); + return $q; } function select20GroupsFromN($n) { - return $GLOBALS["db"]->query(" + $q = $GLOBALS["db"]->prepare(" SELECT `group_page`.`groupID`, `group_page`.`name`, @@ -29,12 +33,16 @@ function select20GroupsFromN($n) { ORDER BY `group_page`.`name` ASC LIMIT - $n, 20 + :n, 20 "); + + $q->bindParam(':n', $n); + $q->execute(); + return $q; } function select20GroupsByStatusFromN($n, $status) { - return $GLOBALS["db"]->query(" + $q = $GLOBALS["db"]->prepare(" SELECT `group_page`.`groupID`, `group_page`.`name`, @@ -45,12 +53,17 @@ function select20GroupsByStatusFromN($n, $status) { FROM `group_page` WHERE - `group_page`.`status` = $status + `group_page`.`status` = :status ORDER BY `group_page`.`name` ASC LIMIT - $n, 20 + :n, 20 "); + + $q->bindParam(':status', $status); + $q->bindParam(':n', $n); + $q->execute(); + return $q; } function search20GroupsFromNByStatus($n, $keyword, $status) { @@ -80,8 +93,8 @@ function search20GroupsFromNByStatus($n, $keyword, $status) { return $q; } -function searchSomeGroupsByStatus($db, $n, $m, $keyword, $status) { - $q = $db->prepare(" +function searchSomeGroupsByStatus($n, $m, $keyword, $status) { + $q = $GLOBALS['db']->prepare(" SELECT `groupID`, `name`, @@ -108,8 +121,8 @@ function searchSomeGroupsByStatus($db, $n, $m, $keyword, $status) { return $q; } -function countSomeGroupsByStatus($db, $keyword, $status) { - $q = $db->prepare(" +function countSomeGroupsByStatus($keyword, $status) { + $q = $GLOBALS['db']->prepare(" SELECT COUNT(*) FROM @@ -141,11 +154,9 @@ function changeGroupStatusByID($id, $status) { return $q; } -<<<<<<< HEAD - -function changeMultipleGroupStatusByID($db, $ids, $status) { - $q = $db->prepare(" +function changeMultipleGroupStatusByID($ids, $status) { + $q = $GLOBALS['db']->prepare(" UPDATE `group_page` SET @@ -163,5 +174,3 @@ function changeMultipleGroupStatusByID($db, $ids, $status) { ?> -======= ->>>>>>> master diff --git a/website/queries/user.php b/website/queries/user.php index 71cef11..719a40f 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -87,7 +87,7 @@ function selectAllUserPosts($userID) { } function select20UsersFromN($n) { - return $GLOBALS["db"]->query(" + $q = $GLOBALS["db"]->prepare(" SELECT `userID`, `username`, @@ -99,8 +99,12 @@ function select20UsersFromN($n) { `role`, `username` LIMIT - $n, 20 + :n, 20 "); + + $q->bindParam(':n', $n); + $q->execute(); + return $q; } function search20UsersFromN($n, $keyword) { @@ -155,8 +159,8 @@ function search20UsersFromNByStatus($n, $keyword, $status) { return $q; } -function searchSomeUsersByStatus($db, $n, $m, $keyword, $status) { - $q = $db->prepare(" +function searchSomeUsersByStatus($n, $m, $keyword, $status) { + $q = $GLOBALS["db"]->prepare(" SELECT `userID`, `username`, @@ -184,8 +188,8 @@ function searchSomeUsersByStatus($db, $n, $m, $keyword, $status) { return $q; } -function countSomeUsersByStatus($db, $keyword, $status) { - $q = $db->prepare(" +function countSomeUsersByStatus($keyword, $status) { + $q = $GLOBALS["db"]->prepare(" SELECT COUNT(*) FROM @@ -208,20 +212,23 @@ function countSomeUsersByStatus($db, $keyword, $status) { function changeUserStatusByID($id, $status) { - $q = $GLOBALS["db"]->query(" + $q = $GLOBALS["db"]->prepare(" UPDATE `user` SET - `role` = $status + `role` = :status WHERE - `userID` = $id + `userID` = :id "); + $q->bindParam(':status', $status); + $q->bindParam(':id', $id); + $q->execute(); return $q; } -function changeMultipleUserStatusByID($db, $ids, $status) { - $q = $db->prepare(" +function changeMultipleUserStatusByID($ids, $status) { + $q = $GLOBALS["db"]->prepare(" UPDATE `user` SET diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index 52681a4..af23dae 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -84,19 +84,19 @@ if (isset($_GET["groupstatus"])) { if ($_SERVER["REQUEST_METHOD"] == "POST") { if (isset($_POST["actions"]) && isset($_POST["userID"])) { - changeUserStatusByID($db, $_POST["userID"], $_POST["actions"]); + changeUserStatusByID($_POST["userID"], $_POST["actions"]); } if (isset($_POST["actions"]) && isset($_POST["groupID"])) { - changeGroupStatusByID($db, $_POST["groupID"], $_POST["actions"]); + changeGroupStatusByID($_POST["groupID"], $_POST["actions"]); } if (isset($_POST["batchactions"]) && isset($_POST["checkbox-user"])) { - changeMultipleUserStatusByID($db, $_POST["checkbox-user"], $_POST["batchactions"]); + changeMultipleUserStatusByID($_POST["checkbox-user"], $_POST["batchactions"]); } if (isset($_POST["groupbatchactions"]) && isset($_POST["checkbox-group"])) { - changeMultipleGroupStatusByID($db, $_POST["checkbox-group"], $_POST["groupbatchactions"]); + changeMultipleGroupStatusByID($_POST["checkbox-group"], $_POST["groupbatchactions"]); } if (isset($_POST["pageselect"])) { @@ -226,9 +226,9 @@ function test_input($data) {
    fetchColumn(); $mincount = min($listm, $countresults); @@ -277,7 +277,7 @@ function test_input($data) { $listm = $currentpage * $perpage; if ($pagetype == 'user') { - $q = searchSomeUsersByStatus($db, $listn, $listm, $search, $status); + $q = searchSomeUsersByStatus($listn, $listm, $search, $status); while($user = $q->fetch(PDO::FETCH_ASSOC)) { $userID = $user['userID']; @@ -316,7 +316,7 @@ function test_input($data) { "); } } else { - $q = searchSomeGroupsByStatus($db, $listn, $listm, $search, $groupstatus); + $q = searchSomeGroupsByStatus($listn, $listm, $search, $groupstatus); while ($group = $q->fetch(PDO::FETCH_ASSOC)) { $groupID = $group['groupID']; -- 2.49.1 From bfdf9e989b2a724f505975d9ab79ccef106e937d Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 13:07:47 +0100 Subject: [PATCH 082/322] Fixed profile page, now shows current user when no username is given in get variable. --- website/public/profile.php | 61 ++++++------------------------------ website/queries/nicetime.php | 39 +++++++++++++++++++++++ 2 files changed, 49 insertions(+), 51 deletions(-) create mode 100644 website/queries/nicetime.php diff --git a/website/public/profile.php b/website/public/profile.php index f3f499b..0fe2feb 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -1,45 +1,16 @@ + + + + + + + $unix_date) { - $difference = $now - $unix_date; - $tense = "geleden"; - } else { - $difference = $unix_date - $now; - $tense = "vanaf nu"; - } - - for($i = 0; $difference >= $lengths[$i] && $i < count($lengths) - 1; $i++) { - $difference /= $lengths[$i]; - } - - $difference = round($difference); - - if($difference != 1) { - $period = $multiple_periods[$i]; - } else { - $period = $single_periods[$i]; - } - - return "$difference $period $tense"; -} +include("../queries/nicetime.php"); if(empty($_GET["username"])) { $userID = $_SESSION["userID"]; @@ -52,18 +23,6 @@ $profile_friends = selectAllFriends($userID); $profile_groups = selectAllUserGroups($userID); $posts = selectAllUserPosts($userID); -?> - - - - - - - - - $unix_date) { +$difference = $now - $unix_date; +$tense = "geleden"; +} else { +$difference = $unix_date - $now; +$tense = "vanaf nu"; +} + +for($i = 0; $difference >= $lengths[$i] && $i < count($lengths) - 1; $i++) { +$difference /= $lengths[$i]; +} + +$difference = round($difference); + +if($difference != 1) { +$period = $multiple_periods[$i]; +} else { +$period = $single_periods[$i]; +} + +return "$difference $period $tense"; +} \ No newline at end of file -- 2.49.1 From 6418b2b679fdaee5f70da8dddf6321989ea5ea5d Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 20 Jan 2017 13:14:28 +0100 Subject: [PATCH 083/322] move js to /js --- website/public/js/admin.js | 44 +++++++++++++++++++++++++++++++ website/views/adminpanel.php | 50 ++---------------------------------- 2 files changed, 46 insertions(+), 48 deletions(-) create mode 100644 website/public/js/admin.js diff --git a/website/public/js/admin.js b/website/public/js/admin.js new file mode 100644 index 0000000..2055123 --- /dev/null +++ b/website/public/js/admin.js @@ -0,0 +1,44 @@ +window.onload = function() { + changeFilter(); +}; + +function checkAll(allbox) { + var checkboxes = document.getElementsByClassName('checkbox-list'); + + for (var i = 0; i < checkboxes.length; i++) { + if (checkboxes[i].type == 'checkbox') { + checkboxes[i].checked = allbox.checked; + } + } +} + +function checkCheckAll(allbox) { + var checkboxes = document.getElementsByClassName('checkbox-list'); + var checked = true; + + for (var i = 0; i < checkboxes.length; i++) { + if (checkboxes[i].type == 'checkbox') { + if (checkboxes[i].checked == false) { + checked = false; + break; + } + } + } + allbox.checked = checked; +} + +function changeFilter() { + if (document.getElementById('group').checked) { + document.getElementById('admin-filter').style.display = 'none'; + document.getElementById('admin-groupfilter').style.display = 'inline-block'; + + document.getElementById('admin-batchactions').style.display = 'none'; + document.getElementById('admin-groupbatchactions').style.display = 'inline-block'; + } else { + document.getElementById('admin-filter').style.display = 'inline-block'; + document.getElementById('admin-groupfilter').style.display = 'none'; + + document.getElementById('admin-batchactions').style.display = 'inline-block'; + document.getElementById('admin-groupbatchactions').style.display = 'none'; + } +} diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index af23dae..fde8237 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -3,53 +3,7 @@ Admin Panel - + fetchColumn(); $mincount = min($listm, $countresults); -- 2.49.1 From 61c148e127bade2b031d75264504a84754b70200 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 20 Jan 2017 13:30:40 +0100 Subject: [PATCH 084/322] Made chat xss prove --- website/public/API/loadMessages.php | 7 +++---- website/public/API/sendMessage.php | 15 +++++++-------- website/public/js/chat.js | 6 +----- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/website/public/API/loadMessages.php b/website/public/API/loadMessages.php index fef9db7..1c6b942 100644 --- a/website/public/API/loadMessages.php +++ b/website/public/API/loadMessages.php @@ -3,11 +3,10 @@ session_start(); require_once("../../queries/connect.php"); require_once("../../queries/private_message.php"); +require_once("../../queries/checkInput.php"); if (isset($_POST["lastID"]) && $_POST["lastID"] != "") { - - echo getNewChatMessages($_POST["lastID"], $_POST["destination"]); - + echo getNewChatMessages(test_input($_POST["lastID"]), test_input($_POST["destination"])); } else { - echo getOldChatMessages($_POST["destination"]); + echo getOldChatMessages(test_input($_POST["destination"])); } \ No newline at end of file diff --git a/website/public/API/sendMessage.php b/website/public/API/sendMessage.php index d1bc758..c5d47d1 100644 --- a/website/public/API/sendMessage.php +++ b/website/public/API/sendMessage.php @@ -3,16 +3,15 @@ session_start(); require_once("../../queries/connect.php"); require_once("../../queries/private_message.php"); +require_once("../../queries/checkInput.php"); -if (isset($_POST["destination"]) && - isset($_POST["content"])) { - - if (sendMessage($_POST["destination"], $_POST["content"])) { - echo $_POST["content"] . " is naar " . $_POST["destination"] . " gestuurd"; +if (!empty(test_input($_POST["destination"])) && + !empty(test_input($_POST["content"]))) { + if (sendMessage(test_input($_POST["destination"]), test_input($_POST["content"]))) { + echo 1; } else { - echo "YOU FAILED!!!"; + echo 0; } - } else { - echo "maybe dont try to hax the system?"; + echo 0; } \ No newline at end of file diff --git a/website/public/js/chat.js b/website/public/js/chat.js index 75eb32e..6c420a1 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -10,7 +10,6 @@ function loadMessages() { $("#lastIDForm").serialize() ).done(function(data) { if (data && data != "[]") { - console.log(data); messages = JSON.parse(data); addMessages(messages); $("#lastID").val(messages[messages.length - 1].messageID); @@ -23,13 +22,10 @@ function loadMessages() { function sendMessage() { - console.log($("#sendMessageForm").serialize()); $.post( "API/sendMessage.php", $("#sendMessageForm").serialize() - ).done(function( data ) { - console.log(data); - }); + ); $("#newContent").val(""); } -- 2.49.1 From b7620fe4dbe3cdaf595eb71087b485e4bbeaf81e Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 14:05:20 +0100 Subject: [PATCH 085/322] Moved .htaccess --- website/.htaccess | 14 -------------- website/public/.htaccess | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) delete mode 100644 website/.htaccess create mode 100644 website/public/.htaccess diff --git a/website/.htaccess b/website/.htaccess deleted file mode 100644 index 5c0147b..0000000 --- a/website/.htaccess +++ /dev/null @@ -1,14 +0,0 @@ -Options +FollowSymLinks -RewriteEngine On - -ErrorDocument 404 /error404.jpg - -RewriteCond %{SCRIPT_FILENAME} !-d -RewriteCond %{SCRIPT_FILENAME} !-f - -# Resolve .php file for extensionless php urls -RewriteRule ^([^/.]+)$ $1.php [L] - -RewriteRule ^([^/.]+)\/$ $1.php [L] - -RewriteRule ^profile/([A-z0-9]+)\/?$ profile.php?username=$1 [NC] \ No newline at end of file diff --git a/website/public/.htaccess b/website/public/.htaccess new file mode 100644 index 0000000..69fda24 --- /dev/null +++ b/website/public/.htaccess @@ -0,0 +1,14 @@ +#Options +FollowSymLinks +#RewriteEngine On +# +#ErrorDocument 404 /error404.jpg +# +#RewriteCond %{SCRIPT_FILENAME} !-d +#RewriteCond %{SCRIPT_FILENAME} !-f +# +## Resolve .php file for extensionless php urls +#RewriteRule ^([^/.]+)$ $1.php [L] +# +#RewriteRule ^([^/.]+)\/$ $1.php [L] +# +#RewriteRule ^profile/([A-z0-9]+)\/?$ profile.php?username=$1 [NC] \ No newline at end of file -- 2.49.1 From f9c55323ad54047ab80381499fef430b3f49fd8b Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 14:09:04 +0100 Subject: [PATCH 086/322] Made friends and groups clickable. --- website/views/profile.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/views/profile.php b/website/views/profile.php index 6c273a6..47b880d 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -13,7 +13,7 @@

    fetch()) { - echo "${friend["username"]}"; + echo "${friend["username"]}"; } @@ -29,7 +29,7 @@

    fetch()) { - echo "${group["name"]}s logo"; + echo "${group["name"]}s logo"; } if($groups->rowCount() === 0) { -- 2.49.1 From 0e5f7dc9fb4e7581bef3d1f85ef1231ad9ad71c0 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 14:10:32 +0100 Subject: [PATCH 087/322] Fixed no friends text and no groups text. --- website/views/profile.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/views/profile.php b/website/views/profile.php index 47b880d..83ac799 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -17,7 +17,7 @@ } - if($friends->rowCount() === 0) { + if($profile_friends->rowCount() === 0) { echo "

    Deze gebruiker heeft nog geen vrienden gemaakt.

    "; } ?> @@ -32,7 +32,7 @@ echo "${group["name"]}s logo"; } - if($groups->rowCount() === 0) { + if($profile_groups->rowCount() === 0) { echo "

    Deze gebruiker is nog geen lid van een groep.

    "; } ?> -- 2.49.1 From adb7f2f37db78f7099b3fedbcfe48d783c9c91a7 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 14:31:49 +0100 Subject: [PATCH 088/322] Fixed .htaccess --- website/public/.htaccess | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/website/public/.htaccess b/website/public/.htaccess index 69fda24..5c0147b 100644 --- a/website/public/.htaccess +++ b/website/public/.htaccess @@ -1,14 +1,14 @@ -#Options +FollowSymLinks -#RewriteEngine On -# -#ErrorDocument 404 /error404.jpg -# -#RewriteCond %{SCRIPT_FILENAME} !-d -#RewriteCond %{SCRIPT_FILENAME} !-f -# -## Resolve .php file for extensionless php urls -#RewriteRule ^([^/.]+)$ $1.php [L] -# -#RewriteRule ^([^/.]+)\/$ $1.php [L] -# -#RewriteRule ^profile/([A-z0-9]+)\/?$ profile.php?username=$1 [NC] \ No newline at end of file +Options +FollowSymLinks +RewriteEngine On + +ErrorDocument 404 /error404.jpg + +RewriteCond %{SCRIPT_FILENAME} !-d +RewriteCond %{SCRIPT_FILENAME} !-f + +# Resolve .php file for extensionless php urls +RewriteRule ^([^/.]+)$ $1.php [L] + +RewriteRule ^([^/.]+)\/$ $1.php [L] + +RewriteRule ^profile/([A-z0-9]+)\/?$ profile.php?username=$1 [NC] \ No newline at end of file -- 2.49.1 From 6478ce920f56a1fe1b004b99ef253cdc6fe10a1e Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 14:40:21 +0100 Subject: [PATCH 089/322] Fixed .htaccess --- website/public/.htaccess | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/website/public/.htaccess b/website/public/.htaccess index 5c0147b..f08898a 100644 --- a/website/public/.htaccess +++ b/website/public/.htaccess @@ -9,6 +9,4 @@ RewriteCond %{SCRIPT_FILENAME} !-f # Resolve .php file for extensionless php urls RewriteRule ^([^/.]+)$ $1.php [L] -RewriteRule ^([^/.]+)\/$ $1.php [L] - -RewriteRule ^profile/([A-z0-9]+)\/?$ profile.php?username=$1 [NC] \ No newline at end of file +RewriteRule ^profile/([A-z0-9]+)$ profile.php?username=$1 [NC] \ No newline at end of file -- 2.49.1 From 42188609363a214a33a7df8a5bbd8c91a3e6334a Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 20 Jan 2017 14:43:04 +0100 Subject: [PATCH 090/322] remove testinput --- website/views/adminpanel.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index fde8237..116512c 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -62,12 +62,6 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { $listn = ($currentpage-1) * $perpage; $listm = $currentpage * $perpage; -function test_input($data) { - $data = trim($data); - $data = stripslashes($data); - $data = htmlspecialchars($data); - return $data; -} ?>
    -- 2.49.1 From ca28724274047a90649944303022a2d503cd45f7 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 14:48:00 +0100 Subject: [PATCH 091/322] Fixed script tags and @import. Has to be absolute path in order to work with the .htaccess file. --- website/public/profile.php | 3 ++- website/views/head.php | 17 ++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/website/public/profile.php b/website/public/profile.php index 0fe2feb..6ede201 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -2,8 +2,9 @@ + diff --git a/website/views/head.php b/website/views/head.php index bb6eec4..4347650 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -1,17 +1,16 @@ MyHyvesbook+ - - - - + + + Date: Fri, 20 Jan 2017 14:55:47 +0100 Subject: [PATCH 092/322] Alpha 0.0.1 profile picture upload shizzle! --- website/public/settings.php | 3 ++- website/queries/settings.php | 28 +++++++++++++++++++++++++--- website/views/settings-view.php | 3 ++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/website/public/settings.php b/website/public/settings.php index 45e50d8..d52608b 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -22,12 +22,13 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { $result = updateSettings(); break; case "password": - $result = updatePassword(); + $result = changePassword(); break; case "email": $result = changeEmail(); break; case "picture": + updateProfilePicture(); $result = $notImplemented; break; } diff --git a/website/queries/settings.php b/website/queries/settings.php index 7c92583..b85cae8 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -99,11 +99,11 @@ function updateSettings() { return new settingsMessage("happy", "Instellingen zijn opgeslagen."); } -function updatePassword() { +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 (changePassword()) { + if (doChangePassword()) { return new settingsMessage("happy", "Wachtwoord gewijzigd."); } else { return new settingsMessage("angry", "Er is iets mis gegaan."); @@ -116,7 +116,7 @@ function updatePassword() { } } -function changePassword() { +function doChangePassword() { $stmt = $GLOBALS["db"]->prepare(" UPDATE `user` @@ -184,4 +184,26 @@ function doChangeEmail($email) { $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); return $stmt->rowCount(); +} + +function updateProfilePicture() { + $profilePictureDir = "/var/www/html/public/"; + $relativePath = "uploads/" . $_SESSION["userID"] . "_" . basename($_FILES["pp"]["name"]); + move_uploaded_file($_FILES['pp']['tmp_name'], $profilePictureDir . $relativePath); + setProfilePictureToDatabase("../" . $relativePath); +} + +function setProfilePictureToDatabase($url) { + $stmt = $GLOBALS["db"]->prepare(" + UPDATE + `user` + SET + `profilepicture` = :profilepicture + WHERE + `userID` = :userID + "); + + $stmt->bindParam(":profilepicture", $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 6d9d660..f6c4e07 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -1,5 +1,6 @@
    @@ -68,7 +69,7 @@ $settings = getSettings();
  • -
    +
    Verander profielfoto
    • -- 2.49.1 From e547712b2a6020aaee8cb59ee4795287f82dfa74 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 15:02:05 +0100 Subject: [PATCH 093/322] Changed links to absolute path. --- website/views/adminpanel.php | 2 +- website/views/header.php | 12 ++++++------ website/views/login-view.php | 4 ++-- website/views/login_head.php | 6 +++--- website/views/menu.php | 2 +- website/views/profile.php | 2 +- website/views/register-view.php | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index fde8237..e8efe6f 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -3,7 +3,7 @@ Admin Panel - +
      diff --git a/website/views/login-view.php b/website/views/login-view.php index 33fa7e9..7a023f0 100644 --- a/website/views/login-view.php +++ b/website/views/login-view.php @@ -1,6 +1,6 @@
      MyHyvesbook+
      diff --git a/website/views/login_head.php b/website/views/login_head.php index a41e87e..645f919 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -3,9 +3,9 @@ MyHyvesbook+ + href="/styles/main.css"> - + href="/styles/index.css"> + diff --git a/website/views/menu.php b/website/views/menu.php index 88ae076..c6b030a 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -51,7 +51,7 @@ echo "
    • -
      +
      - - -- 2.49.1 From e7d63c2f572a79d6a2250e2f3ae23a57f6e370fc Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 15:34:01 +0100 Subject: [PATCH 095/322] Changed how name is displayed on profile page. --- website/public/styles/profile.css | 23 ++++------------------- website/views/profile.php | 7 ++++--- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index af1ed58..7437e4c 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -10,9 +10,12 @@ margin: 0 20px 20px 0; } -.profile-box .profile-username { +.profile-box h1.profile-username { padding-top: 50px; } +.profile-box h5.profile-username { + padding-top: 0; +} div.posts { padding-top: 20px; @@ -37,24 +40,6 @@ div.posts .post p.subscript { font-size: 8pt; } -/*.posts {*/ - /*z-index: -1;*/ - /*margin-right: 0;*/ - /*width: calc(100% + 15px);*/ -/*}*/ - -/*.post-box {*/ - /*display: inline-flex;*/ - /*margin: 20px 15px 0 0;*/ - /*padding: 25px;*/ - /*background-color: #FFFFFF;*/ -/*}*/ - -/*!* fullscreen *!*/ -/*.post-box {*/ - /*width: calc(25% - 69px);*/ -/*}*/ - @media only screen and (max-width: 1500px) { .post-box { width: calc(50% - 68px); diff --git a/website/views/profile.php b/website/views/profile.php index f8cdadd..1457dee 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -4,7 +4,8 @@

      Als vriend toevoegen

      -

      ()

      +

      +

      @@ -13,7 +14,7 @@

      fetch()) { - echo "${friend["username"]}"; + echo "${friend["username"]}"; } @@ -29,7 +30,7 @@

      fetch()) { - echo "${group["name"]}s logo"; + echo "${group["name"]}s logo"; } if($profile_groups->rowCount() === 0) { -- 2.49.1 From 587d0e6ac351787fe1d944b06c6a05b42e1952f1 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 20 Jan 2017 15:41:13 +0100 Subject: [PATCH 096/322] fixed crosssitescripting on settings pagw --- website/queries/settings.php | 8 ++++---- website/views/settings-view.php | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/website/queries/settings.php b/website/queries/settings.php index b85cae8..7d3bf9c 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -87,11 +87,11 @@ function updateSettings() { `userID` = :userID "); - $stmt->bindParam(":fname", $_POST["fname"]); - $stmt->bindParam(":lname", $_POST["lname"]); - $stmt->bindParam(":location", $_POST["location"]); + $stmt->bindParam(":fname", test_input($_POST["fname"])); + $stmt->bindParam(":lname", test_input($_POST["lname"])); + $stmt->bindParam(":location", test_input($_POST["location"])); $stmt->bindParam(":bday", $_POST["bday"]); - $stmt->bindParam(":bio", $_POST["bio"]); + $stmt->bindParam(":bio", test_input($_POST["bio"])); $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); diff --git a/website/views/settings-view.php b/website/views/settings-view.php index f6c4e07..1fa5278 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -1,6 +1,5 @@

      -- 2.49.1 From e17a55e82dff94723917a2393698892134aab18e Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 20 Jan 2017 16:01:08 +0100 Subject: [PATCH 097/322] Fixed redirect to profile page after going back 1 page --- website/public/js/registerAndLogin.js | 8 ++++++++ website/public/login.php | 13 +------------ website/public/register.php | 6 ++++-- website/views/login_head.php | 1 + 4 files changed, 14 insertions(+), 14 deletions(-) create mode 100644 website/public/js/registerAndLogin.js diff --git a/website/public/js/registerAndLogin.js b/website/public/js/registerAndLogin.js new file mode 100644 index 0000000..8428440 --- /dev/null +++ b/website/public/js/registerAndLogin.js @@ -0,0 +1,8 @@ +function checkLoggedIn() { + if (confirm("You are already logged in!\nDo you want to logout?\nPress ok to logout.") == true) { + window.location.href = "logout.php"; + } else { + window.history.back(); + } + document.getElementById("demo").innerHTML = x; +} diff --git a/website/public/login.php b/website/public/login.php index b3da203..0d07413 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -4,20 +4,9 @@ include("../views/login_head.php"); require_once("../queries/connect.php"); include_once("../queries/login.php"); - include_once("../queries/checkInput.php") + include_once("../queries/checkInput.php"); ?> - - + -- 2.49.1 From 6ff70440e67ad96ef71867ef26ca1a1f3f90135c Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 20 Jan 2017 16:14:32 +0100 Subject: [PATCH 098/322] history back -> profile.php --- website/public/js/registerAndLogin.js | 2 +- website/public/register.php | 2 +- website/views/login_head.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/website/public/js/registerAndLogin.js b/website/public/js/registerAndLogin.js index 8428440..0452d15 100644 --- a/website/public/js/registerAndLogin.js +++ b/website/public/js/registerAndLogin.js @@ -2,7 +2,7 @@ function checkLoggedIn() { if (confirm("You are already logged in!\nDo you want to logout?\nPress ok to logout.") == true) { window.location.href = "logout.php"; } else { - window.history.back(); + window.location.href = "profile.php"; } document.getElementById("demo").innerHTML = x; } diff --git a/website/public/register.php b/website/public/register.php index ec1f879..8c0f8e4 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -29,7 +29,7 @@ } else { $bday = test_input($_POST["bday"]); } -g + checkInputChoice("username", "username"); checkInputChoice("password", "longerEight"); checkInputChoice("confirmpassword", ""); diff --git a/website/views/login_head.php b/website/views/login_head.php index 7f1771a..05c9e38 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -7,6 +7,6 @@ - + -- 2.49.1 From 173ef3e50c2feceb27e715fddbfc33aac08ff5db Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 20 Jan 2017 16:17:56 +0100 Subject: [PATCH 099/322] Added a notification bar --- website/public/js/header.js | 24 ++++++++++++++++++++++-- website/public/styles/header.css | 22 +--------------------- website/public/styles/menu.css | 17 +++++++++++++++++ website/queries/friendship.php | 3 ++- website/views/header.php | 9 +++------ website/views/notification-center.php | 11 +++++++++++ 6 files changed, 56 insertions(+), 30 deletions(-) create mode 100644 website/views/notification-center.php diff --git a/website/public/js/header.js b/website/public/js/header.js index 797c56c..ceb6086 100644 --- a/website/public/js/header.js +++ b/website/public/js/header.js @@ -1,7 +1,27 @@ $(document).ready(function() { + // Hide notification center. $("#profile-menu-popup").hide(); + + // $("#own-profile-picture").click(function() { + // $("#profile-menu-popup").toggle(); + // $("#profile-hello-popup").toggle(); + // }); + $("#own-profile-picture").click(function() { - $("#profile-menu-popup").toggle(); - $("#profile-hello-popup").toggle(); + if($("#notification-center").css('right') == "-256px") { + // $(".content").animate({ + // marginRight: "256px" + // }, 500); + $("#notification-center").animate({ + right: "0px" + }, 500); + } else { + // $(".content").animate({ + // marginRight: "0px" + // }, 500); + $("#notification-center").animate({ + right: "-256px" + }, 500); + } }); }); diff --git a/website/public/styles/header.css b/website/public/styles/header.css index 84f308c..ddefdec 100644 --- a/website/public/styles/header.css +++ b/website/public/styles/header.css @@ -33,32 +33,12 @@ header { header div { display: inline-block; } - -#open-chat { - font-size: 32px; - line-height: 80px; - margin-right: 50px; -} - -.profile-menu { - font-size: 21px; -} - .profile-menu img { padding: 8px; height: 64px; width: 64px; } -#own-profile-picture, #profile-menu-popup span { +#own-profile-picture { cursor: pointer; } - -#profile-menu-popup { - padding: 5px; - - background: white; - color: #666; - - border-radius: 3px; -} diff --git a/website/public/styles/menu.css b/website/public/styles/menu.css index 4d4b8bb..b9e3904 100644 --- a/website/public/styles/menu.css +++ b/website/public/styles/menu.css @@ -42,4 +42,21 @@ height: 100%; padding: 0; text-align: left; +} + +#notification-center { + left: auto; + width: 256px; + right: -256px; +} + +#quick-links { + text-align: center; + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); +} + +#quick-links i { + color: #845663; + font-size: 42px; + padding: 7px; } \ No newline at end of file diff --git a/website/queries/friendship.php b/website/queries/friendship.php index 258699f..df6a917 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -15,13 +15,14 @@ function selectAllFriends($userID) { `user` INNER JOIN `friendship` + WHERE (`friendship`.`user1ID` = :userID AND `friendship`.`user2ID` = `user`.`userID` OR `friendship`.`user2ID` = :userID AND `friendship`.`user1ID` = `user`.`userID`) AND `role` != 5 AND - `status` = 1 + `status` = 1 "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); diff --git a/website/views/header.php b/website/views/header.php index a58e5f0..2d65291 100644 --- a/website/views/header.php +++ b/website/views/header.php @@ -19,11 +19,6 @@ $userinfo = getHeaderInfo();
      -
      - | - | - -
      Hallo @@ -32,5 +27,7 @@ $userinfo = getHeaderInfo();
      "/>
      -
      + + + diff --git a/website/views/notification-center.php b/website/views/notification-center.php new file mode 100644 index 0000000..f4b4b5d --- /dev/null +++ b/website/views/notification-center.php @@ -0,0 +1,11 @@ + \ No newline at end of file -- 2.49.1 From 9152ae4f75b17fd7903ba10624f54560f337a637 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 20 Jan 2017 16:18:09 +0100 Subject: [PATCH 100/322] add searching users, searching groups, remembering search options --- website/public/search.php | 6 +- website/public/styles/search.css | 5 ++ website/queries/group_page.php | 23 +++++- website/queries/user.php | 35 ++++++++- website/views/search-view.php | 120 +++++++++++++++++++------------ 5 files changed, 137 insertions(+), 52 deletions(-) diff --git a/website/public/search.php b/website/public/search.php index c314791..6cfadd8 100644 --- a/website/public/search.php +++ b/website/public/search.php @@ -1,7 +1,11 @@ - + diff --git a/website/public/styles/search.css b/website/public/styles/search.css index 4b2281c..b54723d 100644 --- a/website/public/styles/search.css +++ b/website/public/styles/search.css @@ -9,4 +9,9 @@ #search-friends-output { margin-right: 10px; +} + +.searchleft, .searchright { + display: inline-block; + vertical-align: top; } \ No newline at end of file diff --git a/website/queries/group_page.php b/website/queries/group_page.php index ef7af07..d704e8c 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -172,5 +172,26 @@ function changeMultipleGroupStatusByID($ids, $status) { return $q; } +function searchSomeGroups($n, $m, $search) { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + `name`, + `picture` + FROM + `group_page` + WHERE + `name` LIKE :keyword + ORDER BY + `name` + LIMIT + :n, :m + "); -?> + $search = "%$search%"; + $stmt->bindParam(':keyword', $search); + $stmt->bindParam(':n', $n, PDO::PARAM_INT); + $stmt->bindParam(':m', $m, PDO::PARAM_INT); + $stmt->execute(); + return $stmt; +} +?> \ No newline at end of file diff --git a/website/queries/user.php b/website/queries/user.php index 398e2e4..114d673 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -252,12 +252,12 @@ function selectRandomNotFriendUser($userID) { FROM `user` WHERE - `userID` NOT IN (SELECT + `userID` NOT IN (SELECT `user1ID` FROM `friendship` WHERE `user1ID` = :userID) OR - `userID` NOT IN (SELECT + `userID` NOT IN (SELECT `user2ID` FROM `friendship` @@ -271,4 +271,33 @@ function selectRandomNotFriendUser($userID) { $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetch(); -} \ No newline at end of file +} + +function searchSomeUsers($n, $m, $search) { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + `username`, + `profilepicture`, + `fname`, + `lname` + FROM + `user` + WHERE + `username` LIKE :keyword OR + `fname` LIKE :keyword OR + `lname` LIKE :keyword + ORDER BY + `fname`, + `lname`, + `username` + LIMIT + :n, :m + "); + + $search = "%$search%"; + $stmt->bindParam(':keyword', $search); + $stmt->bindParam(':n', $n, PDO::PARAM_INT); + $stmt->bindParam(':m', $m, PDO::PARAM_INT); + $stmt->execute(); + return $stmt; +} diff --git a/website/views/search-view.php b/website/views/search-view.php index b1418d1..0d650d4 100644 --- a/website/views/search-view.php +++ b/website/views/search-view.php @@ -1,3 +1,16 @@ + +
      @@ -7,72 +20,85 @@ + value= + >
      -
      +

      Gebruikers

      -
      - \ No newline at end of file +
      -- 2.49.1 From 18185020c3b4a389d623042050a8edafe622dc6a Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 20 Jan 2017 16:18:12 +0100 Subject: [PATCH 101/322] Added improvements to profile page. --- website/public/styles/profile.css | 21 +++++++++++++-------- website/views/profile.php | 12 ++++++++++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 7437e4c..9c07242 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -40,6 +40,19 @@ div.posts .post p.subscript { font-size: 8pt; } +div.posts .post form input, div.posts .post form textarea { + width: calc(100% - 15px); +} + +div.posts .post form input[type="submit"] { + width: 100%; +} + +div.posts .post form textarea.newpost { + margin: 15px 0 15px 0; + height: 100px; +} + @media only screen and (max-width: 1500px) { .post-box { width: calc(50% - 68px); @@ -53,14 +66,6 @@ div.posts .post p.subscript { } } -.post { - width: 100%; -} - -.post img { - width: 100%; -} - .post .post-date { float: right; color: #aaaaaa; diff --git a/website/views/profile.php b/website/views/profile.php index 1457dee..19bd908 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -42,6 +42,18 @@
      +
      +
      + + + +
      +
      + fetch()) { $nicetime = nicetime($post["creationdate"]); echo " -- 2.49.1 From ac96200d1642a663c61545de841af182285d9981 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 20 Jan 2017 16:20:34 +0100 Subject: [PATCH 102/322] Kind of works now: Profile update --- website/public/settings.php | 2 +- website/queries/settings.php | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/website/public/settings.php b/website/public/settings.php index d52608b..06d17c0 100644 --- a/website/public/settings.php +++ b/website/public/settings.php @@ -29,7 +29,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { break; case "picture": updateProfilePicture(); - $result = $notImplemented; + $result = new settingsMessage("happy", "Deze melding doet nog niks nuttigs."); break; } } diff --git a/website/queries/settings.php b/website/queries/settings.php index 7d3bf9c..0e6dff2 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -188,22 +188,28 @@ function doChangeEmail($email) { function updateProfilePicture() { $profilePictureDir = "/var/www/html/public/"; - $relativePath = "uploads/" . $_SESSION["userID"] . "_" . basename($_FILES["pp"]["name"]); + $relativePath = "uploads/profilepictures/" . $_SESSION["userID"] . "_" . basename($_FILES["pp"]["name"]); +// removeOldProfilePicture(); move_uploaded_file($_FILES['pp']['tmp_name'], $profilePictureDir . $relativePath); setProfilePictureToDatabase("../" . $relativePath); } +//function removeOldProfilePicture() { +// +// unlink("/var/www/html/public/uploads/profilepictures/" . $_SESSION["userID"] . "_*"); +//} + function setProfilePictureToDatabase($url) { $stmt = $GLOBALS["db"]->prepare(" UPDATE `user` SET - `profilepicture` = :profilepicture + `profilepicture` = :profilePicture WHERE `userID` = :userID "); - $stmt->bindParam(":profilepicture", $url); + $stmt->bindParam(":profilePicture", $url); $stmt->bindParam(":userID", $_SESSION["userID"]); $stmt->execute(); } \ No newline at end of file -- 2.49.1 From 2a44057233f4abb86eec42c419e566adcb5e7d2d Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Sun, 22 Jan 2017 11:23:13 +0100 Subject: [PATCH 103/322] Changed binParam for bindValue --- website/queries/settings.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/website/queries/settings.php b/website/queries/settings.php index 0e6dff2..f4c7011 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -87,12 +87,12 @@ function updateSettings() { `userID` = :userID "); - $stmt->bindParam(":fname", test_input($_POST["fname"])); - $stmt->bindParam(":lname", test_input($_POST["lname"])); - $stmt->bindParam(":location", test_input($_POST["location"])); - $stmt->bindParam(":bday", $_POST["bday"]); - $stmt->bindParam(":bio", test_input($_POST["bio"])); - $stmt->bindParam(":userID", $_SESSION["userID"]); + $stmt->bindValue(":fname", test_input($_POST["fname"])); + $stmt->bindValue(":lname", test_input($_POST["lname"])); + $stmt->bindValue(":location", test_input($_POST["location"])); + $stmt->bindValue(":bday", $_POST["bday"]); + $stmt->bindValue(":bio", test_input($_POST["bio"])); + $stmt->bindValue(":userID", $_SESSION["userID"]); $stmt->execute(); -- 2.49.1 From 93b6835ea4400193d9a8fe98ecbafb7018ab4697 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Mon, 23 Jan 2017 11:33:27 +0100 Subject: [PATCH 104/322] Changed style and added friendrequests --- website/public/API/loadMessages.php | 1 + website/public/API/loadNotifications.php | 8 +++ website/public/js/notifications.js | 34 ++++++++++++ website/public/profile.php | 2 +- website/public/styles/adminpanel.css | 4 +- website/public/styles/chat.css | 2 +- website/public/styles/header.css | 8 ++- website/public/styles/index.css | 2 +- website/public/styles/main.css | 71 +++++++++++++++++------- website/public/styles/menu.css | 12 +++- website/public/styles/profile.css | 16 +++++- website/queries/friendship.php | 33 ++++++++++- website/views/head.php | 17 +++--- website/views/header.php | 2 +- website/views/menu.php | 6 +- website/views/notification-center.php | 7 ++- 16 files changed, 178 insertions(+), 47 deletions(-) create mode 100644 website/public/API/loadNotifications.php create mode 100644 website/public/js/notifications.js diff --git a/website/public/API/loadMessages.php b/website/public/API/loadMessages.php index 1c6b942..e30acc8 100644 --- a/website/public/API/loadMessages.php +++ b/website/public/API/loadMessages.php @@ -1,6 +1,7 @@ \ +
      \ + \ +
      \ +
    • \ + "); + } +} + +function loadNotifications() { + $.post( + "API/loadNotifications.php" + ).done(function(data) { + if (data && data != "[]") { + showNotifications(JSON.parse(data), "friendrequestslist"); + } + }); + + setTimeout(loadNotifications, 10000); +} + +loadNotifications(); + diff --git a/website/public/profile.php b/website/public/profile.php index 6ede201..e4f1452 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -4,7 +4,7 @@ diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index b226cd3..4c5356f 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -6,7 +6,7 @@ .admin-title { margin: 10px; padding-bottom: 5px; - border-bottom: 4px solid #845663; + border-bottom: 4px solid #FBC02D; } .admin-panel input[type="radio"], input[type="checkbox"] { @@ -18,7 +18,7 @@ padding: 8px; vertical-align: top; border-radius: 10px; - border: 4px solid #845663; + border: 4px solid #FBC02D; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index e2fa7c9..f6060dd 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -83,7 +83,7 @@ .chat-field input[type="submit"] { width: auto; float: right; - background-color: #845663; + background-color: #FBC02D; color: white; padding: 5px 10px; border-radius: 0 10px 10px 0; diff --git a/website/public/styles/header.css b/website/public/styles/header.css index ddefdec..e39f204 100644 --- a/website/public/styles/header.css +++ b/website/public/styles/header.css @@ -8,21 +8,23 @@ header { width: 100%; color: white; - background-color: rgba(132,86,99, 0.98); + background-color: #FBC02D; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } +#header-logo { + padding-left: 42px; +} #header-logo, #header-logo img { height: 80px; vertical-align: middle; line-height: 80px; - padding-left: 5px; } #header-search { - padding-left: 48px; + padding-left: 42px; } diff --git a/website/public/styles/index.css b/website/public/styles/index.css index 4b55904..6c12823 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -19,7 +19,7 @@ body { background-size: cover; background-attachment: fixed;*/ - /*background-color: #B78996;*/ + /*background-color: #EEE;*/ color: #333; font-family: Arial, sans-serif; } diff --git a/website/public/styles/main.css b/website/public/styles/main.css index 014d05b..062d5d9 100644 --- a/website/public/styles/main.css +++ b/website/public/styles/main.css @@ -18,7 +18,7 @@ html { body { height: 100%; - background-color: #B78996; + background-color: #EEE; color: #333; font-family: Arial, sans-serif; } @@ -37,11 +37,12 @@ h3 { } h4 { - font-size: 1.6em; + font-size: 1.2em; } h5 { - font-size: 1.4em; + font-size: 1.0em; + color: #666; } ul { @@ -54,12 +55,12 @@ p { /* Selection colors */ ::selection { - background: #845663; + background: #FBC02D; color: white; } ::-moz-selection { - background: #845663; + background: #FBC02D; color: white; } @@ -75,7 +76,7 @@ p { .platform { padding: 20px; margin-bottom: 10px; - border-radius: 10px; + border-radius: 5px; background-color: #FFFFFF; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } @@ -143,7 +144,7 @@ button, input, select { cursor: pointer; border: none; font-size: 16px; - border-radius: 7px; + transition-duration: 250ms; } /* All textinput and sections */ @@ -151,19 +152,53 @@ textarea, input, select { padding: 0 5px; background: white; color: #333333; - border: 1px solid #845663; - border-radius: 7px; + border-radius: 5px; + border-bottom: 1px solid #4CAF50; font-size: 16px; + outline: none; + transition-duration: 250ms; +} + +textarea { + padding: 5px; + resize: none; +} + +textarea:hover, input:hover, select:hover { + border-radius: 10px; +} + +textarea:focus, input:focus, select:focus { + border-radius: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } /* All buttons */ button, input[type="submit"], input[type="reset"] { - background-color: #845663; + background-color: #FBC02D; color: white; padding: 0 10px; border: none; + border-radius: 5px; +} + +button:focus, +input[type="submit"]:focus, +input[type="reset"]:focus { + outline: none; +} + +button:active, +input[type="submit"]:active, +input[type="reset"]:active { + outline: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24) +} + +input[type="radio"] { + border-radius: 100%; } /* Tables */ @@ -190,19 +225,17 @@ img[data-title]:hover:after, span[data-title]:hover:after, div[data-title]:hover:after { content: attr(data-title); - padding: 4px 4px; + padding: 7px 7px; color: #FFFFFF; position: absolute; left: 0; - top: 100%; - z-index: 20; + top: 150%; + z-index: 200; white-space: nowrap; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - -moz-box-shadow: 0 0 4px #222; - -webkit-box-shadow: 0 0 4px #222; - box-shadow: 0 0 4px #222; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); background-color: #333; font-size: 15px; line-height: normal; diff --git a/website/public/styles/menu.css b/website/public/styles/menu.css index b9e3904..69aa8a9 100644 --- a/website/public/styles/menu.css +++ b/website/public/styles/menu.css @@ -1,6 +1,7 @@ .menu { position: fixed; z-index: 50; + overflow-y: auto; left: 0; top: 80px; @@ -11,6 +12,10 @@ box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } +.menu section { + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); +} + .menu h4 { padding: 10px; } @@ -26,12 +31,13 @@ cursor: pointer; } -.friend-item { +.friend-item, .group-item { cursor: pointer; + transition-duration: 250ms; } .friend-item:hover, .group-item:hover { - background: #845663; + background: #FBC02D; color: white; } @@ -56,7 +62,7 @@ } #quick-links i { - color: #845663; + color: #4CAF50; font-size: 42px; padding: 7px; } \ No newline at end of file diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 9c07242..f5dd6b1 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -14,7 +14,7 @@ padding-top: 50px; } .profile-box h5.profile-username { - padding-top: 0; + padding: 0 0 10px 0; } div.posts { @@ -28,6 +28,15 @@ div.posts div.post { margin: 20px 0 0 0; padding: 10px; width: calc(100% - 40px); + cursor: pointer; + transition-duration: 250ms; +} + +div.posts div.post:hover { + /*margin: 15px 0 0 -5px;*/ + /*padding: 15px;*/ + /*z-index: 20;*/ + box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); } div.posts div.post img { @@ -76,11 +85,12 @@ div.posts .post form textarea.newpost { float: right; padding: 10px; border-radius: 5px; - background-color: #845663; + background-color: #4CAF50; color: #FFFFFF; transition-duration: 250ms; + cursor: pointer; } .profile-button:hover { - background-color: #B78996; + box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); } \ No newline at end of file diff --git a/website/queries/friendship.php b/website/queries/friendship.php index df6a917..0deba63 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -22,11 +22,42 @@ function selectAllFriends($userID) { `friendship`.`user2ID` = :userID AND `friendship`.`user1ID` = `user`.`userID`) AND `role` != 5 AND - `status` = 1 + `status` = 1 "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); $stmt->execute(); return $stmt; +} + +function selectAllFriendRequests() { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + `userID`, + `username`, + IFNULL( + `profilepicture`, + '../img/notbad.jpg' + ) AS profilepicture, + `onlinestatus`, + `role` + FROM + `user` + INNER JOIN + `friendship` + + WHERE + (`friendship`.`user1ID` = :userID AND + `friendship`.`user2ID` = `user`.`userID` OR + `friendship`.`user2ID` = :userID AND + `friendship`.`user1ID` = `user`.`userID`) AND + `role` != 5 AND + `status` = 0 + "); + + $stmt->bindParam(':userID', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->execute(); + + return json_encode($stmt->fetchAll()); } \ No newline at end of file diff --git a/website/views/head.php b/website/views/head.php index 4347650..044ac83 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -1,16 +1,17 @@ MyHyvesbook+ - - - + + + + MyHyvesbook+
    -
    +
    diff --git a/website/views/menu.php b/website/views/menu.php index a150848..b7651bd 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -1,5 +1,5 @@
    -
    - | - | - -
    Hallo @@ -32,5 +28,4 @@ $userinfo = getHeaderInfo();
    "/>
    -
    -- 2.49.1 From 7eec0cfa2ae345846e0556855d295fbe606c17c5 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Mon, 23 Jan 2017 17:22:22 +0100 Subject: [PATCH 114/322] Begin chat change --- website/public/js/header.js | 8 -------- website/public/styles/chat.css | 10 ++++++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/website/public/js/header.js b/website/public/js/header.js index 093cc91..a0052c3 100644 --- a/website/public/js/header.js +++ b/website/public/js/header.js @@ -1,12 +1,4 @@ $(document).ready(function() { - // Hide notification center. - $("#profile-menu-popup").hide(); - - // $("#own-profile-picture").click(function() { - // $("#profile-menu-popup").toggle(); - // $("#profile-hello-popup").toggle(); - // }); - $("#own-profile-picture").click(function() { if($("#notification-center").css('right') == "-256px") { $(".content").animate({ diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index f6060dd..c7d0235 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -25,6 +25,7 @@ /* Chat history. */ .chat-history { overflow-y: auto; + overflow-x: hidden; height: 100%; padding: 10px; } @@ -46,14 +47,15 @@ .chat-message-self { float: right; margin-right: 10px; - background-color: darkgreen; + background-color: #FBC02D; color: white; } .chat-message-other { float: left; margin-left: 10px; - background-color: aquamarine; + background-color: #4CAF50; + color: white; } /* Chat reply field */ @@ -91,6 +93,6 @@ } .active-friend-chat { - background: aquamarine; - color: #333; + background: #4CAF50; + color: white; } \ No newline at end of file -- 2.49.1 From c4e4508b53d8e10687597cb083190149cea375f2 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 10:19:13 +0100 Subject: [PATCH 115/322] Changed admin layout and fixed for enums --- website/public/js/admin.js | 2 +- website/public/js/header.js | 6 +- website/public/styles/adminpanel.css | 66 ++-------- website/public/styles/chat.css | 8 +- website/public/styles/header.css | 4 +- website/views/adminpanel.php | 190 ++++++++++++--------------- 6 files changed, 109 insertions(+), 167 deletions(-) diff --git a/website/public/js/admin.js b/website/public/js/admin.js index 2055123..e3dfdd7 100644 --- a/website/public/js/admin.js +++ b/website/public/js/admin.js @@ -28,7 +28,7 @@ function checkCheckAll(allbox) { } function changeFilter() { - if (document.getElementById('group').checked) { + if ($('#pagetype').find(":selected").val() == "group") { document.getElementById('admin-filter').style.display = 'none'; document.getElementById('admin-groupfilter').style.display = 'inline-block'; diff --git a/website/public/js/header.js b/website/public/js/header.js index 23e4f0f..8d91d95 100644 --- a/website/public/js/header.js +++ b/website/public/js/header.js @@ -5,14 +5,14 @@ $(document).ready(function() { marginRight: "256px" }, 500); $(".chat-right").animate({ - width: "calc(100% - 512px - 40px)" + width: $(".chat-right").width() - 266 }, 500); $("#notification-center").animate({ right: "0px" }, 500); } else { $(".chat-right").animate({ - width: "calc(100% - 256px - 40px)" + width: $(".chat-right").width() + 266 }, 500); $(".content").animate({ marginRight: "0px" @@ -22,6 +22,4 @@ $(document).ready(function() { }, 500); } }); - - $("#own-profile-picture").click(); }); diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index 4c5356f..f9410e1 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -1,71 +1,33 @@ .admin-panel { - margin: auto; min-width: 800px; } -.admin-title { - margin: 10px; - padding-bottom: 5px; - border-bottom: 4px solid #FBC02D; -} - .admin-panel input[type="radio"], input[type="checkbox"] { + vertical-align: middle; height: auto; -} - -.admin-batchactions, .admin-groupbatchactions { - display: inline-block; - padding: 8px; - vertical-align: top; - border-radius: 10px; - border: 4px solid #FBC02D; - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + margin: 2px; } .admin-searchform { display: inline-block; + width: 100%; } .admin-searchbar { - display: inline-block; - margin: 10px; - vertical-align: top; -} - -.admin-searchinput { - margin-bottom: 10px; -} - -.admin-filter, .admin-filtertype, .admin-groupfilter { - display: inline-block; - margin: 10px; - vertical-align: top; - margin-right: 50px; - margin-left: 50px; -} - -.admin-filter, .admin-groupfilter { - width: 120px; -} - -.admin-users { - margin: 10px; -} - -.admin-userheading { - width: auto; - float: left; -} - -.admin-pageui { - text-align: right; - float: right; - width: auto; margin-bottom: 20px; } -.usertitle { - width: 150px; +.admin-pageui { + display: inline-block; + width: 100%; +} + +.admin-pageselector { + display: inline-block; +} + +.admin-users { + margin-top: 50px; } .usertable { diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index c7d0235..16505f5 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -3,7 +3,7 @@ position: fixed; top: 80px; left: 256px; - padding: 15px 0; + padding: 20px 0; width: calc(100% - 256px); height: calc(100% - 120px); display: inline-flex; @@ -28,6 +28,8 @@ overflow-x: hidden; height: 100%; padding: 10px; + + word-wrap: break-word; } /* Chat-message takes the whole width of the chat area */ @@ -48,7 +50,7 @@ float: right; margin-right: 10px; background-color: #FBC02D; - color: white; + color: #333; } .chat-message-other { @@ -79,7 +81,6 @@ width: 100%; border: none; border-radius: 10px 0 0 10px; - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } .chat-field input[type="submit"] { @@ -89,7 +90,6 @@ color: white; padding: 5px 10px; border-radius: 0 10px 10px 0; - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } .active-friend-chat { diff --git a/website/public/styles/header.css b/website/public/styles/header.css index e39f204..0b70455 100644 --- a/website/public/styles/header.css +++ b/website/public/styles/header.css @@ -7,7 +7,9 @@ header { height: 80px; width: 100%; - color: white; + color: #FFF; + font-weight: bold; + letter-spacing: 1px; background-color: #FBC02D; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index e53d679..d97a9e8 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -1,16 +1,8 @@ - - - - - Admin Panel - - - - - + +
    -
    -

    User Management Panel

    -

    +
    Zoek naar gebruikers of groepen:
    " method="get"> + - -
    -

    Show:

    - - > +
    +
    Type gebruiker:
    + > +
    + >
    - > + >
    - > + >
    - > + >
    - > + >
    - > + >
    -
    -

    Show:

    - +
    +
    Type groep:
    + > +
    >
    @@ -118,60 +143,12 @@ $listm = $currentpage * $perpage; >
    - -
    -

    Page Type:

    - - onchange="changeFilter()"> -
    - - onchange="changeFilter()"> - -
    - -
    -

    Batch Actions:

    -
    - -
    - -
    - -

    - -
    -
    - -
    -

    Batch Actions:

    -
    - -
    - -
    - -

    - -
    -
    -
    -
    -
    -

    Users:

    -
    -
    +

    Resultaat:

    + -

    Current page:

    -
    -

    -

    -

    + +
    + + + +
    +
    - - + + - - + + @@ -226,7 +207,6 @@ $listm = $currentpage * $perpage; if ($pagetype == 'user') { $q = searchSomeUsersByStatus($listn, $listm, $search, $status); - while($user = $q->fetch(PDO::FETCH_ASSOC)) { $userID = $user['userID']; $username = $user['username']; @@ -252,9 +232,9 @@ $listm = $currentpage * $perpage; action='$thispage' method='post'> -- 2.49.1 From 62a2b32c959154274aa71c8c312801da0f642f1a Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 12:12:48 +0100 Subject: [PATCH 116/322] 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 . "
    "; } ?> -- 2.49.1 From 4579b98eb832a53d6fbca0f7a3d2902ad6c6f712 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 13:54:08 +0100 Subject: [PATCH 117/322] 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 -- 2.49.1 From c1359920e067347e3fe0ed15b108e91cc43b9148 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 14:00:55 +0100 Subject: [PATCH 118/322] 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 119/322] 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 -- 2.49.1 From dc11830c80472bbb2006473b995df2cc28754c94 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 14:32:43 +0100 Subject: [PATCH 120/322] 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`, -- 2.49.1 From d44ddf2793168c126329e31f9e1c30bb9804343a Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 14:36:27 +0100 Subject: [PATCH 121/322] 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"]}"; } -- 2.49.1 From 86b97cc186efe69bcbc4b04b2092ed77b5a11931 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 24 Jan 2017 14:47:38 +0100 Subject: [PATCH 122/322] 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();
  • -- 2.49.1 From 4967ab6ea07ed2d20d4bd4909f946ae90ccb9936 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 15:01:55 +0100 Subject: [PATCH 123/322] 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"]}"; } -- 2.49.1 From 7a19fea5f9d8ce126d4fa6bb3f995eab036f8625 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Tue, 24 Jan 2017 15:08:24 +0100 Subject: [PATCH 124/322] 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 @@ *
  • - + + + + +
    -
    -- 2.49.1 From fd055e8355e0ad46e43e120dfb6c49f24b35d49b Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 15:16:15 +0100 Subject: [PATCH 125/322] 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"; -- 2.49.1 From f9f1e2bf173ee75f6eb9dbb8c94e0bd9ef078cf3 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 16:40:30 +0100 Subject: [PATCH 126/322] 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); -- 2.49.1 From 70957015ceb57b7d363b9277c17942dee03cd74e Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 16:51:34 +0100 Subject: [PATCH 127/322] 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"]}"; } -- 2.49.1 From b9fc016f7d4545fcc4d7e30ea351e51774f672b8 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Tue, 24 Jan 2017 16:56:04 +0100 Subject: [PATCH 128/322] add post viewing basis, add insert post and comment queries --- website/public/js/masonry.js | 8 +++ website/public/js/profile.js | 0 website/public/profile.php | 4 +- website/public/styles/post-popup.css | 38 +++++++++++ website/queries/post.php | 97 ++++++++++++++++++++++++++++ website/views/post-view.php | 53 +++++++++++++++ website/views/profile.php | 9 +++ 7 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 website/public/js/profile.js create mode 100644 website/public/styles/post-popup.css create mode 100644 website/queries/post.php create mode 100644 website/views/post-view.php diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index e9419a2..2bddf59 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -73,4 +73,12 @@ function mansonry() { } $("div.posts div.column").width(100/columnCount + "%"); + + $(".post").click(function () { + $(".modal").show(); + }); + + $(".modal-close").click(function () { + $(".modal").hide(); + }); } \ No newline at end of file diff --git a/website/public/js/profile.js b/website/public/js/profile.js new file mode 100644 index 0000000..e69de29 diff --git a/website/public/profile.php b/website/public/profile.php index e4f1452..f7cae2b 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -2,9 +2,10 @@ - + @@ -12,6 +13,7 @@ include("../queries/user.php"); include("../queries/friendship.php"); include("../queries/nicetime.php"); +include("../queries/post.php"); if(empty($_GET["username"])) { $userID = $_SESSION["userID"]; diff --git a/website/public/styles/post-popup.css b/website/public/styles/post-popup.css new file mode 100644 index 0000000..c4a2a4c --- /dev/null +++ b/website/public/styles/post-popup.css @@ -0,0 +1,38 @@ +/* modal based on: http://www.w3schools.com/howto/howto_css_modals.asp */ + +.modal { + /*display: none; !* Hidden by default *!*/ + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + left: 0; + top: 0; + width: calc(100% - 256px); /* Full width */ + height: calc(100% - 80px); /* Full height */ + overflow: visible; /* Enable scroll if needed */ + background-color: rgb(0,0,0); /* Fallback color */ + background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ +} + +/* Modal Content/Box */ +.modal-content { + background-color: #fefefe; + margin: 15% auto; /* 15% from the top and centered */ + padding: 20px; + border: 1px solid #888; + width: 80%; /* Could be more or less, depending on screen size */ +} + +.modal-close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; + margin: auto; +} + +.modal-close:hover, +.modal-close:focus { + color: black; + text-decoration: none; + cursor: pointer; +} \ No newline at end of file diff --git a/website/queries/post.php b/website/queries/post.php new file mode 100644 index 0000000..0183a5d --- /dev/null +++ b/website/queries/post.php @@ -0,0 +1,97 @@ +prepare(" + SELECT + `user`.`fname`, + `user`.`lname`, + `user`.`username`, + `post`.`groupID`, + `post`.`title`, + `post`.`content`, + `post`.`creationdate` + FROM + `post` + INNER JOIN + `user` + ON + `post`.`author` = `user`. `userID` + WHERE + `post`.`postID` = :postID + "); + + $stmt->bindParam(':postID', $postID); + $stmt->execute(); + return $stmt; +} + +function selectCommentsByPostId($postID) { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + `comment`.`commentID`, + `comment`.`postID`, + `comment`.`author`, + `comment`.`content`, + `comment`.`creationdate`, + `user`.`fname`, + `user`.`lname`, + `user`.`username` + FROM + `comment` + INNER JOIN + `user` + ON + `comment`.`author` = `user`.`userID` + WHERE + `comment`.`postID` = :postID + "); + + $stmt->bindParam(':postID', $postID); + $stmt->execute(); + return $stmt; +} + +function makePost($userID, $groupID, $title, $content) { + $stmt = $GLOBALS["db"]->prepare(" + INSERT INTO + `post` ( + `author`, + `groupID`, + `title`, + `content` + ) + VALUES ( + :userID, + :groupID, + :title, + :content + ) + "); + + $stmt->bindParam(':userID', $userID); + $stmt->bindParam(':groupID', $groupID); + $stmt->bindParam(':title', $title); + $stmt->bindParam(':content', $content); + $stmt->execute(); +} + +function makeComment($postID, $userID, $content) { + $stmt = $_GLOBAL["db"]->prepare(" + INSERT INTO + `comment` ( + `postID`, + `author`, + `content` + ) + VALUES ( + :postID, + :userID, + :content + ) + "); + + $stmt->bindParam(':postID', $postID); + $stmt->bindParam(':userID', $userID); + $stmt->bindParam(':content', $content); + $stmt->execute(); +} \ No newline at end of file diff --git a/website/views/post-view.php b/website/views/post-view.php new file mode 100644 index 0000000..2450468 --- /dev/null +++ b/website/views/post-view.php @@ -0,0 +1,53 @@ +fetch(PDO::FETCH_ASSOC); + $fullname = $post['fname'] . " " . $post['lname'] . " (" . $post['username'] . ")"; +?> + +

    +

    + +
    + +
    +

    +
    + +
    +
    +
    +
    + + +
    + + fetch(PDO::FETCH_ASSOC)) { + $commentauthor = $comment['fname'] . " " . $comment['lname'] . " (" . $comment['username'] . ")"; + $commentdate = $comment['creationdate']; + $commentnicetime = nicetime($commentdate); + $commentcontent = $comment['content']; + + echo(" +
    +
    + $commentauthor + + $commentnicetime + +
    +
    + $commentcontent +
    +
    + "); + } + ?> +
    diff --git a/website/views/profile.php b/website/views/profile.php index 19bd908..6d69437 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -66,4 +66,13 @@ } ?>
    + + \ No newline at end of file -- 2.49.1 From de03d8799a2ce018e3f62ac8da30459ef76787ee Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 16:58:51 +0100 Subject: [PATCH 129/322] 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 @@
    - +
    -- 2.49.1 From 7144d700e4c3d805b4d85f68b7d20e93e68d966b Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 24 Jan 2017 17:02:49 +0100 Subject: [PATCH 130/322] 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); -- 2.49.1 From 7bf8a16cf0c306303db1b1ae3179beb71fe3e39c Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 17:06:39 +0100 Subject: [PATCH 131/322] 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 -- 2.49.1 From 12ed710369ce6b0e469eee00a856b19eacd3ee8a Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 24 Jan 2017 17:10:12 +0100 Subject: [PATCH 132/322] 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 133/322] 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`, -- 2.49.1 From f7da87596a513cf8ae421e97e2123aa7a771bc88 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 25 Jan 2017 09:30:05 +0100 Subject: [PATCH 134/322] 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 -- 2.49.1 From 28f31d749bf4dc5a920939c55d37a0f9f9a2b2f3 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Wed, 25 Jan 2017 11:16:53 +0100 Subject: [PATCH 135/322] 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 -- 2.49.1 From 981e34c95082d1bffe8b4a0ca18f5a19239d5829 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Wed, 25 Jan 2017 11:19:01 +0100 Subject: [PATCH 136/322] 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 @@ + diff --git a/website/views/login_head.php b/website/views/login_head.php index e831cd2..e319a9d 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 f970a6f..5f39472 100644 --- a/website/views/register-view.php +++ b/website/views/register-view.php @@ -126,7 +126,7 @@ -- 2.49.1 From 44f86a4fbb614f56b013c964b92662f15f680a5b Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 26 Jan 2017 12:05:28 +0100 Subject: [PATCH 159/322] Email confirm and password change now use messagepage function. --- website/public/emailconfirm.php | 12 ++--- website/public/resetpassword.php | 16 +++--- website/views/messagepage.php | 23 +++++++++ website/views/resetpassword.php | 85 ++++++++++++++------------------ 4 files changed, 77 insertions(+), 59 deletions(-) create mode 100644 website/views/messagepage.php diff --git a/website/public/emailconfirm.php b/website/public/emailconfirm.php index 97eb2f6..2812eaa 100644 --- a/website/public/emailconfirm.php +++ b/website/public/emailconfirm.php @@ -1,5 +1,6 @@ prepare(" SELECT @@ -18,11 +19,11 @@ if (array_key_exists("u", $_GET) and array_key_exists("h", $_GET)) { if ($role == "unconfirmed") { doActivate($email); } else { - echo "Ongeldige link."; + messagePage("Ongeldige link."); } } else { - echo "Ongeldige link."; + messagePage("Ongeldige link."); } function doActivate(string $email) { @@ -39,11 +40,10 @@ function doActivate(string $email) { $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"); + messagePage("Email bevestigd
    + Klik hier om terug te gaan naar de login pagina."); } } else { - echo "Ongeldige link."; + messagePage("Ongeldige link."); } } \ No newline at end of file diff --git a/website/public/resetpassword.php b/website/public/resetpassword.php index 54b706b..3ca2698 100644 --- a/website/public/resetpassword.php +++ b/website/public/resetpassword.php @@ -1,26 +1,30 @@ + + + + + +
    + +
    $content
    +
    + + + "); + + echo $webpage; + } \ No newline at end of file diff --git a/website/views/resetpassword.php b/website/views/resetpassword.php index 24d3aaf..a3107f9 100644 --- a/website/views/resetpassword.php +++ b/website/views/resetpassword.php @@ -1,47 +1,38 @@ - - - - - - -
    - - -
    -
    Voer een nieuw wachtwoord in
    - " - > - " - > -
      -
    • - - -
    • -
    • - - -
    • -
    • - - -
    • -
    - -
    - - \ No newline at end of file + +
    Voer een nieuw wachtwoord in
    + + +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    + "; + return $content; +} \ No newline at end of file -- 2.49.1 From 47eed5514a80408a735bafbfbf756166dad27542 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 26 Jan 2017 12:14:07 +0100 Subject: [PATCH 160/322] Removed .idea folder --- .idea/WebDB.iml | 18 ---------------- .idea/inspectionProfiles/Project_Default.xml | 22 -------------------- .idea/modules.xml | 8 ------- .idea/php.xml | 4 ---- .idea/sqldialects.xml | 6 ------ .idea/vcs.xml | 6 ------ 6 files changed, 64 deletions(-) delete mode 100644 .idea/WebDB.iml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/php.xml delete mode 100644 .idea/sqldialects.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/WebDB.iml b/.idea/WebDB.iml deleted file mode 100644 index b313593..0000000 --- a/.idea/WebDB.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index f08a78f..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index e1b2ef9..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml deleted file mode 100644 index 10b171f..0000000 --- a/.idea/php.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml deleted file mode 100644 index af0e43a..0000000 --- a/.idea/sqldialects.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file -- 2.49.1 From 423c2fd7712b0be152c4201e3e2063b9917ac85b Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 26 Jan 2017 12:16:28 +0100 Subject: [PATCH 161/322] Revert "Merge branch 'marijn-settings' into 'master'" This reverts merge request !128 --- .idea/WebDB.iml | 18 ++++++++++++++++ .idea/inspectionProfiles/Project_Default.xml | 22 ++++++++++++++++++++ .idea/modules.xml | 8 +++++++ .idea/php.xml | 4 ++++ .idea/sqldialects.xml | 6 ++++++ .idea/vcs.xml | 6 ++++++ 6 files changed, 64 insertions(+) create mode 100644 .idea/WebDB.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 .idea/sqldialects.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/WebDB.iml b/.idea/WebDB.iml new file mode 100644 index 0000000..b313593 --- /dev/null +++ b/.idea/WebDB.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..f08a78f --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e1b2ef9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..10b171f --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..af0e43a --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file -- 2.49.1 From 3ebacd62515c89cf6633c7ad0d41631211d09434 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 26 Jan 2017 12:20:32 +0100 Subject: [PATCH 162/322] Fixed masonry grid (posts). --- website/public/js/masonry.js | 66 ++++++++++++++---------------------- website/public/profile.php | 16 ++++++++- website/queries/user.php | 4 ++- website/views/profile.php | 50 +++++++++++++-------------- 4 files changed, 69 insertions(+), 67 deletions(-) diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index e9419a2..b523828 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -1,37 +1,28 @@ margin = 20; -$(window).on("load", function() { - console.log("LOADED"); - container = $("div.posts"); - posts = container.children(); - posts.remove(); - - column = $('
    ').append(posts); - container.append(column); - - mansonry(); - mansonry(); -}); - $(window).resize(function() { clearTimeout(window.resizedFinished); window.resizeFinished = setTimeout(function() { - mansonry(); + masonry(); }, 250); }); -function mansonry() { +var $container = $(".posts"); +function masonry() { + $container.children().remove(); columnCount = Math.floor($(".posts").width() / 250); - console.log("columns: " + columnCount); /* * Initialise columns. */ var columns = new Array(columnCount); + var $columns = new Array(columnCount); for (i = 0; i < columnCount; i++) { - columns[i] = [0, []]; - console.log(columns[i]); + $column = $("
    "); + $column.width(100/columnCount + "%"); + $container.append($column); + columns[i] = [0, $column]; } /* @@ -45,32 +36,27 @@ function mansonry() { column = columns[i]; } } - return column; } /* - * Rearange the objects. + * Get the posts from the server. */ - j = 0; - posts.each(function(i) { - post = posts[i]; - shortestColumn = getShortestColumn(columns); - shortestColumn[0] = shortestColumn[0] + $(post).height() + margin; - shortestColumn[1].push(post); + $.post("API/getPosts.php", { usr : userID }) + .done(function(data) { + posts = JSON.parse(data); - }); - - container.children().remove(); - /* - * Display the objects again in the correct order. - */ - for (i = 0; i < columnCount; i++) { - column = $('
    ').append(columns[i][1]); - console.log(column); - container.append(column); + /* + * Rearange the objects. + */ + jQuery.each(posts, function() { + $post = $("
    "); + $post.append($("

    ").text(this["title"])); + $post.append($("

    ").html(this["content"])); - } - - $("div.posts div.column").width(100/columnCount + "%"); -} \ No newline at end of file + shortestColumn = getShortestColumn(columns); + shortestColumn[1].append($post); + shortestColumn[0] = shortestColumn[0] + $post.height() + margin; + }); + }); +} diff --git a/website/public/profile.php b/website/public/profile.php index 6e188c4..1423483 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -2,7 +2,6 @@ - @@ -45,10 +44,25 @@ include("../views/footer.php"); ?> + diff --git a/website/queries/user.php b/website/queries/user.php index 9904eee..7672746 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -126,7 +126,9 @@ function selectAllUserPosts($userID) { "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); - $stmt->execute(); + if(!$stmt->execute()) { + return False; + } return $stmt; } diff --git a/website/views/profile.php b/website/views/profile.php index 3719ff1..6b7b283 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -5,7 +5,7 @@

    - +

    @@ -43,29 +43,29 @@
    - -
    -
    - - - - -
    - fetch()) { - $nicetime = nicetime($post["creationdate"]); - echo " -
    -

    ${post["title"]}

    -

    ${post["content"]}

    -

    ${nicetime} geplaatst.

    -
    - "; - } - ?> + + + + + + + + +fetch()) { +// $nicetime = nicetime($post["creationdate"]); +// echo " +//
    +//

    ${post["title"]}

    +//

    ${post["content"]}

    +//

    ${nicetime} geplaatst.

    +//
    +// "; +// } +// ?>
    \ No newline at end of file -- 2.49.1 From 91aca6baa740f48958435a3f12ee608cbd8d4e14 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 26 Jan 2017 12:21:01 +0100 Subject: [PATCH 163/322] change comments to use ajax --- website/public/API/postComment.php | 14 ++++++++------ website/public/js/post.js | 18 ++++++++++++++++++ website/public/js/profile.js | 8 -------- website/public/profile.php | 2 +- website/views/post-view.php | 6 +++--- 5 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 website/public/js/post.js diff --git a/website/public/API/postComment.php b/website/public/API/postComment.php index c5b30cc..b840e0b 100644 --- a/website/public/API/postComment.php +++ b/website/public/API/postComment.php @@ -5,12 +5,14 @@ session_start(); require("../../queries/post.php"); require("../../queries/connect.php"); require("../../queries/checkInput.php"); - if (empty($_POST['newcomment-content'])) { + echo 0; } else { - makeComment($_POST['postID'], + if(makeComment($_POST['postID'], $_SESSION['userID'], - test_input($_POST['newcomment-content'])); -} - -header("Location: ../profile.php"); \ No newline at end of file + test_input($_POST['newcomment-content']))) { + echo 1; + } else { + echo 0; + } +} \ No newline at end of file diff --git a/website/public/js/post.js b/website/public/js/post.js new file mode 100644 index 0000000..62ace68 --- /dev/null +++ b/website/public/js/post.js @@ -0,0 +1,18 @@ +function postComment() { + $.post( + "API/postComment.php", + $("#newcommentform").serialize() + ); + + $("#newcomment").val(""); + + //reload post + $.get( + "API/loadPost.php", + $("#newcommentform").serialize() + ).done(function (data) { + $('#modal-response').html(data); + }); +} + + diff --git a/website/public/js/profile.js b/website/public/js/profile.js index 2a47dce..e69de29 100644 --- a/website/public/js/profile.js +++ b/website/public/js/profile.js @@ -1,8 +0,0 @@ -function loadPost(postID) { - $.get( - "API/loadPost.php", - $(postID).serialize() - ).done(function (data) { - $('#modal-response').innerHTML= JSON.parse(data); - }); -} \ No newline at end of file diff --git a/website/public/profile.php b/website/public/profile.php index d2d3c3f..c8f27c4 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -3,7 +3,7 @@ - + + + fetchColumn(); Zoek: > - @@ -79,22 +83,9 @@ $group_count = countSomeGroups($search)->fetchColumn(); @@ -122,42 +113,9 @@ $group_count = countSomeGroups($search)->fetchColumn(); -- 2.49.1 From b66c108f4ec105ed990c804581197b03beb2ac52 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 26 Jan 2017 14:31:45 +0100 Subject: [PATCH 167/322] Fixed post titles for htmlchars. --- website/public/js/masonry.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index 0b31443..6b91e4b 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -100,7 +100,7 @@ function masonry(mode) { */ jQuery.each(posts, function() { $post = $("
    "); - $post.append($("

    ").text(this["title"])); + $post.append($("

    ").html(this["title"])); $post.append($("

    ").html(this["content"])); $post.append($("

    ").text(this["nicetime"])); -- 2.49.1 From 96f70e1a113ee487e65af9e0ab3adebf3d5a29e7 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Thu, 26 Jan 2017 14:50:41 +0100 Subject: [PATCH 168/322] Fixed date and other extras --- website/public/login.php | 6 +-- website/public/register.php | 17 ++++++-- website/public/styles/index.css | 7 ++- website/queries/checkInput.php | 23 +++++++--- website/queries/login.php | 6 +-- website/queries/register.php | 26 ++++++----- website/views/login-view.php | 77 +++++++++++++++++---------------- website/views/register-view.php | 66 ++++++++++++++++++++++++---- 8 files changed, 156 insertions(+), 72 deletions(-) diff --git a/website/public/login.php b/website/public/login.php index 0515793..d4dd991 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -20,15 +20,15 @@ } // Define variables and set to empty values - $uname = $psw =""; + $user = $psw =""; $loginErr = $resetErr =""; if ($_SERVER["REQUEST_METHOD"] == "POST") { switch ($_POST["submit"]) { case "login": try { - $uname = ($_POST["uname"]); - validateLogin($_POST["uname"], $_POST["psw"]); + $user = ($_POST["user"]); + validateLogin($_POST["user"], $_POST["psw"]); } catch(loginException $e) { $loginErr = $e->getMessage(); } diff --git a/website/public/register.php b/website/public/register.php index 1ce4817..0077e62 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -14,9 +14,12 @@ header("location: login.php"); } // define variables and set to empty values - $name = $surname = $bday = $username = $password = $confirmpassword = $location = $housenumber = $email = $captcha = $ip = ""; - $genericErr = $nameErr = $surnameErr = $bdayErr = $usernameErr = $passwordErr = $confirmpasswordErr = $locationErr = $housenumberErr = $emailErr = $captchaErr = ""; + $name = $surname = $bday = $username = $password = $confirmpassword = $location = $housenumber = $email = $confirmEmail = $captcha = $ip = ""; + $genericErr = $nameErr = $surnameErr = $bdayErr = $usernameErr = $passwordErr = $confirmpasswordErr = $locationErr = $housenumberErr = $emailErr = $confirmEmailErr = $captchaErr = ""; $correct = true; + $day_date = "dag"; + $month_date = "maand"; + $year_date = "jaar"; // Trying to register an account if ($_SERVER["REQUEST_METHOD"] == "POST") { @@ -38,7 +41,10 @@ } try{ - $bday = test_input(($_POST["bday"])); + $day_date = test_input(($_POST["day_date"])); + $month_date = test_input(($_POST["month_date"])); + $year_date = test_input(($_POST["year_date"])); + $bday = $year_date . "-" . $month_date . "-" . $day_date; checkInputChoice($bday, "bday"); } catch(bdayException $e){ $correct = false; @@ -76,9 +82,14 @@ try{ $email = test_input(($_POST["email"])); checkInputChoice($email, "email"); + $confirmEmail = test_input(($_POST["confirmEmail"])); + matchEmail(); } catch(emailException $e){ $correct = false; $emailErr = $e->getMessage(); + } catch(confirmEmailException $e){ + $correct = false; + $confirmEmailErr = $e->getMessage(); } try{ diff --git a/website/public/styles/index.css b/website/public/styles/index.css index 97d6f63..9829688 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -133,6 +133,10 @@ label { width: 45%; } +select{ + width: 18%; +} + ul { font-family: Arial; font-size: 16px; @@ -203,7 +207,6 @@ ul { .modal-body {padding: 2px 16px;} .modal-footer { - padding: 2px 16px; background-color: #FBC02D; color: black; -} \ No newline at end of file +} diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index 9b91833..fbf64a7 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -38,8 +38,7 @@ 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!"); } } @@ -48,12 +47,12 @@ function validateBday($variable){ if (empty($variable)) { throw new bdayException("Verplicht!"); } else { - if (!(validateDate($variable, "Y/m/d"))) { + if (!(validateDate($variable, "Y-m-d"))) { throw new bdayException("Geen geldige datum"); } else { - $dateNow = date("Y/m/d"); + $dateNow = date("Y-m-d"); if ($dateNow < $variable) { - throw new bdayException("Geen geldige datum"); + throw new bdayException("Geen geldige datum!"); } } } @@ -97,6 +96,12 @@ function validateEmail($variable){ } } +function matchEmail(){ + if (strtolower($_POST["email"]) != strtolower($_POST["confirmEmail"])){ + throw new confirmEmailException("Emails matchen niet!"); + } +} + /* checks if an input is a valid email. */ function resetEmail($variable){ if (empty($variable)) { @@ -206,6 +211,14 @@ class emailException extends Exception } } +class confirmEmailException 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) diff --git a/website/queries/login.php b/website/queries/login.php index 2af255a..15a5de1 100644 --- a/website/queries/login.php +++ b/website/queries/login.php @@ -9,10 +9,10 @@ function getUser() { FROM `user` WHERE - `username` LIKE :username + `username` LIKE :username OR + `email` LIKE :username "); - $stmt->bindParam(":username", $_POST["uname"]); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } @@ -20,7 +20,7 @@ function getUser() { function validateLogin($username, $password){ // Empty username or password field if (empty($username) || empty($password)) { - throw new loginException("Gebruikersnaam of wachtwoord is niet ingevuld"); + throw new loginException("Inloggegevens zijn niet ingevuld"); } else { $psw = test_input($password); diff --git a/website/queries/register.php b/website/queries/register.php index 738ef43..be9d415 100644 --- a/website/queries/register.php +++ b/website/queries/register.php @@ -10,7 +10,7 @@ function getExistingUsername() { `username` LIKE :username "); - $stmt->bindParam(":username", $_POST["username"]); + $stmt->bindParam(":username", test_input($_POST["username"])); $stmt->execute(); return $stmt->rowCount(); @@ -26,7 +26,7 @@ function getExistingEmail() { `email` LIKE :email "); - $stmt->bindParam(":email", $_POST["email"]); + $stmt->bindParam(":email", test_input($_POST["email"])); $stmt->execute(); return $stmt->rowCount(); @@ -42,7 +42,7 @@ function getResetEmail() { `email` LIKE :email "); - $stmt->bindParam(":email", $_POST["forgotEmail"]); + $stmt->bindParam(":email", test_input($_POST["forgotEmail"])); $stmt->execute(); return $stmt->rowCount(); @@ -70,15 +70,21 @@ function registerAccount() { $hash=password_hash($_POST["password"], PASSWORD_DEFAULT); - $stmt->bindParam(":fname", $_POST["name"]); - $stmt->bindParam(":lname", $_POST["surname"]); - $stmt->bindParam(":bday", $_POST["bday"]); - $stmt->bindParam(":username", $_POST["username"]); - $stmt->bindParam(":password", $hash); - $stmt->bindParam(":location", $_POST["location"]); - $stmt->bindParam(":email", (strtolower($_POST["email"]))); + $stmt->bindParam(":fname", test_input($_POST["name"])); + $stmt->bindParam(":lname", test_input($_POST["surname"])); + $stmt->bindParam(":bday", test_input($_POST["bday"])); + $stmt->bindParam(":username", test_input($_POST["username"])); + $stmt->bindParam(":password", test_input($hash)); + $stmt->bindParam(":location", test_input($_POST["location"])); + $stmt->bindParam(":email", test_input(strtolower($_POST["email"]))); $stmt->execute(); $stmt->rowCount(); } + +function submitselect($date, $value){ + if ($date == $value){ + echo "selected"; + } +} ?> diff --git a/website/views/login-view.php b/website/views/login-view.php index de4c48b..c64590e 100644 --- a/website/views/login-view.php +++ b/website/views/login-view.php @@ -13,11 +13,11 @@

    @@ -47,46 +47,47 @@

    - - -- 2.49.1 From 7073995534742cc2d479f182774d13e2e439b7cf Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 26 Jan 2017 17:03:11 +0100 Subject: [PATCH 174/322] Stop before Genius Bar visit --- website/public/API/postComment.php | 22 ++++++++--- website/public/styles/post-popup.css | 5 +++ website/queries/post.php | 55 +++++++++++++++++++++++++++- website/views/post-view.php | 4 +- 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/website/public/API/postComment.php b/website/public/API/postComment.php index b840e0b..bbe39b1 100644 --- a/website/public/API/postComment.php +++ b/website/public/API/postComment.php @@ -5,14 +5,24 @@ session_start(); require("../../queries/post.php"); require("../../queries/connect.php"); require("../../queries/checkInput.php"); -if (empty($_POST['newcomment-content'])) { - echo 0; -} else { - if(makeComment($_POST['postID'], - $_SESSION['userID'], - test_input($_POST['newcomment-content']))) { +if ($_POST["button"] == "reaction") { + if (empty($_POST['newcomment-content'])) { + echo 0; + } else { + if (makeComment($_POST['postID'], + $_SESSION['userID'], + test_input($_POST['newcomment-content']))) { + echo 1; + } else { + echo 0; + } + } +} elseif ($_POST["button"] == "nietslecht") { + if (makeNietSlecht($_POST["postID"], $_SESSION["userID"])) { echo 1; } else { echo 0; } +} else { + echo 0; } \ No newline at end of file diff --git a/website/public/styles/post-popup.css b/website/public/styles/post-popup.css index 11fe03b..5522743 100644 --- a/website/public/styles/post-popup.css +++ b/website/public/styles/post-popup.css @@ -69,4 +69,9 @@ .commentcontent { margin: 5px auto; width: 95%; +} + +.nietslecht { + font-family: Impact, sans-serif; + text-shadow: -1.5px 0 1px black, 0 1.5px 1px black, 1px 0 1.5px black, 0 -1.5px 1px black; } \ No newline at end of file diff --git a/website/queries/post.php b/website/queries/post.php index 5940267..59e7a91 100644 --- a/website/queries/post.php +++ b/website/queries/post.php @@ -75,7 +75,7 @@ function makePost($userID, $groupID, $title, $content) { $stmt->execute(); } -function makeComment($postID, $userID, $content) { +function makeComment($postID, $userID, $content) : int { $stmt = $GLOBALS["db"]->prepare(" INSERT INTO `comment` ( @@ -94,4 +94,55 @@ function makeComment($postID, $userID, $content) { $stmt->bindParam(':userID', $userID); $stmt->bindParam(':content', $content); $stmt->execute(); -} \ No newline at end of file + return $stmt->rowCount(); +} + +function makeNietSlecht(int $postID, int $userID) : int { + if (checkNietSlecht($postID, $userID)) { + return deleteNietSlecht(postID, $userID); + } else { + return addNietSlecht($postID, $userID); + } +} + +function checkNietSlecht(int $postID, int $userID) { + $stmt = $GLOBALS["db"]->prepare(" + SELECT + * + FROM + `niet_slecht` + WHERE + `userID` = :userID AND + `postID` = :postID + "); + $stmt->bindParam(":userID", $userID); + $stmt->bindParam(":postID", $postID); + $stmt->execute(); + return $stmt->rowCount(); +} + +function addNietSlecht(int $postID, int $userID) { + $stmt = $GLOBALS["db"]->prepare(" + INSERT INTO + `niet_slecht` (`userID`, `postID`) + VALUES (:userID, :postID) + "); + $stmt->bindParam(":userID", $userID); + $stmt->bindParam(":postID", $postID); + $stmt->execute(); + return $stmt->rowCount(); +} + +function deleteNietSlecht(int $postID, int $userID) { + $stmt = $GLOBALS["db"]->prepare(" + DELETE FROM + `niet_slecht` + WHERE + `userID` = :userID AND + `postID` = :postID + "); + $stmt->bindParam(":userID", $userID); + $stmt->bindParam(":postID", $postID); + $stmt->execute(); + return $stmt->rowCount(); +} diff --git a/website/views/post-view.php b/website/views/post-view.php index 61e0e05..37e64b5 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -24,7 +24,9 @@ echo("

    - + + + -- 2.49.1 From 032e25b044c11d0018dfb506de4a9d3d21496f05 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 26 Jan 2017 21:50:47 +0100 Subject: [PATCH 175/322] You can now only chat with friends --- website/public/API/sendMessage.php | 1 + website/queries/private_message.php | 2 +- website/views/chat-view.php | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/website/public/API/sendMessage.php b/website/public/API/sendMessage.php index c5d47d1..f84cb11 100644 --- a/website/public/API/sendMessage.php +++ b/website/public/API/sendMessage.php @@ -3,6 +3,7 @@ session_start(); require_once("../../queries/connect.php"); require_once("../../queries/private_message.php"); +require_once("../../queries/friendship.php"); require_once("../../queries/checkInput.php"); if (!empty(test_input($_POST["destination"])) && diff --git a/website/queries/private_message.php b/website/queries/private_message.php index d2b1537..369ee40 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -58,7 +58,7 @@ function sendMessage($destination, $content) { } function getNewChatMessages($lastID, $destination) { - if (getFriendshipStatus($user2ID) == 1) { + if (getFriendshipStatus($destination) == 1) { $stmt = $GLOBALS["db"]->prepare(" SELECT * diff --git a/website/views/chat-view.php b/website/views/chat-view.php index 0d90149..974b441 100644 --- a/website/views/chat-view.php +++ b/website/views/chat-view.php @@ -74,6 +74,7 @@ name="content" id="newContent" placeholder="Schrijf een bericht..." + autocomplete="off" autofocus required /> -- 2.49.1 From d89e672990325f96c060f3cbb74854eed4519289 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 26 Jan 2017 21:54:47 +0100 Subject: [PATCH 176/322] Also fixed unread chat --- website/public/API/sendMessage.php | 1 - website/queries/private_message.php | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/website/public/API/sendMessage.php b/website/public/API/sendMessage.php index f84cb11..c5d47d1 100644 --- a/website/public/API/sendMessage.php +++ b/website/public/API/sendMessage.php @@ -3,7 +3,6 @@ session_start(); require_once("../../queries/connect.php"); require_once("../../queries/private_message.php"); -require_once("../../queries/friendship.php"); require_once("../../queries/checkInput.php"); if (!empty(test_input($_POST["destination"])) && diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 369ee40..4d48d3a 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -30,6 +30,7 @@ function getOldChatMessages($user2ID) { } function sendMessage($destination, $content) { + require_once("friendship.php"); if (getFriendshipStatus($destination) == 1) { $stmt = $GLOBALS["db"]->prepare(" INSERT INTO @@ -58,6 +59,7 @@ function sendMessage($destination, $content) { } function getNewChatMessages($lastID, $destination) { + require_once("friendship.php"); if (getFriendshipStatus($destination) == 1) { $stmt = $GLOBALS["db"]->prepare(" SELECT @@ -91,13 +93,13 @@ function getNewChatMessages($lastID, $destination) { function selectAllUnreadChat() { $stmt = $GLOBALS["db"]->prepare(" SELECT - LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 15) as `fullname`, + LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 15) AS `fullname`, `user`.`userID`, IFNULL( `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - LEFT(`private_message`.`content`, 15) as `content` + LEFT(`private_message`.`content`, 15) AS `content` FROM `private_message`, `friendship`, -- 2.49.1 From f1bfc89e6afafc61456c4652fade6f197ebd6a26 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 26 Jan 2017 22:33:32 +0100 Subject: [PATCH 177/322] Custom scrollbar --- website/public/styles/main.css | 13 +++++++++++++ website/public/styles/profile.css | 1 + 2 files changed, 14 insertions(+) diff --git a/website/public/styles/main.css b/website/public/styles/main.css index abda8be..0c37afa 100644 --- a/website/public/styles/main.css +++ b/website/public/styles/main.css @@ -275,3 +275,16 @@ div[data-title]:hover:after { display: inline-block; vertical-align: middle; } + +::-webkit-scrollbar { + width: 5px; + height: 5px; +} +::-webkit-scrollbar-track { + background: none; +} +::-webkit-scrollbar-thumb { + -webkit-border-radius: 20px; + border-radius: 20px; + background: #4CAF50; +} \ No newline at end of file diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 85b2db5..becbeca 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -30,6 +30,7 @@ div.posts div.post { width: calc(100% - 40px); cursor: pointer; transition-duration: 250ms; + word-wrap: break-word; } div.posts div.post:hover { -- 2.49.1 From cbff973b631126093c0b8dad90dcb3513eca38ba Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 27 Jan 2017 11:15:33 +0100 Subject: [PATCH 178/322] Save manu state with cookie --- website/public/js/header.js | 11 ++++++++++- website/public/js/main.js | 11 +++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/website/public/js/header.js b/website/public/js/header.js index 9889bdb..bdf5fe3 100644 --- a/website/public/js/header.js +++ b/website/public/js/header.js @@ -1,5 +1,4 @@ $(document).ready(function() { - // Toggle menu $("#own-profile-picture, #open-notifications").click(function() { if ($("#notification-center").css('right') == "-256px") { @@ -8,12 +7,22 @@ $(document).ready(function() { $(".modal").width("calc(100% - 512px)"); $(".content").css("margin-right", "256px"); $("#notification-center").css("right", "0px"); + + // Add cookie so the menu stays open on other pages + document.cookie = "menu=open; path=/"; } else { // Make the menu invisible and move the content to the right. $("#chat-history").width("calc(100% - 331px)"); $(".modal").width("calc(100% - 256px)"); $(".content").css("margin-right", "0px"); $("#notification-center").css("right", "-256px"); + + // Change menu cookie to close + document.cookie = "menu=closed; path=/"; } }); + + if (getCookie("menu") == "open") { + $("#own-profile-picture").click(); + } }); diff --git a/website/public/js/main.js b/website/public/js/main.js index 8a52797..5622827 100644 --- a/website/public/js/main.js +++ b/website/public/js/main.js @@ -1,3 +1,14 @@ +function getCookie(key) { + cookies = document.cookie.split("; "); + for (var i in cookies) { + cookie = cookies[i].split("="); + if (cookie[0] == key) { + return cookie[1]; + } + } + return false; +} + function editFriendship(userID, value) { $.post("API/editFriendship.php", { usr: userID, action: value }) .done(function() { -- 2.49.1 From 3b542e08789c15641248b1e315755e6134f4e38b Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 27 Jan 2017 12:20:50 +0100 Subject: [PATCH 179/322] "Niet slecht."-button! --- website/public/API/postComment.php | 5 +++-- website/public/js/post.js | 10 +++++----- website/public/profile.php | 1 + website/public/styles/post-popup.css | 2 +- website/queries/post.php | 2 +- website/views/post-view.php | 15 ++++++++++++--- 6 files changed, 23 insertions(+), 12 deletions(-) diff --git a/website/public/API/postComment.php b/website/public/API/postComment.php index bbe39b1..30c02eb 100644 --- a/website/public/API/postComment.php +++ b/website/public/API/postComment.php @@ -5,7 +5,8 @@ session_start(); require("../../queries/post.php"); require("../../queries/connect.php"); require("../../queries/checkInput.php"); -if ($_POST["button"] == "reaction") { +print_r($_POST); +if ($_POST['button'] == 'reaction') { if (empty($_POST['newcomment-content'])) { echo 0; } else { @@ -17,7 +18,7 @@ if ($_POST["button"] == "reaction") { echo 0; } } -} elseif ($_POST["button"] == "nietslecht") { +} else if ($_POST['button'] == 'nietslecht') { if (makeNietSlecht($_POST["postID"], $_SESSION["userID"])) { echo 1; } else { diff --git a/website/public/js/post.js b/website/public/js/post.js index 62ace68..1906428 100644 --- a/website/public/js/post.js +++ b/website/public/js/post.js @@ -1,7 +1,9 @@ -function postComment() { +function postComment(buttonValue) { + formData = $("#newcommentform").serializeArray(); + formData.push({name: "button", value: buttonValue}); $.post( "API/postComment.php", - $("#newcommentform").serialize() + formData ); $("#newcomment").val(""); @@ -13,6 +15,4 @@ function postComment() { ).done(function (data) { $('#modal-response').html(data); }); -} - - +} \ No newline at end of file diff --git a/website/public/profile.php b/website/public/profile.php index a79ad4c..95c5b86 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -8,6 +8,7 @@ diff --git a/website/public/styles/post-popup.css b/website/public/styles/post-popup.css index 5522743..c6e96c1 100644 --- a/website/public/styles/post-popup.css +++ b/website/public/styles/post-popup.css @@ -72,6 +72,6 @@ } .nietslecht { - font-family: Impact, sans-serif; + font-family: Impact, Anton, sans-serif; text-shadow: -1.5px 0 1px black, 0 1.5px 1px black, 1px 0 1.5px black, 0 -1.5px 1px black; } \ No newline at end of file diff --git a/website/queries/post.php b/website/queries/post.php index 59e7a91..df1e227 100644 --- a/website/queries/post.php +++ b/website/queries/post.php @@ -99,7 +99,7 @@ function makeComment($postID, $userID, $content) : int { function makeNietSlecht(int $postID, int $userID) : int { if (checkNietSlecht($postID, $userID)) { - return deleteNietSlecht(postID, $userID); + return deleteNietSlecht($postID, $userID); } else { return addNietSlecht($postID, $userID); } diff --git a/website/views/post-view.php b/website/views/post-view.php index 37e64b5..4e0ddb1 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -2,6 +2,7 @@ $postID = $_GET['postID']; $post = selectPostById($postID)->fetch(PDO::FETCH_ASSOC); $fullname = $post['fname'] . " " . $post['lname'] . " (" . $post['username'] . ")"; +session_start(); echo("
    @@ -21,12 +22,20 @@ echo("
    -
    +
    - + - +
    -- 2.49.1 From f27b9ec6b41f85f519c50961e53eb516e3ec842a Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 27 Jan 2017 12:22:26 +0100 Subject: [PATCH 180/322] Chat messages split per day --- website/public/js/chat.js | 18 ++++++++++++++++-- website/public/js/main.js | 3 +++ website/public/js/search.js | 2 -- website/public/styles/chat.css | 21 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/website/public/js/chat.js b/website/public/js/chat.js index 06f85df..2b2fe34 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -1,3 +1,5 @@ +var previousDate = new Date("1970-01-01 00:00:00"); + $(document).ready(function() { loadMessages(); sayEmpty(); @@ -31,13 +33,25 @@ function sendMessage() { } function addMessages(messages) { - for(i in messages) { + for(var i in messages) { + thisDate = new Date(messages[i].creationdate); + thisDate.setHours(0,0,0,0); if (messages[i].destination == $(".destinationID").val()) { type = "chat-message-self"; } else { type = "chat-message-other"; } - + if (thisDate > previousDate) { + console.log(previousDate); + previousDate = thisDate; + $("#chat-history").append('\ +
    \ +
    \ + ' + days[thisDate.getDay()] + " " + thisDate.getDate() + " " + months[thisDate.getMonth()] + " " + thisDate.getFullYear() + '\ +
    \ +
    \ + '); + } $("#chat-history").append('\
    \
    \ diff --git a/website/public/js/main.js b/website/public/js/main.js index 5622827..587f020 100644 --- a/website/public/js/main.js +++ b/website/public/js/main.js @@ -1,3 +1,6 @@ +var days = ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"]; +var months = ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"] + function getCookie(key) { cookies = document.cookie.split("; "); for (var i in cookies) { diff --git a/website/public/js/search.js b/website/public/js/search.js index b3c322a..c026b64 100644 --- a/website/public/js/search.js +++ b/website/public/js/search.js @@ -8,7 +8,6 @@ function searchUsers(n, m) { filter: $("#search-filter").val() } ).done(function(data) { - console.log(data); if (!showFriends(data, "#search-users-list", 0, "profile.php", "GET")) { $("#search-users-list").text("Niemand gevonden"); } @@ -25,7 +24,6 @@ function searchGroups(n, m) { filter: $("#search-filter").val() } ).done(function(data) { - console.log(data); if (!showGroups(data, "#search-groups-list")) { $("#search-groups-list").text("Geen groepen gevonden"); } diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index 6822d21..600bb41 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -1,3 +1,8 @@ + +body { + overflow: hidden; +} + /* Overall chat-screen */ .chat { position: fixed; @@ -37,6 +42,22 @@ } /* Chat-message takes the whole width of the chat area */ +.day-message { + width: 100%; + min-height: 40px; + padding: 10px 0; + clear: both; + text-align: center; +} + +.day-message-content { + width: auto; + padding: 10px; + + background-color: #F8F8F8; + color: #666; +} + .chat-message { width: 100%; min-height: 40px; -- 2.49.1 From 609f350cd344812617a94a18847aa2590fd94044 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 27 Jan 2017 12:27:40 +0100 Subject: [PATCH 181/322] Made different files for login and register --- website/public/login.php | 102 +-------- website/public/register(stash).php | 115 +++++++++++ website/public/register.php | 187 ++++++++--------- website/public/styles/index.css | 31 +-- website/queries/login.php | 5 +- website/views/bdayInput.php | 37 ++++ website/views/forgotPasswordModal.php | 35 ++++ website/views/login-view.php | 286 ++++---------------------- website/views/register-view.php | 8 - website/views/registerModal.php | 155 ++++++++++++++ 10 files changed, 482 insertions(+), 479 deletions(-) create mode 100644 website/public/register(stash).php create mode 100644 website/views/bdayInput.php create mode 100644 website/views/forgotPasswordModal.php create mode 100644 website/views/registerModal.php diff --git a/website/public/login.php b/website/public/login.php index 81fee57..9fd7fb0 100644 --- a/website/public/login.php +++ b/website/public/login.php @@ -28,7 +28,7 @@ $year_date = "jaar"; // Define variables and set to empty values - $user = $psw =""; + $user = $psw = $remember =""; $loginErr = $resetErr =""; if ($_SERVER["REQUEST_METHOD"] == "POST") { @@ -55,107 +55,9 @@ } break; case "register": - try { - $name = test_input(($_POST["name"])); - checkInputChoice($name, "lettersAndSpaces"); - } catch(lettersAndSpacesException $e){ - $correct = false; - $nameErr = $e->getMessage(); - } - - try { - $surname = test_input(($_POST["surname"])); - checkInputChoice($surname, "lettersAndSpaces"); - } - catch(lettersAndSpacesException $e){ - $correct = false; - $surnameErr = $e->getMessage(); - } - - try{ - $day_date = test_input(($_POST["day_date"])); - $month_date = test_input(($_POST["month_date"])); - $year_date = test_input(($_POST["year_date"])); - $bday = $year_date . "-" . $month_date . "-" . $day_date; - checkInputChoice($bday, "bday"); - } catch(bdayException $e){ - $correct = false; - $bdayErr = $e->getMessage(); - } - - try{ - $username = str_replace(' ', '', test_input(($_POST["username"]))); - checkInputChoice($username, "username"); - } catch(usernameException $e){ - $correct = false; - $usernameErr = $e->getMessage(); - } - - try{ - $password = str_replace(' ', '', 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"); - $confirmEmail = test_input(($_POST["confirmEmail"])); - matchEmail(); - } catch(emailException $e){ - $correct = false; - $emailErr = $e->getMessage(); - } catch(confirmEmailException $e){ - $correct = false; - $confirmEmailErr = $e->getMessage(); - } - - try{ - $captcha = $_POST['g-recaptcha-response']; - checkCaptcha($captcha); - } catch(captchaException $e){ - $correct = false; - $captchaErr = $e->getMessage(); - } - - try { - getIp(); - registerCheck($correct); - sendConfirmEmailUsername($username); - } catch(registerException $e){ - echo ""; - $genericErr = $e->getMessage(); - } + include("register.php"); } } -// // Trying to login -// if ($_SERVER["REQUEST_METHOD"] == "POST") { -// try{ -// $uname = ($_POST["uname"]); -// validateLogin($_POST["uname"], $_POST["psw"]); -// } catch(loginException $e) { -// $loginErr = $e->getMessage(); -// } -// } - /* This view adds login view */ include("../views/login-view.php"); ?> diff --git a/website/public/register(stash).php b/website/public/register(stash).php new file mode 100644 index 0000000..0077e62 --- /dev/null +++ b/website/public/register(stash).php @@ -0,0 +1,115 @@ + + + + +getMessage(); + } + + try { + $surname = test_input(($_POST["surname"])); + checkInputChoice($surname, "lettersAndSpaces"); + } + catch(lettersAndSpacesException $e){ + $correct = false; + $surnameErr = $e->getMessage(); + } + + try{ + $day_date = test_input(($_POST["day_date"])); + $month_date = test_input(($_POST["month_date"])); + $year_date = test_input(($_POST["year_date"])); + $bday = $year_date . "-" . $month_date . "-" . $day_date; + checkInputChoice($bday, "bday"); + } catch(bdayException $e){ + $correct = false; + $bdayErr = $e->getMessage(); + } + + try{ + $username = str_replace(' ', '', test_input(($_POST["username"]))); + checkInputChoice($username, "username"); + } catch(usernameException $e){ + $correct = false; + $usernameErr = $e->getMessage(); + } + + try{ + $password = str_replace(' ', '', 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"); + $confirmEmail = test_input(($_POST["confirmEmail"])); + matchEmail(); + } catch(emailException $e){ + $correct = false; + $emailErr = $e->getMessage(); + } catch(confirmEmailException $e){ + $correct = false; + $confirmEmailErr = $e->getMessage(); + } + + try{ + $captcha = $_POST['g-recaptcha-response']; + checkCaptcha($captcha); + } catch(captchaException $e){ + $correct = false; + $captchaErr = $e->getMessage(); + } + + try { + getIp(); + registerCheck($correct); + sendConfirmEmailUsername($username); + } catch(registerException $e){ + $genericErr = $e->getMessage(); + } + } +/* This view adds register view */ +include("../views/register-view.php"); +?> + + diff --git a/website/public/register.php b/website/public/register.php index 0077e62..ee19930 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -1,115 +1,90 @@ - - - -getMessage(); +} - // Trying to register an account - if ($_SERVER["REQUEST_METHOD"] == "POST") { - try { - $name = test_input(($_POST["name"])); - checkInputChoice($name, "lettersAndSpaces"); - } catch(lettersAndSpacesException $e){ - $correct = false; - $nameErr = $e->getMessage(); - } +try { + $surname = test_input(($_POST["surname"])); + checkInputChoice($surname, "lettersAndSpaces"); +} +catch(lettersAndSpacesException $e){ + $correct = false; + $surnameErr = $e->getMessage(); +} - try { - $surname = test_input(($_POST["surname"])); - checkInputChoice($surname, "lettersAndSpaces"); - } - catch(lettersAndSpacesException $e){ - $correct = false; - $surnameErr = $e->getMessage(); - } +try{ + $day_date = test_input(($_POST["day_date"])); + $month_date = test_input(($_POST["month_date"])); + $year_date = test_input(($_POST["year_date"])); + $bday = $year_date . "-" . $month_date . "-" . $day_date; + checkInputChoice($bday, "bday"); +} catch(bdayException $e){ + $correct = false; + $bdayErr = $e->getMessage(); +} - try{ - $day_date = test_input(($_POST["day_date"])); - $month_date = test_input(($_POST["month_date"])); - $year_date = test_input(($_POST["year_date"])); - $bday = $year_date . "-" . $month_date . "-" . $day_date; - checkInputChoice($bday, "bday"); - } catch(bdayException $e){ - $correct = false; - $bdayErr = $e->getMessage(); - } +try{ + $username = str_replace(' ', '', test_input(($_POST["username"]))); + checkInputChoice($username, "username"); +} catch(usernameException $e){ + $correct = false; + $usernameErr = $e->getMessage(); +} - try{ - $username = str_replace(' ', '', test_input(($_POST["username"]))); - checkInputChoice($username, "username"); - } catch(usernameException $e){ - $correct = false; - $usernameErr = $e->getMessage(); - } +try{ + $password = str_replace(' ', '', 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{ - $password = str_replace(' ', '', 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{ - $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"); + $confirmEmail = test_input(($_POST["confirmEmail"])); + matchEmail(); +} catch(emailException $e){ + $correct = false; + $emailErr = $e->getMessage(); +} catch(confirmEmailException $e){ + $correct = false; + $confirmEmailErr = $e->getMessage(); +} - try{ - $email = test_input(($_POST["email"])); - checkInputChoice($email, "email"); - $confirmEmail = test_input(($_POST["confirmEmail"])); - matchEmail(); - } catch(emailException $e){ - $correct = false; - $emailErr = $e->getMessage(); - } catch(confirmEmailException $e){ - $correct = false; - $confirmEmailErr = $e->getMessage(); - } +try{ + $captcha = $_POST['g-recaptcha-response']; + checkCaptcha($captcha); +} catch(captchaException $e){ + $correct = false; + $captchaErr = $e->getMessage(); +} - try{ - $captcha = $_POST['g-recaptcha-response']; - checkCaptcha($captcha); - } catch(captchaException $e){ - $correct = false; - $captchaErr = $e->getMessage(); - } - - try { - getIp(); - registerCheck($correct); - sendConfirmEmailUsername($username); - } catch(registerException $e){ - $genericErr = $e->getMessage(); - } - } -/* This view adds register view */ -include("../views/register-view.php"); -?> - - +try { + getIp(); + registerCheck($correct); + sendConfirmEmailUsername($username); +} catch(registerException $e){ + echo ""; + $genericErr = $e->getMessage(); +} \ No newline at end of file diff --git a/website/public/styles/index.css b/website/public/styles/index.css index 85cc670..f5d40a7 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -28,10 +28,10 @@ body { form { /*background-color: #a87a87;*/ border-radius: 12px; - height: 80%; + height: 85%; margin: auto; width: 600px; - overflow-y:auto; + overflow-y: auto; overflow-x: hidden; } @@ -46,13 +46,13 @@ h1 { /* registreer titel*/ h2 { - padding: 16px; + padding: 8px; text-align: left; font-size: 2.0em; } h3 { - padding: 16px; + padding: 8px; text-align: center; font-size: 1.5em; } @@ -63,7 +63,7 @@ input[type=text], input[type=password], input[type=email], input[type="date"] { display: inline-block; height: 60%; font-size: 16px; - padding: 8px 20px; + padding: 8px 10px; margin: 4px 0; width: 55%; } @@ -79,7 +79,7 @@ button { cursor: pointer; height: 50%; padding: 8px 20px; - margin: 10px; + margin: 5px; font-family: Arial; font-size: 22px; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); @@ -90,6 +90,7 @@ button { font-family: Arial; font-size: 15px; color: red; + text-align: left; } label { @@ -98,19 +99,19 @@ label { /* padding voor registreer container */ .login_containerregister { - padding: 16px; + padding: 8px; text-align: left; } /* padding voor login_containers */ .login_containerlogin { - padding:16px; + padding:8px; text-align: center; } /* padding voor foutmelding login */ .login_containerfault { - padding: 16px; + padding: 4px; text-align: center; color: red; } @@ -129,7 +130,7 @@ label { background-attachment: fixed;*/ box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); height: 400px; - margin: 34px auto; + margin: 16px auto; overflow-y: auto; padding: 20px; width: 600px; @@ -149,12 +150,12 @@ ul { display: none; /* Hidden by default */ position: fixed; /* Stay in place */ z-index: 1; /* Sit on top */ - padding-top: 100px; /* Location of the box */ + padding-top: 30px; /* Location of the box */ left: 0; top: 0; width: 100%; /* Full width */ height: 100%; /* Full height */ - overflow: auto; /* Enable scroll if needed */ + overflow: hidden; /* Enable scroll if needed */ background-color: rgb(0,0,0); /* Fallback color */ background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ } @@ -166,7 +167,7 @@ ul { margin: auto; padding: 0; border: 1px solid #888; - width: 589px; + width: 600px; box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); -webkit-animation-name: animatetop; -webkit-animation-duration: 0.4s; @@ -189,7 +190,7 @@ ul { .close { color: white; float: right; - font-size: 28px; + font-size: 36px; font-weight: bold; } @@ -201,7 +202,7 @@ ul { } .modal-header { - padding: 2px 16px; + padding: 4px 16px; background-color: #FBC02D; color: black; } diff --git a/website/queries/login.php b/website/queries/login.php index 6af9e1e..b686659 100644 --- a/website/queries/login.php +++ b/website/queries/login.php @@ -13,7 +13,7 @@ function getUser() { `email` LIKE :username "); - $stmt->bindParam(":username", test_input($_POST["user"])); + $stmt->bindValue(":username", test_input($_POST["user"])); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } @@ -42,6 +42,9 @@ function validateLogin($username, $password){ "; } else { $_SESSION["userID"] = $userID; + if($_POST[rememberMe] == 1){ + ini_set("session.gc_maxlifetime", "10"); + } header("location: profile.php"); } } else { diff --git a/website/views/bdayInput.php b/website/views/bdayInput.php new file mode 100644 index 0000000..f3ddecc --- /dev/null +++ b/website/views/bdayInput.php @@ -0,0 +1,37 @@ + + + diff --git a/website/views/forgotPasswordModal.php b/website/views/forgotPasswordModal.php new file mode 100644 index 0000000..a84ae68 --- /dev/null +++ b/website/views/forgotPasswordModal.php @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/website/views/login-view.php b/website/views/login-view.php index b9052b3..fa7f8fd 100644 --- a/website/views/login-view.php +++ b/website/views/login-view.php @@ -32,6 +32,11 @@ >
    + + @@ -49,269 +54,52 @@ + +// When the user clicks anywhere outside of the modal, close it + window.onclick = function (event) { + if (event.target == modal) { + modal.style.display = "none"; + } + if (event.target == registerModal) { + registerModal.style.display = "none"; + } + } + \ No newline at end of file diff --git a/website/views/register-view.php b/website/views/register-view.php index 9577216..acb5f4b 100644 --- a/website/views/register-view.php +++ b/website/views/register-view.php @@ -41,14 +41,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    \ No newline at end of file -- 2.49.1 From ce6a75163047b4209846129d748f620565a1cbbb Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 27 Jan 2017 12:30:28 +0100 Subject: [PATCH 182/322] Niet slecht inverted --- website/views/post-view.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/views/post-view.php b/website/views/post-view.php index 4e0ddb1..e3ceb9b 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -30,9 +30,9 @@ echo(" -- 2.49.1 From 5e9629eddd5ccdf983c384602951a25f468b3081 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 27 Jan 2017 14:03:11 +0100 Subject: [PATCH 183/322] Fixed bugs --- website/public/js/registerAndLogin.js | 6 +- website/public/register.php | 155 +++++++++++++------------- website/public/styles/index.css | 4 + website/queries/checkInput.php | 4 +- website/queries/login.php | 6 +- website/queries/register.php | 20 ++-- website/views/bdayInput.php | 24 ++-- website/views/forgotPasswordModal.php | 1 + website/views/login-view.php | 15 ++- website/views/registerModal.php | 5 +- 10 files changed, 127 insertions(+), 113 deletions(-) diff --git a/website/public/js/registerAndLogin.js b/website/public/js/registerAndLogin.js index b2fda05..87522cf 100644 --- a/website/public/js/registerAndLogin.js +++ b/website/public/js/registerAndLogin.js @@ -1,5 +1,5 @@ function checkLoggedIn() { - if (confirm("You are already logged in!\nDo you want to logout?\nPress ok to logout.") == true) { + if (confirm("U bent al ingelogd!!\nWilt u uitloggen?\nKlik ok om uit te loggen.") == true) { window.location.href = "logout.php"; } else { window.location.href = "profile.php"; @@ -7,9 +7,9 @@ function checkLoggedIn() { } function bannedAlert(){ - alert("Your account is banned"); + alert("Uw account is geband!"); } function emailNotConfirmed(){ - alert("Your account has not been verified yet!\nAnother email has been sent to you") + alert("Uw account is nog niet bevestigd!\nEr is een nieuwe email gestuurd om uw account te bevestigen"); } diff --git a/website/public/register.php b/website/public/register.php index ee19930..6bebd7e 100644 --- a/website/public/register.php +++ b/website/public/register.php @@ -1,90 +1,91 @@ getMessage(); -} -try { - $surname = test_input(($_POST["surname"])); - checkInputChoice($surname, "lettersAndSpaces"); -} -catch(lettersAndSpacesException $e){ - $correct = false; - $surnameErr = $e->getMessage(); -} + try { + $name = test_input(($_POST["name"])); + checkInputChoice($name, "lettersAndSpaces"); + } catch(lettersAndSpacesException $e){ + $correct = false; + $nameErr = $e->getMessage(); + } -try{ - $day_date = test_input(($_POST["day_date"])); - $month_date = test_input(($_POST["month_date"])); - $year_date = test_input(($_POST["year_date"])); - $bday = $year_date . "-" . $month_date . "-" . $day_date; - checkInputChoice($bday, "bday"); -} catch(bdayException $e){ - $correct = false; - $bdayErr = $e->getMessage(); -} + try { + $surname = test_input(($_POST["surname"])); + checkInputChoice($surname, "lettersAndSpaces"); + } + catch(lettersAndSpacesException $e){ + $correct = false; + $surnameErr = $e->getMessage(); + } -try{ - $username = str_replace(' ', '', test_input(($_POST["username"]))); - checkInputChoice($username, "username"); -} catch(usernameException $e){ - $correct = false; - $usernameErr = $e->getMessage(); -} + try{ + $day_date = test_input(($_POST["day_date"])); + $month_date = test_input(($_POST["month_date"])); + $year_date = test_input(($_POST["year_date"])); + $bday = $year_date . "-" . $month_date . "-" . $day_date; + checkInputChoice($bday, "bday"); + } catch(bdayException $e){ + $correct = false; + $bdayErr = $e->getMessage(); + } -try{ - $password = str_replace(' ', '', 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{ + $username = str_replace(' ', '', test_input(($_POST["username"]))); + checkInputChoice($username, "username"); + } catch(usernameException $e){ + $correct = false; + $usernameErr = $e->getMessage(); + } -try{ - $location = test_input(($_POST["location"])); - checkInputChoice($location, "lettersAndSpaces"); -} catch(lettersAndSpacesException $e){ - $correct = false; - $locationErr = $e->getMessage(); -} + try{ + $password = str_replace(' ', '', 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{ - $email = test_input(($_POST["email"])); - checkInputChoice($email, "email"); - $confirmEmail = test_input(($_POST["confirmEmail"])); - matchEmail(); -} catch(emailException $e){ - $correct = false; - $emailErr = $e->getMessage(); -} catch(confirmEmailException $e){ - $correct = false; - $confirmEmailErr = $e->getMessage(); -} + try{ + $location = test_input(($_POST["location"])); + checkInputChoice($location, "lettersAndSpaces"); + } catch(lettersAndSpacesException $e){ + $correct = false; + $locationErr = $e->getMessage(); + } -try{ - $captcha = $_POST['g-recaptcha-response']; - checkCaptcha($captcha); -} catch(captchaException $e){ - $correct = false; - $captchaErr = $e->getMessage(); -} + try{ + $email = test_input(($_POST["email"])); + checkInputChoice($email, "email"); + $confirmEmail = test_input(($_POST["confirmEmail"])); + matchEmail(); + } catch(emailException $e){ + $correct = false; + $emailErr = $e->getMessage(); + } catch(confirmEmailException $e){ + $correct = false; + $confirmEmailErr = $e->getMessage(); + } -try { - getIp(); - registerCheck($correct); - sendConfirmEmailUsername($username); -} catch(registerException $e){ - echo ""; - $genericErr = $e->getMessage(); -} \ No newline at end of file + $genericErr = $e->getMessage(); + } diff --git a/website/public/styles/index.css b/website/public/styles/index.css index f5d40a7..6f7caf0 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -68,6 +68,10 @@ input[type=text], input[type=password], input[type=email], input[type="date"] { width: 55%; } +.middle{ + text-align: center; +} + .center{ text-align: center; } diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index fbf64a7..52b830f 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -124,11 +124,11 @@ function matchPassword(){ /* Checks if captcha is correctly filled in */ function checkCaptcha($captcha){ if(!$captcha){ - throw new captchaException("Captcha needs to be filled in!"); + throw new captchaException("Captcha moet ingevuld worde!"); } 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!"); + throw new captchaException("Je bent een spammer!"); } } } diff --git a/website/queries/login.php b/website/queries/login.php index b686659..384a3d5 100644 --- a/website/queries/login.php +++ b/website/queries/login.php @@ -42,9 +42,9 @@ function validateLogin($username, $password){ "; } else { $_SESSION["userID"] = $userID; - if($_POST[rememberMe] == 1){ - ini_set("session.gc_maxlifetime", "10"); - } +// if($_POST[rememberMe] == 1){ +// ini_set("session.gc_maxlifetime", "10"); +// } header("location: profile.php"); } } else { diff --git a/website/queries/register.php b/website/queries/register.php index be9d415..bc44acf 100644 --- a/website/queries/register.php +++ b/website/queries/register.php @@ -10,7 +10,7 @@ function getExistingUsername() { `username` LIKE :username "); - $stmt->bindParam(":username", test_input($_POST["username"])); + $stmt->bindValue(":username", test_input($_POST["username"])); $stmt->execute(); return $stmt->rowCount(); @@ -26,7 +26,7 @@ function getExistingEmail() { `email` LIKE :email "); - $stmt->bindParam(":email", test_input($_POST["email"])); + $stmt->bindValue(":email", test_input($_POST["email"])); $stmt->execute(); return $stmt->rowCount(); @@ -42,7 +42,7 @@ function getResetEmail() { `email` LIKE :email "); - $stmt->bindParam(":email", test_input($_POST["forgotEmail"])); + $stmt->bindValue(":email", test_input($_POST["forgotEmail"])); $stmt->execute(); return $stmt->rowCount(); @@ -70,13 +70,13 @@ function registerAccount() { $hash=password_hash($_POST["password"], PASSWORD_DEFAULT); - $stmt->bindParam(":fname", test_input($_POST["name"])); - $stmt->bindParam(":lname", test_input($_POST["surname"])); - $stmt->bindParam(":bday", test_input($_POST["bday"])); - $stmt->bindParam(":username", test_input($_POST["username"])); - $stmt->bindParam(":password", test_input($hash)); - $stmt->bindParam(":location", test_input($_POST["location"])); - $stmt->bindParam(":email", test_input(strtolower($_POST["email"]))); + $stmt->bindValue(":fname", test_input($_POST["name"])); + $stmt->bindValue(":lname", test_input($_POST["surname"])); + $stmt->bindValue(":bday", test_input($_POST["bday"])); + $stmt->bindValue(":username", test_input($_POST["username"])); + $stmt->bindValue(":password", test_input($hash)); + $stmt->bindValue(":location", test_input($_POST["location"])); + $stmt->bindValue(":email", test_input(strtolower($_POST["email"]))); $stmt->execute(); $stmt->rowCount(); diff --git a/website/views/bdayInput.php b/website/views/bdayInput.php index f3ddecc..f4e440f 100644 --- a/website/views/bdayInput.php +++ b/website/views/bdayInput.php @@ -11,18 +11,18 @@ diff --git a/website/views/login-view.php b/website/views/login-view.php index fa7f8fd..8edc777 100644 --- a/website/views/login-view.php +++ b/website/views/login-view.php @@ -15,6 +15,7 @@ - - @@ -49,6 +46,11 @@ Inloggen + + @@ -78,7 +80,10 @@ var registerSpan = document.getElementsByClassName("close")[1]; // When the user clicks the button, open the modal btn.onclick = function () { +// modal.style.display = "block"; modal.style.display = "block"; + window.onload=emailSent(); + } registerBtn.onclick = function () { diff --git a/website/views/registerModal.php b/website/views/registerModal.php index f55c33a..b430ab8 100644 --- a/website/views/registerModal.php +++ b/website/views/registerModal.php @@ -19,6 +19,8 @@ return= $correct method="post"> + + @@ -135,7 +137,8 @@ -- 2.49.1 From e9eeeaf11045b6c98a7f52929c4cb906cf125db9 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 27 Jan 2017 14:17:56 +0100 Subject: [PATCH 184/322] fixed idk --- website/queries/requestpassword.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/queries/requestpassword.php b/website/queries/requestpassword.php index c0ff462..bae825a 100644 --- a/website/queries/requestpassword.php +++ b/website/queries/requestpassword.php @@ -50,5 +50,5 @@ function setHashToDatabase(int $userID, string $hash) { $stmt->bindParam(":hash", $hash); $stmt->bindParam(":userID", $userID); $stmt->execute(); - return $stmt->rowCount(); + $stmt->rowCount(); } \ No newline at end of file -- 2.49.1 From 7e2c20e2447a10fd449bc718e4b735bf5b589559 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Fri, 27 Jan 2017 15:40:07 +0100 Subject: [PATCH 185/322] Added showEmail and showBday to the settings page --- website/queries/settings.php | 49 ++++++++++++++++++++++++++++----- website/views/settings-view.php | 26 +++++++++++++++++ 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/website/queries/settings.php b/website/queries/settings.php index 0bf8791..05e7fbf 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -1,6 +1,10 @@ fetch(); } +/** + * Gets the passwordHas form the database + * @return mixed passwordhash + */ function getPasswordHash() { $stmt = $GLOBALS["db"]->prepare(" SELECT @@ -73,6 +91,10 @@ function getPasswordHash() { return $stmt->fetch(); } +/** + * Changes the setting from post. + * @throws HappyAlert + */ function updateSettings() { $stmt = $GLOBALS["db"]->prepare(" UPDATE @@ -82,7 +104,9 @@ function updateSettings() { `lname` = :lname, `location` = :location, `birthdate` = :bday, - `bio` = :bio + `bio` = :bio, + `showEmail` = :showEmail, + `showBday` = :showBday WHERE `userID` = :userID "); @@ -92,15 +116,22 @@ function updateSettings() { $stmt->bindValue(":location", test_input($_POST["location"])); $stmt->bindValue(":bday", test_input($_POST["bday"])); $stmt->bindValue(":bio", test_input($_POST["bio"])); + $stmt->bindValue(":showEmail", test_input($_POST["showEmail"])); + $stmt->bindValue(":showBday", test_input($_POST["showBday"])); + $stmt->bindValue(":userID", $_SESSION["userID"]); $stmt->execute(); throw new HappyAlert("Instellingen zijn opgeslagen."); } +/** + * Change + * @throws AngryAlert + */ 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 (password_verify($_POST["password-old"], test_input($user["password"]))) { + if (test_input($_POST["password-new"]) == test_input($_POST["password-confirm"]) && (strlen(test_input($_POST["password-new"])) >= 8)) { doChangePassword(); } else { throw new AngryAlert("Wachtwoorden komen niet overeen."); @@ -110,6 +141,10 @@ function changePassword() { } } +/** + * @throws AngryAlert + * @throws HappyAlert + */ function doChangePassword() { $stmt = $GLOBALS["db"]->prepare(" UPDATE @@ -134,8 +169,8 @@ function doChangePassword() { function changeEmail() { - if ($_POST["email"] == $_POST["email-confirm"]) { - $email = strtolower($_POST["email"]); + if (test_input($_POST["email"]) == test_input($_POST["email-confirm"])) { + $email = strtolower(test_input($_POST["email"])); if (filter_var($email, FILTER_VALIDATE_EMAIL)) { //check if email exists emailIsAvailableInDatabase($email); @@ -193,7 +228,6 @@ function updateAvatar() { $tmpImg = $_FILES["pp"]["tmp_name"]; checkAvatarSize($tmpImg); - removeOldAvatar(); if (getimagesize($tmpImg)["mime"] == "image/gif") { if ($_FILES["pp"]["size"] > 4000000) { throw new AngryAlert("Bestand is te groot, maximaal 4MB toegestaan."); @@ -205,6 +239,7 @@ function updateAvatar() { $scaledImg = scaleAvatar($tmpImg); imagepng($scaledImg, $profilePictureDir . $relativePath); } + removeOldAvatar(); setAvatarToDatabase("../" . $relativePath); throw new HappyAlert("Profielfoto veranderd."); } diff --git a/website/views/settings-view.php b/website/views/settings-view.php index 66513fc..b6a3b4c 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -51,6 +51,32 @@ $settings = getSettings(); value="" > +
  • + + + > Ja + + > Nee +
  • +
  • + + + > Ja + + > Nee +

  • - - -- 2.49.1 From 9a36dea59219f037eb266412fd090d1b950a1f1b Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Mon, 30 Jan 2017 13:22:44 +0100 Subject: [PATCH 198/322] Removed a comma --- website/views/post-view.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/views/post-view.php b/website/views/post-view.php index 81aca46..264d67c 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -50,7 +50,7 @@ echo("
    $commentauthor - + $commentnicetime
    -- 2.49.1 From 54ddb784531c5dc8ae57cba6bf8cc6cf2416bc4f Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Mon, 30 Jan 2017 13:59:02 +0100 Subject: [PATCH 199/322] Chat receive messages is now better --- website/public/js/chat.js | 36 +++++++++++++++++++------------ website/public/styles/main.css | 1 - website/public/styles/profile.css | 3 --- website/queries/friendship.php | 6 ++++++ website/views/menu.php | 2 +- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/website/public/js/chat.js b/website/public/js/chat.js index 773a819..0f32fa6 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -1,25 +1,30 @@ var previousDate = new Date("1970-01-01 00:00:00"); +var gettingMessages = false; + $(document).ready(function() { - loadMessages(); + setInterval(loadMessages, 2000); sayEmpty(); $(".chat-field").hide(); }); function loadMessages() { - $.post( - "API/loadMessages.php", - $("#lastIDForm").serialize() - ).done(function(data) { - if (data && data != "[]") { - messages = JSON.parse(data); - addMessages(messages); - $("#lastID").val(messages[messages.length - 1].messageID); - $("#chat-history").scrollTop($("#chat-history")[0].scrollHeight); - } - }); - - setTimeout(loadMessages, 1000); + if (!gettingMessages) { + gettingMessages = true; + $.post( + "API/loadMessages.php", + $("#lastIDForm").serialize() + ).done(function (data) { + if (data && data != "[]") { + messages = JSON.parse(data); + addMessages(messages); + $("#lastID").val(messages[messages.length - 1].messageID); + } + gettingMessages = false; + }); + } else { + setTimeout(loadMessages, 500); + } } @@ -30,6 +35,7 @@ function sendMessage() { ); $("#newContent").val(""); + loadMessages(); } function addMessages(messages) { @@ -59,6 +65,8 @@ function addMessages(messages) {
    \ '); } + + $("#chat-history").scrollTop($("#chat-history")[0].scrollHeight); } function switchUser(userID) { diff --git a/website/public/styles/main.css b/website/public/styles/main.css index be2f4f7..3eb0bb3 100644 --- a/website/public/styles/main.css +++ b/website/public/styles/main.css @@ -97,7 +97,6 @@ p { } .item-box, .item-box-full-width { - margin: 20px 0 0 0; padding: 25px; background-color: #FFFFFF; } diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 2fe819a..03ab19f 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -2,7 +2,6 @@ .user-box { text-align: center; - margin-bottom: 50px; } .status-buttons-container { @@ -64,14 +63,12 @@ } div.posts { - padding-top: 20px; width: calc(100% + 20px); display: inline-flex; } div.posts div.post { display: block; - margin: 20px 0 0 0; padding: 10px; width: calc(100% - 40px); cursor: pointer; diff --git a/website/queries/friendship.php b/website/queries/friendship.php index a1a23d8..01e3d8a 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -29,6 +29,12 @@ function selectLimitedFriends($userID, $limit) { `friendship`.`user1ID` = `user`.`userID`) AND `user`.`role` != 'banned' AND `friendship`.`status` = 'confirmed' + ORDER BY + CASE + WHEN `friendship`.`user2ID` = `user`.`userID` THEN `friendship`.`chatLastVisted1` + WHEN `friendship`.`user1ID` = `user`.`userID` THEN `friendship`.`chatLastVisted2` + END + DESC LIMIT :limitCount "); diff --git a/website/views/menu.php b/website/views/menu.php index 0444384..f3f3cde 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -1,7 +1,7 @@
  • @@ -25,15 +24,14 @@ while ($group = $q->fetch(PDO::FETCH_ASSOC)) { class='checkbox-list' value='$groupID' form='admin-groupbatchform' - onchange='$function'> + onchange='checkCheckAll();'> - + @@ -14,7 +14,6 @@ while($user = $q->fetch(PDO::FETCH_ASSOC)) { $username = $user['username']; $role = $user['role']; $bancomment = $user['bancomment']; - $function = "checkCheckAll(document.getElementById('checkall'))"; echo(" @@ -24,20 +23,29 @@ while($user = $q->fetch(PDO::FETCH_ASSOC)) { class='checkbox-list' value='$userID' form='admin-batchform' - onchange='$function'> + onchange='checkCheckAll();'> - + - + - + @@ -33,9 +33,9 @@ while ($group = $q->fetch(PDO::FETCH_ASSOC)) { diff --git a/website/views/adminpanel-table.php b/website/views/adminpanel-table.php index aa790e6..f7bc966 100644 --- a/website/views/adminpanel-table.php +++ b/website/views/adminpanel-table.php @@ -55,7 +55,8 @@ while($user = $q->fetch(PDO::FETCH_ASSOC)) { OR $user['role'] == 'owner'))) { echo " - "; + + "; if ($userinfo == 'owner') { echo " diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index a4da648..2c0bec2 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -67,13 +67,13 @@ if (isset($_GET["groupstatus"])) { id="frozen" value="frozen" > -
    +
    > -
    +
    > - +
    @@ -122,6 +122,7 @@ if (isset($_GET["groupstatus"])) { + Maak Owner"; + value=\"owner\">Maak Eigenaar"; } ?> @@ -139,9 +140,9 @@ if (isset($_GET["groupstatus"])) { onsubmit="adminUpdate(this); return false;"> - - - + + +
    -- 2.49.1 From cfa7c870f08417b80d5d7c285207deb0e94db228 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 15:13:35 +0100 Subject: [PATCH 286/322] fix profile error color --- website/public/styles/profile.css | 4 ++++ website/views/profile.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index dbb3d24..46906d2 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -5,6 +5,10 @@ background-color: firebrick; } +.alerttext { + color: white; +} + .user-box { text-align: center; } diff --git a/website/views/profile.php b/website/views/profile.php index 7348642..4139099 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -1,6 +1,6 @@
    - +
    -- 2.49.1 From 8a3cfebf55bbc8380034c25741f52682beb2b9aa Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 15:34:45 +0100 Subject: [PATCH 287/322] Redirect to 404 from profile and group --- website/public/group.php | 9 ++++++++- website/public/profile.php | 7 ++++++- website/queries/group_page.php | 7 ++++++- website/queries/user.php | 4 +++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/website/public/group.php b/website/public/group.php index bb393e3..84726fa 100644 --- a/website/public/group.php +++ b/website/public/group.php @@ -13,9 +13,16 @@ include_once("../queries/group_page.php"); -$group = selectGroupByName($_GET["groupname"]); +if(!$group = selectGroupByName($_GET["groupname"])) { + header("HTTP/1.0 404 Not Found"); + header("Location: error/404.php"); + die(); +} + + $members = selectGroupMembers($group["groupID"]); + /* * This view adds the main layout over the screen. * Header, menu, footer. diff --git a/website/public/profile.php b/website/public/profile.php index aa4cf7c..126c87f 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -25,7 +25,12 @@ if(empty($_GET["username"])) { $userID = getUserID($_GET["username"]); } -$user = selectUser($_SESSION["userID"], $userID); +if(!$user = selectUser($_SESSION["userID"], $userID)) { + header("HTTP/1.0 404 Not Found"); + header("Location: error/404.php"); + die(); +} + $profile_friends = selectAllFriends($userID); $profile_groups = selectAllUserGroups($userID); $showProfile = $user["showProfile"] || ($user["status"] == 'confirmed') || $_SESSION["userID"] == $userID; diff --git a/website/queries/group_page.php b/website/queries/group_page.php index f2f028f..a6676c4 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -33,7 +33,12 @@ function selectGroupByName($name) { if (!$stmt->execute()) { return False; } - return $stmt->fetch(); + $row = $stmt->fetch(); + if($row["groupID"] == null) { + return False; + } + + return $row; } function selectGroupRole(int $groupID) { diff --git a/website/queries/user.php b/website/queries/user.php index 972937d..836c956 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -101,7 +101,9 @@ function selectUser($me, $other) { $stmt->bindParam(':me', $me, PDO::PARAM_INT); $stmt->bindParam(':other', $other, PDO::PARAM_INT); - $stmt->execute(); + if(!$stmt->execute() || $stmt->rowCount() == 0) { + return False; + } return $stmt->fetch(); } -- 2.49.1 From 1c53eab2fa77c02aaeb7340a38b053d38c0cf335 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 15:50:12 +0100 Subject: [PATCH 288/322] Fixed user group list on profile page. --- website/queries/user.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/queries/user.php b/website/queries/user.php index 06487be..422edc4 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -122,7 +122,7 @@ function selectAllUserGroups($userID) { `group_page`.`groupID` = `group_member`.`groupID` WHERE `userID` = :userID AND - `role` = 'member' + `role` IN ('member', 'mod', 'admin') "); $stmt->bindParam(':userID', $userID, PDO::PARAM_INT); -- 2.49.1 From afb45d6709c6ddf640bac34844ac4e3ac8f38055 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 15:51:27 +0100 Subject: [PATCH 289/322] add closing of modal on escape key and clicking outside --- website/public/js/masonry.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index a628e96..107f710 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -83,6 +83,21 @@ $(window).on("load", function() { loadMorePosts(userID, groupID, postAmount, postLimit); } }; + + $(document).keyup(function(e) { + if (e.keyCode == 27) { + closeModal(); + } + }); + + $('.modal').click(function() { + closeModal(); + }); + + $('.modal-content').click(function(event){ + event.stopPropagation(); + }); + }); function closeModal() { -- 2.49.1 From 380d8fa83a7ea8780f09fd8c1a8df7965b8f45b1 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 2 Feb 2017 16:01:45 +0100 Subject: [PATCH 290/322] Group Shit --- website/public/createGroup.php | 36 +++++++++++++++ website/public/groupAdmin.php | 46 ++++++++++++++++++++ website/queries/createGroup.php | 37 ++++++++++++++++ website/queries/groupAdmin.php | 61 ++++++++++++++++++++++++++ website/queries/picture.php | 12 ++--- website/views/createGroup.php | 42 ++++++++++++++++++ website/views/groupAdmin.php | 77 +++++++++++++++++++++++++++++++++ website/views/menu.php | 2 +- 8 files changed, 306 insertions(+), 7 deletions(-) create mode 100644 website/public/createGroup.php create mode 100644 website/public/groupAdmin.php create mode 100644 website/queries/createGroup.php create mode 100644 website/queries/groupAdmin.php create mode 100644 website/views/createGroup.php create mode 100644 website/views/groupAdmin.php diff --git a/website/public/createGroup.php b/website/public/createGroup.php new file mode 100644 index 0000000..ffeb6e3 --- /dev/null +++ b/website/public/createGroup.php @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/website/public/groupAdmin.php b/website/public/groupAdmin.php new file mode 100644 index 0000000..13ff7e0 --- /dev/null +++ b/website/public/groupAdmin.php @@ -0,0 +1,46 @@ + + + + + + + + +getClass(); + $alertMessage = $w->getMessage(); + } +} + +/* Add your view files here. */ +include("../views/groupAdmin.php"); + +/* This adds the footer. */ +include("../views/footer.php"); +?> + + diff --git a/website/queries/createGroup.php b/website/queries/createGroup.php new file mode 100644 index 0000000..20ee28b --- /dev/null +++ b/website/queries/createGroup.php @@ -0,0 +1,37 @@ +bindValue(':name', test_input($_POST["groupName"]), PDO::PARAM_STR); + $createGroup->bindValue(':description', test_input($_POST["bio"])); + $createGroup->execute(); + + $getGroupID = prepareQuery(" + SELECT + `groupID` + FROM + `group_page` + WHERE + `name` LIKE :name"); + $getGroupID->bindValue(':name', test_input($_POST["groupName"]), PDO::PARAM_STR); + $getGroupID->execute(); + $groupID = $getGroupID->fetch()["groupID"]; + + $makeUserAdmin = prepareQuery(" + INSERT INTO + `group_member` (userID, groupID, role) + VALUES (:userID, :groupID, 'admin') + "); + $makeUserAdmin->bindValue(":userID", $_SESSION["userID"]); + $makeUserAdmin->bindValue("groupID", $groupID); + $makeUserAdmin->execute(); + + updateAvatar($groupID); +} \ No newline at end of file diff --git a/website/queries/groupAdmin.php b/website/queries/groupAdmin.php new file mode 100644 index 0000000..ae2abd3 --- /dev/null +++ b/website/queries/groupAdmin.php @@ -0,0 +1,61 @@ +bindParam(":groupID", $groupID); + $stmt->execute(); + return $stmt->fetch(); +} + +function updateGroupSettings(int $groupID) +{ + if (!checkGroupAdmin($groupID, $_SESSION["userID"])) { + throw new AngryAlert("Je hebt geen rechten in deze groep"); + } + $stmt = prepareQuery(" + UPDATE + `group_page` + SET + `name` = :name, + `description` = :bio + WHERE + `groupID` = :groupID + "); + $stmt->bindValue(":bio", test_input($_POST["bio"])); + $stmt->bindValue(":name", test_input($_POST["name"])); + $stmt->bindValue(":groupID", test_input($_POST["groupID"])); + $stmt->execute(); + if ($stmt->rowCount()) { + throw new HappyAlert("Groep aangepast!"); + } else { + throw new AngryAlert("Er is iets mis gegaan"); + } +} + +function checkGroupAdmin(int $groupID, int $userID) : bool { + $stmt = prepareQuery(" + SELECT + `role` + FROM + `group_member` + WHERE + `groupID` = :groupID AND + `userID` = :userID + "); + $stmt->bindValue(":userID", $userID); + $stmt->bindValue(":groupID", $groupID); + $stmt->execute(); + if (!$stmt->rowCount()) { + return false; + } + $role = $stmt->fetch()["role"]; + return ($role == "admin"); +} \ No newline at end of file diff --git a/website/queries/picture.php b/website/queries/picture.php index 8e99d9a..ba27f72 100644 --- a/website/queries/picture.php +++ b/website/queries/picture.php @@ -6,7 +6,7 @@ * @throws AngryAlert * @throws HappyAlert */ -function updateAvatar(bool $group = false) { +function updateAvatar(int $group = 0) { $publicDir = "/var/www/html/public/"; $tmpImg = $_FILES["pp"]["tmp_name"]; $avatarDir = $group ? "uploads/groupavatar/" : "uploads/profilepictures/"; @@ -16,17 +16,17 @@ function updateAvatar(bool $group = false) { if ($_FILES["pp"]["size"] > 4000000) { throw new AngryAlert("Bestand is te groot, maximaal 4MB toegestaan."); } - $relativePath = $avatarDir . $_SESSION["userID"] . "_avatar.gif"; - $group ? removeOldGroupAvatar($_POST["groupID"]) : removeOldUserAvatar(); + $relativePath = $group ? $avatarDir . $group . "_avatar.gif" : $avatarDir . $_SESSION["userID"] . "_avatar.gif"; + $group ? removeOldGroupAvatar($group) : removeOldUserAvatar(); move_uploaded_file($tmpImg, $publicDir . $relativePath); } else { - $relativePath = $avatarDir . $_SESSION["userID"] . "_avatar.png"; + $relativePath = $group ? $avatarDir . $group . "_avatar.png": $avatarDir . $_SESSION["userID"] . "_avatar.png"; $scaledImg = scaleAvatar($tmpImg); - $group ? removeOldGroupAvatar($_POST["groupID"]) : removeOldUserAvatar(); + $group ? removeOldGroupAvatar($group) : removeOldUserAvatar(); imagepng($scaledImg, $publicDir . $relativePath); } - $group ? setGroupAvatarToDatabase("../" . $relativePath, $_POST["groupID"]) : setUserAvatarToDatabase("../" . $relativePath); + $group ? setGroupAvatarToDatabase("../" . $relativePath, $group) : setUserAvatarToDatabase("../" . $relativePath); throw new HappyAlert("Profielfoto veranderd."); } diff --git a/website/views/createGroup.php b/website/views/createGroup.php new file mode 100644 index 0000000..736fc45 --- /dev/null +++ b/website/views/createGroup.php @@ -0,0 +1,42 @@ + + +
    +
    +
    +
    Maak een groep!
    +
      +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    + +
    +
    diff --git a/website/views/groupAdmin.php b/website/views/groupAdmin.php new file mode 100644 index 0000000..66b38f5 --- /dev/null +++ b/website/views/groupAdmin.php @@ -0,0 +1,77 @@ + +
    +
    + +
    + +
    + +
    +
    Groep Instellingen
    + "> +
      +
    • + + " + > +
    • +
    • + + + +
    • +
    • + + +
    • +
    + +
    +
    Verander groepsafbeelding.
    + "> +
      +
    • + + " + class="group-picture" + > +
    • +
    • + + +
    • +
    • + + +
    • +
    + +
    +
    \ No newline at end of file diff --git a/website/views/menu.php b/website/views/menu.php index dab8fce..03e0f56 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -14,7 +14,7 @@ +
    + +
    \ No newline at end of file -- 2.49.1 From 74e91ed7cb18acebaabd5b6356f87aec25830977 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 2 Feb 2017 21:14:25 +0100 Subject: [PATCH 296/322] Add mods/admin to a group. --- website/public/groupAdmin.php | 27 ++++++++++++++----- website/queries/groupAdmin.php | 48 ++++++++++++++++++++++++++++++++++ website/queries/settings.php | 15 +++++++++++ website/views/groupAdmin.php | 29 ++++++++++++++++++++ 4 files changed, 113 insertions(+), 6 deletions(-) diff --git a/website/public/groupAdmin.php b/website/public/groupAdmin.php index 13ff7e0..6095149 100644 --- a/website/public/groupAdmin.php +++ b/website/public/groupAdmin.php @@ -23,12 +23,27 @@ $alertClass; $alertMessage; if ($_SERVER["REQUEST_METHOD"] == "POST") { try { - if ($_POST["form"] == "group") { - updateGroupSettings($_POST["groupID"]); - } else if ($_POST["form"] == "picture") { - if (checkGroupAdmin($_POST["groupID"], $_SESSION["userID"])) { - updateAvatar($_POST["groupID"]); - } + switch ($_POST["form"]) { + case "group": + updateGroupSettings($_POST["groupID"]); + break; + case "picture": + if (checkGroupAdmin($_POST["groupID"], $_SESSION["userID"])) { + updateAvatar($_POST["groupID"]); + } + break; + case "mod": + if (!array_key_exists("userID", $_POST)) { + throw new AngryAlert("Geen gebruiker geselecteerd."); + } + upgradeUser($_POST["groupID"], $_POST["userID"], "mod"); + break; + case "admin": + if (!array_key_exists("userID", $_POST)) { + throw new AngryAlert("Geen gebruiker geselecteerd."); + } + upgradeUser($_POST["groupID"], $_POST["userID"], "admin"); + break; } } catch (AlertMessage $w) { $alertClass = $w->getClass(); diff --git a/website/queries/groupAdmin.php b/website/queries/groupAdmin.php index ae2abd3..e3580b6 100644 --- a/website/queries/groupAdmin.php +++ b/website/queries/groupAdmin.php @@ -58,4 +58,52 @@ function checkGroupAdmin(int $groupID, int $userID) : bool { } $role = $stmt->fetch()["role"]; return ($role == "admin"); +} + +function getAllGroupMembers(int $groupID) { + $stmt = prepareQuery(" + SELECT + `username`, + `user`.`userID`, + CONCAT(`fname`, ' ', `lname`) AS `fullname`, + `group_member`.`role` + FROM + `group_member` + LEFT JOIN + `user` + ON + `group_member`.`userID` = `user`.`userID` + WHERE + `groupID` = :groupID AND `group_member`.`role` = 'member' + "); + + $stmt->bindParam(':groupID', $groupID); + if (!$stmt->execute()) { + return False; + } + return $stmt->fetchAll(); +} + +function upgradeUser(int $groupID, int $userID, string $role) { + if (!checkGroupAdmin($groupID, $_SESSION["userID"])) { + throw new AngryAlert("Geen toestemming om te wijzigen"); + } + + $stmt = prepareQuery(" + UPDATE + `group_member` + SET + `role` = :role + WHERE + `userID` = :userID AND `groupID` = :groupID + "); + $stmt->bindValue(":groupID", $groupID); + $stmt->bindValue(":userID", $userID); + $stmt->bindValue(":role", $role); + $stmt->execute(); + if ($stmt->rowCount()) { + throw new HappyAlert("Permissie aangepast!"); + } else { + throw new AngryAlert("Er is iets mis gegaan"); + } } \ No newline at end of file diff --git a/website/queries/settings.php b/website/queries/settings.php index 9b17d17..26237ec 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -148,6 +148,10 @@ function doChangePassword() { } } +/** + * Changes the users email if it is valid. + * @throws AngryAlert + */ function changeEmail() { if (test_input($_POST["email"]) == test_input($_POST["email-confirm"])) { @@ -164,6 +168,11 @@ function changeEmail() { } } +/** + * Checks if an emailadres is available in the database. + * @param $email + * @throws AngryAlert + */ function emailIsAvailableInDatabase($email) { $stmt = prepareQuery(" SELECT @@ -181,6 +190,12 @@ function emailIsAvailableInDatabase($email) { } } +/** + * Does the actual changing of an email-adress. + * @param $email + * @throws AngryAlert + * @throws HappyAlert + */ function doChangeEmail($email) { $stmt = prepareQuery(" UPDATE diff --git a/website/views/groupAdmin.php b/website/views/groupAdmin.php index a28553e..54fbee8 100644 --- a/website/views/groupAdmin.php +++ b/website/views/groupAdmin.php @@ -85,6 +85,35 @@ $groupinfo = getGroupSettings($_GET["groupID"]); +
    +
    Voeg een admin/mod toe
    +
      + + " type="hidden"> + + + + + +
    +
    • -- 2.49.1 From 7e4107ac8b357bc1335c9657293182a5ce18720c Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 00:13:23 +0100 Subject: [PATCH 297/322] Added fancy buttons in profile --- website/public/js/friendButtons.js | 28 +++++++++++++++------------- website/public/js/groupButtons.js | 12 ++++++------ website/public/styles/post-popup.css | 12 ------------ website/public/styles/profile.css | 19 ++++++++++++------- website/views/post-view.php | 4 ++-- website/views/profile.php | 14 ++++++++++---- 6 files changed, 45 insertions(+), 44 deletions(-) diff --git a/website/public/js/friendButtons.js b/website/public/js/friendButtons.js index 47c476a..303ccf9 100644 --- a/website/public/js/friendButtons.js +++ b/website/public/js/friendButtons.js @@ -19,24 +19,24 @@ function placeFriendButtons() { case "0": value1 = "request"; class1 = "green"; - text1 = "Bevriend"; - icon1 = "fa-handshake-o"; + text1 = "Word vrienden"; + icon1 = "fa-user-plus"; break; case "1": value1 = userID; class1 = "green"; text1 = "Chat"; - icon1 = "fa-comment-o"; + icon1 = "fa-comment"; value2 = "delete"; class2 = "red"; - text2 = "Verwijder"; - icon2 = "fa-times"; + text2 = "Ontvriend"; + icon2 = "fa-user-times"; break; case "2": value1 = "delete"; class1 = "red"; text1 = "Trek verzoek in"; - icon1 = "fa-cross"; + icon1 = "fa-times"; break; case "3": value1 = "accept"; @@ -51,16 +51,18 @@ function placeFriendButtons() { } $buttonContainer.append( - ""); + "
      "); $buttonContainer.append( - ""); + "
      "); - $buttonContainer.children().click(function() { + $buttonContainer.find("button").click(function() { if (isNaN(this.value)) editFriendship(userID, this.value); else if (this.value != "") diff --git a/website/public/js/groupButtons.js b/website/public/js/groupButtons.js index 549277d..caf3ab8 100644 --- a/website/public/js/groupButtons.js +++ b/website/public/js/groupButtons.js @@ -5,23 +5,23 @@ function placeGroupButtons() { if (data == 'none') { $buttonContainer.append( - ""); } else if (data == 'request') { $buttonContainer.append( - ""); } else if (data == 'admin') { $buttonContainer.append( - "" ); } else { $buttonContainer.append( - ""); } diff --git a/website/public/styles/post-popup.css b/website/public/styles/post-popup.css index 9493b83..e82129b 100644 --- a/website/public/styles/post-popup.css +++ b/website/public/styles/post-popup.css @@ -92,16 +92,4 @@ .deleteButton { background-color: firebrick; float: right; -} - -.deleteButton i { - display: inline-block; -} - -.deleteButton:hover span { - display: inline-block; -} - -.deleteButton span { - display: none; } \ No newline at end of file diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 18e105e..8a93d12 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -27,16 +27,21 @@ display: inline-block; } +.friend-button-container div, .status-buttons-container div { + width: 200px; + display: inline-block; +} + .friend-button-container button, .status-buttons-container button, .group-button-container button { display: block; + float: right; margin: 7px 0; font-size: 18px; } - -.friend-button-container button, .status-buttons-container button, .group-button-fixed { - width: 200px; +.status-buttons-container button { + float: left; } .group-button-container button { @@ -76,19 +81,19 @@ border: none; } -.group-button-fancy span { +.fancy-button span { display: none; } -.group-button-fancy:hover { +.fancy-button:hover { text-align: right; } -.group-button-fancy i { +.fancy-button i { display: inline-block; } -.group-button-fancy:hover span { +.fancy-button:hover span { display: inline-block; margin-right: 5px; } diff --git a/website/views/post-view.php b/website/views/post-view.php index 717e6a8..fadc791 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -13,11 +13,11 @@ $fullname = $post['fname'] . " " . $post['lname'] . " (" . $post['username'] . "
    -
    diff --git a/website/views/profile.php b/website/views/profile.php index 62157f4..0cb5cc2 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -7,10 +7,16 @@ <?= $user[" class="profile-picture main-picture " src="">
    - - +
    + +
    +
    + +

    :)

    -- 2.49.1 From 6d739a4480019709d6abe9addea37ade0ebbc34d Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 00:24:38 +0100 Subject: [PATCH 298/322] Chat is now only loading the last 100 messages --- website/queries/private_message.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/website/queries/private_message.php b/website/queries/private_message.php index 3b88563..f2df887 100644 --- a/website/queries/private_message.php +++ b/website/queries/private_message.php @@ -6,18 +6,23 @@ function getOldChatMessages($user2ID) { if (getFriendshipStatus($user2ID) == 1) { $stmt = prepareQuery(" SELECT - * + * FROM - `private_message` - WHERE - `origin` = :user1 AND - `destination` = :user2 OR - `origin` = :user2 AND - `destination` = :user1 + (SELECT + * + FROM + `private_message` + WHERE + `origin` = :user1 AND + `destination` = :user2 OR + `origin` = :user2 AND + `destination` = :user1 + ORDER BY + `messageID` DESC + LIMIT + 100) sub ORDER BY - `creationdate` ASC - LIMIT - 100 + `messageID` ASC "); $stmt->bindParam(":user1", $user1ID); @@ -76,7 +81,7 @@ function getNewChatMessages($lastID, $destination) { `destination` = :user1) AND `messageID` > :lastID ORDER BY - `creationdate` ASC + `messageID` ASC "); $stmt->bindParam(':user1', $_SESSION["userID"]); -- 2.49.1 From 1a3efe9669089acffc404151616d26b1d3f9d984 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 3 Feb 2017 10:12:37 +0100 Subject: [PATCH 299/322] Fixed W3Validation and url GETs --- website/public/fb-callback.php | 71 -------------- website/public/register(stash).php | 116 ----------------------- website/public/styles/index.css | 6 -- website/queries/checkInput.php | 6 +- website/queries/login.php | 7 +- website/views/facebookRegisterModal.php | 8 +- website/{public => views}/fbRegister.php | 0 website/views/forgotPasswordModal.php | 4 +- website/views/homeLoginRegister.php | 38 ++++---- website/views/login-view.php | 13 ++- website/{public => views}/register.php | 0 website/views/registerModal.php | 13 +-- 12 files changed, 43 insertions(+), 239 deletions(-) delete mode 100644 website/public/fb-callback.php delete mode 100644 website/public/register(stash).php rename website/{public => views}/fbRegister.php (100%) rename website/{public => views}/register.php (100%) diff --git a/website/public/fb-callback.php b/website/public/fb-callback.php deleted file mode 100644 index 0ed0369..0000000 --- a/website/public/fb-callback.php +++ /dev/null @@ -1,71 +0,0 @@ - $appID, // Replace {app-id} with your app id - 'app_secret' => $appSecret, - 'default_graph_version' => 'v2.2', -]); - -$helper = $fb->getRedirectLoginHelper(); - -try { - $accessToken = $helper->getAccessToken(); -} catch(Facebook\Exceptions\FacebookResponseException $e) { - // When Graph returns an error - echo 'Graph returned an error: ' . $e->getMessage(); - exit; -} catch(Facebook\Exceptions\FacebookSDKException $e) { - // When validation fails or other local issues - echo 'Facebook SDK returned an error: ' . $e->getMessage(); - exit; -} - -if (! isset($accessToken)) { - if ($helper->getError()) { - header('HTTP/1.0 401 Unauthorized'); - echo "Error: " . $helper->getError() . "\n"; - echo "Error Code: " . $helper->getErrorCode() . "\n"; - echo "Error Reason: " . $helper->getErrorReason() . "\n"; - echo "Error Description: " . $helper->getErrorDescription() . "\n"; - } else { - header('HTTP/1.0 400 Bad Request'); - echo 'Bad request'; - } - exit; -} - -// Logged in -echo '

    Access Token

    '; -var_dump($accessToken->getValue()); - -// The OAuth 2.0 client handler helps us manage access tokens -$oAuth2Client = $fb->getOAuth2Client(); - -// Get the access token metadata from /debug_token -$tokenMetadata = $oAuth2Client->debugToken($accessToken); -echo '

    Metadata

    '; -var_dump($tokenMetadata); - -// Validation (these will throw FacebookSDKException's when they fail) -$tokenMetadata->validateAppId($appID); // Replace {app-id} with your app id -// If you know the user ID this access token belongs to, you can validate it here -//$tokenMetadata->validateUserId('123'); -$tokenMetadata->validateExpiration(); - -if (! $accessToken->isLongLived()) { - // Exchanges a short-lived access token for a long-lived one - try { - $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); - } catch (Facebook\Exceptions\FacebookSDKException $e) { - echo "

    Error getting long-lived access token: " . $helper->getMessage() . "

    \n\n"; - exit; - } - - echo '

    Long-lived

    '; - var_dump($accessToken->getValue()); -} - -$_SESSION['fb_access_token'] = (string) $accessToken; - -// User is logged in with a long-lived access token. -// You can redirect them to a members-only page. -//header('Location: https://example.com/members.php'); \ No newline at end of file diff --git a/website/public/register(stash).php b/website/public/register(stash).php deleted file mode 100644 index 99ebc02..0000000 --- a/website/public/register(stash).php +++ /dev/null @@ -1,116 +0,0 @@ - - - - -getMessage(); - } - - try { - $surname = test_input(($_POST["surname"])); - checkInputChoice($surname, "lettersAndSpaces"); - } - catch(lettersAndSpacesException $e){ - $correct = false; - $surnameErr = $e->getMessage(); - } - - try{ - $day_date = test_input(($_POST["day_date"])); - $month_date = test_input(($_POST["month_date"])); - $year_date = test_input(($_POST["year_date"])); - $bday = $year_date . "-" . $month_date . "-" . $day_date; - checkInputChoice($bday, "bday"); - } catch(bdayException $e){ - $correct = false; - $bdayErr = $e->getMessage(); - } - - try{ - $username = str_replace(' ', '', test_input(($_POST["username"]))); - checkInputChoice($username, "username"); - } catch(usernameException $e){ - $correct = false; - $usernameErr = $e->getMessage(); - } - - try{ - $password = str_replace(' ', '', 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"); - $confirmEmail = test_input(($_POST["confirmEmail"])); - matchEmail(); - } catch(emailException $e){ - $correct = false; - $emailErr = $e->getMessage(); - } catch(confirmEmailException $e){ - $correct = false; - $confirmEmailErr = $e->getMessage(); - } - - try{ - $captcha = $_POST['g-recaptcha-response']; - checkCaptcha($captcha); - } catch(captchaException $e){ - $correct = false; - $captchaErr = $e->getMessage(); - } - - try { - getIp(); - registerCheck($correct); - sendConfirmEmailUsername($username); - } 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 c7a0aa8..68191ad 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -198,12 +198,6 @@ ul { animation-duration: 0.4s } -/* Add Animation */ -@-webkit-keyframes animatetop { - from {top:-300px; opacity:0} - to {top:0; opacity:1} -} - @keyframes animatetop { from {top:-300px; opacity:0} to {top:0; opacity:1} diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index 69274ce..247050b 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -68,7 +68,7 @@ function validateBday($variable){ } } -// Checks for date +/* Checks for date */ function validateDate($date, $format) { $d = DateTime::createFromFormat($format, $date); @@ -124,7 +124,7 @@ function validateEmail($variable){ throw new emailException("Mag maximaal 50 karakters!"); } } -//255 + /* checks if an input is a valid email. */ function validateFBEmail($variable){ if (empty($variable)) { @@ -138,6 +138,7 @@ function validateFBEmail($variable){ } } +/* checks if email is the same */ function matchEmail(){ if (strtolower($_POST["email"]) != strtolower($_POST["confirmEmail"])){ throw new confirmEmailException("Emails matchen niet!"); @@ -153,7 +154,6 @@ function resetEmail($variable){ } } - /* checks if two passwords matches. */ function matchPassword(){ if ($_POST["password"] != $_POST["confirmpassword"]) { diff --git a/website/queries/login.php b/website/queries/login.php index 27c1f3b..3480991 100644 --- a/website/queries/login.php +++ b/website/queries/login.php @@ -1,5 +1,6 @@ @@ -75,8 +77,9 @@ function validateLogin($username, $password, $url){ $_SESSION["userID"] = $userID; if(!isset($url) or $url == "") { header("location: profile.php"); + echo "succes"; } else{ - header("location: $url"); + header("location: ".$url); } } diff --git a/website/views/facebookRegisterModal.php b/website/views/facebookRegisterModal.php index 7271d63..a38a3a3 100644 --- a/website/views/facebookRegisterModal.php +++ b/website/views/facebookRegisterModal.php @@ -1,7 +1,6 @@
    - * +
    - + diff --git a/website/public/fbRegister.php b/website/views/fbRegister.php similarity index 100% rename from website/public/fbRegister.php rename to website/views/fbRegister.php diff --git a/website/views/forgotPasswordModal.php b/website/views/forgotPasswordModal.php index 2ebdbb9..ebb9d64 100644 --- a/website/views/forgotPasswordModal.php +++ b/website/views/forgotPasswordModal.php @@ -4,7 +4,6 @@ diff --git a/website/views/homeLoginRegister.php b/website/views/homeLoginRegister.php index 55277e7..ad7be40 100644 --- a/website/views/homeLoginRegister.php +++ b/website/views/homeLoginRegister.php @@ -11,16 +11,16 @@ if(isset($_SESSION["userID"])){ // Facebook variables $appID = "353857824997532"; $appSecret = "db47e91ffbfd355fdd11b4b65eade851"; -$fbUsername = $fbPassword = $fbConfirmpassword = ""; +$fbUsername = $fbPassword = $fbConfirmpassword = $fbName = $fbSurname = $fbBday = $fbEmail = $fbUserID = ""; $fbUsernameErr = $fbPasswordErr = $fbConfirmpasswordErr = $fbEmailErr = $fbBdayErr = ""; $fbCorrect = true; -$fbName = $fbSurname = $fbBday = $fbEmail = $fbUserID = ""; // Register variables $name = $surname = $bday = $username = $password = $confirmpassword = $location = $housenumber = $email = $confirmEmail = $captcha = $ip = ""; $genericErr = $nameErr = $surnameErr = $bdayErr = $usernameErr = $passwordErr = $confirmpasswordErr = $locationErr = $housenumberErr = $emailErr = $confirmEmailErr = $captchaErr = ""; $correct = true; +// Bday dates $day_date = $month_date = $year_date = ""; $fbDay_date = $fbMonth_date = $fbYear_date = ""; @@ -28,22 +28,14 @@ $fbDay_date = $fbMonth_date = $fbYear_date = ""; $user = $psw = $remember =""; $loginErr = $resetErr = $fbRegisterErr =""; -//if ($_SERVER["REQUEST_METHOD"] == "GET") { -// try { -// $user = ($_POST["user"]); -// validateLogin($_POST["user"], $_POST["psw"], "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"); -// } catch(loginException $e) { -// $loginErr = $e->getMessage(); -// } -//} - if ($_SERVER["REQUEST_METHOD"] == "POST") { + $url = $_POST["url"]; // Checks for which button is pressed switch ($_POST["submit"]) { case "login": try { $user = ($_POST["user"]); - validateLogin($_POST["user"], $_POST["psw"], $_POST["url"]); + validateLogin($_POST["user"], $_POST["psw"], $url); } catch(loginException $e) { $loginErr = $e->getMessage(); } @@ -62,18 +54,22 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { } break; case "register": - include("register.php"); + include("../views/register.php"); break; case "fbRegister": - include("fbRegister.php"); + include("../views/fbRegister.php"); break; } } + +// Get facebook information with facebook PHP SDK. $fb = new Facebook\Facebook([ 'app_id' => $appID, 'app_secret' => $appSecret, 'default_graph_version' => 'v2.2', ]); + +// Redirect back to login.php after logging/canceling with facebook. $redirect = "https://myhyvesbookplus.nl/login.php"; $helper = $fb->getRedirectLoginHelper(); @@ -88,6 +84,7 @@ try { exit; } +// If theres no facebook account logged in, ask for permission. if(!isset($acces_token)){ $permission=["email", "user_birthday"]; $loginurl=$helper->getLoginUrl($redirect,$permission); @@ -96,13 +93,14 @@ if(!isset($acces_token)){ $response = $fb->get('/me?fields=email,name,birthday'); $usernode = $response->getGraphUser(); + // Get facebook information $nameSplit = explode(" ", $usernode->getName()); $fbName = $nameSplit[0]; $fbSurname = $nameSplit[1]; $fbUserID = $usernode->getID(); $fbEmail = $usernode->getProperty("email"); -// $image = 'https://graph.facebook.com/' . $usernode->getId() . '/picture?width=200'; + // If there is an account, check if the account is banned or frozen. if (fbLogin($fbUserID) == 1) { $fbID = getfbUserID($fbUserID)["userID"]; $fbRole = getfbUserID($fbUserID)["role"]; @@ -110,16 +108,20 @@ if(!isset($acces_token)){ echo ""; + } else if($fbRole == "frozen"){ $_SESSION["userID"] = $fbID; echo ""; + window.onload=frozenAlert(); + window.location.href= 'profile.php'; + "; + } else { $_SESSION["userID"] = $fbID; header("location: profile.php"); + } + // Registration with faceobook if theres no account. } else { echo " diff --git a/website/views/login_head.php b/website/views/login_head.php index 9e580df..e8e3a84 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -3,6 +3,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MyHyvesbook+ Date: Fri, 3 Feb 2017 11:47:16 +0100 Subject: [PATCH 316/322] Added fbModal button --- website/public/js/loginRegisterModals.js | 5 ++++- website/views/facebookRegisterModal.php | 6 ++++++ website/views/homeLoginRegister.php | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/website/public/js/loginRegisterModals.js b/website/public/js/loginRegisterModals.js index 373fb7e..104dd02 100644 --- a/website/public/js/loginRegisterModals.js +++ b/website/public/js/loginRegisterModals.js @@ -7,7 +7,7 @@ var facebookModal = document.getElementById("fbModal"); // Get the button that opens the modal var registerBtn = document.getElementById("registerBtn"); var btn = document.getElementById("myBtn"); - +var fbBtn = document.getElementById("fbBtn"); // Get the element that closes the modal var span = document.getElementsByClassName("close")[0]; @@ -24,6 +24,9 @@ btn.onclick = function () { registerBtn.onclick = function () { registerModal.style.display = "block"; } +fbBtn.onclick = function () { + facebookModal.style.display = "block"; +} /** * WHen the user clicks on (X), close the modal diff --git a/website/views/facebookRegisterModal.php b/website/views/facebookRegisterModal.php index a38a3a3..17ce7ef 100644 --- a/website/views/facebookRegisterModal.php +++ b/website/views/facebookRegisterModal.php @@ -1,3 +1,9 @@ +Facebook registreer'; + +} +?> -- 2.49.1 From fb5f76c4993cab6d41ab7be8c246452a2f49a207 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 12:32:57 +0100 Subject: [PATCH 319/322] ? --- website/public/js/profile.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 website/public/js/profile.js diff --git a/website/public/js/profile.js b/website/public/js/profile.js deleted file mode 100644 index e69de29..0000000 -- 2.49.1 From 1ac6a7da87e1637e195e596f111df74c8742d8af Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Fri, 3 Feb 2017 12:40:33 +0100 Subject: [PATCH 320/322] Changed admin checkbox buttons --- website/public/styles/adminpanel.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/public/styles/adminpanel.css b/website/public/styles/adminpanel.css index 888b4ca..d04d8fa 100644 --- a/website/public/styles/adminpanel.css +++ b/website/public/styles/adminpanel.css @@ -1,9 +1,9 @@ .admin-panel input[type="radio"], input[type="checkbox"] { vertical-align: middle; - height: 28px; - width: 28px; - margin: 2px; + height: 14px; + width: 14px; + margin: 7px; } .table-checkbox { -- 2.49.1 From 4643dfcddb4f8ef314168cb0851c811d559d57bd Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Fri, 3 Feb 2017 12:42:30 +0100 Subject: [PATCH 321/322] Fixed comments and links --- website/queries/register.php | 31 +++++++++++++++++++++++++++++ website/queries/requestpassword.php | 18 +++++++++++++++-- website/views/homeLoginRegister.php | 2 +- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/website/queries/register.php b/website/queries/register.php index 3dcbed4..7f91dfa 100644 --- a/website/queries/register.php +++ b/website/queries/register.php @@ -1,5 +1,9 @@ rowCount(); } +/** + * Registers a new account with facebook register + */ function fbRegisterAccount() { $stmt = prepareQuery(" INSERT INTO @@ -158,6 +184,11 @@ function fbRegisterAccount() { return $stmt->execute(); } +/** + * Checks which dates need to be selected when there is an invalid registration. + * @param $date + * @param $value + */ function submitselect($date, $value){ if ($date == $value){ echo "selected"; diff --git a/website/queries/requestpassword.php b/website/queries/requestpassword.php index a54bd7d..daad355 100644 --- a/website/queries/requestpassword.php +++ b/website/queries/requestpassword.php @@ -1,6 +1,10 @@ getRedirectLoginHelper(); try { -- 2.49.1 From 7cc6450e6afde743509fcc83b3e8dadf0415509e Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Fri, 3 Feb 2017 13:19:00 +0100 Subject: [PATCH 322/322] Added comments to javascript code. --- website/public/js/friendButtons.js | 8 +++++- website/public/js/groupButtons.js | 5 ++++ website/public/js/masonry.js | 44 +++++++++++++++++++----------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/website/public/js/friendButtons.js b/website/public/js/friendButtons.js index 47c476a..440dfe5 100644 --- a/website/public/js/friendButtons.js +++ b/website/public/js/friendButtons.js @@ -1,6 +1,8 @@ +// Show the right friendship buttonsto the user. function placeFriendButtons() { $.post("API/getFriendshipStatus.php", { usr: userID }) .done(function(data) { + //save the friendship status var friendshipStatus = data; var $buttonContainer = $("div.friend-button-container"); $("#start-profile-chat").hide(); @@ -22,6 +24,7 @@ function placeFriendButtons() { text1 = "Bevriend"; icon1 = "fa-handshake-o"; break; + // Users are friends. case "1": value1 = userID; class1 = "green"; @@ -32,12 +35,14 @@ function placeFriendButtons() { text2 = "Verwijder"; icon2 = "fa-times"; break; + // This user sent request. case "2": value1 = "delete"; class1 = "red"; text1 = "Trek verzoek in"; icon1 = "fa-cross"; break; + // Other user sent request. case "3": value1 = "accept"; class1 = "green"; @@ -50,6 +55,7 @@ function placeFriendButtons() { break; } + // Append buttons to the container. $buttonContainer.append( ""); - + // Gets triggered when a friend button is triggered. $buttonContainer.children().click(function() { if (isNaN(this.value)) editFriendship(userID, this.value); diff --git a/website/public/js/groupButtons.js b/website/public/js/groupButtons.js index e6ada67..ab86e8c 100644 --- a/website/public/js/groupButtons.js +++ b/website/public/js/groupButtons.js @@ -3,16 +3,20 @@ function placeGroupButtons() { .done(function(data) { var $buttonContainer = $("div.group-button-container"); + // Append the right group button to the button container. + // When user is not a member if(data == 'none') { $buttonContainer.append( ""); + // when user sent a request to become a member. } else if(data == 'request') { $buttonContainer.append( ""); + // When user is a member of the group. } else { $buttonContainer.append( ""); } + // Gets triggered when a group button is clicked. $buttonContainer.children().click(function() { $.post("API/editMembership.php", { grp: groupID, role: this.value }) .done(function() { diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index a628e96..eeb5cf7 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -1,3 +1,4 @@ +// Vertical margin between two posts. margin = 20; // scrolling modal taken from http://stackoverflow.com/questions/10476632/how-to-scroll-the-page-when-a-modal-dialog-is-longer-than-the-screen @@ -11,9 +12,12 @@ function scrollbarMargin(width, overflow) { }); } +// Get post from the server. function requestPost(postID) { + // Make the modal view visible. $(".modal").show(); + // Send get request to the server to load the post. $.get("API/loadPost.php", { postID : postID }).done(function(data) { $('.modal-default').hide(); var scrollBarWidth = window.innerWidth - document.body.offsetWidth; @@ -23,11 +27,14 @@ function requestPost(postID) { }); } +// Create a new post. function postPost() { title = $("input.newpost[name='title']").val(); content = $("textarea.newpost[name='content']").val(); + // Masonrymode 2: when on group page and user is an admin. if (masonryMode == 2) { + // Create the new group post. $.post("API/postPost.php", { title: title, content : content, group : groupID }) @@ -42,6 +49,7 @@ function postPost() { } }); } else { + // Create the new user post. $.post("API/postPost.php", { title: title, content : content }) .done(function(data) { @@ -68,6 +76,7 @@ var postAmount = 0; var noposts = false; $(document).ready(function () { + // Initialise variables for masonry. windowWidth = $(window).width(); columnCount = Math.floor($(".posts").width() / 250); columns = new Array(columnCount); @@ -78,6 +87,7 @@ $(window).on("load", function() { $(".modal-close").click(function (){closeModal()}); // http://stackoverflow.com/questions/9439725/javascript-how-to-detect-if-browser-window-is-scrolled-to-bottom + // Infinite scroll. window.onscroll = function(ev) { if($(window).scrollTop() + $(window).height() == $(document).height() ) { loadMorePosts(userID, groupID, postAmount, postLimit); @@ -85,6 +95,7 @@ $(window).on("load", function() { }; }); +// Hide modal view from the screen. function closeModal() { $(".modal").hide(); scrollbarMargin(0, 'auto'); @@ -92,23 +103,30 @@ function closeModal() { $('.modal-default').show(); } +// Will fire when user resizes the window. $(window).resize(function() { clearTimeout(window.resizedFinished); window.resizeFinished = setTimeout(function() { + // Check if the width of the screen changed. if ($(window).width() != windowWidth) { + // Save width. windowWidth = $(window).width(); - + // Check if there fit more or less columns in the new width. if (columnCount != Math.floor($(".posts").width() / 250)) { columnCount = Math.floor($(".posts").width() / 250); + // Respawn the masonry grid. masonry(masonryMode); } } }, 250); }); +// Select the container for masonry. var $container = $(".posts"); +// Spawn the masonry grid. function masonry(mode) { + // save the masonry mode. masonryMode = mode; $container.children().remove(); @@ -116,10 +134,7 @@ function masonry(mode) { noposts = false; postAmount = 0; - /* - * Initialise columns. - */ - + // Initialise columns. for (i = 0; i < columnCount; i++) { $column = $("
    "); $column.width(100/columnCount + "%"); @@ -127,11 +142,13 @@ function masonry(mode) { columns[i] = [0, $column]; } + // Place the form for new posts. if(mode > 0) { $postInput = $("
    "); $form = $(""); $postInput.append($form); + //Add extra input for group posts. if(mode == 2) { $form.append($("")); } @@ -144,17 +161,11 @@ function masonry(mode) { columns[0][0] = $postInput.height() + margin; } - /* - * Function will find the column with the shortest height. - */ - - - /* - * Get the posts from the server. - */ + // Get the posts from the server. loadMorePosts(userID, groupID, 0, postLimit); } +// Find the column with the shortest hight. function getShortestColumn(columns) { column = columns[0]; @@ -166,17 +177,20 @@ function getShortestColumn(columns) { return column; } +// Load certain range of posts. function loadMorePosts(uID, gID, offset, limit) { if (noposts) { return; } + // Get a list of posts from the server. $.post("API/getPosts.php", { usr : uID, grp : gID, offset : offset, limit : limit}) .done(function(data) { if (!data) { + // No posts were found, show noposts bar to user. $('.noposts').show(); noposts = true; return; @@ -184,9 +198,7 @@ function loadMorePosts(uID, gID, offset, limit) { posts = JSON.parse(data); - /* - * Rearange the objects. - */ + // Rearange the objects. $.each(posts, function() { $post = $("
    "); $post.append($("

    ").html(this["title"])); -- 2.49.1

    - - UserGebruikersnaam StatusCommentActionAantekeningActie
    $name $role $description
    + onsubmit=\"adminUpdate(this); return false;\">
    Gebruikersnaam Status Aantekening
    $username $role $bancomment - + onsubmit=\"adminUpdate(this); return false;\"> + diff --git a/website/views/adminpanel.php b/website/views/adminpanel.php index c48a28d..d2b83d2 100644 --- a/website/views/adminpanel.php +++ b/website/views/adminpanel.php @@ -7,6 +7,7 @@ $perpage = 20; $status = array("user", "frozen", "banned", "unconfirmed", "admin", "owner"); $groupstatus = array("hidden", "public", "membersonly"); $pagetype = "user"; +$userinfo = getRoleByID($_SESSION['userID'])->fetch(PDO::FETCH_ASSOC); if (isset($_GET["search"])) { $search = test_input($_GET["search"]); @@ -123,20 +124,30 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { -
    + + + Maak Admin + "; + } + ?>
    -
    + + -- 2.49.1 From 422e2d13086ec6d501edf1aa71f8f6107ab53f32 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Mon, 30 Jan 2017 21:48:18 +0100 Subject: [PATCH 213/322] Date picker in bday --- website/queries/settings.php | 14 +++++++-- website/views/settings-view.php | 53 ++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/website/queries/settings.php b/website/queries/settings.php index f4c5403..6c52fc4 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -110,20 +110,30 @@ function updateSettings() { WHERE `userID` = :userID "); + $bday = new DateTime(test_input($_POST["year"] . $_POST["month"] . $_POST["day"])); + checkBday($bday); $stmt->bindValue(":fname", test_input($_POST["fname"])); $stmt->bindValue(":lname", test_input($_POST["lname"])); $stmt->bindValue(":location", test_input($_POST["location"])); - $stmt->bindValue(":bday", test_input($_POST["bday"])); + $stmt->bindValue(":bday", $bday->format("Ymd")); $stmt->bindValue(":bio", test_input($_POST["bio"])); $stmt->bindValue(":showEmail", test_input($_POST["showEmail"])); - $stmt->bindValue(":showBday", test_input($_POST["showBday"])); + $stmt->bindValue(":showBday",test_input($_POST["showBday"])); $stmt->bindValue(":userID", $_SESSION["userID"]); $stmt->execute(); throw new HappyAlert("Instellingen zijn opgeslagen."); } +function checkBday(DateTime $bday) { + $today = new DateTime(); + if ($bday >= $today) { + throw new AngryAlert("Jij bent vast niet in de toekomst geboren toch? ;)"); + } +} + + /** * Change * @throws AngryAlert diff --git a/website/views/settings-view.php b/website/views/settings-view.php index b6a3b4c..1079c91 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -44,37 +44,68 @@ $settings = getSettings();
  • - " - > + + + +
  • + > Ja + > Nee
  • + > Ja + > Nee
  • @@ -189,4 +220,4 @@ $settings = getSettings();
  • - \ No newline at end of file + -- 2.49.1 From ce53b6e9e4e592b55a4f1918862e01ba50bbc4c5 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Mon, 30 Jan 2017 22:42:47 +0100 Subject: [PATCH 214/322] Checkbox for showBday and showEmail --- website/queries/settings.php | 7 ++-- website/views/settings-view.php | 58 +++++++++++++-------------------- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/website/queries/settings.php b/website/queries/settings.php index 6c52fc4..bdc9d38 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -110,7 +110,8 @@ function updateSettings() { WHERE `userID` = :userID "); - $bday = new DateTime(test_input($_POST["year"] . $_POST["month"] . $_POST["day"])); + $bday = new DateTime(); + $bday->setDate(test_input($_POST["year"]), test_input($_POST["month"]), test_input($_POST["day"])); checkBday($bday); $stmt->bindValue(":fname", test_input($_POST["fname"])); @@ -118,8 +119,8 @@ function updateSettings() { $stmt->bindValue(":location", test_input($_POST["location"])); $stmt->bindValue(":bday", $bday->format("Ymd")); $stmt->bindValue(":bio", test_input($_POST["bio"])); - $stmt->bindValue(":showEmail", test_input($_POST["showEmail"])); - $stmt->bindValue(":showBday",test_input($_POST["showBday"])); + $stmt->bindValue(":showEmail", (array_key_exists("showEmail", $_POST) ? "1" : "0")); + $stmt->bindValue(":showBday", (array_key_exists("showBday", $_POST) ? "1" : "0")); $stmt->bindValue(":userID", $_SESSION["userID"]); $stmt->execute(); diff --git a/website/views/settings-view.php b/website/views/settings-view.php index 1079c91..6271a45 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -45,30 +45,30 @@ $settings = getSettings();
  • - + "; - + + + - format("Y"); for ($year = $now; $year >= 1900; $year--): ?> @@ -80,33 +80,19 @@ $settings = getSettings();
  • - - > Ja - - > Nee + >
  • - - > Ja - - > Nee + >
  • @@ -220,4 +206,4 @@ $settings = getSettings(); - + \ No newline at end of file -- 2.49.1 From 8dfa31696c8c53ceac1214c862261bd8ba875d06 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Mon, 30 Jan 2017 22:49:43 +0100 Subject: [PATCH 215/322] autocomplete suggestions at password --- website/views/settings-view.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/website/views/settings-view.php b/website/views/settings-view.php index 6271a45..c5c58c2 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -141,24 +141,30 @@ $settings = getSettings();
    Verander Wachtwoord
    • - +
    • - +
    • - +
    • -- 2.49.1 From 6983aa06a2c97646ff2f5fce9ebe4b03c18c8a33 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Mon, 30 Jan 2017 23:03:50 +0100 Subject: [PATCH 216/322] Finishing touches --- website/views/settings-view.php | 37 +++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/website/views/settings-view.php b/website/views/settings-view.php index c5c58c2..029a32b 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -21,7 +21,7 @@ $settings = getSettings(); id="fname" placeholder="Voornaam" title="Voornaam" - value="" + value="" >
    • @@ -30,7 +30,7 @@ $settings = getSettings(); name="lname" id="lname" placeholder="Achternaam" - value="" + value="" >
    • @@ -39,18 +39,19 @@ $settings = getSettings(); name="location" id="location" placeholder="Locatie" - value="" + value="" >
    • - + - -
    • @@ -83,7 +84,7 @@ $settings = getSettings(); + >
    • @@ -91,7 +92,7 @@ $settings = getSettings(); + >
    • @@ -100,7 +101,7 @@ $settings = getSettings(); rows="5" title="bio" id="bio" - > + >
    • @@ -116,7 +117,7 @@ $settings = getSettings();
      • - " + " class="profile-picture" >
      • @@ -183,7 +184,7 @@ $settings = getSettings(); " + value="" disabled > -- 2.49.1 From a6b6d6d747ca2a02e53f8bab68dcafda38ea5387 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 31 Jan 2017 10:23:47 +0100 Subject: [PATCH 217/322] Style changes --- website/views/settings-view.php | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/website/views/settings-view.php b/website/views/settings-view.php index 029a32b..b7f554a 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -4,13 +4,11 @@ $settings = getSettings();
        - - $alertMessage -
        "; - } - ?> + +
        + +
        +
        Profiel Instellingen
          @@ -43,10 +41,10 @@ $settings = getSettings(); >
        • - + +
        • -- 2.49.1 From 4dc3b4f651d353b266973acebaad5f517cb97826 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 31 Jan 2017 10:31:57 +0100 Subject: [PATCH 218/322] Mobile friendly --- website/public/js/admin.js | 1 - website/public/js/friendButtons.js | 3 -- website/public/js/header.js | 46 ++++++++++++++--------- website/public/styles/chat.css | 14 ++++++- website/public/styles/header.css | 9 ++++- website/public/styles/main.css | 10 +++++ website/public/styles/menu.css | 14 +++++++ website/public/styles/mobilefriendly.css | 47 ++++++++++++++++++++++++ website/public/styles/profile.css | 2 +- website/views/head.php | 2 + website/views/menu.php | 2 +- 11 files changed, 125 insertions(+), 25 deletions(-) create mode 100644 website/public/styles/mobilefriendly.css diff --git a/website/public/js/admin.js b/website/public/js/admin.js index 140c99a..36347c2 100644 --- a/website/public/js/admin.js +++ b/website/public/js/admin.js @@ -60,7 +60,6 @@ function adminSearch() { "API/adminSearchUsers.php", $("#admin-searchform").serialize() ).done(function (data) { - console.log(data); $("#usertable").html(data); }) } diff --git a/website/public/js/friendButtons.js b/website/public/js/friendButtons.js index d62e919..47c476a 100644 --- a/website/public/js/friendButtons.js +++ b/website/public/js/friendButtons.js @@ -48,9 +48,6 @@ function placeFriendButtons() { text2 = "Weiger"; icon2 = "fa-times"; break; - default: - console.log(friendshipStatus); - break; } $buttonContainer.append( diff --git a/website/public/js/header.js b/website/public/js/header.js index bdf5fe3..13e3e12 100644 --- a/website/public/js/header.js +++ b/website/public/js/header.js @@ -1,25 +1,37 @@ $(document).ready(function() { // Toggle menu $("#own-profile-picture, #open-notifications").click(function() { - if ($("#notification-center").css('right') == "-256px") { - // Make the menu visible and move the content to the left. - $("#chat-history").width("calc(100% - 587px)"); - $(".modal").width("calc(100% - 512px)"); - $(".content").css("margin-right", "256px"); - $("#notification-center").css("right", "0px"); + if ($("#notification-center").css('display') == "none") { + // Make the menu visible and move the content to the left. + $(".modal").width("calc(100% - 512px)"); + $(".content").css("margin-right", "256px"); + $("#notification-center").css("right", "0px"); + $("#notification-center").css("display", "block"); + $("#contact-menu").css("display", "block"); - // Add cookie so the menu stays open on other pages - document.cookie = "menu=open; path=/"; - } else { - // Make the menu invisible and move the content to the right. - $("#chat-history").width("calc(100% - 331px)"); - $(".modal").width("calc(100% - 256px)"); - $(".content").css("margin-right", "0px"); - $("#notification-center").css("right", "-256px"); + // Add cookie so the menu stays open on other pages + if (window.innerWidth > 1080) { + $("#chat-history").width("calc(100% - 587px)"); + document.cookie = "menu=open; path=/"; + } else { + document.cookie = "menu=closed; path=/"; + } + } else { + $(".modal").width("calc(100% - 256px)"); + $(".content").css("margin-right", "0px"); + $("#notification-center").css("display", "none"); - // Change menu cookie to close - document.cookie = "menu=closed; path=/"; - } + if (window.innerWidth > 1080) { + $("#chat-history").width("calc(100% - 331px)"); + } else { + // Make the menu invisible and move the content to the right. + $("#contact-menu").css("display", "none"); + } + + // Change menu cookie to close + document.cookie = "menu=closed; path=/"; + + } }); if (getCookie("menu") == "open") { diff --git a/website/public/styles/chat.css b/website/public/styles/chat.css index 85eb219..cb0f19f 100644 --- a/website/public/styles/chat.css +++ b/website/public/styles/chat.css @@ -146,8 +146,20 @@ body { text-align: right; } -@media only screen and (max-width: 1200px) { +@media only screen and (max-width: 1080px) { .chat-message-self, .chat-message-other { max-width: 75%; } + .chat { + left: 0; + width: 100%; + } + #chat-recent-panel { + left: 0; + width: 320px; + } + #chat-history { + left: 50%; + width: calc(100% - 390px); + } } \ No newline at end of file diff --git a/website/public/styles/header.css b/website/public/styles/header.css index 70e8c80..61727eb 100644 --- a/website/public/styles/header.css +++ b/website/public/styles/header.css @@ -26,7 +26,8 @@ header { } #header-search { - padding-left: 42px; + margin: 24px 0 24px 32px; + vertical-align: middle; } @@ -49,4 +50,10 @@ header div { #open-notifications { padding: 5px 20px 5px 0px; +} + +@media only screen and (max-width: 1080px) { + #header-logo { + display: none; + } } \ No newline at end of file diff --git a/website/public/styles/main.css b/website/public/styles/main.css index abb1604..baff345 100644 --- a/website/public/styles/main.css +++ b/website/public/styles/main.css @@ -293,4 +293,14 @@ div[data-title]:hover:after { -webkit-border-radius: 20px; border-radius: 20px; background: #4CAF50; +} + +@media only screen and (max-width: 1080px) { + body { + font-size: 28px!important; + } + button { + font-size: 28px; + } + } \ No newline at end of file diff --git a/website/public/styles/menu.css b/website/public/styles/menu.css index 303b9bc..a862d12 100644 --- a/website/public/styles/menu.css +++ b/website/public/styles/menu.css @@ -86,4 +86,18 @@ height: 100%; padding: 0; text-align: left; +} + +@media only screen and (max-width: 1080px) { + #contact-menu, #notification-center { + display: none; + background: rgba(0, 0, 0, 0.4); + width: calc(50% - 20px); + } + .content { + margin-left: 0; + } + #quick-links i { + font-size: 48px!important; + } } \ No newline at end of file diff --git a/website/public/styles/mobilefriendly.css b/website/public/styles/mobilefriendly.css new file mode 100644 index 0000000..86ffab8 --- /dev/null +++ b/website/public/styles/mobilefriendly.css @@ -0,0 +1,47 @@ +/* MAIN */ +body { + font-size: 28px!important; +} +button { + font-size: 28px; +} + +/* HEADER */ +#header-logo { + display: none; +} + +/* PROFILE */ +.post-box { + width: calc(100% - 65px); +} + +/* MENU */ +#contact-menu, #notification-center { + display: none; + background: rgba(0, 0, 0, 0.4); + width: calc(50% - 20px); +} +.content { + margin-left: 0; +} +#quick-links i { + font-size: 48px!important; +} + +/* CHAT */ +.chat-message-self, .chat-message-other { + max-width: 75%; +} +.chat { + left: 0; + width: 100%; +} +#chat-recent-panel { + left: 0; + width: 320px; +} +#chat-history { + left: 50%; + width: calc(100% - 390px); +} \ No newline at end of file diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 03ab19f..37aaaa1 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -116,7 +116,7 @@ div.posts .post form textarea.newpost { } /* mobile */ -@media only screen and (max-width: 1000px) { +@media only screen and (max-width: 1080px) { .post-box { width: calc(100% - 65px); } diff --git a/website/views/head.php b/website/views/head.php index eb86d56..6e8ca0a 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -12,6 +12,8 @@ @import url("styles/header.css"); @import url("styles/menu.css"); @import url("styles/footer.css"); + + @import url("styles/mobilefriendly.css") screen and (orientation: portrait); +
        -- 2.49.1 From f26097f55fab9a19fa2fc59b087aa4c813f84b5f Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 31 Jan 2017 12:25:28 +0100 Subject: [PATCH 221/322] Fixed online status --- website/public/bits/friend-item.php | 2 +- website/public/group.php | 2 +- website/public/profile.php | 8 ++++---- website/public/styles/main.css | 10 +++++++++- website/public/styles/profile.css | 2 +- website/queries/friendship.php | 11 ++++++----- website/queries/user.php | 13 +++++++++++++ website/views/head.php | 5 ++++- website/views/profile.php | 4 ++-- 9 files changed, 41 insertions(+), 16 deletions(-) diff --git a/website/public/bits/friend-item.php b/website/public/bits/friend-item.php index a69d12a..40bc8a8 100644 --- a/website/public/bits/friend-item.php +++ b/website/public/bits/friend-item.php @@ -33,7 +33,7 @@ foreach($friends as $i => $friend) { } ?>'>
        - PF + PF
        fullname ?>
        = DATE_SUB(NOW(),INTERVAL 15 MINUTE) + WHEN TRUE THEN 'online' + WHEN FALSE THEN 'offline' + END AS `onlinestatus`, `role` FROM `user` @@ -28,11 +32,8 @@ function selectLimitedFriends($userID, $limit) { `friendship`.`user1ID` = `user`.`userID`) AND `user`.`role` != 'banned' AND `friendship`.`status` = 'confirmed' - ORDER BY - CASE - WHEN `friendship`.`user2ID` = `user`.`userID` THEN `friendship`.`chatLastVisted1` - WHEN `friendship`.`user1ID` = `user`.`userID` THEN `friendship`.`chatLastVisted2` - END + ORDER BY + `user`.`lastactivity` DESC LIMIT :limitCount "); diff --git a/website/queries/user.php b/website/queries/user.php index 0900d9f..b1bb93c 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -2,6 +2,19 @@ require_once ("connect.php"); +function updateLastActivity() { + $stmt = prepareQuery(" + UPDATE + `user` + SET + `lastactivity` = NOW() + WHERE + `userID` = :userID + "); + $stmt->bindParam(":userID", $_SESSION["userID"]); + return $stmt->execute(); +} + function getUserID($username) { $stmt = prepareQuery(" SELECT diff --git a/website/views/head.php b/website/views/head.php index 6e8ca0a..284abb4 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -19,9 +19,12 @@ require_once ("../queries/checkInput.php"); require_once ("../queries/connect.php"); +require_once ("../queries/user.php"); session_start(); if(!isset($_SESSION["userID"])){ header("location:login.php"); -} \ No newline at end of file +} else { + updateLastActivity(); +} diff --git a/website/views/profile.php b/website/views/profile.php index 90a368d..8cf555f 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -1,10 +1,10 @@
        - ">
        + " src="">
        -- 2.49.1 From f67dd019c46c67ca604423d00ac04b7c956a8ac7 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Tue, 31 Jan 2017 12:47:24 +0100 Subject: [PATCH 222/322] Inputs are now mobile friendly --- website/public/styles/main.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/website/public/styles/main.css b/website/public/styles/main.css index 7909687..f2d7535 100644 --- a/website/public/styles/main.css +++ b/website/public/styles/main.css @@ -192,7 +192,7 @@ button.green { } button.gray{ - background-color: inherit; + background-color: #FFF; color: #333; } @@ -307,8 +307,9 @@ div[data-title]:hover:after { body { font-size: 28px!important; } - button { + button, input { font-size: 28px; + height: 42px; } } \ No newline at end of file -- 2.49.1 From c14a2770bd092b41a343a2a99f0606c444c75b3d Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 31 Jan 2017 12:52:50 +0100 Subject: [PATCH 223/322] Fixed posting functions for groups. --- website/public/API/postPost.php | 57 +++++++++++++++++++++++++++------ website/queries/group_page.php | 31 +++++++++++++++++- 2 files changed, 77 insertions(+), 11 deletions(-) diff --git a/website/public/API/postPost.php b/website/public/API/postPost.php index b52e96b..40c18e1 100644 --- a/website/public/API/postPost.php +++ b/website/public/API/postPost.php @@ -2,16 +2,53 @@ session_start(); -require("../../queries/post.php"); -require("../../queries/connect.php"); -require("../../queries/checkInput.php"); +require_once("../../queries/post.php"); +require_once("../../queries/group_page.php"); +require_once("../../queries/connect.php"); +require_once("../../queries/checkInput.php"); -if (empty($_POST['newpost-title'])) { -} else { - makePost($_SESSION['userID'], - null, - test_input($_POST['newpost-title']), - test_input($_POST['newpost-content'])); +if (empty($_POST["title"]) or + empty($_POST["content"]) or + empty($_SESSION["userID"])) { + header('HTTP/1.1 500 Non enough arguments'); } -header("Location: ../profile.php"); \ No newline at end of file +if (empty($_POST["group"])) { + // User Post + makePost( + $_SESSION["userID"], + null, + test_input($_POST["title"]), + test_input($_POST["content"]) + ); +} else { + // Group Post + + // Check if the user is an admin or mod of the group. + if(!in_array(selectGroupRole($_POST["group"]), array('mod', 'admin'))) { + header('HTTP/1.1 500 Non enough rights'); + return; + } + + makePost( + $_SESSION["userID"], + $_POST["group"], + test_input($_POST["title"]), + test_input($_POST["content"]) + ); +} + + + + + + +//if (empty($_POST['newpost-title'])) { +//} else { +// makePost($_SESSION['userID'], +// null, +// test_input($_POST['newpost-title']), +// test_input($_POST['newpost-content'])); +//} +// +//header("Location: ../profile.php"); \ No newline at end of file diff --git a/website/queries/group_page.php b/website/queries/group_page.php index b3e454c..83911f8 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -11,6 +11,12 @@ function selectGroupByName($name) { `description`, `picture`, `status`, + ( + SELECT `role` + FROM `group_member` + WHERE `group_member`.`groupID` = `group_page`.`groupID` AND + `userID` = :userID + ) AS `role`, COUNT(`group_member`.`groupID`) as `members` FROM `group_page` @@ -22,13 +28,36 @@ function selectGroupByName($name) { name LIKE :name "); - $stmt->bindParam(':name', $name); + $stmt->bindParam(':name', $name, PDO::PARAM_STR); + $stmt->bindParam(':userID', $_SESSION["userID"], PDO::PARAM_INT); if (!$stmt->execute()) { return False; } return $stmt->fetch(); } +function selectGroupRole(int $groupID) { + $stmt = prepareQuery(" + SELECT + `role` + FROM + `group_member` + WHERE + `groupID` = :groupID AND + `userID` = :userID + "); + + $stmt->bindParam(':groupID', $groupID, PDO::PARAM_INT); + $stmt->bindParam(':userID', $_SESSION["userID"], PDO::PARAM_INT); + if(!$stmt->execute()) { + return False; + } + if($stmt->rowCount() == 0) { + return "none"; + } + return $stmt->fetch()["role"]; +} + function selectGroupMembers(int $groupID) { $stmt = prepareQuery(" SELECT -- 2.49.1 From 6b13db9c4fbfeb99ce903b8072c36ad2e60f7cc9 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Tue, 31 Jan 2017 12:53:45 +0100 Subject: [PATCH 224/322] Fixed posting on group pages. --- website/public/API/postPost.php | 2 +- website/public/group.php | 3 +++ website/public/js/masonry.js | 34 +++++++++++++++++++++++++++++---- website/views/group.php | 2 +- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/website/public/API/postPost.php b/website/public/API/postPost.php index 40c18e1..7a33857 100644 --- a/website/public/API/postPost.php +++ b/website/public/API/postPost.php @@ -29,7 +29,7 @@ if (empty($_POST["group"])) { header('HTTP/1.1 500 Non enough rights'); return; } - + makePost( $_SESSION["userID"], $_POST["group"], diff --git a/website/public/group.php b/website/public/group.php index 2ef3493..5d9459e 100644 --- a/website/public/group.php +++ b/website/public/group.php @@ -34,6 +34,9 @@ include("../views/group.php"); include("../views/footer.php"); $masonry_mode = 0; +if ($group["role"] == "mod" OR $group["role"] == "admin") { + $masonry_mode = 2; +} ?> diff --git a/website/public/js/masonry.js b/website/public/js/masonry.js index cb82089..d73c33c 100644 --- a/website/public/js/masonry.js +++ b/website/public/js/masonry.js @@ -23,6 +23,28 @@ function requestPost(postID) { }); } +function postPost() { + title = $("input.newpost[name='title']").val(); + content = $("textarea.newpost[name='content']").val(); + + if (masonryMode == 2) { + $.post("API/postPost.php", { title: title, + content : content, + group : groupID }) + .done(function() { + masonry(masonryMode); + }); + } else { + $.post("API/postPost.php", { title: title, + content : content }) + .done(function() { + masonry(masonryMode); + }); + } + + +} + $(window).on("load", function() { $(".modal-close").click(function () { $(".modal").hide(); @@ -64,13 +86,17 @@ function masonry(mode) { columns[i] = [0, $column]; } - if(mode == 1) { + if(mode > 0) { $postInput = $("
        "); - $form = $(""); + $form = $(""); $postInput.append($form); - $form.append($("")); - $form.append($("")); $form.append($("")); columns[0][1].append($postInput); diff --git a/website/views/post-view.php b/website/views/post-view.php index 264d67c..d961334 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -24,7 +24,7 @@ echo("
        -
        +
        +
        +
        + + + + + + + + + + + +
        \ No newline at end of file diff --git a/website/views/fbBdayInput.php b/website/views/fbBdayInput.php new file mode 100644 index 0000000..c08b192 --- /dev/null +++ b/website/views/fbBdayInput.php @@ -0,0 +1,40 @@ + + + + + + diff --git a/website/views/login-view.php b/website/views/login-view.php index 0219797..8e82fdf 100644 --- a/website/views/login-view.php +++ b/website/views/login-view.php @@ -20,7 +20,7 @@ name="user" value="" title="Moet een geldige gebruiker zijn" - > + required>
        @@ -31,7 +31,7 @@ placeholder="Voer uw wachtwoord in" name="psw" title="Moet minstens 8 karakters lang zijn" - > + required>
        @@ -47,73 +47,68 @@
        -
        - + + +login with Facebook!
        '; + } +?> \ No newline at end of file diff --git a/website/views/registerModal.php b/website/views/registerModal.php index b430ab8..9ad48dc 100644 --- a/website/views/registerModal.php +++ b/website/views/registerModal.php @@ -32,7 +32,8 @@ name="name" value="" title="Mag alleen letters bevatten" - > + required + autocomplete="given-name"> * @@ -44,7 +45,8 @@ name="surname" value="" title="Mag alleen letters bevatten" - > + required + autocomplete="family-name"> * @@ -65,7 +67,7 @@ name="username" value="" title="Moet minimaal 6 karakters bevatten" - > + required> *
        • Minstens 6 karakters
        • @@ -81,7 +83,7 @@ name="password" value="" id="password" - > + required> *
          • Minstens 8 karakters
          • @@ -96,7 +98,7 @@ value="" id="confirmpassword" title="Herhaal wachtwoord" - > + required> * @@ -109,7 +111,6 @@ value="" pattern="[A-Za-z]{1,}" title="Mag alleen letters bevatten"> - * @@ -120,7 +121,8 @@ name="email" value="" id="email" - title="Voer een geldige email in"> + title="Voer een geldige email in" + required> * @@ -132,10 +134,12 @@ name="confirmEmail" value="" id="email" - title="Herhaal uw email"> + title="Herhaal uw email" + required> * +
  • $username $role$bancomment +
    $bancomment
    +
    +
    + + + +
    +
    + +
    -- 2.49.1 From c0a64e9ffd4af652b488ac18a39f31831de13523 Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Tue, 31 Jan 2017 16:19:15 +0100 Subject: [PATCH 238/322] 1337 bday --- website/views/settings-view.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/website/views/settings-view.php b/website/views/settings-view.php index b7f554a..b03133e 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -75,6 +75,9 @@ $settings = getSettings(); +
  • -- 2.49.1 From 52a4822477432218965aff2bf0b9b15018f4112e Mon Sep 17 00:00:00 2001 From: Hendrik Date: Tue, 31 Jan 2017 16:20:02 +0100 Subject: [PATCH 239/322] post-merge fix --- website/public/API/adminSearchUsers.php | 2 +- website/views/adminpanel-table.php | 2 +- website/views/adminpanel.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/website/public/API/adminSearchUsers.php b/website/public/API/adminSearchUsers.php index 58b170a..5f7944b 100644 --- a/website/public/API/adminSearchUsers.php +++ b/website/public/API/adminSearchUsers.php @@ -33,7 +33,7 @@ if (isset($_POST['groupstatus'])) { $groupstatus = $_POST["groupstatus"]; } -$userinfo = getRoleByID($_SESSION['userID'])->fetch(PDO::FETCH_ASSOC); +$userinfo = getRoleByID($_SESSION['userID']); if ($pagetype == "user") { include ("../../views/adminpanel-table.php"); diff --git a/website/views/adminpanel-table.php b/website/views/adminpanel-table.php index 9e6b9bc..3ae5da4 100644 --- a/website/views/adminpanel-table.php +++ b/website/views/adminpanel-table.php @@ -50,7 +50,7 @@ while($user = $q->fetch(PDO::FETCH_ASSOC)) { - + name="fbUserID" + value=""> + diff --git a/website/views/forgotPasswordModal.php b/website/views/forgotPasswordModal.php index d3f12f9..2ebdbb9 100644 --- a/website/views/forgotPasswordModal.php +++ b/website/views/forgotPasswordModal.php @@ -19,7 +19,8 @@ class="middle" placeholder="Voer uw email in" name="forgotEmail" - title="Voer een email in"> + title="Voer een email in" + required>
  • + value="email"> + Verander Email +
  • -- 2.49.1 From d027333bd7dfa3170505566a0f93c6b5ef55d6d9 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Thu, 2 Feb 2017 01:06:31 +0100 Subject: [PATCH 262/322] fix filter and pagenumber interaction in search --- website/public/API/searchPageNumber.php | 14 ++++++++--- website/queries/friendship.php | 31 +++++++++++++++++++++++++ website/queries/group_member.php | 23 ++++++++++++++++++ website/views/search-view.php | 7 +++++- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/website/public/API/searchPageNumber.php b/website/public/API/searchPageNumber.php index 4a76516..9a12d79 100644 --- a/website/public/API/searchPageNumber.php +++ b/website/public/API/searchPageNumber.php @@ -6,6 +6,8 @@ require_once ("../../queries/connect.php"); require_once ("../../queries/checkInput.php"); require_once ("../../queries/user.php"); require_once ("../../queries/group_page.php"); +require_once ("../../queries/friendship.php"); +require_once ("../../queries/group_member.php"); $user_perpage = $group_perpage = 20; @@ -25,14 +27,20 @@ if (isset($_POST['search'])) { $search = test_input($_POST['search']); } -$user_count = countSomeUsers($search)->fetchColumn(); -$group_count = countSomeGroups($search)->fetchColumn(); - $filter = "all"; if (isset($_POST['filter'])) { $filter = test_input($_POST['filter']); } +if ($filter == "all") { + $user_count = countSomeUsers($search)->fetchColumn(); + $group_count = countSomeGroups($search)->fetchColumn(); +} else { + $user_count = countSomeFriends($search); + $group_count = countSomeOwnGroups($search); +} + + $option = "user"; if (isset($_POST['option'])) { $option = test_input($_POST['option']); diff --git a/website/queries/friendship.php b/website/queries/friendship.php index 450fd20..49d8047 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -274,4 +274,35 @@ function searchSomeFriends($n, $m, $search) { $stmt->bindParam(':m', $m, PDO::PARAM_INT); $stmt->execute(); return json_encode($stmt->fetchAll()); +} + +function countSomeFriends($search) { + $stmt = prepareQuery(" + SELECT + COUNT(*) + FROM + `user` + INNER JOIN + `friendship` + WHERE + ((`friendship`.`user1ID` = :userID AND + `friendship`.`user2ID` = `user`.`userID` OR + `friendship`.`user2ID` = :userID AND + `friendship`.`user1ID` = `user`.`userID`) AND + `user`.`role` != 'banned' AND + `friendship`.`status` = 'confirmed') AND + (`username` LIKE :keyword OR + `fname` LIKE :keyword OR + `lname` LIKE :keyword) + ORDER BY + `fname`, + `lname`, + `username` + "); + + $search = "%$search%"; + $stmt->bindParam(':keyword', $search); + $stmt->bindParam(':userID', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchColumn(); } \ No newline at end of file diff --git a/website/queries/group_member.php b/website/queries/group_member.php index cea4dde..8b6bf75 100644 --- a/website/queries/group_member.php +++ b/website/queries/group_member.php @@ -54,3 +54,26 @@ function searchSomeOwnGroups($n, $m, $search) { return json_encode($stmt->fetchAll()); } + +function countSomeOwnGroups($search) { + $stmt = prepareQuery(" + SELECT + COUNT(*) + FROM + `group_page` + INNER JOIN + `group_member` + WHERE + `group_member`.`userID` = :userID AND + `group_member`.`groupID` = `group_page`.`groupID` AND + `group_page`.`status` != 'hidden' AND + `name` LIKE :keyword + "); + + $search = "%$search%"; + $stmt->bindParam(':keyword', $search); + $stmt->bindParam(':userID', $_SESSION["userID"], PDO::PARAM_INT); + $stmt->execute(); + + return $stmt->fetchColumn(); +} \ No newline at end of file diff --git a/website/views/search-view.php b/website/views/search-view.php index e42f985..f00fd3c 100644 --- a/website/views/search-view.php +++ b/website/views/search-view.php @@ -48,7 +48,12 @@ $group_n = ($group_currentpage - 1) * $group_perpage; - -- 2.49.1 From e299ef59e8e5e46d87fde39c1b152b34aa92807a Mon Sep 17 00:00:00 2001 From: Marijn Jansen Date: Thu, 2 Feb 2017 10:28:12 +0100 Subject: [PATCH 263/322] Added show profile into settings --- website/public/js/post.js | 2 -- website/queries/settings.php | 7 +++++-- website/views/settings-view.php | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/website/public/js/post.js b/website/public/js/post.js index f176950..4009023 100644 --- a/website/public/js/post.js +++ b/website/public/js/post.js @@ -34,6 +34,4 @@ function deletePost(postID) { }); closeModal(); masonry(masonryMode); - - } \ No newline at end of file diff --git a/website/queries/settings.php b/website/queries/settings.php index 03f794f..dfd65a0 100644 --- a/website/queries/settings.php +++ b/website/queries/settings.php @@ -18,7 +18,8 @@ function getSettings() { `bio`, `profilepicture`, `showBday`, - `showEmail` + `showEmail`, + `showProfile` FROM `user` WHERE @@ -64,7 +65,8 @@ function updateSettings() { `birthdate` = :bday, `bio` = :bio, `showEmail` = :showEmail, - `showBday` = :showBday + `showBday` = :showBday, + `showProfile` = :showProfile WHERE `userID` = :userID "); @@ -79,6 +81,7 @@ function updateSettings() { $stmt->bindValue(":bio", test_input($_POST["bio"])); $stmt->bindValue(":showEmail", (array_key_exists("showEmail", $_POST) ? "1" : "0")); $stmt->bindValue(":showBday", (array_key_exists("showBday", $_POST) ? "1" : "0")); + $stmt->bindValue(":showProfile", (array_key_exists("showProfile", $_POST) ? "1" : "0")); $stmt->bindValue(":userID", $_SESSION["userID"]); $stmt->execute(); diff --git a/website/views/settings-view.php b/website/views/settings-view.php index e3cfd36..f72e243 100644 --- a/website/views/settings-view.php +++ b/website/views/settings-view.php @@ -96,6 +96,14 @@ $settings = getSettings(); > +
  • + + + > +
  • ")); - $form.append($("")); + $form.append($("")); columns[0][1].append($postInput); columns[0][0] = $postInput.height() + margin; diff --git a/website/public/styles/profile.css b/website/public/styles/profile.css index 1bacafa..2370da8 100644 --- a/website/public/styles/profile.css +++ b/website/public/styles/profile.css @@ -108,7 +108,7 @@ div.posts .post form input, div.posts .post form textarea { width: calc(100% - 15px); } -div.posts .post form input[type="submit"] { +div.posts .post form input[type="submit"], .post button{ width: 100%; } diff --git a/website/views/post-view.php b/website/views/post-view.php index da1c86f..f8fe902 100644 --- a/website/views/post-view.php +++ b/website/views/post-view.php @@ -30,7 +30,7 @@ $fullname = $post['fname'] . " " . $post['lname'] . " (" . $post['username'] . "

    - + "; + ""; } // Add ogg video's else if (link.match(/(https?:\/\/.[^ ]*\.(?:ogg))/ig)) { return ""; + ""; } // Add youtube video's else if (link.match(/(https?:\/\/.(www.)?youtube|youtu.be)*watch/ig)) { diff --git a/website/public/styles/main.css b/website/public/styles/main.css index 226a96d..650a30f 100644 --- a/website/public/styles/main.css +++ b/website/public/styles/main.css @@ -116,7 +116,7 @@ p { @media only screen and (max-width: 1400px) { .item-box { - width: calc(100% - 50px); + width: calc(100% - 50px)!important; } } diff --git a/website/public/styles/settings.css b/website/public/styles/settings.css index 933e7fd..6a2c2f2 100644 --- a/website/public/styles/settings.css +++ b/website/public/styles/settings.css @@ -32,6 +32,11 @@ text-align: right; } +.settings-password, .settings-email { + width: calc(50% - 60px); + display: inline-flex; +} + .settings-password label, .settings-email label { text-align: left; } diff --git a/website/views/head.php b/website/views/head.php index 284abb4..c4d13a5 100644 --- a/website/views/head.php +++ b/website/views/head.php @@ -1,4 +1,8 @@ - + + + + + MyHyvesbook+ -- 2.49.1 From 327a6a8f5cb5f8ca04508548dd3f6d3062e5264d Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 12:52:03 +0100 Subject: [PATCH 268/322] BUG FIX: username doesn't cut off in link --- website/public/bits/friend-item.php | 2 +- website/queries/friendship.php | 13 ++++++++----- website/queries/user.php | 3 ++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/website/public/bits/friend-item.php b/website/public/bits/friend-item.php index 181f9b6..6a0c868 100644 --- a/website/public/bits/friend-item.php +++ b/website/public/bits/friend-item.php @@ -41,7 +41,7 @@ foreach($friends as $i => $friend) { fullname ?>
    username)) { - echo $friend->username; + echo $friend->usernameshort; } else if (isset($friend->content)) { echo $friend->content; } diff --git a/website/queries/friendship.php b/website/queries/friendship.php index e1a8c53..6ea6313 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -10,7 +10,8 @@ function selectLimitedFriends($userID, $limit) { $stmt = prepareQuery(" SELECT `userID`, - LEFT(`username`, 12) as `username`, + LEFT(`username`, 12) as `usernameshort`, + `username`, LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 12) as `fullname`, IFNULL( `profilepicture`, @@ -50,7 +51,8 @@ function selectAllFriends($userID) { $stmt = prepareQuery(" SELECT `userID`, - LEFT(`username`, 12) as `username`, + LEFT(`username`, 12) as `usernameshort`, + `username`, LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 12) as `fullname`, IFNULL( `profilepicture`, @@ -85,7 +87,8 @@ function selectAllFriendRequests() { $stmt = prepareQuery(" SELECT `userID`, - LEFT(`username`, 12) as `username`, + LEFT(`username`, 12) as `usernameshort`, + `username`, LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 12) as `fullname`, IFNULL( `profilepicture`, @@ -235,8 +238,8 @@ function searchSomeFriends($n, $m, $search) { $stmt = prepareQuery(" SELECT `userID`, - - LEFT(`username`, 12) as `username`, + LEFT(`username`, 12) as `usernameshort`, + `username`, LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 12) as `fullname`, IFNULL( `profilepicture`, diff --git a/website/queries/user.php b/website/queries/user.php index 72205ba..1e54763 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -349,7 +349,8 @@ function searchSomeUsers($n, $m, $search) { $stmt = prepareQuery(" SELECT `userID`, - LEFT(`username`, 12) as `username`, + LEFT(`username`, 12) as `usernameshort`, + `username`, IFNULL( `profilepicture`, '../img/avatar-standard.png' -- 2.49.1 From 86b02973e4887022619cff121379f9fd5da50998 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 13:02:00 +0100 Subject: [PATCH 269/322] Fixed visibility on profiles --- website/public/profile.php | 6 ++++++ website/queries/user.php | 4 ++++ website/views/profile.php | 7 +++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/website/public/profile.php b/website/public/profile.php index 05c661d..d9a317c 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -21,13 +21,19 @@ include_once("../queries/calcAge.php"); if(empty($_GET["username"])) { $userID = $_SESSION["userID"]; + $showProfile = True; } else { $userID = getUserID($_GET["username"]); + $showProfile = False; } $user = selectUser($_SESSION["userID"], $userID); $profile_friends = selectAllFriends($userID); $profile_groups = selectAllUserGroups($userID); +$showProfile = $showProfile || $user["showProfile"] || ($user["status"] == 'confirmed'); +echo " friendship status: " . $user["status"]; +echo " showprofile: $showProfile"; +echo " userID: " . $user["userID"]; if ($userID == $_SESSION["userID"]) { diff --git a/website/queries/user.php b/website/queries/user.php index 33a85a1..74b0aa1 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -65,6 +65,10 @@ function selectUser($me, $other) { `role`, `fname`, `lname`, + `showBday`, + `showEmail`, + `showProfile`, + `status`, CASE `status` IS NULL WHEN TRUE THEN 0 WHEN FALSE THEN diff --git a/website/views/profile.php b/website/views/profile.php index 2bb117f..1e88af8 100644 --- a/website/views/profile.php +++ b/website/views/profile.php @@ -15,16 +15,18 @@

    - " . $user["bio"] . "

    "; } ?>
    - 50) { + 50 and $showProfile) { echo "

    Bio:

    " . $user["bio"] . "

    "; } ?> +

    Informatie

    @@ -85,4 +87,5 @@

    + \ No newline at end of file -- 2.49.1 From 9d675dd897b01d2a5e4e13a124ab9944b2b63a46 Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 13:11:05 +0100 Subject: [PATCH 270/322] Fixed default image for group members. --- website/queries/group_page.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/website/queries/group_page.php b/website/queries/group_page.php index 511ff4d..b66ca54 100644 --- a/website/queries/group_page.php +++ b/website/queries/group_page.php @@ -81,7 +81,10 @@ function selectGroupMembers(int $groupID) { `username`, `fname`, `lname`, - `profilepicture` + IFNULL( + `profilepicture`, + '../img/avatar-standard.png' + ) AS profilepicture FROM `group_member` LEFT JOIN -- 2.49.1 From 044ed6a9d34345e54778ef1795611a51402521c1 Mon Sep 17 00:00:00 2001 From: Joey Lai Date: Thu, 2 Feb 2017 13:19:39 +0100 Subject: [PATCH 271/322] Added noscript --- website/public/styles/index.css | 8 +++++++- website/queries/checkInput.php | 2 +- website/views/facebookRegisterModal.php | 3 +-- website/views/login-view.php | 7 +++++++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/website/public/styles/index.css b/website/public/styles/index.css index 196485e..c7a0aa8 100644 --- a/website/public/styles/index.css +++ b/website/public/styles/index.css @@ -133,6 +133,12 @@ label { color: red; } +.login_containerNoscript { + padding: 4px; + text-align: center; + color: red; +} + @keyframes animatezoom { from {transform: scale(0)} to {transform: scale(1)} @@ -150,7 +156,7 @@ label { margin: 16px auto; overflow-y: auto; padding: 20px; - width: 600px; + width: 650px; } select{ diff --git a/website/queries/checkInput.php b/website/queries/checkInput.php index 8722418..69274ce 100644 --- a/website/queries/checkInput.php +++ b/website/queries/checkInput.php @@ -132,7 +132,7 @@ function validateFBEmail($variable){ } else if (!filter_var($variable, FILTER_VALIDATE_EMAIL)) { throw new emailException("Geldige email invullen"); } else if (getExistingFBEmail() == 1){ - throw new emailException("Email bestaal al!"); + throw new emailException("Uw email wordt al gebruikt voor een ander account!"); } else if (strlen($variable) > 255) { throw new emailException("Mag maximaal 50 karakters!"); } diff --git a/website/views/facebookRegisterModal.php b/website/views/facebookRegisterModal.php index 7db44b0..7271d63 100644 --- a/website/views/facebookRegisterModal.php +++ b/website/views/facebookRegisterModal.php @@ -55,7 +55,6 @@ * - + * - diff --git a/website/views/login-view.php b/website/views/login-view.php index 4f85b0a..98ce71c 100644 --- a/website/views/login-view.php +++ b/website/views/login-view.php @@ -1,3 +1,9 @@ +
    -- 2.49.1 From 417124a1fed22f85cd86615e83df488455baeb30 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:13:20 +0100 Subject: [PATCH 276/322] BUG FIX: added 0 in chat time if needed --- website/public/js/chat.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/website/public/js/chat.js b/website/public/js/chat.js index 1141334..a3ff430 100644 --- a/website/public/js/chat.js +++ b/website/public/js/chat.js @@ -59,7 +59,7 @@ function addMessages(messages) { for(var i in messages) { // Initialize message variables. var thisDate = new Date(messages[i].creationdate.replace(/ /,"T")); - var thisTime = thisDate.getHours() + ":" + thisDate.getMinutes(); + var thisTime = thisDate.getHours() + ":" + ('0' + thisDate.getMinutes()).slice(-2); var type; thisDate.setHours(0,0,0,0); @@ -81,6 +81,8 @@ function addMessages(messages) {
    '; } previousDate = thisDate; + previousTime = thisTime; + previousType = type; messagesText += '
    '; // If it is not the first message, and has a different date/time/type then the previous message, } else if (type != previousType || thisTime != previousTime || thisDate.getTime() > previousDate.getTime()) { -- 2.49.1 From 4a7a91ecd964f1cb0827765078314d04ac6534dc Mon Sep 17 00:00:00 2001 From: "K. Nobel" Date: Thu, 2 Feb 2017 14:20:17 +0100 Subject: [PATCH 277/322] Fixed bug (not showing profile when on own profile) --- website/public/profile.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/website/public/profile.php b/website/public/profile.php index d9a317c..aa4cf7c 100644 --- a/website/public/profile.php +++ b/website/public/profile.php @@ -21,19 +21,14 @@ include_once("../queries/calcAge.php"); if(empty($_GET["username"])) { $userID = $_SESSION["userID"]; - $showProfile = True; } else { $userID = getUserID($_GET["username"]); - $showProfile = False; } $user = selectUser($_SESSION["userID"], $userID); $profile_friends = selectAllFriends($userID); $profile_groups = selectAllUserGroups($userID); -$showProfile = $showProfile || $user["showProfile"] || ($user["status"] == 'confirmed'); -echo " friendship status: " . $user["status"]; -echo " showprofile: $showProfile"; -echo " userID: " . $user["userID"]; +$showProfile = $user["showProfile"] || ($user["status"] == 'confirmed') || $_SESSION["userID"] == $userID; if ($userID == $_SESSION["userID"]) { -- 2.49.1 From 188741ddf5ded574767a0115f06af8bd2a97487b Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:22:13 +0100 Subject: [PATCH 278/322] BUG FIX: link in fancy text now opens in new tab --- website/public/js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/public/js/main.js b/website/public/js/main.js index b6ab703..30cd3ed 100644 --- a/website/public/js/main.js +++ b/website/public/js/main.js @@ -31,7 +31,7 @@ function fancyText(text) { } // Add links else { - return "" + link + ""; + return "" + link + ""; } }); -- 2.49.1 From 1672ce6086deed96f1325a3044e9fe9c632adaf6 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:23:36 +0100 Subject: [PATCH 279/322] Changed offline status to 5 minutes after inactive --- website/queries/friendship.php | 8 ++++---- website/queries/user.php | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/website/queries/friendship.php b/website/queries/friendship.php index 7edada9..3dcd53b 100644 --- a/website/queries/friendship.php +++ b/website/queries/friendship.php @@ -17,7 +17,7 @@ function selectLimitedFriends($userID, $limit) { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -58,7 +58,7 @@ function selectAllFriends($userID) { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -94,7 +94,7 @@ function selectAllFriendRequests() { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -245,7 +245,7 @@ function searchSomeFriends($n, $m, $search) { `profilepicture`, '../img/avatar-standard.png' ) AS profilepicture, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, diff --git a/website/queries/user.php b/website/queries/user.php index e8bda13..7b8ef3f 100644 --- a/website/queries/user.php +++ b/website/queries/user.php @@ -62,7 +62,7 @@ function selectUser($me, $other) { ) AS profilepicture, `bio`, `user`.`creationdate`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus`, @@ -131,7 +131,7 @@ function select20UsersFromN($n) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -156,7 +156,7 @@ function search20UsersFromN($n, $keyword) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -184,7 +184,7 @@ function search20UsersFromNByStatus($n, $keyword, $status) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -218,7 +218,7 @@ function searchSomeUsersByStatus($n, $m, $search, $status) { `username`, `role`, `bancomment`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` @@ -362,7 +362,7 @@ function searchSomeUsers($n, $m, $search) { '../img/avatar-standard.png' ) AS profilepicture, LEFT(CONCAT(`user`.`fname`, ' ', `user`.`lname`), 12) as `fullname`, - CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 15 MINUTE) + CASE `lastactivity` >= DATE_SUB(NOW(),INTERVAL 5 MINUTE) WHEN TRUE THEN 'online' WHEN FALSE THEN 'offline' END AS `onlinestatus` -- 2.49.1 From 6fc2f715176a34529d129a0f1a79d4d57f9ae659 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Thu, 2 Feb 2017 14:27:23 +0100 Subject: [PATCH 280/322] Added meta data in the login page --- website/views/login_head.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/website/views/login_head.php b/website/views/login_head.php index e319a9d..bb7d7cf 100644 --- a/website/views/login_head.php +++ b/website/views/login_head.php @@ -1,5 +1,8 @@ - + + + + MyHyvesbook+ Date: Thu, 2 Feb 2017 14:50:51 +0100 Subject: [PATCH 281/322] Added "add group" under group menu --- website/views/menu.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/views/menu.php b/website/views/menu.php index dab8fce..1c1cf01 100644 --- a/website/views/menu.php +++ b/website/views/menu.php @@ -12,6 +12,8 @@ + +
  • GebruikersnaamGroepsnaam StatusAantekeningBeschrijving Actie