package org.qrone.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Externalizable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InvalidClassException;
import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import org.apache.commons.codec.binary.Base64;
import com.ibm.icu.text.CharsetDetector;
public class QrONEUtils{
public static String getString(InputStream in, String contentType) throws IOException{
return getString(Stream.read(in), contentType);
}
public static String getString(byte[] bytes, String contentType){
String encoding = null;
if(contentType != null){
int idx = contentType.indexOf("charset=");
if(idx >= 0){
encoding = contentType.substring(idx + "charset=".length());
}
}
CharsetDetector cd = new CharsetDetector();
return cd.getString(bytes, encoding);
}
private static int uniquekey = 0;
public static String uniqueid(){
return "qid" + (++uniquekey);
}
public static InputStream getResourceAsStream(String name, ServletContext c) throws IOException {
InputStream in;
if(c != null){
in = QrONEUtils.class.getClassLoader().getResourceAsStream("org/qrone/r7/resource/" + name);
if(in != null){
return in;
}
}
in = QrONEUtils.class.getClassLoader().getResourceAsStream("../r7/resource/" + name);
if(in != null){
return in;
}
in = new FileInputStream("src/org/qrone/r7/resource/" + name);
return in;
}
public static String getContent(File file, String x) throws IOException{
File s = new File(file, x);
if(s.exists()){
return new String(Stream.read(new FileInputStream(s)),"utf8");
}
return null;
}
public static String getResource(String name) throws IOException {
InputStream in = QrONEUtils.class.getResourceAsStream("resource/" + name);
if(in != null){
return new String(Stream.read(in),"utf8");
}
in = new FileInputStream("src/org/qrone/r7/resource/" + name);
return new String(Stream.read(in),"utf8");
}
public static byte[] base64_decode(String base64String){
return Base64.decodeBase64(base64String);
}
public static String base64_encode(byte[] binaryData){
return Base64.encodeBase64String(binaryData);
}
public static String base64_urlsafe_encode(byte[] binaryData){
return Base64.encodeBase64URLSafeString(binaryData);
}
public static String escape(String str){
if(str == null) return null;
StringBuffer b = new StringBuffer();
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
switch (ch[i]) {
case '\t':
case '\r':
case '\n':
case ' ':
b.append(' ');
break;
case '<':
b.append("<");
break;
case '>':
b.append(">");
break;
case '"':
b.append(""");
break;
case '&':
b.append("&");
break;
case '\u00A0':
b.append(" ");
break;
case '\0':
break;
default:
b.append(ch[i]);
break;
}
}
return b.toString();
}
public static String packEQ64(Externalizable object){
ByteArrayOutputStream out = new ByteArrayOutputStream();
Serialization.extenalize(object,out);
return base64_urlsafe_encode(out.toByteArray());
}
public static Object unpackEQ64(Class c, String packed){
ByteArrayInputStream in = new ByteArrayInputStream(base64_decode(packed));
return Serialization.unextenalize(c, in);
}
public static String packQ64(Object object){
ByteArrayOutputStream out = new ByteArrayOutputStream();
Serialization.serialize(object,out);
return base64_urlsafe_encode(out.toByteArray());
}
public static Object unpackQ64(String packed){
ByteArrayInputStream in = new ByteArrayInputStream(base64_decode(packed));
return Serialization.unserialize(in);
}
public static Cookie getCookie(Cookie[] cookies, String name){
if(cookies != null){
for (int i = 0; i < cookies.length; i++) {
if(cookies[i].getName().equals(name)){
return cookies[i];
}
}
}
return null;
}
public static Date now(){
return Calendar.getInstance(Locale.ENGLISH).getTime();
}
public static String toGMTString(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(
"E, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH );
return sdf.format(date);
}
public static byte[] generateKey(){
KeyGenerator keyGenerator;
try {
keyGenerator = KeyGenerator.getInstance("Blowfish");
keyGenerator.init(128);
return keyGenerator.generateKey().getEncoded();
} catch (NoSuchAlgorithmException e) {}
return null;
}
public static byte[] encrypt(byte[] data, byte[] key){
if(data == null) return null;
Cipher cipher;
try {
cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "Blowfish"));
return cipher.doFinal(data);
} catch (NoSuchAlgorithmException e) {
} catch (NoSuchPaddingException e) {
} catch (InvalidKeyException e) {
} catch (IllegalBlockSizeException e) {
} catch (BadPaddingException e) {
}
return null;
}
public static byte[] decrypt(byte[] data, byte[] key){
if(data == null) return null;
Cipher cipher;
try {
cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "Blowfish"));
return cipher.doFinal(data);
} catch (NoSuchAlgorithmException e) {
} catch (NoSuchPaddingException e) {
} catch (InvalidKeyException e) {
} catch (IllegalBlockSizeException e) {
} catch (BadPaddingException e) {
}
return null;
}
}