/*
* 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.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
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.services.account.ICoreMailClient;
import cn.vlabs.umt.services.session.SessionUtils;
import cn.vlabs.umt.services.user.Credential;
import cn.vlabs.umt.services.user.LoginService;
import cn.vlabs.umt.services.user.UserService;
import cn.vlabs.umt.services.user.bean.BindInfo;
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.Attributes;
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.BindThirdPartyFormValidator;
import cn.vlabs.umt.validate.formValidator.impl.CreateRequestFormValidator;
/**
* 绑定微博与umt账户
* @author lvly
* @since 2013-2-1
*/
@Controller
@RequestMapping("/bind.do")
public class BindThirdPartyController{
private static final Logger LOGGER = Logger.getLogger(BindThirdPartyController.class);
@Autowired
private LoginService loginService;
@Autowired
private UserService userService;
@Autowired
private ITokenService tokenService;
@Autowired
private IUserLoginNameService loginNameService;
/**
* 创建coreMail账户并与umt进行关联
* @throws InvalidUserNameException
* @throws IOException
* */
@RequestMapping(params="act=createEmailAndBindUmt")
public String createEmailAndBindUmt(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute CreateRequestForm rform) throws InvalidUserNameException, IOException{
String screenName=request.getParameter("screenName");
String openId=request.getParameter("openId");
String type=request.getParameter("type");
if(CommonUtils.isNull(screenName)||CommonUtils.isNull(openId)||CommonUtils.isNull(type)){
response.sendRedirect(ShowPageController.getMessageUrl(request, "common.data.un.equals"));
return null;
}
User user = rform.getUser();
if(BindInfo.TYPE_QQ.equals(type)){
User umtUser=SessionUtils.getUser(request);
userService.remove(new int[]{umtUser.getId()});
user.setUmtId(umtUser.getUmtId());
}
ICoreMailClient coreMailClient=ICoreMailClient.getInstance();
if (!coreMailClient.isUserExt(user.getCstnetId())) {
boolean flag=coreMailClient.createUser(user.getCstnetId(),user.getTrueName(),user.getPassword());
if(flag){
user.setType(User.USER_TYPE_CORE_MAIL);
user.setPassword(null);
int uid=userService.create(user,LoginNameInfo.STATUS_ACTIVE);
SessionUtils.setSessionVar(request, "createUser", user);
tokenService.createToken(uid,Token.OPERATION_ACTIVATION_PRIMARY_EMAIL, user.getUmtId(),null,Token.STATUS_USED);
userService.bindThirdParty(new BindInfo(uid,screenName,openId,type,SessionUtils.getSessionVar(request,Attributes.THIRDPARTY_URL )));
if(!CommonUtils.isNull(rform.getTempSecurityEmail())){
userService.sendActivicationSecurityMail(new UMTContext(request).getLocale(), user.getId(), rform.getTempSecurityEmail(), ServiceFactory.getWebUrl(request));
}
request.setAttribute("sendEmail", rform.getTempSecurityEmail());
return "redirect:/login?type="+type+"&act=Validate&authBy="+type+getSiteInfoParam(request);
}else{
response.sendRedirect(ShowPageController.getMessageUrl(request, "email.service.exception"));
return null;
}
} else {
request.setAttribute("message", "regist.user.exist");
return "/accountBind_createCoreMail";
}
}
/**
* 创建umt账户并与umt进行关联
* */
@RequestMapping(params="act=createAndBindUmt")
public String createAndBindUmt(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute CreateRequestForm rform) throws IOException {
ErrorMsgs msgs=new CreateRequestFormValidator(request).validateForm();
if(!msgs.isPass()){
return "/accountBind_createUmt";
}
String screenName=request.getParameter("screenName");
String openId=request.getParameter("openId");
String type=request.getParameter("type");
try {
User user = rform.getUser();
int uid=userService.create(user,LoginNameInfo.STATUS_TEMP);
userService.bindThirdParty(new BindInfo(uid,screenName,openId,type,SessionUtils.getSessionVar(request,Attributes.THIRDPARTY_URL )));
int loginNameId = loginNameService.getLoginNameId(uid, user.getCstnetId(), LoginNameInfo.LOGINNAME_TYPE_PRIMARY);
userService.sendActivateionLoginMailAndSecurity(new UMTContext(request).getLocale(), uid, rform.getUsername(),ServiceFactory.getWebUrl(request), loginNameId);
response.sendRedirect(RequestUtil.getContextPath(request)+"/login?type="+type+"&act=Validate&authBy="+type+getSiteInfoParam(request));
return null;
} catch (InvalidUserNameException e) {
request.setAttribute("message", "regist.username.format");
return "/accountBind_createUmt";
}
}
/**
* 更新qq用户信息,是完善信息
* */
@RequestMapping(params="act=updateQQInfo")
public String updateQQInfo(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute CreateRequestForm rform) throws IOException {
String screenName=request.getParameter("screenName");
String openId=request.getParameter("openId");
String type=request.getParameter("type");
if(CommonUtils.isNull(screenName)||CommonUtils.isNull(openId)||CommonUtils.isNull(type)||!BindInfo.TYPE_QQ.equals(type)){
response.sendRedirect(ShowPageController.getMessageUrl(request, "common.data.un.equals"));
return null;
}
User formUser = rform.getUser();
User umtUser=userService.getUserByUid(SessionUtils.getUserId(request));
if(umtUser==null){
response.sendRedirect(RequestUtil.getContextPath(request)+"/");
return null;
}
if(!CommonUtils.isNull(formUser.getCstnetId())||userService.isUsed(formUser.getCstnetId())==UserService.USER_NAME_UNUSED){
userService.updateValueByColumn(umtUser.getId(), "cstnet_id", formUser.getCstnetId());
loginNameService.updateLoginName(umtUser.getId(), umtUser.getCstnetId(), formUser.getCstnetId());
userService.updateValueByColumn(umtUser.getId(), "type", User.USER_TYPE_UMT);
int loginNameId = loginNameService.getLoginNameId(umtUser.getId(), formUser.getCstnetId(), LoginNameInfo.LOGINNAME_TYPE_PRIMARY);
userService.sendActivateionLoginMailAndSecurity(new UMTContext(request).getLocale(), umtUser.getId(), rform.getUsername(),ServiceFactory.getWebUrl(request), loginNameId);
}
if(!CommonUtils.isNull(formUser.getTrueName())){
userService.updateValueByColumn(umtUser.getId(), "true_name", formUser.getTrueName());
}
if(!CommonUtils.isNull(formUser.getPassword())){
userService.updatePassword(umtUser.getId(),formUser.getPassword());
}
return "redirect:/login?type="+type+"&act=Validate&authBy="+type+getSiteInfoParam(request);
}
/**
* 创建umt账户并与umt进行关联,QQ比较隔路
* */
@RequestMapping(params="act=createAndBindQQUmt")
public String createAndBindQQUmt(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute CreateRequestForm rform) throws IOException {
String screenName=request.getParameter("screenName");
String openId=request.getParameter("openId");
String type=request.getParameter("type");
if(CommonUtils.isNull(screenName)||CommonUtils.isNull(openId)||CommonUtils.isNull(type)||!BindInfo.TYPE_QQ.equals(type)){
response.sendRedirect(ShowPageController.getMessageUrl(request, "common.data.un.equals"));
return null;
}
try {
User user = rform.getUser();
if(CommonUtils.isNull(user.getCstnetId())){
user.setCstnetId(BindInfo.LIKE_EMAIL);
user.setType(type);
}else{
if(userService.isUsed(user.getCstnetId())!=UserService.USER_NAME_UNUSED){
request.setAttribute("username_error", "regist.user.exist");
return "/accountBind_createUmt";
}
}
if(CommonUtils.isNull(user.getTrueName())){
user.setTrueName(screenName);
}
if(CommonUtils.isNull(user.getPassword())){
user.setPassword(new Random().nextInt(1000000)+"");
}
int uid=userService.create(user,LoginNameInfo.STATUS_TEMP);
userService.bindThirdParty(new BindInfo(uid,screenName,openId,type));
return "redirect:/login?type="+type+"&act=Validate&authBy="+type+getSiteInfoParam(request);
} catch (InvalidUserNameException e) {
request.setAttribute("message", "regist.username.format");
return "/accountBind_createUmt";
}
}
/**
* 创建umt账户并与umt进行关联
* */
@RequestMapping(params="act=createAndBindWeixinUmt")
public String createAndBindWeixinUmt(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute CreateRequestForm rform) throws IOException {
//String screenName=request.getParameter("screenName");
String openId=request.getParameter("openId");
String type=request.getParameter("type");
if(CommonUtils.isNull(openId)||CommonUtils.isNull(type)||!BindInfo.TYPE_WEIXIN.equals(type)){
response.sendRedirect(ShowPageController.getMessageUrl(request, "common.data.un.equals"));
return null;
}
try {
User user = rform.getUser();
if(CommonUtils.isNull(user.getCstnetId())){
user.setCstnetId(BindInfo.LIKE_EMAIL);
user.setType(type);
}else{
if(userService.isUsed(user.getCstnetId())!=UserService.USER_NAME_UNUSED){
request.setAttribute("username_error", "regist.user.exist");
return "/accountBind_createUmt";
}
}
/*if(CommonUtils.isNull(user.getTrueName())){
user.setTrueName(screenName);
}*/
if(CommonUtils.isNull(user.getPassword())){
user.setPassword(new Random().nextInt(1000000)+"");
}
int uid=userService.create(user,LoginNameInfo.STATUS_TEMP);
userService.bindThirdParty(new BindInfo(uid,"",openId,type));
return "redirect:/login?type="+type+"&act=Validate&authBy="+type+getSiteInfoParam(request);
} catch (InvalidUserNameException e) {
request.setAttribute("message", "regist.username.format");
return "/accountBind_weixin_umt";
}
}
/**
* 把第三方账户与umt进行绑定
* */
@RequestMapping(params="act=bindUmt")
public String bindUmt(HttpServletRequest request,
HttpServletResponse response,@ModelAttribute CreateRequestForm rform) throws IOException {
ErrorMsgs msgs=new BindThirdPartyFormValidator(request).validateForm();
String type=request.getParameter("type");
if(!msgs.isPass()){
if(BindInfo.TYPE_WEIXIN.equals(type)){
return "/accountBind_weixin_umt";
}
return "/accountBind_createUmt";
}
String loginName=request.getParameter("loginName");
String password=request.getParameter("loginPassword");
String screenName=request.getParameter("screenName");
String openId=request.getParameter("openId");
boolean result=checkUser(loginName,password,request);
//的确拥有该账户
if(result){
if(BindInfo.TYPE_QQ.equals(type)){
int oldUid=SessionUtils.getUserId(request);
userService.remove(new int[]{oldUid});
}
User user=userService.getUserByLoginName(loginName);
int uid=user.getId();
userService.bindThirdParty(new BindInfo(uid,screenName,openId,SessionUtils.getSessionVar(request,Attributes.THIRDPARTY_TYPE),SessionUtils.getSessionVar(request,Attributes.THIRDPARTY_URL )));
return "redirect:/login?type="+type+"&act=Validate&authBy="+type+getSiteInfoParam(request);
}
//账户名或者密码不存在
else{
request.setAttribute("hidden", false);
request.setAttribute("loginName_error","login.password.wrong");
if(BindInfo.TYPE_WEIXIN.equals(type)){
return "/accountBind_weixin_umt";
}
return "/accountBind_createUmt";
}
}
/**
* 判断用户名密码是否正确
* */
private boolean checkUser(String username,String password,HttpServletRequest request){
Credential credential = new UsernamePasswordCredential(username, password);
LoginInfo prins = loginService.loginAndReturnPasswordType(credential);
return prins.getUser()!=null;
}
private String getSiteInfoParam(HttpServletRequest request) throws UnsupportedEncodingException{
StringBuffer result=new StringBuffer();
Map<String,String> siteInfo=SessionUtils.getSiteInfo(request);
if(siteInfo!=null){
for (String param:Attributes.SSO_PARAMS){
if (siteInfo.get(param)!=null){
result.append("&").append(param).append("=").append(URLEncoder.encode(siteInfo.get(param),"utf-8"));
if(Attributes.RETURN_URL.equals(param)){
try {
if(StringUtils.endsWith(siteInfo.get(param), "?")){
result.append(URLEncoder.encode("&pageinfo=userinfo", "UTF-8"));
}else{
result.append(URLEncoder.encode("?pageinfo=userinfo", "UTF-8"));
}
}catch (UnsupportedEncodingException e){
LOGGER.error(e.getMessage(),e);
}
}
}
}
}
return result.toString();
}
}