/*
* Copyright (c) 2008-2016 Computer Network Information Center (CNIC), Chinese Academy of Sciences.
*
* This file is part of Duckling project.
*
* 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 cn.vlabs.umt.ui.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import cn.vlabs.umt.common.util.CommonUtils;
import cn.vlabs.umt.common.util.RequestUtil;
import cn.vlabs.umt.domain.RegistLog;
import cn.vlabs.umt.domain.UMTLog;
import cn.vlabs.umt.services.account.IAccountService;
import cn.vlabs.umt.services.account.ICoreMailClient;
import cn.vlabs.umt.services.account.IRegistLogDAO;
import cn.vlabs.umt.services.session.SessionUtils;
import cn.vlabs.umt.services.user.LoginService;
import cn.vlabs.umt.services.user.UserService;
import cn.vlabs.umt.services.user.bean.LoginInfo;
import cn.vlabs.umt.services.user.bean.LoginNameInfo;
import cn.vlabs.umt.services.user.bean.Token;
import cn.vlabs.umt.services.user.bean.User;
import cn.vlabs.umt.services.user.bean.UsernamePasswordCredential;
import cn.vlabs.umt.services.user.exception.InvalidUserNameException;
import cn.vlabs.umt.services.user.service.ITokenService;
import cn.vlabs.umt.services.user.service.IUserLoginNameService;
import cn.vlabs.umt.services.user.utils.ServiceFactory;
import cn.vlabs.umt.ui.ShowPageController;
import cn.vlabs.umt.ui.UMTContext;
import cn.vlabs.umt.validate.domain.ErrorMsgs;
import cn.vlabs.umt.validate.formValidator.impl.CreateEmailRequestFormValidator;
import cn.vlabs.umt.validate.formValidator.impl.CreateRequestFormValidator;
@Controller
@RequestMapping("/createRequest.do")
public class CreateRequestController {
@Autowired
private UserService userService;
@Autowired
private ITokenService tokenService;
@Autowired
private LoginService loginService;
@Autowired
private IAccountService logService;
@Autowired
private IRegistLogDAO registDAO;
@Autowired
private IUserLoginNameService loginNameService;
/**
* 验证用户是否存在,逻辑是先去数据库差,如果数据库米有,就去邮件系统查
* */
@RequestMapping(params="act=usercheck")
public void usercheck(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("application/json");
PrintWriter writer = response.getWriter();
int rtnCode=userService.isUsed(request.getParameter("username"));
if(!CommonUtils.isNull(request.getParameter("returnCode"))){
writer.print(rtnCode!=UserService.USER_NAME_UNUSED?UserService.USER_NAME_USED:UserService.USER_NAME_UNUSED);
}else{
writer.println(rtnCode==UserService.USER_NAME_UNUSED);
}
writer.flush();
writer.close();
}
/**
* 注册umt本地用户
* */
@RequestMapping(params="act=save")
public String save(HttpServletRequest request, HttpServletResponse response,@ModelAttribute CreateRequestForm rform){
ErrorMsgs msgs=new CreateRequestFormValidator(request).validateForm();
if(!msgs.isPass()){
request.setAttribute("form", rform);
return "/regist";
}
try {
User user = rform.getUser();
UserService us = userService;
if (us.getUserByUmtId(rform.getUsername()) == null) {
int uid=us.create(user,LoginNameInfo.STATUS_TEMP);
SessionUtils.setSessionVar(request, "createUser", user);
int loginNameId = loginNameService.getLoginNameId(uid, user.getCstnetId(), LoginNameInfo.LOGINNAME_TYPE_PRIMARY);
String webUrl = ServiceFactory.getWebUrl(request);
userService.sendActivateionLoginMailAndSecurity(new UMTContext(request).getLocale(), uid, rform.getUsername(),webUrl, loginNameId);
request.setAttribute("sendEmail", rform.getUsername());
request.setAttribute("title","temp.filter.regist.title");
LoginInfo info=loginService.loginAndReturnPasswordType(new UsernamePasswordCredential(rform.getUsername(),rform.getPassword()));
UMTContext.saveUser(request.getSession(), info);
logService.log(UMTLog.EVENT_TYPE_LOG_IN, uid,RequestUtil.getRemoteIP(request), RequestUtil.getBrowseType(request));
String showUrl="redirect:/show.do";
showUrl=RequestUtil.addParam(showUrl, "act", "showFilterActive");
showUrl=RequestUtil.addParam(showUrl, "oper","regist");
showUrl=RequestUtil.addParam(showUrl, "type", User.USER_TYPE_UMT);
showUrl=RequestUtil.addParam(showUrl, "sendEmail", rform.getUsername());
return showUrl;
} else {
request.setAttribute("message", "regist.user.exist");
return "/regist";
}
} catch (InvalidUserNameException e) {
request.setAttribute("message", "regist.username.format");
return "/regist";
}
}
private RegistLog getRegistLog(HttpServletRequest request,String userName){
RegistLog log=new RegistLog();
log.setIp(RequestUtil.getRemoteIP(request));
log.setOccureTime(new Date());
log.setUserAgent(request.getHeader("User-Agent"));
log.setUserName(userName);
return log;
}
/**
* 去注册邮箱账号
* @throws IOException
* */
@RequestMapping(params="act=saveToEmail")
public synchronized String saveToEmail(HttpServletRequest request, HttpServletResponse response,@ModelAttribute CreateRequestForm rform) throws IOException{
ErrorMsgs msgs=new CreateEmailRequestFormValidator(request).validateForm();
if(!msgs.isPass()){
request.setAttribute("form", rform);
return "/regist_email";
}
RegistLog log= getRegistLog(request,rform.getUsername());
if(!registDAO.canRegist(log.getIp())){
response.sendRedirect(ShowPageController.getMessageUrl(request, "today.regist.limit"));
return null;
}
String appName=request.getParameter("appName");
String loginUrl=request.getParameter("loginUrl");
request.setAttribute("loginURL", loginUrl);
request.setAttribute("appName", appName);
try {
User user = rform.getUser();
UserService us = userService;
ICoreMailClient client=ICoreMailClient.getInstance();
if (!client.isUserExt(user.getCstnetId())) {
boolean flag=client.createUser(user.getCstnetId(),user.getTrueName(),user.getPassword());
if(flag){
user.setType(User.USER_TYPE_CORE_MAIL);
user.setPassword(null);
int uid=us.create(user,LoginNameInfo.STATUS_ACTIVE);
SessionUtils.setSessionVar(request, "createUser", user);
tokenService.createToken(uid,Token.OPERATION_ACTIVATION_PRIMARY_EMAIL, user.getUmtId(),null,Token.STATUS_USED);
if(!CommonUtils.isNull(rform.getTempSecurityEmail())){
userService.sendActivicationSecurityMail(new UMTContext(request).getLocale(), user.getId(), rform.getTempSecurityEmail(), ServiceFactory.getWebUrl(request));
}
LoginInfo info=loginService.loginAndReturnPasswordType(new UsernamePasswordCredential(client.formatEmail(rform.getUsername()),rform.getPassword()));
UMTContext.saveUser(request.getSession(), info);
logService.log(UMTLog.EVENT_TYPE_LOG_IN, uid,RequestUtil.getRemoteIP(request), RequestUtil.getBrowseType(request));
registDAO.log(log);
response.sendRedirect(RequestUtil.getContextPath(request));
return null;
}else{
response.sendRedirect(ShowPageController.getMessageUrl(request, "email.service.exception"));
return null;
}
} else {
request.setAttribute("message", "regist.user.exist");
return "/regist";
}
} catch (InvalidUserNameException e) {
request.setAttribute("message", "regist.username.format");
return "/regist";
}
}
}