From 6dc2e9c87288fb872a06a825a7c6c81306b5d23e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=94=80?= Date: Fri, 9 Sep 2016 16:19:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=9B=AE=E5=89=8D=E7=9A=84?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=9A=84=E8=AE=BA=E5=9D=9B=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将之前的使用shop的登录接口,改成设计器内实现登录,另外修改了之前的autoLogin操作,改成现在的直接登录 --- .../design/mainframe/bbs/UserInfoLabel.java | 1 + .../fr/design/mainframe/bbs/UserInfoPane.java | 11 +- .../src/com/fr/design/DesignerEnvManager.java | 10 + .../com/fr/design/extra/LoginWebBridge.java | 144 +++++--- .../com/fr/design/extra/QQLoginWebBridge.java | 3 + .../extra/exe/GetLoginInfoExecutor.java | 2 +- .../com/fr/design/extra/ucenter/Base64.java | 256 +++++++++++++ .../com/fr/design/extra/ucenter/Client.java | 335 ++++++++++++++++++ .../fr/design/extra/ucenter/PHPFunctions.java | 108 ++++++ .../fr/design/extra/ucenter/XMLHelper.java | 36 ++ 10 files changed, 843 insertions(+), 63 deletions(-) create mode 100644 designer_base/src/com/fr/design/extra/ucenter/Base64.java create mode 100644 designer_base/src/com/fr/design/extra/ucenter/Client.java create mode 100644 designer_base/src/com/fr/design/extra/ucenter/PHPFunctions.java create mode 100644 designer_base/src/com/fr/design/extra/ucenter/XMLHelper.java diff --git a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java index 197321ede7..54a2016eb1 100644 --- a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -117,6 +117,7 @@ public class UserInfoLabel extends UILabel{ DesignerEnvManager.getEnvManager().setBBSName(StringUtils.EMPTY); DesignerEnvManager.getEnvManager().setBBSPassword(StringUtils.EMPTY); DesignerEnvManager.getEnvManager().setInShowBBsName(StringUtils.EMPTY); + DesignerEnvManager.getEnvManager().setBbsUid(Integer.parseInt(StringUtils.EMPTY)); } private void updateInfoPane(){ diff --git a/designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java b/designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java index b73ac67179..b8a168baa0 100644 --- a/designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java +++ b/designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java @@ -14,6 +14,7 @@ import java.util.Date; import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; import com.fr.design.dialog.BasicPane; +import com.fr.design.extra.LoginWebBridge; import com.fr.design.mainframe.DesignerContext; import com.fr.general.DateUtils; import com.fr.general.FRLogger; @@ -33,6 +34,9 @@ public class UserInfoPane extends BasicPane{ private static final Color LOGIN_BACKGROUND = new Color(184, 220, 242); private static final int WIDTH = 104; private static final int HEIGHT = 24; + + //登录成功 + private static final String LOGININ = "0"; // 登录框弹出间隔时间 private static final int LOGIN_DIFF_DAY = 7; @@ -74,10 +78,11 @@ public class UserInfoPane extends BasicPane{ public void run() { String username = DesignerEnvManager.getEnvManager().getBBSName(); String password = DesignerEnvManager.getEnvManager().getBBSPassword(); - if(!BBSLoginDialog.login(username, password)){ - markUnSignIn(); - }else{ + String loginResult = LoginWebBridge.getHelper().login(username, password); + if (loginResult.equals(LOGININ)) { markSignIn(username); + }else { + markUnSignIn(); } } }); diff --git a/designer_base/src/com/fr/design/DesignerEnvManager.java b/designer_base/src/com/fr/design/DesignerEnvManager.java index e1e3465523..524f4f96c4 100644 --- a/designer_base/src/com/fr/design/DesignerEnvManager.java +++ b/designer_base/src/com/fr/design/DesignerEnvManager.java @@ -93,6 +93,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private String bbsName; //当前设计器用户的论坛密码 private String bbsPassword; + //当前设计器用户的论坛ID + private int bbsUid; //当前设计器用户的昵称显示(带消息) private String inShowBBsName; //上一次登录弹窗的时间, 为了控制一天只弹一次窗口 @@ -1151,6 +1153,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.bbsPassword = bbsPassword; } + public int getBbsUid() { + return bbsUid; + } + + public void setBbsUid(int bbsUid) { + this.bbsUid = bbsUid; + } + public void setInShowBBsName(String inShowBBsName) { this.inShowBBsName = inShowBBsName; } diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index d98315151e..e209481283 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -3,9 +3,10 @@ package com.fr.design.extra; import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; import com.fr.design.dialog.UIDialog; +import com.fr.design.extra.ucenter.Client; +import com.fr.design.extra.ucenter.XMLHelper; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.DesignerContext; -import com.fr.general.FRLogger; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; import com.fr.json.JSONObject; @@ -14,12 +15,12 @@ import com.fr.stable.StringUtils; import javafx.scene.web.WebEngine; import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; import java.net.URI; import javax.swing.*; import java.awt.*; import java.net.URLEncoder; import java.util.HashMap; +import java.util.LinkedList; public class LoginWebBridge { @@ -29,18 +30,22 @@ public class LoginWebBridge { private static final String SUCCESS_MESSAGE_STATUS = "ok"; //数据通讯失败 private static final String FAILED_MESSAGE_STATUS = "error"; - //消息条数 private int messageCount; - //最低消息的条数 private static final int MIN_MESSAGE_COUNT = 0; - - private static final String LOGIN_SUCCESS_FLAG = "http://bbs.finereport.com"; + //登录成功 private static final String LOGININ = "0"; - private static final String LOGIN_INFO_EMPTY = "-1"; - private static final String DISCONNECTED = "-2"; - private static final String LOGININFO_ERROR = "-3"; + //用户名不存在 + private static final String USERNAME_NOT_EXSIT = "-1"; + //密码错误 + private static final String PASSWORD_ERROR = "-2"; + //未知错误 + private static final String UNKNOWN_ERROR = "-3"; + //网络连接失败 + private static final String NET_FAILED = "-4"; + //用户名,密码为空 + private static final String LOGIN_INFO_EMPTY = "-5"; private static final int TIME_OUT = 10000; private static com.fr.design.extra.LoginWebBridge helper; @@ -52,6 +57,10 @@ public class LoginWebBridge { return messageCount; } + /** + * 测试论坛网络连接 + * @return + */ private boolean testConnection() { HttpClient client = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("bbs.test")); return client.isServerAlive(); @@ -94,6 +103,11 @@ public class LoginWebBridge { setUserName(username, uiLabel); } + /** + * 设置显示的用户名 + * @param userName 登录用户名 + * @param label label显示 + */ public void setUserName(String userName, UILabel label) { if (uiLabel == null) { this.uiLabel = label; @@ -101,24 +115,23 @@ public class LoginWebBridge { if(StringUtils.isEmpty(userName)){ return; } - if(!StringUtils.isEmpty(this.userName)){ updateMessageCount(); } - //往designerenvmanger里写一下 DesignerEnvManager.getEnvManager().setBBSName(userName); this.userName = userName; } + /** + * 定时取后台论坛消息 + */ private void updateMessageCount(){ //启动获取消息更新的线程 //登陆状态, 根据存起来的用户名密码, 每1分钟发起一次请求, 更新消息条数. Thread updateMessageThread = new Thread(new Runnable() { - @Override public void run() { sleep(CHECK_MESSAGE_TIME); - //从env中获取username, 因为如果注销的话, env的里username会被清空. while(StringUtils.isNotEmpty(DesignerEnvManager.getEnvManager().getBBSName())){ HashMap para = new HashMap(); para.put("username", encode(encode(userName))); @@ -145,6 +158,10 @@ public class LoginWebBridge { updateMessageThread.start(); } + /** + * 设置获取的消息长度,并设置显示 + * @param count + */ public void setMessageCount(int count) { if (count == MIN_MESSAGE_COUNT) { uiLabel.setText(DesignerEnvManager.getEnvManager().getBBSName()); @@ -199,45 +216,47 @@ public class LoginWebBridge { } /** - * 登录操作的回调 - * @param username - * @param password - * @return + * 设计器端的用户登录 + * @param username 用户名 + * @param password 密码 + * @return 登录信息标志 */ public String defaultLogin(String username, String password) { - if (!StringUtils.isNotBlank(username) && !StringUtils.isNotBlank(password)) { - return LOGIN_INFO_EMPTY; - } - if (!testConnection()) { - return DISCONNECTED; - } - if (login(username, password)) { - updateUserInfo(username, password); - loginSuccess(username); - setUserName(username, uiLabel); - return LOGININ; - }else { - return LOGININFO_ERROR; - } + return login(username, password, uiLabel); } - /* - 插件管理那边的登录 + /** + * 插件管理的用户登录部分 + * @param username 用户名 + * @param password 密码 + * @param uiLabel 设计器端的label + * @return 登录信息标志 */ public String pluginManageLogin(String username, String password, UILabel uiLabel) { + return login(username, password, uiLabel); + } + + /** + * 登录操作 + * @param username 用户名 + * @param password 密码 + * @param uiLabel 两边的label显示 + * @return 登录信息标志 + */ + private String login(String username, String password, UILabel uiLabel) { if (!StringUtils.isNotBlank(username) && !StringUtils.isNotBlank(password)) { return LOGIN_INFO_EMPTY; } if (!testConnection()) { - return DISCONNECTED; + return NET_FAILED; } - if (login(username, password)) { + String loginResult = login(username, password); + if (loginResult.equals(LOGININ)) { updateUserInfo(username, password); - uiLabel.setText(username); - return LOGININ; - }else { - return LOGININFO_ERROR; + loginSuccess(username); + setUserName(username, uiLabel); } + return loginResult; } /** @@ -251,6 +270,11 @@ public class LoginWebBridge { } } + /** + * 更新后台的用户信息 + * @param username 用户名 + * @param password 密码 + */ public void updateUserInfo(String username,String password) { DesignerEnvManager.getEnvManager().setBBSName(username); DesignerEnvManager.getEnvManager().setBBSPassword(password); @@ -285,28 +309,30 @@ public class LoginWebBridge { }); } - public boolean login(String username, String password) { - if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) { - try { - username = URLEncoder.encode(username, EncodeConstants.ENCODING_GBK); - password = URLEncoder.encode(password, EncodeConstants.ENCODING_GBK); - } catch (UnsupportedEncodingException e) { - FRLogger.getLogger().error(e.getMessage()); - } - String url = SiteCenter.getInstance().acquireUrlByKind("bbs.login") + "&username=" + username + "&password=" + password; - HttpClient client = new HttpClient(url); - client.setTimeout(TIME_OUT); - if (client.getResponseCodeNoException() == HttpURLConnection.HTTP_OK) { - try { - String res = client.getResponseText(EncodeConstants.ENCODING_GBK); - if (res.contains(LOGIN_SUCCESS_FLAG)) { - return true; - } - } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); + public String login(String username, String password) { + try { + Client uc = new Client(); + String result = uc.uc_user_login(username, password); + result = new String(result.getBytes("iso-8859-1"), "gbk"); + LinkedList list = XMLHelper.uc_unserialize(result); + if (list.size() > 0) { + int $uid = Integer.parseInt(list.get(0)); + if ($uid > 0) { + DesignerEnvManager.getEnvManager().setBbsUid($uid); + return LOGININ;//登录成功,0 + } else if ($uid == -1) { + return USERNAME_NOT_EXSIT;//用户名不存在,-1 + } else if ($uid == -2) { + return PASSWORD_ERROR;//密码错误,-2 + } else { + return UNKNOWN_ERROR;//未知错误,-3 } + }else { + return NET_FAILED; } + }catch (Exception e) { + FRContext.getLogger().info(e.getMessage()); } - return false; + return UNKNOWN_ERROR; } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/QQLoginWebBridge.java b/designer_base/src/com/fr/design/extra/QQLoginWebBridge.java index 1538e71c2c..a2826cd0dd 100644 --- a/designer_base/src/com/fr/design/extra/QQLoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/QQLoginWebBridge.java @@ -106,10 +106,13 @@ public class QQLoginWebBridge { String status = jo.get("status").toString(); if (status.equals(LOGINSUCCESS)) { String username = jo.get("username").toString(); + int uid = Integer.parseInt(jo.get("uid") == null ? "" : jo.get("uid").toString()); closeQQWindow(); closeParentWindow(); pluginuiLabel.setText(username); DesignerEnvManager.getEnvManager().setBBSName(username); + DesignerEnvManager.getEnvManager().setBbsUid(uid); + DesignerEnvManager.getEnvManager().setInShowBBsName(username); }else if (status.equals(LOGINFAILED)){ //账号没有QQ授权 closeQQWindow(); diff --git a/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java b/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java index 06a0646980..91402c47c7 100644 --- a/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/GetLoginInfoExecutor.java @@ -30,7 +30,7 @@ public class GetLoginInfoExecutor implements Executor { String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName(); if (StringUtils.isEmpty(username) && StringUtils.isEmpty(inShowUsername)) { }else { - result = inShowUsername; + result = StringUtils.isEmpty(inShowUsername) ? username : inShowUsername; } } } diff --git a/designer_base/src/com/fr/design/extra/ucenter/Base64.java b/designer_base/src/com/fr/design/extra/ucenter/Base64.java new file mode 100644 index 0000000000..199cc0bc8a --- /dev/null +++ b/designer_base/src/com/fr/design/extra/ucenter/Base64.java @@ -0,0 +1,256 @@ +package com.fr.design.extra.ucenter; + +import java.io.*; + +/** + * Created by lp on 2016/9/9. + */ +public class Base64 { + /** + * returns an array of base64-encoded characters to represent the + * passed data array. + * + * @param data the array of bytes to encode + * @return base64-coded character array. + */ + public static char[] encode(byte[] data) { + char[] out = new char[((data.length + 2) / 3) * 4]; + + // + // 3 bytes encode to 4 chars. Output is always an even + // multiple of 4 characters. + // + for (int i = 0, index = 0; i < data.length; i += 3, index += 4) { + boolean quad = false; + boolean trip = false; + + int val = (0xFF & data[i]); + val <<= 8; + if ((i + 1) < data.length) { + val |= (0xFF & data[i + 1]); + trip = true; + } + val <<= 8; + if ((i + 2) < data.length) { + val |= (0xFF & data[i + 2]); + quad = true; + } + out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)]; + val >>= 6; + out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)]; + val >>= 6; + out[index + 1] = alphabet[val & 0x3F]; + val >>= 6; + out[index + 0] = alphabet[val & 0x3F]; + } + return out; + } + + /** + * Decodes a BASE-64 encoded stream to recover the original + * data. White space before and after will be trimmed away, + * but no other manipulation of the input will be performed. + * + * As of version 1.2 this method will properly handle input + * containing junk characters (newlines and the like) rather + * than throwing an error. It does this by pre-parsing the + * input and generating from that a count of VALID input + * characters. + **/ + public static byte[] decode(char[] data) { + // as our input could contain non-BASE64 data (newlines, + // whitespace of any sort, whatever) we must first adjust + // our count of USABLE data so that... + // (a) we don't misallocate the output array, and + // (b) think that we miscalculated our data length + // just because of extraneous throw-away junk + + int tempLen = data.length; + for (int ix = 0; ix < data.length; ix++) { + if ((data[ix] > 255) || codes[data[ix]] < 0) + --tempLen; // ignore non-valid chars and padding + } + // calculate required length: + // -- 3 bytes for every 4 valid base64 chars + // -- plus 2 bytes if there are 3 extra base64 chars, + // or plus 1 byte if there are 2 extra. + + int len = (tempLen / 4) * 3; + if ((tempLen % 4) == 3) + len += 2; + if ((tempLen % 4) == 2) + len += 1; + + byte[] out = new byte[len]; + + + int shift = 0; // # of excess bits stored in accum + int accum = 0; // excess bits + int index = 0; + + // we now go through the entire array (NOT using the 'tempLen' value) + for (int ix = 0; ix < data.length; ix++) { + int value = (data[ix] > 255) ? -1 : codes[data[ix]]; + + if (value >= 0)// skip over non-code + { + accum <<= 6; // bits shift up by 6 each time thru + shift += 6; // loop, with new bits being put in + accum |= value; // at the bottom. + if (shift >= 8)// whenever there are 8 or more shifted in, + { + shift -= 8; // write them out (from the top, leaving any + out[index++] = // excess at the bottom for next iteration. + (byte) ((accum >> shift) & 0xff); + } + } + // we will also have skipped processing a padding null byte ('=') here; + // these are used ONLY for padding to an even length and do not legally + // occur as encoded data. for this reason we can ignore the fact that + // no index++ operation occurs in that special case: the out[] array is + // initialized to all-zero bytes to start with and that works to our + // advantage in this combination. + } + + // if there is STILL something wrong we just have to throw up now! + if (index != out.length) { + throw new Error("Miscalculated data length (wrote " + + index + " instead of " + out.length + ")"); + } + + return out; + } + + + // + // code characters for values 0..63 + // + private static char[] alphabet = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray(); + + // + // lookup table for converting base64 characters to value in range 0..63 + // + private static byte[] codes = new byte[256]; + + static { + for (int i = 0; i < 256; i++) + codes[i] = -1; + for (int i = 'A'; i <= 'Z'; i++) + codes[i] = (byte) (i - 'A'); + for (int i = 'a'; i <= 'z'; i++) + codes[i] = (byte) (26 + i - 'a'); + for (int i = '0'; i <= '9'; i++) + codes[i] = (byte) (52 + i - '0'); + codes['+'] = 62; + codes['/'] = 63; + } + + + + + /////////////////////////////////////////////////// + // remainder (main method and helper functions) is + // for testing purposes only, feel free to clip it. + /////////////////////////////////////////////////// + + public static void main(String[] args) { + boolean decode = false; + + if (args.length == 0) { + System.out.println("usage: java Base64 [-d[ecode]] filename"); + System.exit(0); + } + for (int i = 0; i < args.length; i++) { + if ("-decode".equalsIgnoreCase(args[i])) + decode = true; + else if ("-d".equalsIgnoreCase(args[i])) + decode = true; + } + + String filename = args[args.length - 1]; + File file = new File(filename); + if (!file.exists()) { + System.out.println("Error: file '" + filename + "' doesn't exist!"); + System.exit(0); + } + + if (decode) { + char[] encoded = readChars(file); + byte[] decoded = decode(encoded); + writeBytes(file, decoded); + } + else { + byte[] decoded = readBytes(file); + char[] encoded = encode(decoded); + writeChars(file, encoded); + } + } + + private static byte[] readBytes(File file) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + InputStream fis = new FileInputStream(file); + InputStream is = new BufferedInputStream(fis); + int count = 0; + byte[] buf = new byte[16384]; + while ((count = is.read(buf)) != -1) { + if (count > 0) + baos.write(buf, 0, count); + } + is.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + + return baos.toByteArray(); + } + + private static char[] readChars(File file) { + CharArrayWriter caw = new CharArrayWriter(); + try { + Reader fr = new FileReader(file); + Reader in = new BufferedReader(fr); + int count = 0; + char[] buf = new char[16384]; + while ((count = in.read(buf)) != -1) { + if (count > 0) + caw.write(buf, 0, count); + } + in.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + + return caw.toCharArray(); + } + + private static void writeBytes(File file, byte[] data) { + try { + OutputStream fos = new FileOutputStream(file); + OutputStream os = new BufferedOutputStream(fos); + os.write(data); + os.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + private static void writeChars(File file, char[] data) { + try { + Writer fos = new FileWriter(file); + Writer os = new BufferedWriter(fos); + os.write(data); + os.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + /////////////////////////////////////////////////// + // end of test code. + /////////////////////////////////////////////////// +} diff --git a/designer_base/src/com/fr/design/extra/ucenter/Client.java b/designer_base/src/com/fr/design/extra/ucenter/Client.java new file mode 100644 index 0000000000..1724881820 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/ucenter/Client.java @@ -0,0 +1,335 @@ +package com.fr.design.extra.ucenter; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by lp on 2016/9/9. + */ +public class Client extends PHPFunctions{ + + public static boolean IN_UC = true; + public static String UC_IP = "211.149.195.54"; + public static String UC_API = "http://bbs.fanruan.com/uc_server"; + public static String UC_CONNECT = ""; + public static String UC_KEY = "Rc85U37411p4zdvcedm8D4t4D3l9Sa42H0kd98Gbd82aA99a61S2Z5LbQ9u430M0"; + public static String UC_APPID = "4"; + public static String UC_CLIENT_VERSION = "1.0"; + public static String UC_CLIENT_RELEASE = "20090212"; + public static String UC_ROOT = ""; //note ûĿͻ˵ĸĿ?? UC_CLIENTROOT + public static String UC_DATADIR = UC_ROOT + "./data/"; //note ûĵݻĿ?? + public static String UC_DATAURL = "UC_API" + "/data"; //note ûĵ?? URL + public static String UC_API_FUNC = UC_CONNECT.equals("mysql") ? "uc_api_mysql" : "uc_api_post"; + public static String[] uc_controls = {}; + + protected String uc_serialize(String $arr, int $htmlon) { + return $arr; + } + + protected String uc_unserialize(String $s) { + return $s; + } + + protected String uc_addslashes(String $string, int $force, boolean $strip) { + return $string; + } + + protected String daddslashes(String $string, int $force) { + return uc_addslashes($string, $force, false); + } + + protected String uc_stripslashes(String $string) { + return $string; + } + + public String uc_api_post(String $module, String $action, Map $arg) { + StringBuffer $s = new StringBuffer(); + String $sep = ""; + for (String $k : $arg.keySet()) { + Object $v = $arg.get($k); + $k = urlencode($k); + + if ($v.getClass().isAssignableFrom(Map.class)) { + String $s2 = ""; + String $sep2 = ""; + for (String $k2 : ((Map) $v).keySet()) { + Object $v2 = ((Map) $v).get($k2); + $k2 = urlencode($k2); + $s2 += $sep2 + "{" + $k + "}[" + $k2 + "]=" + urlencode(uc_stripslashes(String.valueOf($v2))); + $sep2 = "&"; + } + $s.append($sep).append($s2); + } else { + $s.append($sep).append($k).append("=").append(urlencode(uc_stripslashes(String.valueOf($v)), "GBK")); + } + $sep = "&"; + } + String $postdata = uc_api_requestdata($module, $action, $s.toString(), ""); + return uc_fopen2(UC_API + "/index.php", 500000, $postdata, "", true, UC_IP, 20, true); + } + + protected String uc_api_requestdata(String $module, String $action, String $arg, String $extra) { + String $input = uc_api_input($arg); + String $post = "m=" + $module + "&a=" + $action + "&inajax=2&release=" + UC_CLIENT_RELEASE + "&input=" + $input + "&appid=" + UC_APPID + $extra; + return $post; + } + + protected String uc_api_url(String $module, String $action, String $arg, String $extra) { + String $url = UC_API + "/index.php?" + uc_api_requestdata($module, $action, $arg, $extra); + return $url; + } + + public String uc_api_input(String $data) { + String $s = urlencode(uc_authcode($data + "&agent=" + md5("") + "&time=" + time(), "ENCODE", UC_KEY), "GBK"); + return $s; + } + + public String uc_api_mysql(String $model, String $action, Map $args) { + if ($action.charAt(0) != '_') { + return null; + } else { + return ""; + } + } + + public String uc_authcode(String $string, String $operation) { + return uc_authcode($string, $operation, null); + } + + public String uc_authcode(String $string, String $operation, String $key) { + return uc_authcode($string, $operation, $key, 0); + } + + public String uc_authcode(String $string, String $operation, String $key, int $expiry) { + int $ckey_length = 4; + $key = md5($key != null ? $key : UC_KEY); + String $keya = md5(substr($key, 0, 16)); + String $keyb = md5(substr($key, 16, 16)); + String $keyc = $ckey_length > 0 ? ($operation.equals("DECODE") ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : ""; + + String $cryptkey = $keya + md5($keya + $keyc); + int $key_length = $cryptkey.length(); + + $string = $operation.equals("DECODE") ? base64_decode(substr($string, $ckey_length)) : sprintf("%010d", $expiry > 0 ? $expiry + time() : 0) + substr(md5($string + $keyb), 0, 16) + $string; + int $string_length = $string.length(); + + StringBuffer $result1 = new StringBuffer(); + + int[] $box = new int[256]; + for (int i = 0; i < 256; i++) { + $box[i] = i; + } + + int[] $rndkey = new int[256]; + for (int $i = 0; $i <= 255; $i++) { + $rndkey[$i] = (int) $cryptkey.charAt($i % $key_length); + } + + int $j = 0; + for (int $i = 0; $i < 256; $i++) { + $j = ($j + $box[$i] + $rndkey[$i]) % 256; + int $tmp = $box[$i]; + $box[$i] = $box[$j]; + $box[$j] = $tmp; + } + + $j = 0; + int $a = 0; + for (int $i = 0; $i < $string_length; $i++) { + $a = ($a + 1) % 256; + $j = ($j + $box[$a]) % 256; + int $tmp = $box[$a]; + $box[$a] = $box[$j]; + $box[$j] = $tmp; + $result1.append((char) (((int) $string.charAt($i)) ^ ($box[($box[$a] + $box[$j]) % 256]))); + } + if ($operation.equals("DECODE")) { + String $result = $result1.toString(); + try { + $result = new String($result.getBytes("iso-8859-1"), "gbk"); + } catch (Exception e) { + $result = $result1.substring(0, $result1.length()); + } + if ((Integer.parseInt(substr($result.toString(), 0, 10)) == 0 || Long.parseLong(substr($result.toString(), 0, 10)) - time() > 0) && substr($result.toString(), 10, 16).equals(substr(md5(substr($result.toString(), 26) + $keyb), 0, 16))) { + return substr($result.toString(), 26); + } else { + return ""; + } + } else { + return $keyc + base64_encode($result1.toString()).replaceAll("=", ""); + } + } + + protected String uc_fopen2(String $url, int $limit, String $post, String $cookie, boolean $bysocket, String $ip, int $timeout, boolean $block) { + $url += $url.indexOf("?") > 0 ? "&" : "?" + "__times__=1"; + return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block); + } + + protected String uc_fopen(String $url, int $limit, String $post, String $cookie, boolean $bysocket, String $ip, int $timeout, boolean $block) { + String $return = ""; + + URL $matches; + String $host = ""; + String $path = ""; + int $port = 80; + try { + $matches = new URL($url); + $host = $matches.getHost(); + $path = $matches.getPath() != null ? $matches.getPath() + ($matches.getQuery() != null ? "?" + $matches.getQuery() : "") : "/"; + if ($matches.getPort() > 0) $port = $matches.getPort(); + } catch (MalformedURLException e1) { + } + StringBuffer $out = new StringBuffer(); + if ($post != null && $post.length() > 0) { + $out.append("POST ").append($path).append(" HTTP/1.0\r\n"); + $out.append("Accept: */*\r\n"); + $out.append("Accept-Language: zh-cn\r\n"); + $out.append("Content-Type: application/x-www-form-urlencoded\r\n"); + $out.append("User-Agent: \r\n"); + $out.append("Host: ").append($host).append("\r\n"); + $out.append("Content-Length: ").append($post.length()).append("\r\n"); + $out.append("Connection: Close\r\n"); + $out.append("Cache-Control: no-cache\r\n"); + $out.append("Cookie: \r\n\r\n"); + $out.append($post); + } else { + $out.append("GET $path HTTP/1.0\r\n"); + $out.append("Accept: */*\r\n"); + $out.append("Accept-Language: zh-cn\r\n"); + $out.append("User-Agent: Java/1.5.0_01\r\n"); + $out.append("Host: $host\r\n"); + $out.append("Connection: Close\r\n"); + $out.append("Cookie: $cookie\r\n\r\n"); + } + try { + Socket $fp = new Socket($ip != null && $ip.length() > 10 ? $ip : $host, $port); + if (!$fp.isConnected()) { + return ""; + } else { + OutputStream os = $fp.getOutputStream(); + os.write($out.toString().getBytes()); + InputStream ins = $fp.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(ins, "iso-8859-1")); + while (true) { + String $header = reader.readLine(); + if ($header == null || $header.equals("") || $header == "\r\n" || $header == "\n") { + break; + } + } + while (true) { + String $data = reader.readLine(); + if ($data == null || $data.equals("")) { + break; + } else { + $return += $data; + } + } + $fp.close(); + } + } catch (IOException e) { + + } + return $return; + } + + public String uc_app_ls() { + String $return = call_user_func(UC_API_FUNC, "app", "ls", null); + return UC_CONNECT.equals("mysql") ? $return : uc_unserialize($return); + } + + public String uc_user_register(String $username, String $password, String $email) { + return uc_user_register($username, $password, $email, "", ""); + } + + public String uc_user_register(String $username, String $password, String $email, String $questionid, String $answer) { + Map args = new HashMap(); + args.put("username", $username); + args.put("password", $password); + args.put("email", $email); + args.put("questionid", $questionid); + args.put("answer", $answer); + return call_user_func(UC_API_FUNC, "user", "register", args); + } + + public String uc_user_login(String $username, String $password) { + return uc_user_login($username, $password, 0, 0); + } + + public String uc_user_login(String $username, String $password, int $isuid, int $checkques) { + return uc_user_login($username, $password, $isuid, $checkques, "", ""); + } + + /** + * ȡ¼Ϣ + * @param $username + * @param $password + * @param $isuid + * @param $checkques + * @param $questionid + * @param $answer + * @return + */ + public String uc_user_login(String $username, String $password, int $isuid, int $checkques, String $questionid, String $answer) { + Map args = new HashMap(); + args.put("username", $username); + args.put("password", $password); + args.put("isuid", $isuid); + args.put("checkques", $checkques); + args.put("questionid", $questionid); + args.put("answer", $answer); + String $return = call_user_func(UC_API_FUNC, "user", "login", args); + return UC_CONNECT.equals("mysql") ? $return : uc_unserialize($return); + } + + public String uc_user_synlogin(int $uid) { + Map args = new HashMap(); + args.put("uid", $uid); + String $return = uc_api_post("user", "synlogin", args); + return $return; + } + + public String uc_user_synlogout() { + String $return = uc_api_post("user", "synlogout", new HashMap()); + return $return; + } + + public String uc_get_user(String $username, int $isuid) { + Map args = new HashMap(); + args.put("username", $username); + args.put("isuid", $isuid); + String $return = call_user_func(UC_API_FUNC, "user", "get_user", args); + return UC_CONNECT.equals("mysql") ? $return : uc_unserialize($return); + } + + public String uc_user_edit(String $username, String $oldpw, String $newpw, String $email, int $ignoreoldpw, String $questionid, String $answer) { + Map args = new HashMap(); + args.put("username", $username); + args.put("oldpw", $oldpw); + args.put("newpw", $newpw); + args.put("email", $email); + args.put("ignoreoldpw", $ignoreoldpw); + args.put("questionid", $questionid); + args.put("answer", $answer); + return call_user_func(UC_API_FUNC, "user", "edit", args); + } + + public String uc_user_delete(String $uid) { + Map args = new HashMap(); + args.put("uid", $uid); + return call_user_func(UC_API_FUNC, "user", "delete", args); + } + + public String uc_user_deleteavatar(String $uid) { + Map args = new HashMap(); + args.put("uid", $uid); + return uc_api_post("user", "deleteavatar", args); + } +} diff --git a/designer_base/src/com/fr/design/extra/ucenter/PHPFunctions.java b/designer_base/src/com/fr/design/extra/ucenter/PHPFunctions.java new file mode 100644 index 0000000000..511fbd9b91 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/ucenter/PHPFunctions.java @@ -0,0 +1,108 @@ +package com.fr.design.extra.ucenter; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +/** + * Created by lp on 2016/9/9. + */ +public abstract class PHPFunctions { + protected String urlencode(String value){ + return URLEncoder.encode(value); + } + + protected String md5(String input){ + MessageDigest md; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + return byte2hex(md.digest(input.getBytes())); + } + + protected String md5(long input){ + return md5(String.valueOf(input)); + } + + protected String base64_decode(String input){ + try { + return new String(Base64.decode(input.toCharArray()),"iso-8859-1"); + } catch (Exception e) { + return e.getMessage(); + } + } + + protected String base64_encode(String input){ + try { + return new String(Base64.encode(input.getBytes("iso-8859-1"))); + } catch (Exception e) { + return e.getMessage(); + } + } + + protected String byte2hex(byte[] b) { + StringBuffer hs = new StringBuffer(); + String stmp = ""; + for (int n = 0; n < b.length; n++) { + stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); + if (stmp.length() == 1) + hs.append("0").append(stmp); + else + hs.append(stmp); + } + return hs.toString(); + } + + protected String substr(String input,int begin, int length){ + return input.substring(begin, begin+length); + } + + protected String substr(String input,int begin){ + if(begin>0){ + return input.substring(begin); + }else{ + return input.substring(input.length()+ begin); + } + } + + protected long microtime(){ + return System.currentTimeMillis(); + } + + protected long time(){ + return System.currentTimeMillis()/1000; + } + + protected String sprintf(String format, long input){ + String temp = "0000000000"+input; + return temp.substring(temp.length()-10); + } + + protected String call_user_func(String function, String model, String action, Map args){ + if("uc_api_mysql".equals(function)){ + return this.uc_api_mysql(model, action, args); + } + if("uc_api_post".equals(function)){ + return this.uc_api_post(model, action, args); + } + return ""; + } + + public abstract String uc_api_post(String $module, String $action, Map $arg ); + + public abstract String uc_api_mysql(String $model, String $action, Map $args); + + protected String urlencode(String value,String code){ + try { + return URLEncoder.encode(value,code); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return null; + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/ucenter/XMLHelper.java b/designer_base/src/com/fr/design/extra/ucenter/XMLHelper.java new file mode 100644 index 0000000000..09868af15b --- /dev/null +++ b/designer_base/src/com/fr/design/extra/ucenter/XMLHelper.java @@ -0,0 +1,36 @@ +package com.fr.design.extra.ucenter; + +import com.sun.org.apache.xerces.internal.parsers.DOMParser; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.IOException; +import java.io.StringReader; +import java.util.LinkedList; + +/** + * Created by lp on 2016/9/9. + */ +public class XMLHelper { + public static LinkedList uc_unserialize(String input){ + LinkedList result = new LinkedList(); + DOMParser parser = new DOMParser(); + try { + parser.parse(new InputSource(new StringReader(input))); + Document doc = parser.getDocument(); + NodeList nl = doc.getChildNodes().item(0).getChildNodes(); + int length = nl.getLength(); + for(int i=0;i