/* * Copyright (C) 2014 Divide.io * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.divide.shared.util; import io.divide.shared.transitory.Credentials; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.exceptions.EncryptionOperationNotPossibleException; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.logging.Logger; public class AuthTokenUtils { static Logger logger = Logger.getLogger(AuthTokenUtils.class.getName()); static long expirateIn = (1000 * 60 * 60 * 24); // 1 day public static String getNewToken(String key, Credentials credentials){ String uuid = UUID.randomUUID().toString(); Integer ownerId = credentials.getOwnerId(); // Long expireIn = (System.currentTimeMillis() + expirateIn ); Long expireIn = Long.MAX_VALUE; // 106,751,991,167 days if(ownerId == null) throw new InternalError("ownerId returned null for receating auth token"); String token = uuid + // "|" + someImportantProjectToken + "|" + ownerId + "|" + expireIn; // TODO grab this from credentials? return encrypt(token,key); } public static class AuthToken { public String userId; public Long expirationDate; public AuthToken(String key,String token) throws AuthenticationException { try { logger.info("En: " + token); token = decrypt(token, key); logger.info("De: " + token); String[] parts = token.split("(\\|)"); for (String s : parts){ logger.info("Part: " + s); } userId = parts[1]; expirationDate = Long.parseLong(parts[2]); } catch (EncryptionOperationNotPossibleException e){ e.printStackTrace(); throw new AuthenticationException("Failed to create AuthToken",e); } } public boolean isExpired(){ return expirationDate < System.currentTimeMillis(); } } private static Map<String,StandardPBEStringEncryptor> encryptors = new HashMap<String,StandardPBEStringEncryptor>(); private static StandardPBEStringEncryptor getEncryptor(String key){ StandardPBEStringEncryptor encryptor; if(encryptors.containsKey(key)) encryptor = encryptors.get(key); else { encryptor = new StandardPBEStringEncryptor(); encryptor.setPassword(key); } return encryptor; } private static String encrypt(String string, String key){ StandardPBEStringEncryptor encryptor = getEncryptor(key); String encrypted = encryptor.encrypt(string); return Base64.encode(encrypted); } private static String decrypt(String string, String key){ StandardPBEStringEncryptor encryptor = getEncryptor(key); String decoded = Base64.decode(string); return encryptor.decrypt(decoded); } public static class AuthenticationException extends Exception{ public AuthenticationException(String message, Exception e){ super(message,e); } } private static boolean isNorE(String s){ if(s == null) return false; if(s.length() == 0) return false; return true; } }