Exemple #1
0
 /**
  * 토큰 정보를 이용해 생성한 사용자 객체를 {@link Http.Context#args} 에 저장한다. 생성된 사용자가 {@link User#anonymous} 가 아니고
  * 존재하는 세션 정보가 없다면 세션 정보를 생성한다.
  *
  * @see UserApp#getUserFromToken()
  */
 public static void initTokenUser() {
   User user = getUserFromToken();
   Http.Context.current().args.put(TOKEN_USER, user);
   if (!user.isAnonymous() && getUserFromSession().isAnonymous()) {
     addUserInfoToSession(user);
   }
 }
Exemple #2
0
  /**
   * 로그인 처리 시스템 설정에서 가입승인 기능이 활성화 되어 있고 사용자 상태가 잠금상태(미승인?)라면 계정이 잠겼다는 메시지를 노출하고 로그인 폼으로 돌아감 시스템 설정에서
   * 가입승인 기능이 활성화 되어 있지 않다면, 사용자 상태가 잠금상태라도 로그인이 가능하다 (스펙확인 필요) 요청의 정보로 사용자 인증에 성공하면 로그인쿠키를 생성하고
   * 로그인유지하기가 선택되었다면, 로그인유지를 위한 쿠키를 별도로 생성한다 인증에 실패하면 관련된 메시지를 노출하고 로그인 폼으로 돌아간다
   *
   * @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());
  }
Exemple #3
0
  /**
   * ajax 를 이용한 사용자 검색 요청 헤더의 accept 파라미터에 application/json 값이 없으면 406 응답 응답에 포함되는 데이터 수는
   * MAX_FETCH_USERS 로 제한된다 입력 파라미터 query 가 부분매칭 되는 loginId 목록을 json 형태로 응답
   *
   * @param query 검색어
   * @return
   */
  public static Result users(String query) {
    if (!request().accepts("application/json")) {
      return status(Http.Status.NOT_ACCEPTABLE);
    }

    ExpressionList<User> el = User.find.select("loginId, name").where().disjunction();
    el.icontains("loginId", query);
    el.icontains("name", query);
    el.endJunction();

    int total = el.findRowCount();
    if (total > MAX_FETCH_USERS) {
      el.setMaxRows(MAX_FETCH_USERS);
      response().setHeader("Content-Range", "items " + MAX_FETCH_USERS + "/" + total);
    }

    List<Map<String, String>> users = new ArrayList<>();
    for (User user : el.findList()) {
      StringBuilder sb = new StringBuilder();
      sb.append(String.format("<img class='mention_image' src='%s'>", user.avatarUrl()));
      sb.append(String.format("<b class='mention_name'>%s</b>", user.name));
      sb.append(String.format("<span class='mention_username'> @%s</span>", user.loginId));

      Map<String, String> userMap = new HashMap<>();
      userMap.put("info", sb.toString());
      userMap.put("loginId", user.loginId);
      users.add(userMap);
    }

    return ok(toJson(users));
  }
Exemple #4
0
 /**
  * 세션에 저장된 정보를 이용해서 사용자 객체를 생성한다. 세션에 저장된 정보가 없다면 토큰 정보를 이용해서 사용자 객체를 생성한다. 세션과 토큰 쿠키에 저장된 정보가 없다면
  * anonymous 객체가 리턴된다.
  *
  * @return
  */
 public static User currentUser() {
   User user = getUserFromSession();
   if (!user.isAnonymous()) {
     return user;
   }
   return getUserFromContext();
 }
  public static void saveUser(User user, String verifyPassword) {
    // input check
    validation.required(user.email);
    validation.email(user.email);
    validation.min(user.password, 6);
    if (validation.hasErrors()) {
      Logger.info("用户注册输入有错误");
      render("@register");
    }

    // 此邮件是否被注册过
    User userTemp = User.find("byEmailAndDeleted", user.email, false).first();
    if (userTemp != null) {
      flash.error("此邮件己被注册");
      render("@register");
    }

    user.uuid = UUIDUtil.generate();
    user.create();

    Logger.info("register" + user.activated);

    // 放致session中
    session.put("user", user.email);

    // 发送激活邮件
    Mails.activate(user);
    flash.success("己成功注册激活邮件至您邮件中:" + user.email);
    Passport.notactivate(user.email);
  }
Exemple #6
0
  /*
   * 사용자 가입 입력 폼 유효성 체크
   */
  private static void validate(Form<User> newUserForm) {
    // loginId가 빈 값이 들어오면 안된다.
    if (newUserForm.field("loginId").value().trim().isEmpty()) {
      newUserForm.reject("loginId", "user.wrongloginId.alert");
    }

    if (newUserForm.field("loginId").value().contains(" ")) {
      newUserForm.reject("loginId", "user.wrongloginId.alert");
    }

    // password가 빈 값이 들어오면 안된다.
    if (newUserForm.field("password").value().trim().isEmpty()) {
      newUserForm.reject("password", "user.wrongPassword.alert");
    }

    // 중복된 loginId로 가입할 수 없다.
    if (User.isLoginIdExist(newUserForm.field("loginId").value())) {
      newUserForm.reject("loginId", "user.loginId.duplicate");
    }

    // 중복된 email로 가입할 수 없다.
    if (User.isEmailExist(newUserForm.field("email").value())) {
      newUserForm.reject("email", "user.email.duplicate");
    }
  }
  public static void showUpcomingBirthdays(Long id) {
    User current = User.findById(id);

    Date today = new Date();
    int day = today.getDate();
    Date weekLater = new Date();
    weekLater.setDate(day + 7);

    Date almostWeekLater = new Date();
    almostWeekLater.setDate(day + 6);

    List<Relationship> friends = current.confirmedFriends();
    List<User> birthdayPeople = new ArrayList<User>();

    for (Relationship x : friends) {
      Date friendBirthday = x.to.getProfile().birthday;

      if (friendBirthday == null) // The user's friend did not set a birthday date field
      {
        // x.to.getProfile().birthday = almostWeekLater;
        // friendBirthday =  almostWeekLater;
        continue;
      }

      friendBirthday.setYear(today.getYear());
      if (friendBirthday.before(weekLater)) birthdayPeople.add(x.to);
    }

    render(birthdayPeople, today, weekLater, almostWeekLater, day);
  }
Exemple #8
0
 public static void update(String firstName, String lastName, String email) {
   User user = current();
   user.firstName = firstName;
   user.lastName = lastName;
   user.email = email;
   user.save();
   edit();
 }
Exemple #9
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;
 }
Exemple #10
0
  @Before
  static void setConnectedUser() {
    if (Security.isConnected()) {
      User user = User.find("byEmail", Security.connected()).first();

      if (user == null) {
        user = new User("*****@*****.**", "1234", "Andreas");
        user.save();
      }

      renderArgs.put("user", user.fullname);
    }
  }
Exemple #11
0
 /*
  * 신규 가입 사용자 생성
  */
 private static User createNewUser(User user) {
   RandomNumberGenerator rng = new SecureRandomNumberGenerator();
   user.passwordSalt = Arrays.toString(rng.nextBytes().getBytes());
   user.password = hashedPassword(user.password, user.passwordSalt);
   User.create(user);
   if (isUseSignUpConfirm()) {
     user.changeState(UserState.LOCKED);
   } else {
     user.changeState(UserState.ACTIVE);
   }
   Email.deleteOtherInvalidEmails(user.email);
   return user;
 }
  /**
   * Validates fields from the registration form and either creates a new user or communicates any
   * validation errors.
   */
  public static Result submit() {
    Form<User> filledForm = signupForm.bindFromRequest();

    // Check accept conditions
    if (!"true".equals(filledForm.field("accept").value())) {
      filledForm.reject("accept", "You must accept the terms and conditions");
    }

    // Check repeated password
    if (!filledForm.field("password").valueOr("").isEmpty()) {
      if (!filledForm
          .field("password")
          .valueOr("")
          .equals(filledForm.field("repeatPassword").value())) {
        filledForm.reject("repeatPassword", "Passwords do not match");
      }
    }

    // Check if the username and email are valid
    if (!filledForm.hasErrors()) {

      String un = filledForm.get().username;
      String email = filledForm.get().email;

      if (un.equals("admin") || un.equals("guest")) {
        filledForm.reject("username", "This username is already taken");
      }

      try {
        Logger.debug("Finding user " + email);
        User.findByEmail(email);
        filledForm.reject(
            "email", "There is already an account associated with this email address.");
      } catch (Exception e) {
        // continue - the user does not exist
      }
    }

    // Return validation results to user or save user
    if (filledForm.hasErrors()) {
      return badRequest(form.render(filledForm));
    } else {
      User user = filledForm.get(); /* create an object from a form */
      User svUser =
          new User(user.username, user.email, user.password); /* recreate to get save group info */
      svUser.save();
      return ok(summary.render(svUser));
    }
  }
Exemple #13
0
 /**
  * 토큰 정보를 이용해서 사용자 객체를 가져온다. 토큰 정보가 없거나 잘못된 정보라면 anonymous 객체를 반환한다. 잘못된 정보의 경우 토큰 정보를 삭제한다.
  *
  * @return
  */
 private static User getUserFromToken() {
   Cookie cookie = request().cookies().get(TOKEN);
   if (cookie == null) {
     return User.anonymous;
   }
   String[] subject = StringUtils.split(cookie.value(), TOKEN_SEPARATOR);
   if (ArrayUtils.getLength(subject) != TOKEN_LENGTH) {
     return invalidToken();
   }
   User user = authenticateWithHashedPassword(subject[0], subject[1]);
   if (user.isAnonymous()) {
     return invalidToken();
   }
   return user;
 }
Exemple #14
0
 public static void save(Long id, String title, String content, String tags) {
   Post post;
   if (id == null) {
     // Create post
     User author = User.find("byEmail", Security.connected()).first();
     post = new Post(author, title, content);
   } else {
     // Retrieve post
     post = Post.findById(id);
     // Edit
     post.title = title;
     post.content = content;
     post.tags.clear();
   }
   // Set tags list
   for (String tag : tags.split("\\s+")) {
     if (tag.trim().length() > 0) {
       post.tags.add(Tag.findOrCreateByName(tag));
     }
   }
   // Validate
   validation.valid(post);
   if (validation.hasErrors()) {
     render("@form", post);
   }
   // Save
   post.save();
   index();
 }
Exemple #15
0
  public static void activate(String uuid) {

    Logger.info("用户开始进行激活,uuid" + uuid);
    User user = User.find("uuid", uuid).first();
    Logger.info("start activate:" + user.activated + "id:" + user.id);
    if (user != null) {
      // 激活成功
      user.activated = true;
      user.save();
      Logger.info("user id:" + user.id);
      render("@activatesuccess");

    } else {
      Application.index();
    }
  }
Exemple #16
0
 @Before
 static void setConnectedUser() {
   if (Security.isConnected()) {
     User user = User.find("byEmail", Security.connected()).first();
     renderArgs.put("user", user.fullname);
   }
 }
Exemple #17
0
  /**
   * 이메일 삭제
   *
   * @param id
   * @return
   */
  @Transactional
  public static Result deleteEmail(Long id) {
    User currentUser = currentUser();
    Email email = Email.find.byId(id);

    if (currentUser == null || currentUser.isAnonymous() || email == null) {
      return forbidden(ErrorViews.NotFound.render());
    }

    if (!AccessControl.isAllowed(currentUser, email.user.asResource(), Operation.DELETE)) {
      return forbidden(ErrorViews.Forbidden.render(Messages.get("error.forbidden")));
    }

    email.delete();
    return redirect(routes.UserApp.editUserInfoForm());
  }
Exemple #18
0
 /**
  * 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));
 }
Exemple #19
0
 /*
  * 사용자 인증
  *
  * 사용자 객체와 hash 값을 이용
  */
 private static User authenticate(User user, String password) {
   if (!user.isAnonymous()) {
     if (user.password.equals(password)) {
       return user;
     }
   }
   return null;
 }
Exemple #20
0
  /**
   * 사용자 정보 수정
   *
   * @return
   */
  @With(AnonymousCheckAction.class)
  @Transactional
  public static Result editUserInfo() {
    Form<User> userForm = new Form<>(User.class).bindFromRequest("name", "email");
    String newEmail = userForm.data().get("email");
    String newName = userForm.data().get("name");
    User user = UserApp.currentUser();

    if (StringUtils.isEmpty(newEmail)) {
      userForm.reject("email", "user.wrongEmail.alert");
    } else {
      if (!StringUtils.equals(user.email, newEmail) && User.isEmailExist(newEmail)) {
        userForm.reject("email", "user.email.duplicate");
      }
    }

    if (userForm.error("email") != null) {
      flash(Constants.WARNING, userForm.error("email").message());
      return badRequest(edit.render(userForm, user));
    }
    user.email = newEmail;
    user.name = newName;

    try {
      Long avatarId = Long.valueOf(userForm.data().get("avatarId"));
      if (avatarId != null) {
        Attachment attachment = Attachment.find.byId(avatarId);
        String primary = attachment.mimeType.split("/")[0].toLowerCase();

        if (attachment.size > AVATAR_FILE_LIMIT_SIZE) {
          userForm.reject("avatarId", "user.avatar.fileSizeAlert");
        }

        if (primary.equals("image")) {
          Attachment.deleteAll(currentUser().avatarAsResource());
          attachment.moveTo(currentUser().avatarAsResource());
        }
      }
    } catch (NumberFormatException ignored) {
    }

    Email.deleteOtherInvalidEmails(user.email);
    user.update();
    return redirect(
        routes.UserApp.userInfo(user.loginId, DEFAULT_GROUP, DAYS_AGO, DEFAULT_SELECTED_TAB));
  }
Exemple #21
0
  /**
   * 로그인 처리 시스템 설정에서 가입승인 기능이 활성화 되어 있고 사용자 상태가 잠금상태(미승인?)라면 계정이 잠겼다는 메시지를 노출하고 로그인 폼으로 돌아감 시스템 설정에서
   * 가입승인 기능이 활성화 되어 있지 않다면, 사용자 상태가 잠금상태라도 로그인이 가능하다 (스펙확인 필요) 요청의 정보로 사용자 인증에 성공하면 로그인쿠키를 생성하고
   * 로그인유지하기가 선택되었다면, 로그인유지를 위한 쿠키를 별도로 생성한다 인증에 실패하면 관련된 메시지를 노출하고 로그인 폼으로 돌아간다
   *
   * @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());
  }
  public static void projects() {
    Long id = Long.parseLong(Session.current().get("user_id"));

    User u = User.findById(id);

    List<Project> projects = Project.find("owner = ?", u).fetch();

    render(projects);
  }
Exemple #23
0
  /**
   * 보조 이메일 확인 메일 보내기
   *
   * @param id
   * @return
   */
  @Transactional
  public static Result sendValidationEmail(Long id) {
    User currentUser = currentUser();
    Email email = Email.find.byId(id);

    if (currentUser == null || currentUser.isAnonymous() || email == null) {
      return forbidden(ErrorViews.NotFound.render());
    }

    if (!AccessControl.isAllowed(currentUser, email.user.asResource(), Operation.UPDATE)) {
      return forbidden(ErrorViews.Forbidden.render(Messages.get("error.forbidden")));
    }

    email.sendValidationEmail();

    flash(Constants.WARNING, "확인 메일을 전송했습니다.");
    return redirect(routes.UserApp.editUserInfoForm());
  }
Exemple #24
0
  /**
   * 현재 사용자가 선호하는 언어를 갱신한다.
   *
   * <p>쿠키나 Accept-Language HTTP 헤더에 선호하는 언어가 설정되어 있는 경우, 그것을 현재 로그인한 사용자가 선호하는 언어로 설정한다.
   */
  public static void updatePreferredLanguage() {
    Http.Request request = Http.Context.current().request();
    User user = UserApp.currentUser();

    if (user.isAnonymous()) {
      return;
    }

    if (request.acceptLanguages().isEmpty() && request.cookie(Play.langCookieName()) == null) {
      return;
    }

    String code = StringUtils.left(Http.Context.current().lang().code(), 255);

    if (!code.equals(user.lang)) {
      user.lang = code;
      user.update();
    }
  }
Exemple #25
0
  @Before
  static void header() {
    Journal journal = Journal.all().first();
    renderArgs.put("journal", journal);
    renderArgs.put("journalName", journal.name);
    renderArgs.put("journalDesc", journal.description);

    User currentUser = User.find("byEmail", Security.connected()).<User>first();
    renderArgs.put("currentUser", currentUser);
  }
Exemple #26
0
 @Before
 static void setConnectedUser() {
   if (Security.isConnected()) {
     User user = User.find("byUsername", Security.connected()).first();
     if (!user.isAdmin) {
       flash.error(Messages.get("UserIsNotAuthorized"));
       Application.index();
     }
   }
 }
Exemple #27
0
 @Check("login")
 public static void index() {
   User curUser = User.find("byName", Secure.Security.connected()).first();
   if (curUser.type == UserType.ADMINISTRATOR) {
     redirect("/admin/crud");
   } else if (curUser.type == UserType.STUDENT) {
     Student.index();
   } else {
     Teacher.index();
   }
 }
  public static void project(Long id) {
    Project project = Project.findById(id);

    Long UID = Long.parseLong(Session.current().get("user_id"));
    User u = User.findById(UID);

    if (project.canBeSeenBy(u)) {
      render(project);
    } else {
      projects();
    }
  }
  public static void ajaxEditDocument(Long documentId, String newTitle, String newContent) {
    Document document = Document.findById(documentId);
    document.changeSubject(newTitle);

    Config config = Config.getInstance();
    User currentUser = User.findById(config.getSingedInUserId());
    Version newVersion = new Version(currentUser, document, newContent).save();
    System.out.println("* A new version is successfully created.");

    document.addVersion(newVersion);
    document.save();
  }
Exemple #30
0
  /**
   * 대표 메일로 설정하기
   *
   * @param id
   * @return
   */
  @Transactional
  public static Result setAsMainEmail(Long id) {
    User currentUser = currentUser();
    Email email = Email.find.byId(id);

    if (currentUser == null || currentUser.isAnonymous() || email == null) {
      return forbidden(ErrorViews.NotFound.render());
    }

    if (!AccessControl.isAllowed(currentUser, email.user.asResource(), Operation.UPDATE)) {
      return forbidden(ErrorViews.Forbidden.render(Messages.get("error.forbidden")));
    }

    String oldMainEmail = currentUser.email;
    currentUser.email = email.email;
    currentUser.removeEmail(email);
    currentUser.update();

    Email newSubEmail = new Email();
    newSubEmail.valid = true;
    newSubEmail.email = oldMainEmail;
    newSubEmail.user = currentUser;
    currentUser.addEmail(newSubEmail);

    return redirect(routes.UserApp.editUserInfoForm());
  }