package org.ripple.power.blockchain; import org.json.JSONObject; import org.ripple.power.CoinUtils; import org.ripple.power.config.LSystem; import org.ripple.power.txns.TransactionTx; import org.ripple.power.utils.Base64Coder; import org.ripple.power.utils.StringUtils; import org.ripple.power.wallet.OpenSSL; import com.ripple.core.coretypes.RippleDate; public class RippleMemoDecode { private String dataHash; private String typeHash; private String account; private String modeName; private String data; private String type; public long date = -1; public RippleMemoDecode(String account, JSONObject obj, long date, String password) { this.date = date; this.account = account; TransactionTx.Memo tx_memo = new TransactionTx.Memo(obj, date); if (tx_memo.memo_format != null) { modeName = convertBase64(tx_memo.memo_format); } this.typeHash = tx_memo.memo_type; this.dataHash = tx_memo.memo_data; if (tx_memo.memo_format == null || tx_memo.memo_data == null || tx_memo.memo_type == null) { modeName = "UNKOWN"; if (tx_memo.memo_data == null) { data = "UNKOWN"; } else { data = convertBase64(tx_memo.memo_data); } if (tx_memo.memo_type == null) { type = "UNKOWN"; } else { type = convertBase64(tx_memo.memo_type); } } else { switch (modeName) { case "UNKOWN": case "NONE": data = convertHash(tx_memo.memo_data); type = convertHash(tx_memo.memo_type); break; case "BASE64": data = convertBase64(tx_memo.memo_data); type = convertBase64(tx_memo.memo_type); break; case "ENCODE": if (password == null) { data = convertBase64(tx_memo.memo_data); type = convertBase64(tx_memo.memo_type); } else { data = convertEncode(tx_memo.memo_data, password); type = convertEncode(tx_memo.memo_type, password); } break; } } } private static String convertEncode(String res, String password) { byte[] result = CoinUtils.fromHex(res); if (Base64Coder.isArrayByteBase64(result)) { byte[] buffer = Base64Coder.decode(CoinUtils.fromHex(res)); try { buffer = new OpenSSL().decrypt(buffer, password); return new String(buffer, LSystem.encoding); } catch (Exception e) { return new String(buffer); } } else { try { return new String(result, LSystem.encoding); } catch (Exception e) { return new String(result); } } } private static String convertBase64(String res) { byte[] result = CoinUtils.fromHex(res); if (Base64Coder.isArrayByteBase64(result)) { byte[] buffer = Base64Coder.decode(CoinUtils.fromHex(res)); try { return new String(buffer, LSystem.encoding); } catch (Exception e) { return new String(buffer); } } else { try { return new String(result, LSystem.encoding); } catch (Exception e) { return new String(result); } } } private static String convertHash(String res) { byte[] result = CoinUtils.fromHex(res); try { return new String(result, LSystem.encoding); } catch (Exception e) { return new String(result); } } public long getDate() { return date; } public String getDataHash() { return dataHash; } public String getTypeHash() { return typeHash; } public String getAccount() { return account; } public String getModeName() { return modeName; } public String getData() { return data; } public String getType() { return type; } private String wrap(String res, int limit) { if (res.length() <= limit) { return res; } char[] chars = res.toCharArray(); StringBuilder sbr = new StringBuilder(); final int size = chars.length; for (int i = 0; i < size; i++) { sbr.append(chars[i]); if (i != 0 && i % limit == 0) { sbr.append("<br>"); } } return sbr.toString(); } public String toHTML() { StringBuilder sbr = new StringBuilder(); sbr.append("<font size=3 color=red>Account </font>"); sbr.append(account); sbr.append("<br>"); sbr.append("<font size=3 color=red>Date </font>"); sbr.append(RippleDate.fromSecondsSinceRippleEpoch(date).getTimeString()); sbr.append("<br>"); sbr.append("<font size=3 color=red>Type </font>"); sbr.append(type.toUpperCase()); sbr.append(" "); sbr.append("<font size=3 color=red>Mode </font>"); sbr.append(modeName.toUpperCase()); sbr.append("<br>"); sbr.append("<font size=3 color=red>Type Hash </font>"); sbr.append("<br>"); sbr.append(wrap(typeHash, 60)); sbr.append("<br>"); sbr.append("<font size=3 color=red>Data Hash </font>"); sbr.append("<br>"); sbr.append(wrap(dataHash, 60)); sbr.append("<br>"); sbr.append("<font size=4 color=orange>"); String html = data; html = StringUtils.replaceIgnoreCase(html, "\n", "<br>"); html = StringUtils.replaceIgnoreCase(html, "\r", "<br>"); sbr.append(html); sbr.append("</font>"); return sbr.toString(); } }