From 1f6f6f0cf69e4092715e4f1c769d403ecc5b22f4 Mon Sep 17 00:00:00 2001 From: RenFei Date: Wed, 23 Dec 2020 12:52:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=8E=9F=E4=BD=9C=E8=80=85?= =?UTF-8?q?=E7=9A=84Base64=E5=AE=9E=E7=8E=B0=E4=BD=BF=E7=94=A8Java8?= =?UTF-8?q?=E8=87=AA=E5=B8=A6=E5=BA=93=E5=AE=9E=E7=8E=B0=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../renfei/discuz/ucenter/client/Client.java | 19 +- .../discuz/ucenter/client/PHPFunctions.java | 183 +++++----- .../renfei/discuz/ucenter/util/Base64.java | 317 ------------------ src/test/java/Test.java | 10 +- 4 files changed, 111 insertions(+), 418 deletions(-) delete mode 100644 src/main/java/net/renfei/discuz/ucenter/util/Base64.java diff --git a/src/main/java/net/renfei/discuz/ucenter/client/Client.java b/src/main/java/net/renfei/discuz/ucenter/client/Client.java index c26f898..4cd3639 100644 --- a/src/main/java/net/renfei/discuz/ucenter/client/Client.java +++ b/src/main/java/net/renfei/discuz/ucenter/client/Client.java @@ -11,7 +11,6 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; -import java.util.Properties; /** * ================================================ @@ -395,7 +394,7 @@ protected String ucFopen(String url, int limit, String post, String cookie, bool } public String ucAppLs() { - String returnString = call_user_func(UC_API_FUNC, "app", "ls", null); + String returnString = callUserFunc(UC_API_FUNC, "app", "ls", null); return UC_CONNECT.equals("mysql") ? returnString : ucUnserialize(returnString); } @@ -414,8 +413,8 @@ public String ucAppLs() { * -6 : 该 email 已经被注册 * >1 : 表示成功,数值为 UID */ - public String uc_user_register(String username, String password, String email) { - return uc_user_register(username, password, email, "", ""); + public String ucUserRegister(String username, String password, String email) { + return ucUserRegister(username, password, email, "", ""); } /** @@ -435,14 +434,14 @@ public String uc_user_register(String username, String password, String email) { * -6 : 该 email 已经被注册 * >1 : 表示成功,数值为 UID */ - public String uc_user_register(String username, String password, String email, String questionid, String answer) { + public String ucUserRegister(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); + return callUserFunc(UC_API_FUNC, "user", "register", args); } /** @@ -500,7 +499,7 @@ public String ucUserLogin(String username, String password, int isuid, int check args.put("checkques", checkques); args.put("questionid", questionid); args.put("answer", answer); - String returnString = call_user_func(UC_API_FUNC, "user", "login", args); + String returnString = callUserFunc(UC_API_FUNC, "user", "login", args); return UC_CONNECT.equals("mysql") ? returnString : ucUnserialize(returnString); } @@ -538,7 +537,7 @@ public String ucGetUser(String username, int isuid) { Map args = new HashMap(); args.put("username", username); args.put("isuid", isuid); - String returnString = call_user_func(UC_API_FUNC, "user", "get_user", args); + String returnString = callUserFunc(UC_API_FUNC, "user", "get_user", args); return UC_CONNECT.equals("mysql") ? returnString : ucUnserialize(returnString); } @@ -571,7 +570,7 @@ public String ucUserEdit(String username, String oldpw, String newpw, String ema args.put("ignoreoldpw", ignoreoldpw); args.put("questionid", questionid); args.put("answer", answer); - return call_user_func(UC_API_FUNC, "user", "edit", args); + return callUserFunc(UC_API_FUNC, "user", "edit", args); } /** @@ -585,7 +584,7 @@ public String ucUserEdit(String username, String oldpw, String newpw, String ema public String ucUserDelete(String uid) { Map args = new HashMap(); args.put("uid", uid); - return call_user_func(UC_API_FUNC, "user", "delete", args); + return callUserFunc(UC_API_FUNC, "user", "delete", args); } /** diff --git a/src/main/java/net/renfei/discuz/ucenter/client/PHPFunctions.java b/src/main/java/net/renfei/discuz/ucenter/client/PHPFunctions.java index 94f6902..0812cae 100644 --- a/src/main/java/net/renfei/discuz/ucenter/client/PHPFunctions.java +++ b/src/main/java/net/renfei/discuz/ucenter/client/PHPFunctions.java @@ -2,17 +2,18 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.Base64; import java.util.Map; -import net.renfei.discuz.ucenter.util.Base64; /** * ================================================ * Discuz! Ucenter API for JAVA * ================================================ * 构造本接口运行所需要PHP的内置函数 - * + *

* 更多信息:http://code.google.com/p/discuz-ucenter-api-for-java * 原作者:梁平 (no_ten@163.com) * 创建时间:2009-2-20 @@ -21,89 +22,99 @@ * 修改时间:2020-12-17 */ public abstract class PHPFunctions { - //JAVA EXTRA METHOD - - protected String urlencode(String value) { - try { - return URLEncoder.encode(value,"UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return ""; - } - } - 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 base64Decode(String input){ - try { - return new String(Base64.decode(input.toCharArray()),"iso-8859-1"); - } catch (Exception e) { - return e.getMessage(); - } - } - - protected String base64Encode(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.ucApiMysql(model, action, args); - } - if("uc_api_post".equals(function)){ - return this.ucApiPost(model, action, args); - } - return ""; - } - - public abstract String ucApiPost(String module, String action, Map arg ); - - public abstract String ucApiMysql(String model, String action, Map args); + //JAVA EXTRA METHOD + + protected String urlencode(String value) { + try { + return URLEncoder.encode(value, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return ""; + } + } + + 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 base64Decode(String input) { + try { + return new String(Base64.getDecoder().decode(input), StandardCharsets.ISO_8859_1); + } catch (Exception e) { + return e.getMessage(); + } + } + + protected String base64Encode(String input) { + try { + return new String(Base64.getEncoder().encode(input.getBytes(StandardCharsets.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 callUserFunc(String function, String model, String action, Map args) { + if ("uc_api_mysql".equals(function)) { + return this.ucApiMysql(model, action, args); + } + if ("uc_api_post".equals(function)) { + return this.ucApiPost(model, action, args); + } + return ""; + } + + public abstract String ucApiPost(String module, String action, Map arg); + + public abstract String ucApiMysql(String model, String action, Map args); } diff --git a/src/main/java/net/renfei/discuz/ucenter/util/Base64.java b/src/main/java/net/renfei/discuz/ucenter/util/Base64.java deleted file mode 100644 index 1af5b5f..0000000 --- a/src/main/java/net/renfei/discuz/ucenter/util/Base64.java +++ /dev/null @@ -1,317 +0,0 @@ -/* ======================================================================== - * JCommon : a free general purpose class library for the Java(tm) platform - * ======================================================================== - * - * (C) Copyright 2000-2004, by Object Refinery Limited and Contributors. - * - * Project Info: http://www.jfree.org/jcommon/index.html - * - * This library is free software; you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Foundation; - * either version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with this - * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - * - * [Java is a trademark or registered trademark of Sun Microsystems, Inc. - * in the United States and other countries.] - * - * ------------------------------------- - * AbstractElementDefinitionHandler.java - * ------------------------------------- - * (C)opyright 2003, by Thomas Morgner and Contributors. - * - * Original Author: Kevin Kelley - - * 30718 Rd. 28, La Junta, CO, 81050 USA. // - * - * $Id: Base64.java,v 1.5 2004/01/01 23:59:29 mungady Exp $ - * - * Changes - * ------------------------- - * 23.09.2003 : Initial version - * - */ -package net.renfei.discuz.ucenter.util; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; -import java.io.CharArrayWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; - -/** - * Provides encoding of raw bytes to base64-encoded characters, and - * decoding of base64 characters to raw bytes. - * date: 06 August 1998 - * modified: 14 February 2000 - * modified: 22 September 2000 - * - * @author Kevin Kelley (kelley@ruralnet.net) - * @version 1.3 - */ -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. - /////////////////////////////////////////////////// - -} \ No newline at end of file diff --git a/src/test/java/Test.java b/src/test/java/Test.java index ef689e6..e7980f8 100644 --- a/src/test/java/Test.java +++ b/src/test/java/Test.java @@ -25,11 +25,11 @@ public class Test { * @param args */ public static void main(String[] args) { - Client uc = new Client("http://localhost/uc_server",null,"mykey","2",""); - testLogin(uc); + Client uc = new Client("http://localhost/uc_server",null,"123456","3",""); +// testLogin(uc); // synlogin(uc); -// String s = uc.ucAuthcode("8485m7QEfsvnOg9tKGvAsxlwXpAzZU6LhFA04pD6N0XIYG1cJVDh2Th83Qcci130UPHbXp+UNG0","DECODE"); -// System.out.println(s); + String s = uc.ucAuthcode("8485m7QEfsvnOg9tKGvAsxlwXpAzZU6LhFA04pD6N0XIYG1cJVDh2Th83Qcci130UPHbXp+UNG0","DECODE"); + System.out.println(s); } @@ -79,7 +79,7 @@ public static void testRegister(Client uc){ //setcookie('Example_auth', '', -86400); // 生成同步退出的代码 - String returns = uc.uc_user_register("cccc", "ccccc" ,"ccc@abc.com" ); + String returns = uc.ucUserRegister("cccc", "ccccc" ,"ccc@abc.com" ); int uid = Integer.parseInt(returns); if(uid <= 0) { if(uid == -1) {