/**
* Yobi, Project Hosting SW
*
* Copyright 2012 NAVER Corp.
* http://yobi.io
*
* @Author Hwi Ahn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package controllers;
import com.avaje.ebean.Page;
import info.schleichardt.play2.mailplugin.Mailer;
import models.*;
import models.enumeration.State;
import models.enumeration.UserState;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
import org.codehaus.jackson.node.ObjectNode;
import org.eclipse.jgit.api.errors.GitAPIException;
import play.Configuration;
import play.Logger;
import play.db.ebean.Transactional;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Http;
import play.mvc.Result;
import play.mvc.With;
import utils.Constants;
import utils.PasswordReset;
import utils.SiteManagerAuthAction;
import utils.ErrorViews;
import views.html.site.*;
import java.util.*;
import static play.libs.Json.toJson;
import utils.Config;
/**
* The Class SiteApp.
*/
@With(SiteManagerAuthAction.class)
public class SiteApp extends Controller {
private static final int PROJECT_COUNT_PER_PAGE = 25;
private static final int POSTING_COUNT_PER_PAGE = 30;
private static final int ISSUE_COUNT_PER_PAGE = 30;
/**
* @return the result
* @throws EmailException the email exception
* @see {@link SiteApp#writeMail(String, boolean)}
*/
public static Result sendMail() throws EmailException{
SimpleEmail email = new SimpleEmail();
Map<String, String[]> formData = request().body().asFormUrlEncoded();
email.setFrom(utils.HttpUtil.getFirstValueFromQuery(formData, "from"));
email.setSubject(utils.HttpUtil.getFirstValueFromQuery(formData, "subject"));
email.addTo(utils.HttpUtil.getFirstValueFromQuery(formData, "to"));
email.setMsg(utils.HttpUtil.getFirstValueFromQuery(formData, "body"));
email.setCharset("utf-8");
String errorMessage = null;
boolean sended;
String result = Mailer.send(email);
Logger.info(">>>" + result);
sended = true;
return writeMail(errorMessage, sended);
}
public static Result writeMail(String errorMessage, boolean sended) {
Configuration config = play.Play.application().configuration();
List<String> notConfiguredItems = new ArrayList<>();
String[] requiredItems = {"smtp.host", "smtp.user", "smtp.password"};
for(String key : requiredItems) {
if (config.getString(key) == null) {
notConfiguredItems.add(key);
}
}
String sender = utils.Config.getEmailFromSmtp();
return ok(mail.render("title.sendMail", notConfiguredItems, sender, errorMessage, sended));
}
public static Result massMail() {
return ok(massMail.render("title.massMail"));
}
/**
* @param pageNum pager number
* @param loginId loginId
* @return the result
* @see {@link User#findUsers(int, String)}
*/
public static Result userList(int pageNum, String query) {
String state = StringUtils.defaultIfBlank(request().getQueryString("state"), UserState.ACTIVE.name());
UserState userState = UserState.valueOf(state);
Page<User> users = User.findUsers(pageNum -1, query, userState);
return ok(userList.render("title.siteSetting", users, userState, query));
}
/**
* @param pageNum page number
* @return the result
*/
public static Result postList(int pageNum) {
Page<Posting> page = Posting.finder.order("createdDate DESC").findPagingList(POSTING_COUNT_PER_PAGE).getPage(pageNum - 1);
return ok(postList.render("title.siteSetting", page));
}
/**
* @param pageNum page number
* @return the result
*/
public static Result issueList(int pageNum) {
String state = StringUtils.defaultIfBlank(request().getQueryString("state"), State.OPEN.name());
State currentState = State.valueOf(state.toUpperCase());
Page<Issue> page = Issue.findIssuesByState(ISSUE_COUNT_PER_PAGE, pageNum - 1, currentState);
return ok(issueList.render("title.siteSetting", page, currentState));
}
/**
* @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));
}
/**
* @param projectName the project name
* @param pageNum page number
* @return the result
* @see {@link Project#findByName(String, int, int)}
*/
public static Result projectList(String projectName, int pageNum) {
Page<Project> projects = Project.findByName(projectName, PROJECT_COUNT_PER_PAGE, pageNum);
return ok(projectList.render("title.projectList", projects, projectName));
}
/**
* @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));
}
/**
* @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());
}
public static Result mailList() {
Set<String> emails = new HashSet<>();
Map<String, String[]> projects = request().body().asFormUrlEncoded();
if(!UserApp.currentUser().isSiteManager()) {
return forbidden(ErrorViews.Forbidden.render("error.auth.unauthorized.waringMessage"));
}
if (!request().accepts("application/json")) {
return status(Http.Status.NOT_ACCEPTABLE);
}
if (projects == null) {
return ok(toJson(new HashSet<String>()));
}
if (projects.containsKey("all")) {
if (projects.get("all")[0].equals("true")) {
for(User user : User.find.findList()) {
emails.add(user.email);
}
}
} else {
for(String[] projectNames : projects.values()) {
String projectName = projectNames[0];
String[] parts = projectName.split("/");
String owner = parts[0];
String name = parts[1];
Project project = Project.findByOwnerAndProjectName(owner, name);
for (ProjectUser projectUser : ProjectUser.findMemberListByProject(project.id)) {
Logger.debug(projectUser.user.email);
emails.add(projectUser.user.email);
}
}
}
return ok(toJson(emails));
}
/**
* Hide the notification for Yobi updates.
*/
public static Result unwatchUpdate() {
YobiUpdate.isWatched = false;
return ok();
}
/**
* Show the page to update Yobi.
*/
public static Result update() throws GitAPIException {
String currentVersion = null;
Exception exception = null;
try {
currentVersion = Config.getCurrentVersion();
YobiUpdate.refreshVersionToUpdate();
} catch (Exception e) {
exception = e;
}
return ok(update.render("title.siteSetting", currentVersion,
YobiUpdate.versionToUpdate, exception));
}
}