diff --git a/.gitignore b/.gitignore index a65bf3836e..a2b7aa3f3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.iml target/ .idea/ +Config.java diff --git a/adlister_seeder.sql b/adlister_seeder.sql new file mode 100644 index 0000000000..0e3a4c28a1 --- /dev/null +++ b/adlister_seeder.sql @@ -0,0 +1,16 @@ + +TRUNCATE table ads; +SET FOREIGN_KEY_CHECKS = 0; +TRUNCATE table users; +SET FOREIGN_KEY_CHECKS = 1; + + +INSERT INTO users(username, email, password) VALUES +('MikuHatsune', 'worldismine@email.com', '$2a$12$Ji/mV8KYcSht5MQyEFC.yOQGyOuXPoU.c8bBBVqS/UQd87/SKwAUK'), +('Yimothy', 'yimothy@yahoo.net', '$2a$12$33kjPr4iufbum3L37BLO6.nkLBqOplFO1AQTYGN7O0KqW4diamYSC'); + +INSERT INTO ads (user_id, title, description, img_url, gender, price, age) VALUES +(1, 'Dog', 'I dont know what it is', 'https://static.wikia.nocookie.net/warner-bros-entertainment/images/e/e5/Courage_cartoon_network.png','male',1, 20), +(1, 'Cat', 'Dont eat', 'https://upload.wikimedia.org/wikipedia/en/thumb/e/ed/Nyan_cat_250px_frame.PNG/220px-Nyan_cat_250px_frame.PNG', 'unknown', 100, 12); + + diff --git a/migration.sql b/migration.sql new file mode 100644 index 0000000000..0f67902261 --- /dev/null +++ b/migration.sql @@ -0,0 +1,27 @@ +CREATE DATABASE IF NOT EXISTS adlister_project_db; +USE adlister_project_db; + +DROP TABLE IF EXISTS ads; +DROP TABLE IF EXISTS users; + +CREATE TABLE users ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + username VARCHAR(240) NOT NULL, + email VARCHAR(240) NOT NULL, + password VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE ads ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + user_id INT UNSIGNED NOT NULL, + title VARCHAR(240) NOT NULL, + description TEXT NOT NULL, + img_url VARCHAR(300) NOT NULL, #MAYBE ADD DEFAULT STATE IF NO IMG ADDED + gender VARCHAR(20) NOT NULL, + price DECIMAL(10, 2), # 12,345,678.90 + age VARCHAR(128), + PRIMARY KEY (id), + FOREIGN KEY (user_id) REFERENCES users(id) + ON DELETE CASCADE +); diff --git a/pom.xml b/pom.xml index 4782732164..2d12dc7c5a 100644 --- a/pom.xml +++ b/pom.xml @@ -16,18 +16,33 @@ maven-compiler-plugin 3.6.0 - 1.8 - 1.8 + 16 + 16 + + org.mindrot + jbcrypt + 0.4 + javax.servlet javax.servlet-api - 3.0.1 + 4.0.1 + + + jstl + jstl + 1.2 + + + mysql + mysql-connector-java + 8.0.32 diff --git a/src/main/java/HelloWorldServlet.java b/src/main/java/HelloWorldServlet.java deleted file mode 100644 index dd49fb7133..0000000000 --- a/src/main/java/HelloWorldServlet.java +++ /dev/null @@ -1,9 +0,0 @@ -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class HelloWorldServlet extends HttpServlet { - protected void doGet(HttpServletRequest req, HttpServletResponse res) { - - } -} diff --git a/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java b/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java new file mode 100644 index 0000000000..1763081228 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java @@ -0,0 +1,18 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.AdsIndexServlet", urlPatterns = "/ads") +public class AdsIndexServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setAttribute("ads", DaoFactory.getAdsDao().all()); + request.getRequestDispatcher("/WEB-INF/ads/index.jsp").forward(request, response); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java new file mode 100644 index 0000000000..8290844f09 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -0,0 +1,50 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.Ad; +import com.codeup.adlister.models.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.CreateAdServlet", urlPatterns = "/ads/create") +public class CreateAdServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.getRequestDispatcher("/WEB-INF/ads/create.jsp") + .forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + User user = (User) request.getSession().getAttribute("user"); + + String img = request.getParameter("img_url"); + + if(img.isEmpty()) + { + img = "https://core.trac.wordpress.org/raw-attachment/ticket/45927/placeholder-image-portrait.png"; + } + + Ad ad = new Ad( + user.getId(), + request.getParameter("title"), + request.getParameter("description"), + img, + request.getParameter("gender"), + Double.parseDouble(request.getParameter("price")), + Integer.parseInt(request.getParameter("age")) + ); + + + + DaoFactory.getAdsDao().insert(ad); + response.sendRedirect("/ads"); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/EditProfileServlet.java b/src/main/java/com/codeup/adlister/controllers/EditProfileServlet.java new file mode 100644 index 0000000000..3b441f7f42 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/EditProfileServlet.java @@ -0,0 +1,21 @@ +package com.codeup.adlister.controllers; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.EditProfileServlet", urlPatterns = "/edit-profile") +public class EditProfileServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.getRequestDispatcher("/WEB-INF/editProfile.jsp") + .forward(request, response); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java new file mode 100644 index 0000000000..d6c920d1c7 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -0,0 +1,43 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; +import org.mindrot.jbcrypt.BCrypt; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.LoginServlet", urlPatterns = "/login") +public class LoginServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") != null) { + response.sendRedirect("/profile"); + return; + } + request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + User user = DaoFactory.getUsersDao().findByUsername(username); + + if (user == null) { + response.sendRedirect("/login"); + return; + } + String hashedPassword = user.getPassword(); //hashed password + boolean validAttempt = BCrypt.checkpw(password, hashedPassword); //refactored to entered password to hashed password + + if (validAttempt) { + request.getSession().setAttribute("user", user); + response.sendRedirect("/profile"); + } else { + response.sendRedirect("/login"); + } + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java new file mode 100644 index 0000000000..3d07bffbfd --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java @@ -0,0 +1,15 @@ +package com.codeup.adlister.controllers; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.LogoutServlet", urlPatterns = "/logout") +public class LogoutServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.getRequestDispatcher("/WEB-INF/logout.jsp").forward(request,response); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java new file mode 100644 index 0000000000..ea2ab4d62a --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -0,0 +1,41 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.RegisterServlet", urlPatterns = "/register") +public class RegisterServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + String username = request.getParameter("username"); + String email = request.getParameter("email"); + String password = request.getParameter("password"); + String passwordConfirmation = request.getParameter("confirm_password"); + + // validate input + boolean inputHasErrors = username.isEmpty() + || email.isEmpty() + || password.isEmpty() + || (! password.equals(passwordConfirmation)); + + if (inputHasErrors) { + response.sendRedirect("/register"); + return; + } + + // create and save a new user + User user = new User(username, email, password); + DaoFactory.getUsersDao().insert(user); + response.sendRedirect("/login"); + } +} \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java b/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java new file mode 100644 index 0000000000..e1b8941067 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java @@ -0,0 +1,19 @@ +package com.codeup.adlister.controllers; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "controllers.ViewProfileServlet", urlPatterns = "/profile") +public class ViewProfileServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.getRequestDispatcher("/WEB-INF/profile.jsp").forward(request, response); + } +} diff --git a/src/main/java/com/codeup/adlister/dao/Ads.java b/src/main/java/com/codeup/adlister/dao/Ads.java new file mode 100644 index 0000000000..79dc59f484 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Ads.java @@ -0,0 +1,12 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; + +import java.util.List; + +public interface Ads { + // get a list of all the ads + List all(); + // insert a new ad and return the new ad's id + Long insert(Ad ad); +} diff --git a/src/main/java/com/codeup/adlister/dao/DaoFactory.java b/src/main/java/com/codeup/adlister/dao/DaoFactory.java new file mode 100644 index 0000000000..e002140f85 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/DaoFactory.java @@ -0,0 +1,21 @@ +package com.codeup.adlister.dao; + +public class DaoFactory { + private static Ads adsDao; + private static Users usersDao; + private static Config config = new Config(); + + public static Ads getAdsDao() { + if (adsDao == null) { + adsDao = new MySQLAdsDao(config); + } + return adsDao; + } + + public static Users getUsersDao() { + if (usersDao == null) { + usersDao = new MySQLUsersDao(config); + } + return usersDao; + } +} diff --git a/src/main/java/com/codeup/adlister/dao/ListAdsDao.java b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java new file mode 100644 index 0000000000..e0e6ccdc7c --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java @@ -0,0 +1,58 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; + +import java.util.ArrayList; +import java.util.List; + +public class ListAdsDao implements Ads { + private List ads; + + public List all() { + if (ads == null) { + ads = generateAds(); + } + return ads; + } + + public Long insert(Ad ad) { + // make sure we have ads + if (ads == null) { + ads = generateAds(); + } + // we'll assign an "id" here based on the size of the ads list + // really the com.codeup.adlister.dao would handle this + ad.setId((long) ads.size()); + ads.add(ad); + return ad.getId(); + } + + private List generateAds() { + List ads = new ArrayList<>(); + ads.add(new Ad( + 1, + 1, + "playstation for sale", + "This is a slightly used playstation" + )); + ads.add(new Ad( + 2, + 1, + "Super Nintendo", + "Get your game on with this old-school classic!" + )); + ads.add(new Ad( + 3, + 2, + "Junior Java Developer Position", + "Minimum 7 years of experience required. You will be working in the scripting language for Java, JavaScript" + )); + ads.add(new Ad( + 4, + 2, + "JavaScript Developer needed", + "Must have strong Java skills" + )); + return ads; + } +} diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java new file mode 100644 index 0000000000..17a66607ce --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -0,0 +1,84 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; +import com.codeup.adlister.util.Password; +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class MySQLAdsDao implements Ads { + private Connection connection = null; + + public MySQLAdsDao(Config config) { + try { + DriverManager.registerDriver(new Driver()); + connection = DriverManager.getConnection( + config.getUrl(), + config.getUser(), + config.getPassword() + ); + } catch (SQLException e) { + throw new RuntimeException("Error connecting to the database!", e); + } + } + + @Override + public List all() { + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement("SELECT * FROM ads"); + ResultSet rs = stmt.executeQuery(); + return createAdsFromResults(rs); + } catch (SQLException e) { + throw new RuntimeException("Error retrieving all ads.", e); + } + } + + @Override + public Long insert(Ad ad) { + try { + + String insertQuery = "INSERT INTO ads(user_id, title, description, img_url, gender, price, age) VALUES (?, ?, ?, ?, ?, ?, ?)"; + PreparedStatement stmt = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS); + stmt.setLong(1, ad.getUserId()); + stmt.setString(2, ad.getTitle()); + stmt.setString(3, ad.getDescription()); + stmt.setString(4, ad.getImg_url()); + stmt.setString(5, ad.getGender()); + stmt.setDouble(6, ad.getPrice()); + stmt.setInt(7, ad.getAge()); + + stmt.executeUpdate(); + ResultSet rs = stmt.getGeneratedKeys(); + + rs.next(); + return rs.getLong(1); + } catch (SQLException e) { + throw new RuntimeException("Error creating a new ad.", e); + } + } + + private Ad extractAd(ResultSet rs) throws SQLException { + return new Ad( + rs.getLong("id"), + rs.getLong("user_id"), + rs.getString("title"), + rs.getString("description"), + rs.getString("img_url"), + rs.getString("gender"), + rs.getDouble("price"), + rs.getInt("age") + ); + } + + private List createAdsFromResults(ResultSet rs) throws SQLException { + List ads = new ArrayList<>(); + while (rs.next()) { + ads.add(extractAd(rs)); + } + return ads; + } + +} diff --git a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java new file mode 100644 index 0000000000..4e69e57044 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -0,0 +1,66 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.User; +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; + +public class MySQLUsersDao implements Users { + private Connection connection; + + public MySQLUsersDao(Config config) { + try { + DriverManager.registerDriver(new Driver()); + connection = DriverManager.getConnection( + config.getUrl(), + config.getUser(), + config.getPassword() + ); + } catch (SQLException e) { + throw new RuntimeException("Error connecting to the database!", e); + } + } + + + @Override + public User findByUsername(String username) { + String query = "SELECT * FROM users WHERE username = ? LIMIT 1"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setString(1, username); + return extractUser(stmt.executeQuery()); + } catch (SQLException e) { + throw new RuntimeException("Error finding a user by username", e); + } + } + + @Override + public Long insert(User user) { + String query = "INSERT INTO users(username, email, password) VALUES (?, ?, ?)"; + try { + PreparedStatement stmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); + stmt.setString(1, user.getUsername()); + stmt.setString(2, user.getEmail()); + stmt.setString(3, user.getPassword()); + stmt.executeUpdate(); + ResultSet rs = stmt.getGeneratedKeys(); + rs.next(); + return rs.getLong(1); + } catch (SQLException e) { + throw new RuntimeException("Error creating new user", e); + } + } + + private User extractUser(ResultSet rs) throws SQLException { + if (! rs.next()) { + return null; + } + return new User( + rs.getLong("id"), + rs.getString("username"), + rs.getString("email"), + rs.getString("password") + ); + } + +} diff --git a/src/main/java/com/codeup/adlister/dao/Users.java b/src/main/java/com/codeup/adlister/dao/Users.java new file mode 100644 index 0000000000..c434147497 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Users.java @@ -0,0 +1,8 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.User; + +public interface Users { + User findByUsername(String username); + Long insert(User user); +} diff --git a/src/main/java/com/codeup/adlister/models/Ad.java b/src/main/java/com/codeup/adlister/models/Ad.java new file mode 100644 index 0000000000..bdc8b6c92d --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -0,0 +1,117 @@ +package com.codeup.adlister.models; + +public class Ad { + private long id; + private long userId; + private String title; + private String description; + private String img_url; + private String gender; + private double price; + private int age; + + + public Ad(long id, long userId, String title, String description) { + this.id = id; + this.userId = userId; + this.title = title; + this.description = description; + } + + public Ad(long userId, String title, String description) { + this.userId = userId; + this.title = title; + this.description = description; + } + + + // constructor with everything on it for extract DAO method + public Ad(long id, long userId, String title, String description, String img_url, String gender, double price, int age) + { + this.id = id; + this.userId = userId; + this.title = title; + this.description = description; + this.img_url = img_url; + this.gender = gender; + this.price = price; + this.age = age; + } + + // additional features constructor + public Ad(long userId, String title, String description, String img_url, String gender, double price, int age) + { + this.userId = userId; + this.title = title; + this.description = description; + this.img_url = img_url; + this.gender = gender; + this.price = price; + this.age = age; + } + + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getImg_url() { + return img_url; + } + + public void setImg_url(String img_url) { + this.img_url = img_url; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } +} diff --git a/src/main/java/com/codeup/adlister/models/User.java b/src/main/java/com/codeup/adlister/models/User.java new file mode 100644 index 0000000000..e43bc0dc81 --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/User.java @@ -0,0 +1,57 @@ +package com.codeup.adlister.models; + +import com.codeup.adlister.util.Password; + +public class User { + private long id; + private String username; + private String email; + private String password; + + public User() {} + + public User(String username, String email, String password) { + this.username = username; + this.email = email; + setPassword(password); + } + + public User(long id, String username, String email, String password) { + this.id = id; + this.username = username; + this.email = email; + this.password = password; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = Password.hash(password); + } +} diff --git a/src/main/java/com/codeup/adlister/util/Password.java b/src/main/java/com/codeup/adlister/util/Password.java new file mode 100644 index 0000000000..1ca33b20dd --- /dev/null +++ b/src/main/java/com/codeup/adlister/util/Password.java @@ -0,0 +1,15 @@ +package com.codeup.adlister.util; + +import org.mindrot.jbcrypt.BCrypt; + +public class Password { + private static final int ROUNDS = 12; + + public static String hash(String password) { + return BCrypt.hashpw(password, BCrypt.gensalt(ROUNDS)); + } + + public static boolean check(String password, String hash) { + return BCrypt.checkpw(password, hash); + } +} diff --git a/src/main/webapp/WEB-INF/ads/create.jsp b/src/main/webapp/WEB-INF/ads/create.jsp new file mode 100644 index 0000000000..da4194cd05 --- /dev/null +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -0,0 +1,45 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Create a new Ad

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/src/main/webapp/WEB-INF/ads/index.jsp b/src/main/webapp/WEB-INF/ads/index.jsp new file mode 100644 index 0000000000..4684b9863c --- /dev/null +++ b/src/main/webapp/WEB-INF/ads/index.jsp @@ -0,0 +1,38 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Adlister

+ + +
+

${ad.title}

+

${ad.description}

+
+
+
+
+ + + diff --git a/src/main/webapp/WEB-INF/editProfile.jsp b/src/main/webapp/WEB-INF/editProfile.jsp new file mode 100644 index 0000000000..bab6857d89 --- /dev/null +++ b/src/main/webapp/WEB-INF/editProfile.jsp @@ -0,0 +1,16 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Edit your profile below ${sessionScope.user.username}!

+
+ + + diff --git a/src/main/webapp/WEB-INF/login.jsp b/src/main/webapp/WEB-INF/login.jsp new file mode 100644 index 0000000000..8cf2a99a9b --- /dev/null +++ b/src/main/webapp/WEB-INF/login.jsp @@ -0,0 +1,28 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Please Log In

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

New user? Sign up!

+
+ + diff --git a/src/main/webapp/WEB-INF/logout.jsp b/src/main/webapp/WEB-INF/logout.jsp new file mode 100644 index 0000000000..7bb5cff87b --- /dev/null +++ b/src/main/webapp/WEB-INF/logout.jsp @@ -0,0 +1,28 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<% + request.getSession().removeAttribute("user"); + request.getSession().invalidate(); +%> + + + + + + + + + +
+

You have been logged out

+

Redirecting to login page

+ +
+ + diff --git a/src/main/webapp/WEB-INF/partials/head.jsp b/src/main/webapp/WEB-INF/partials/head.jsp new file mode 100644 index 0000000000..5bc6b167b5 --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/head.jsp @@ -0,0 +1,2 @@ +${param.title} + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/partials/navbar.jsp b/src/main/webapp/WEB-INF/partials/navbar.jsp new file mode 100644 index 0000000000..8cf38cf3e1 --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/navbar.jsp @@ -0,0 +1,12 @@ + diff --git a/src/main/webapp/WEB-INF/partials/style.jsp b/src/main/webapp/WEB-INF/partials/style.jsp new file mode 100644 index 0000000000..698f93e71f --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/style.jsp @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/partials/userNavbar.jsp b/src/main/webapp/WEB-INF/partials/userNavbar.jsp new file mode 100644 index 0000000000..3a5584b5c4 --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/userNavbar.jsp @@ -0,0 +1,12 @@ + diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp new file mode 100644 index 0000000000..3d1617cc3d --- /dev/null +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -0,0 +1,41 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + + + +
+ ... +
+

Welcome, ${sessionScope.user.username}!

+
+
    +
  • ${sessionScope.user.email}!

  • +
+ +
+ +<%--
--%> +<%--

Welcome, ${sessionScope.user.username}!

--%> +<%--
--%> + + + + + +<%--//TODO The profile page should display the username and email of the logged-in user and a list of links to all the ads a user has created in the AdLister.–%>--%> + +<%--//TODO When a user logs in the user should be redirected to their profile page.--%> +<%--done--%> + +<%--//TODO The profile view should only be accessible to users that are logged in.--%> +<%--done--%> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/register.jsp b/src/main/webapp/WEB-INF/register.jsp new file mode 100644 index 0000000000..422478d7e4 --- /dev/null +++ b/src/main/webapp/WEB-INF/register.jsp @@ -0,0 +1,34 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Please fill in your information.

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000000..1615c6e907 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,16 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Welcome to the Adlister!

+
+ +