Skip to content
This repository has been archived by the owner on Dec 31, 2023. It is now read-only.

Commit

Permalink
Merge pull request #77 from hardingadonis/vuong_forgot_password
Browse files Browse the repository at this point in the history
Vương: Forgot password functionally
  • Loading branch information
GoldStarPro authored Dec 7, 2023
2 parents 8cd6d85 + 23ead1e commit 42a11d2
Show file tree
Hide file tree
Showing 12 changed files with 515 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package io.hardingadonis.miu.controller.web;

import io.hardingadonis.miu.model.*;
import io.hardingadonis.miu.services.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import org.json.simple.*;

@WebServlet(name = "ForgotChangePasswordServlet", urlPatterns = {"/forgot-change-password"})
public class ForgotChangePasswordServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");

HttpSession session = request.getSession();

User user = (User) session.getAttribute("user");

if (user != null) {
response.sendRedirect("home");
return;
}

request.getRequestDispatcher("/view/web/forgot-change-password.jsp").forward(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String email = request.getParameter("email");
String password = request.getParameter("password");

User user = Singleton.userDAO.get(email);

if (user != null) {
user.setHashedPassword(Hash.SHA256(password));
Singleton.userDAO.update(user);

JSONObject jsonResponse = new JSONObject();
jsonResponse.put("status", "success");
jsonResponse.put("message", "Change password successfully");

response.setContentType("application/json");
response.getWriter().write(jsonResponse.toString());

response.setStatus(HttpServletResponse.SC_OK);
}

} catch (NumberFormatException ex) {
System.err.println(ex.getMessage());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package io.hardingadonis.miu.controller.web;

import io.hardingadonis.miu.model.*;
import io.hardingadonis.miu.services.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;

@WebServlet(name = "ForgotPasswordServlet", urlPatterns = {"/forgot-password"})
public class ForgotPasswordServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");

HttpSession session = request.getSession();

User user = (User) session.getAttribute("user");

if (user != null) {
response.sendRedirect("home");
return;
}

String code = request.getParameter("code");

if ((code != null) && (code.equals((String) session.getAttribute("code")))) {
session.removeAttribute("code");
}

request.getRequestDispatcher("/view/web/forgot-password.jsp").forward(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");

String email = request.getParameter("email");

User user = Singleton.userDAO.get(email);

if (user != null) {
String code = Hash.SHA256(email + System.currentTimeMillis());

Singleton.email.sendForgotPasswordEmail(user, code, request);

response.sendRedirect("forgot-password?sent=true");
return;
}

String errorMsg = "Tài khoản không tồn tại!";

request.setAttribute("errorMsg", errorMsg);

this.doGet(request, response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,20 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
if ((email == null) || (email.isEmpty())) {
String hashedStr = Hash.SHA256(email + System.currentTimeMillis());

session.setAttribute("hashed_str", hashedStr);
session.setAttribute("hashed_verify_str", hashedStr);

Singleton.email.sendVerifyEmail(user, hashedStr, request);

msg = "Bạn đã nhận được một email xác thực tài khoản. Vui lòng kiểm tra email!";
} else {
if (user.getEmail().equals(email)) {
String hashedStrParameter = request.getParameter("code");
String hashedStrSession = (String) session.getAttribute("hashed_str");
String hashedStrSession = (String) session.getAttribute("hashed_verify_str");

if ((hashedStrParameter != null) && (hashedStrSession != null) && (hashedStrParameter.equals(hashedStrSession))) {
user.setStatus(UserStatus.ACTIVATE);

session.setAttribute("hashed_str", null);
session.setAttribute("hashed_verify_str", null);

request.setAttribute("success", true);

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/io/hardingadonis/miu/services/Email.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ public interface Email {
public void sendWelcomeEmail(User user);

public void sendVerifyEmail(User user, String code, HttpServletRequest request);

public void sendForgotPasswordEmail(User user, String code, HttpServletRequest request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,29 @@ public void sendVerifyEmail(User user, String code, HttpServletRequest request)
}
}

@Override
public void sendForgotPasswordEmail(User user, String code, HttpServletRequest request) {
Session session = Session.getInstance(this.props, this.getAuthenticator());

try {
MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress(this.email));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(user.getEmail()));
message.setSubject("Miu Shop, quên mật khẩu!", "UTF-8");

String forgotPasswordLink = Server.getServerLink(request) + "forgot-change-password?email=" + user.getEmail() + "&code=" + code;

String msgStr = String.format("<html lang=\"vi\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><style>body{font-family:Arial,sans-serif;background-color:#f5f5f5;text-align:center;padding:20px}.container{max-width:600px;margin:0 auto;background-color:#fff;padding:30px;border-radius:8px;box-shadow:0 0 20px rgba(0,0,0,.1);text-align:justify;align-items:center}h1{color:#333;font-size:24px;margin-bottom:20px}p{color:#666;text-align:justify;line-height:1.6;margin-bottom:15px}.button{display:inline-block;padding:10px 20px;font-size:16px;text-align:center;text-decoration:none;color:#fff;background-color:#4caf50;border-radius:5px}</style></head><body><div class=\"container\"><h1>Miu Shop, Quên mật khẩu!</h1><p>Chào %s. Để tạo mật khẩu mới, vui lòng truy cập vào liên kết bên dưới:</p><a href=\"%s\" class=\"button\" target=\"_blank\">Quên mật khẩu</a></div></body></html>", user.getFullName(), forgotPasswordLink);

message.setContent(msgStr, "text/html; charset=UTF-8");

Transport.send(message);
} catch (MessagingException ex) {
System.err.println(ex.getMessage());
}
}

private Authenticator getAuthenticator() {
return new Authenticator() {
@Override
Expand Down
61 changes: 61 additions & 0 deletions src/main/webapp/assets/css/web/forgot-change-password.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
* {
font-family: 'Poppins', sans-serif;
}

body {
background-image: url('../../images/covers/d8c447f52ed8adc4ec394b0d1a0b7cda88dc9c90b6e3795796c90dd27267214b.jpg');
background-size: cover;
background-position: center center;
background-repeat: no-repeat;
background-attachment: fixed;
backdrop-filter: blur(5px);
}

.main {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}

.forgot-password-container {
width: 65%;
min-height: 400px;
border-radius: 5px;
background: #ffffff;
box-shadow: 5px 5px 10px 1px rgba(0, 0, 0, 0.2);
}

header {
font-weight: 700;
font-size: 25px;
text-align: center;
margin-bottom: 45px;
}

#submit-form {
align-items: center;
}

.submit {
margin: 0;
border: none;
outline: none;
height: 45px;
width: 50%;
background: #ececec;
border-radius: 5px;
transition: .2s;
}

.submit:hover {
background: rgba(33, 37, 41, 0.9);
color: #ffffff;
}

.toggle-password {
float: right;
cursor: pointer;
margin-right: 10px;
margin-top: -27px;
}
54 changes: 54 additions & 0 deletions src/main/webapp/assets/css/web/forgot-password.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
* {
font-family: 'Poppins', sans-serif;
}

body {
background-image: url('../../images/covers/d8c447f52ed8adc4ec394b0d1a0b7cda88dc9c90b6e3795796c90dd27267214b.jpg');
background-size: cover;
background-position: center center;
background-repeat: no-repeat;
background-attachment: fixed;
backdrop-filter: blur(5px);
}

.main {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}

.forgot-password-container {
width: 65%;
min-height: 400px;
border-radius: 5px;
background: #ffffff;
box-shadow: 5px 5px 10px 1px rgba(0, 0, 0, 0.2);
}

header {
font-weight: 700;
font-size: 25px;
text-align: center;
margin-bottom: 45px;
}

#submit-form {
align-items: center;
}

.submit {
margin: 0;
border: none;
outline: none;
height: 45px;
width: 50%;
background: #ececec;
border-radius: 5px;
transition: .2s;
}

.submit:hover {
background: rgba(33, 37, 41, 0.9);
color: #ffffff;
}
Loading

0 comments on commit 42a11d2

Please sign in to comment.