/** * 로그인 처리 시스템 설정에서 가입승인 기능이 활성화 되어 있고 사용자 상태가 잠금상태(미승인?)라면 계정이 잠겼다는 메시지를 노출하고 로그인 폼으로 돌아감 시스템 설정에서 * 가입승인 기능이 활성화 되어 있지 않다면, 사용자 상태가 잠금상태라도 로그인이 가능하다 (스펙확인 필요) 요청의 정보로 사용자 인증에 성공하면 로그인쿠키를 생성하고 * 로그인유지하기가 선택되었다면, 로그인유지를 위한 쿠키를 별도로 생성한다 인증에 실패하면 관련된 메시지를 노출하고 로그인 폼으로 돌아간다 * * @return */ public static Result login() { Form<User> userForm = form(User.class).bindFromRequest(); if (userForm.hasErrors()) { return badRequest(login.render("title.login", userForm)); } User sourceUser = form(User.class).bindFromRequest().get(); if (isUseSignUpConfirm()) { if (User.findByLoginId(sourceUser.loginId).state == UserState.LOCKED) { flash(Constants.WARNING, "user.locked"); return redirect(routes.UserApp.loginForm()); } } if (User.findByLoginId(sourceUser.loginId).state == UserState.DELETED) { flash(Constants.WARNING, "user.deleted"); return redirect(routes.UserApp.loginForm()); } User authenticate = authenticateWithPlainPassword(sourceUser.loginId, sourceUser.password); if (authenticate != null) { addUserInfoToSession(authenticate); if (sourceUser.rememberMe) { setupRememberMe(authenticate); } return redirect(routes.Application.index()); } flash(Constants.WARNING, "user.login.failed"); return redirect(routes.UserApp.loginForm()); }
/** * loginId 와 plain password 를 이용해서 사용자 인증 인증에 성공하면 DB 에서 조회된 사용자 정보를 리턴 인증에 실패하면 null 리턴 * * @param loginId 로그인ID * @param password 입력받은 비밀번호 * @return */ public static User authenticateWithPlainPassword(String loginId, String password) { User user = User.findByLoginId(loginId); if (user == User.anonymous) { return null; } return authenticate(user, hashedPassword(password, user.passwordSalt)); }
/** * 로그인 처리 시스템 설정에서 가입승인 기능이 활성화 되어 있고 사용자 상태가 잠금상태(미승인?)라면 계정이 잠겼다는 메시지를 노출하고 로그인 폼으로 돌아감 시스템 설정에서 * 가입승인 기능이 활성화 되어 있지 않다면, 사용자 상태가 잠금상태라도 로그인이 가능하다 (스펙확인 필요) 요청의 정보로 사용자 인증에 성공하면 로그인쿠키를 생성하고 * 로그인유지하기가 선택되었다면, 로그인유지를 위한 쿠키를 별도로 생성한다 인증에 실패하면 관련된 메시지를 노출하고 로그인 폼으로 돌아간다 * * @return */ public static Result login() { Form<User> userForm = form(User.class).bindFromRequest(); if (userForm.hasErrors()) { return badRequest(login.render("title.login", userForm, null)); } User sourceUser = form(User.class).bindFromRequest().get(); Map<String, String[]> params = request().body().asFormUrlEncoded(); String redirectUrl = HttpUtil.getFirstValueFromQuery(params, "redirectUrl"); String loginFormUrl = routes.UserApp.loginForm().absoluteURL(request()); loginFormUrl += "?redirectUrl=" + redirectUrl; if (isUseSignUpConfirm()) { if (User.findByLoginId(sourceUser.loginId).state == UserState.LOCKED) { flash(Constants.WARNING, "user.locked"); return redirect(loginFormUrl); } } if (User.findByLoginId(sourceUser.loginId).state == UserState.DELETED) { flash(Constants.WARNING, "user.deleted"); return redirect(loginFormUrl); } User authenticate = authenticateWithPlainPassword(sourceUser.loginId, sourceUser.password); if (authenticate != null) { addUserInfoToSession(authenticate); if (sourceUser.rememberMe) { setupRememberMe(authenticate); } authenticate.lang = play.mvc.Http.Context.current().lang().code(); authenticate.update(); if (StringUtils.isEmpty(redirectUrl)) { return redirect(routes.Application.index()); } else { return redirect(redirectUrl); } } flash(Constants.WARNING, "user.login.failed"); return redirect(routes.UserApp.loginForm()); }
/** * 프로젝트를 삭제한다. * * <p>when 관리자 페이지의 프로젝트 설정에서 프로젝트 삭제시 * * <p>세션 {@code loginId} 가 사이트 관리자인지 확인하고 관리자이면 해당 프로젝트를 삭제한다. 관리자가 아니면 경고메세지와 함께 프로젝트 설정 페이지로 * 리다이렉트 한다. * * @param projectId the project id * @return the result */ @Transactional public static Result deleteProject(Long projectId) { if (User.findByLoginId(session().get("loginId")).isSiteManager()) { Project.find.byId(projectId).delete(); } else { flash(Constants.WARNING, "error.auth.unauthorized.waringMessage"); } return redirect(routes.SiteApp.projectList(StringUtils.EMPTY, 0)); }
/* * 사용자 인증 * * 사용자 객체와 hash 값을 이용 */ private static User authenticate(String loginId, String password, boolean hashed) { User user = User.findByLoginId(loginId); if (user.isAnonymous()) { return user; } String hashedPassword = hashed ? password : hashedPassword(password, user.passwordSalt); if (StringUtils.equals(user.password, hashedPassword)) { return user; } return User.anonymous; }
/** * 계정을 장금 / 해제한다. * * <p>when 사용자 관리 페이지의 계정 장금/해제 * * <p>세션 {@code loginId} 가 사이트 관리자이고 삭제할 {@code loginId}가 {@code anonymous}가 아니면 계정 장금 또는 해제한후 사용자 * 관리페이지로 리다이렉트한다. 세션 {@code loginId} 가 사이트 관리자이고 삭제할 {@code loginId}가 익명사용자이면 경고메세지와 함께사용자 관리페이지로 * 리다이렉트한다. 세션 {@code loginId} 가 사이트 관리자가 아니면 경고메세지와 함께 Yobi 첫페이지로 리다이렉트한다. * * @param loginId the login id * @return the result */ public static Result toggleAccountLock(String loginId, String state, String query) { String stateParam = StringUtils.defaultIfBlank(state, UserState.ACTIVE.name()); UserState userState = UserState.valueOf(stateParam); if (User.findByLoginId(session().get("loginId")).isSiteManager()) { User targetUser = User.findByLoginId(loginId); if (targetUser.isAnonymous()) { flash(Constants.WARNING, "user.notExists.name"); return redirect(routes.SiteApp.userList(0, null)); } if (targetUser.state == UserState.ACTIVE) { targetUser.changeState(UserState.LOCKED); } else { targetUser.changeState(UserState.ACTIVE); } return ok( userList.render( "title.siteSetting", User.findUsers(0, query, userState), userState, query)); } flash(Constants.WARNING, "error.auth.unauthorized.waringMessage"); return redirect(routes.Application.index()); }
private static void buildIssueHistory( String userName, Project project, List<Issue> issues, List<History> histories) { for (Issue issue : issues) { History issueHistory = new History(); String authorName = issue.authorName; issueHistory.setWho(authorName); setUserPageUrl(issueHistory, User.findByLoginId(issue.authorLoginId)); issueHistory.setWhen(issue.createdDate); issueHistory.setWhere(project.name); issueHistory.setWhat("issue"); issueHistory.setShortTitle("#" + issue.number); issueHistory.setHow(issue.title); issueHistory.setUrl("/" + userName + "/" + project.name + "/issue/" + issue.number); histories.add(issueHistory); } }
private static void buildPostingHistory( String userName, Project project, List<Posting> postings, List<History> histories) { for (Posting posting : postings) { History postingHistory = new History(); String authorName = posting.authorName; postingHistory.setWho(authorName); setUserPageUrl(postingHistory, User.findByLoginId(posting.authorLoginId)); postingHistory.setWhen(posting.createdDate); postingHistory.setWhere(project.name); postingHistory.setWhat("post"); postingHistory.setShortTitle("#" + posting.number); postingHistory.setHow(posting.title); postingHistory.setUrl("/" + userName + "/" + project.name + "/post/" + posting.number); histories.add(postingHistory); } }
private static void buildPullRequestsHistory( String userName, Project project, List<PullRequest> pullRequests, List<History> histories) { for (PullRequest pull : pullRequests) { History pullHistory = new History(); User contributor = pull.contributor; pullHistory.setWho(contributor.loginId); setUserPageUrl(pullHistory, User.findByLoginId(contributor.loginId)); pullHistory.setWhen(pull.created); pullHistory.setWhere(project.name); pullHistory.setWhat("pullrequest"); pullHistory.setShortTitle("#" + pull.number); pullHistory.setHow(pull.title); pullHistory.setUrl("/" + userName + "/" + project.name + "/pullRequest/" + pull.number); histories.add(pullHistory); } }
/** * 사용자 또는 그룹 정보 조회 * * <p>{@code loginId}에 해당하는 그룹이 있을 때는 그룹을 보여주고 해당하는 그룹이 없을 경우에는 {@code loginId}에 해당하는 사용자 페이지를 * 보여준다. * * <p>when: 사용자 로그인 아이디나 아바타를 클릭할 때 사용한다. * * <p>{@code groups}에는 여러 그룹 이름이 콤마(,)를 기준으로 들어올 수 있으며, 각그룹에 해당하는 프로젝트 목록을 간추리고, 그 프로젝트 목록에 포함되는 * 이슈, 게시물, 풀리퀘, 마일스톤 데이터를 종합하고 최근 등록일 순으로 정렬하여 보여준다. * * @param loginId 로그인ID * @return */ public static Result userInfo(String loginId, String groups, int daysAgo, String selected) { Organization org = Organization.findByName(loginId); if (org != null) { return redirect(routes.OrganizationApp.organization(org.name)); } if (daysAgo == UNDEFINED) { Cookie cookie = request().cookie(DAYS_AGO_COOKIE); if (cookie != null) { daysAgo = Integer.parseInt(cookie.value()); } else { daysAgo = DAYS_AGO; response().setCookie(DAYS_AGO_COOKIE, daysAgo + ""); } } else { if (daysAgo < 0) { daysAgo = 1; } response().setCookie(DAYS_AGO_COOKIE, daysAgo + ""); } User user = User.findByLoginId(loginId); String[] groupNames = groups.trim().split(","); List<Posting> postings = new ArrayList<>(); List<Issue> issues = new ArrayList<>(); List<PullRequest> pullRequests = new ArrayList<>(); List<Milestone> milestones = new ArrayList<>(); List<Project> projects = collectProjects(loginId, user, groupNames); collectDatum(projects, postings, issues, pullRequests, milestones, daysAgo); sortDatum(postings, issues, pullRequests, milestones); sortByLastPushedDateAndName(projects); return ok( view.render( user, groupNames, projects, postings, issues, pullRequests, milestones, daysAgo, selected)); }
/** * 사용자를 삭제한다. * * <p>when 관리자 페이지 사용자 삭제시 * * @param userId the user id * @return the result * @see {@link Project#isOnlyManager(Long)} */ @Transactional public static Result deleteUser(Long userId) { if (User.findByLoginId(session().get("loginId")).isSiteManager()) { if (Project.isOnlyManager(userId)) { flash(Constants.WARNING, "site.userList.deleteAlert"); } else { User user = User.find.byId(userId); for (ProjectUser projectUser : user.projectUser) { projectUser.delete(); } user.changeState(UserState.DELETED); } } else { flash(Constants.WARNING, "error.auth.unauthorized.waringMessage"); } return redirect(routes.SiteApp.userList(1, null)); }
/** * loginId 와 hash 값을 이용해서 사용자 인증. 인증에 성공하면 DB 에서 조회된 사용자 정보를 리턴 인증에 실패하면 null 리턴 * * @param loginId 로그인ID * @param password hash된 비밀번호 * @return */ public static User authenticateWithHashedPassword(String loginId, String password) { User user = User.findByLoginId(loginId); return authenticate(user, password); }