/** * Authentication * Copyright 24.05.2016 by Michael Peter Christen, @0rb1t3r * * 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 program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package org.loklak.server; import java.time.Instant; import org.json.JSONObject; import org.loklak.tools.storage.JsonTray; import javax.annotation.Nonnull; /** * Authentication asks: who is the user. This class holds user identification details */ public class Authentication { private JsonTray parent; private JSONObject json; private ClientCredential credential; /** * create a new authentication object. Creates a JSONObject or reads a from the parent. * The parent is used to enable persistency. * @param credential a ClientCredential for which the Authentication should created for * @param parent the storage object or null if there is no parent file (no persistency) */ public Authentication(@Nonnull ClientCredential credential, JsonTray parent) { if(parent != null){ if(parent.has(credential.toString())){ this.json = parent.getJSONObject(credential.toString()); } else{ this.json = new JSONObject(); parent.put(credential.toString(), this.json, credential.isPersistent()); } } else this.json = new JSONObject(); this.parent = parent; this.credential = credential; } /** * Associate a ClientIdentity with this Authentication * @param id the ClientIdentity to associate with * @return this authentication object */ public Authentication setIdentity(@Nonnull ClientIdentity id) { this.json.put("id", id.toString()); if (this.parent != null && this.credential.isPersistent()) this.parent.commit(); return this; } /** * Get the associated ClientIdentity * @return the ClientIdentity associated with this Authentication or null if none is set */ public ClientIdentity getIdentity() { if (this.json.has("id")) return new ClientIdentity(this.json.getString("id")); return null; } /** * Set an expire time. Useful for anonymous users and tokens * @param time seconds from now when the Authentication expires */ public void setExpireTime(long time){ this.json.put("expires_on", Instant.now().getEpochSecond() + time); if (this.parent != null && this.credential.isPersistent()) this.parent.commit(); } /** * Check if the authentication is still valid * @return true if the Authentication is still valid or does not have an expire time set. false otherwise */ public boolean checkExpireTime() { return !this.json.has("expires_on") || this.json.getLong("expires_on") > Instant.now().getEpochSecond(); } /** * Get a value from the internal JSONObject * @param key the key for the object * @return the value */ public Object get(String key){ return this.json.get(key); } /** * Get a String form the internal JSONObject * @param key the key for the object * @return the String */ public String getString(String key){ return this.json.getString(key); } /** * Get a String form the internal JSONObject. * @param key the key for the object * @param defVal a default value in case the key does not exist or is not a String * @return the value or, on error, the default value */ public String getString(String key, String defVal){ try { return getString(key); } catch (Throwable e){ return defVal; } } /** * Get a boolean form the internal JSONObject * @param key the key for the object * @return the boolean */ public boolean getBoolean(String key){ return this.json.getBoolean(key); } /** * Get a boolean form the internal JSONObject * @param key the key for the object * @param defVal a default value in case the key does not exist or is not a boolean * @return the boolean or, on error, the default value */ public boolean getBoolean(String key, boolean defVal){ try { return getBoolean(key); } catch (Throwable e){ return defVal; } } /** * Check the internal JSONObject for a key * @param key the key to be looked for * @return true if the key exists, false otherwise */ public boolean has(String key){ return this.json.has(key); } /** * Put data into the internal JSONObject * @param key the key * @param value the data */ public void put(String key, Object value){ this.json.put(key, value); if (this.parent != null && this.credential.isPersistent()) this.parent.commit(); } /** * Remove an object from the internal JSONObject * @param key the key of the object */ public void remove(String key){ this.json.remove(key); if (this.parent != null && this.credential.isPersistent()) this.parent.commit(); } /** * Delete the authentication. That is important if the Authentication turned out to invalid. * For example during login, if no ClientIdentity was associated with the given Credentials */ public void delete(){ this.parent.remove(this.credential.toString()); parent = null; } }