package com.gustz.dove.cli.api.service.util; import java.io.UnsupportedEncodingException; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URLDecoder; import java.nio.charset.Charset; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; import com.gustz.dove.cli.api.service.dict.EventTypeDict; import com.gustz.dove.cli.api.message.req.CommEventMsgReq; import com.gustz.dove.cli.api.service.BaseWebsUrl; import com.gustz.dove.cli.api.service.MessageHolder; /** * TODO: Client helper * * @author ZHENFENG ZHANG * @since [ Aug 7, 2015 ] */ public class CliAppHelper { private static Set<String> ignoreUriSet = new HashSet<String>(); // algorithm private static final String AES_ALGO_KEY = "AES"; // MD5 private static final String MD5_ALGO_KEY = "MD5"; // cipher algorithm private static final String CIPHER_ALGO = "AES/ECB/PKCS5Padding"; public static final Charset CHARSET = Charset.forName("utf-8"); public static final String TODAY_PATT = "yyyyMMdd010101"; private String msgReq; /** * Get local IP address * * @return 127.0.0.1,192.128.128.1,192.168.1.1 * @throws SocketException */ public static String[] getLocalIpAddrs() throws SocketException { List<String> _tmpList = new ArrayList<String>(); Enumeration<NetworkInterface> allNetInters = NetworkInterface.getNetworkInterfaces(); InetAddress ipAddr = null; NetworkInterface netInter = null; Enumeration<InetAddress> addrEnum = null; while (allNetInters.hasMoreElements()) { netInter = (NetworkInterface) allNetInters.nextElement(); addrEnum = netInter.getInetAddresses(); while (addrEnum.hasMoreElements()) { ipAddr = (InetAddress) addrEnum.nextElement(); if (ipAddr != null && (ipAddr instanceof Inet4Address || ipAddr instanceof Inet6Address)) { _tmpList.add(ipAddr.getHostAddress().trim()); } } } if (_tmpList != null && !_tmpList.isEmpty()) { String ips = _tmpList.toString(); ips = ips.replace("[", "").trim().replace("]", "").trim(); ips = ips.replace(" ", ""); return ips.split(","); } return null; } public static void setIgnoreUriSet(String ignoreUri) { if (ignoreUri != null && !ignoreUri.isEmpty()) { for (String uri : ignoreUri.split(",")) { if (uri != null && !uri.isEmpty()) { ignoreUriSet.add(uri); } } } } public static boolean isIgnoreUri(String uri) { for (String str : ignoreUriSet) { if (uri == null || uri.isEmpty()) { continue; } // 匹配URI后缀 1. if (uri.endsWith(str)) { return true; } // 匹配URI前缀 2. if (uri.startsWith(str)) { return true; } // 全部匹配URI 3. if (str.equals(uri)) { return true; } } return false; } public static void clsIgnoreUriSet() { if (ignoreUriSet != null) { ignoreUriSet.clear(); } } private static String decrypt(final String seed, String data) throws Exception { // get keyt MessageDigest _md5 = MessageDigest.getInstance(MD5_ALGO_KEY); _md5.update((seed).getBytes(CHARSET)); byte[] keyt = _md5.digest(); // Cipher cipher = Cipher.getInstance(CIPHER_ALGO); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyt, AES_ALGO_KEY)); // do decrypt byte[] _retVal = cipher.doFinal(DatatypeConverter.parseBase64Binary(data)); return new String(_retVal, CHARSET); } /** * Decrypt message * * @param data * @return decrypt data * @throws Exception */ public static String decryptMsg(String data) throws Exception { // return decrypt(("$" + new SimpleDateFormat(TODAY_PATT).format(new Date()) + "¥"), data); } /** * Is development mode * * @param remoteAddr * @return */ public static boolean isDevMode(final String remoteAddr) { return ("127.0.0.1".equals(remoteAddr) || "0:0:0:0:0:0:0:1".equals(remoteAddr)); } /** * Decode URL * * @param url * @return decode URL * @throws UnsupportedEncodingException */ public static String decodeUrl(final String url) throws UnsupportedEncodingException { // return URLDecoder.decode(url, CHARSET.name()); } /** * Get CP source id * * @param devAcCode * @return */ public static final String getCpSrcId(final String devAcCode) { return devAcCode.split("_")[0]; } /** * Get return message * * @param data * @param oauthCbUrl * @return * @throws Exception */ public String getReturnMsg(final String data, OauthCbUrl oauthCbUrl) throws Exception { setMessageReq(data, oauthCbUrl, new MessageHolder() { @Override public void setMessage(final String msg) { setMsgReq(msg); } }); // 获取用户帐号 return CommEventMsgReq.toBean(EventTypeDict.ENTER_AGENT, msgReq).getFromUserName(); } /** * Get message request * * @param data * @param oauthCbUrl * @param msgHolder * @return * @throws Exception */ public void setMessageReq(final String data, OauthCbUrl oauthCbUrl, MessageHolder msgHolder) throws Exception { // 接收报文和解密 final String[] _reqDatas = CliAppHelper.decryptMsg(URLDecoder.decode(data, CHARSET.name())).split( BaseWebsUrl.OAUTH_CBURL_KEY_EXT); // 获取用户推送的消息 1. msgHolder.setMessage(_reqDatas[0]); // 获取OAuth授权回调的URL 2. oauthCbUrl.setOauthCbUrl(_reqDatas[1]); } public interface OauthCbUrl { void setOauthCbUrl(String url); } public String getMsgReq() { return msgReq; } public void setMsgReq(String msgReq) { this.msgReq = msgReq; } }