package io.loli.sc.server.action.social; import io.loli.sc.server.entity.Social; import io.loli.sc.server.entity.User; import io.loli.sc.server.service.social.SocialService; import io.loli.sc.server.social.parent.AuthInfo; import io.loli.sc.server.social.parent.UserInfo; import io.loli.sc.server.social.weibo.WeiboAuthManager; import io.loli.util.bean.Pair; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Named @RequestMapping(value = "social/weibo") public class WeiboSocialAction extends SocialAction { @Inject private SocialService ss; protected String type = Social.TYPE_WEIBO; public WeiboSocialAction() { // init init(); } @Override @RequestMapping(value = "redirect") public void redirect(HttpServletResponse response) { if (manager == null) { init(); } String url = manager.getAuthUrl(); if (StringUtils.isNotBlank(url)) { try { response.sendRedirect(url); } catch (IOException e) { logger.error("Failed to redirect:" + url + ", " + e); } } } @RequestMapping(value = "cancel") public String cancel(HttpSession session, RedirectAttributes redirectAttributes) { Object obj = session.getAttribute("user"); String accessToken = ""; if (obj != null) { User user = (User) obj; Social social = ss.findByUserIdAndType(user.getId(), this.getType()); accessToken = social.getAccessToken(); if (StringUtils.isNotBlank(accessToken) && manager.cancel(accessToken)) { ss.delete(social); redirectAttributes.addFlashAttribute("message", "解除绑定成功"); } else { redirectAttributes.addFlashAttribute("message", "操作失败"); } } else { redirectAttributes.addFlashAttribute("message", "操作失败"); } return "redirect:/user/edit"; } @Override @RequestMapping(value = "acceptCode") public String acceptCode(@RequestParam(value = "code", required = false) String code, HttpSession session, Model model, RedirectAttributes redirectAttributes) { if (code == null) { model.addAttribute("info", "登录失败"); return "/user/login"; } String type = getType(); if (session.getAttribute("user") == null) { Pair<String, Long> token = manager.getAccessToken(code); UserInfo info = manager.getUserInfo(token.getKey()); ss.save(null, info.getId(), token.getKey(), info.getUsername(), type, token.getValue()); Social social = ss.findByUserIdAndType(info.getId(), type); if (social != null) { session.setAttribute("user", social.getUser()); } return "index"; } else { Pair<String, Long> token = manager.getAccessToken(code); UserInfo info = manager.getUserInfo(token.getKey()); // 检查该Social是否已经存在 if (ss.checkExists(info.getId(), type)) { redirectAttributes.addFlashAttribute("message", "该社交帐号已经被使用了"); } else { ss.save((User) session.getAttribute("user"), info.getId(), token.getKey(), info.getUsername(), type, token.getValue()); Social social = ss.findByUserIdAndType(info.getId(), type); if (social != null) { session.setAttribute("user", social.getUser()); } redirectAttributes.addFlashAttribute("message", "绑定成功"); } return "redirect:/user/edit"; } } protected String getType() { return Social.TYPE_WEIBO; } @Override public void init() { InputStream in = this.getClass().getResourceAsStream("/social.properties"); Properties p = new Properties(); try { p.load(in); } catch (IOException e) { e.printStackTrace(); } String id = p.getProperty("weibo_id"); String secret = p.getProperty("weibo_key"); String callBack = p.getProperty("weibo_call"); if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(secret) && StringUtils.isNotBlank(callBack)) { manager = new WeiboAuthManager(new AuthInfo(id, secret, callBack)); } else { logger.error("Init failed: properties not complete"); } } }