Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Creative commons Attribution-NonCommercial license. http://creativecommons.org/licenses/by-nc/2.5/au/deed.en_GB NO WARRANTY IS GIVEN OR IMPLIED, USE AT YOUR OWN RISK.
  
  package base.jee.api.cassandra;
  
 
 import base.KeyValue;
 import base.Query;
 
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
 
 import base.json.Json;
 
 import static base.jee.api.cassandra.util.AddPerson.addPerson;
 import static base.jee.api.cassandra.util.CreateSession.createSession;
 import static base.jee.api.cassandra.util.IpLocation.ipLocation;
 import static base.jee.api.cassandra.util.IsThrottled.isThrottled;
 import static base.jee.api.cassandra.util.Log.log;
 import static base.jee.api.cassandra.util.MarkForThrottling.markForThrottling;
 import static base.jee.api.cassandra.util.UpdatePersonFromLdap.updatePersonFromLdap;

 
 public class Authenticate extends Query<KeyValue> {
 
 	private CassandraAPI api;
 	private String currentToken;
 	private String username;
 	private String password;
 	private String ip;
 
 	public Authenticate() {
 	}
 
 	public Authenticate(CassandraAPI apiString currentTokenString usernameString passwordString ip) {
 
 		if(api == null) {
 			throw new IllegalArgumentException("Invalid parameter: api");
 		}
 		if(username == null) {
 			throw new IllegalArgumentException("Invalid parameter: username");
 		}
 		if(password == null) {
 			throw new IllegalArgumentException("Invalid parameter: password");
 		}
 
 		if(currentToken != null && currentToken.trim().length() > .) {
 			throw new IllegalArgumentException("Invalid token.");
 		}
 		if(username.trim().length() > .) {
 			throw new IllegalArgumentException("Invalid username. Usernames should not have more than " + . + " characters.");
 		}
 		if(password.trim().length() > .) {
 			throw new IllegalArgumentException("Invalid password. Passwords should not have more than " + . + " characters.");
 		}
 		if(ip != null && ip.trim().length() > .) {
 			throw new IllegalArgumentException("Invalid IP address. IP address should not have more than " + . + " characters.");
 		}
 
 		this. = api;
 		this. = currentToken;
 		this. = username.trim().toLowerCase();
 		this. = password.trim();
 		this. = ip == null?null:ip.trim();
 	}
 
 		return new Authenticate(
 				(CassandraAPI)parameters.get("api"),
 				(String)parameters.get("current_token"),
 				(String)parameters.get("username"),
 				(String)parameters.get("password"),
 				((User)parameters.get("user")).getIp());
 	}
	public List<KeyValueexecute() throws IOException {
		List<KeyValueresults = new LinkedList<>();
		String token = null;
			results.add(new KeyValue("error""Invalid password."));
			return results;
		}
		try {
			Settings settings = .getSettingsCache();
			if(isThrottled(s"ip")) {
				log(s"SEVERE", User.userWithIp(), "Blocked authentication for throttled IP address: " + );
				results.add(new KeyValue("error""Sign-in from this IP address is temporarily disabled due to repated sign in failures. Please try again shortly."));
				return results;
			}
			if(isThrottled(s"auth")) {
				log(s"SEVERE", User.userWithIp(), "Blocked authentication for throttled username: " + );
				results.add(new KeyValue("error""Sign-in using this account is temporarily disabled due to repated sign in failures. Please try again shortly."));
				return results;
			}
			UUID personUuid = null;
			String firstName = null;
			String lastName = null;
			PreparedStatement p = s.prepare("select uuid, password, first_name, last_name from person where " + (.contains("@") ? "email" : "username") + "=?");
			for(Row r : s.execute(p.bind())) {
				personUuid = r.getUUID(0);
				firstName = r.getString(2);
				lastName = r.getString(3);
				// If password hash does not match password, we forget this search result,
				// this enables a lookup on LDAP (below).
				if(!Password.verifyPassword(r.getString(1), )) {
					personUuid = null;
				}
			}
			// Internal password check failed. Do LDAP lookup if this feature is configured to be enabled.
			if(personUuid == null) {
				boolean ldapEnabled = false;
				String ldapUrl = null;
				String ldapUserDn = null;
				if(!.contains("@")) {
					String e = settings.get("ldap.enabled""false");
					ldapEnabled = e.equalsIgnoreCase("true") || e.equalsIgnoreCase("y") || e.equalsIgnoreCase("yes");
					ldapUrl = settings.get("ldap.url");
					ldapUserDn = settings.get("ldap.userdn");
				}
				if(ldapEnabled) {
					String user = ldapUserDn.replace("{u}");
					Map<StringStringattributes;
					try {
						ldap = new LdapHelper(ldapUrlusertrue);
						attributes = ldap.getAttributes(user);
catch (NamingException | IOException e) {
							log(s"FINE", User.userWithIp(), "Invalid internal and/or ldap username or password. Username=" + );
							results.add(new KeyValue("error""Invalid username or password."));
							return results;
else {
							log(s"SEVERE", User.userWithIp(), "Problem communicating with LDAP server. user=" + user + " - " + StringHelper.exceptionToString(e"\n    "));
							results.add(new KeyValue("error""Authentication temporarily unavailable."));
							return results;
						}
					}
					firstName = attributes.get("givenName");
					lastName = attributes.get("sn");
					personUuid = createOrUpdatePersonUsingLdapAttributes(sattributes);
				}
				if(personUuid == null) {
					if( != null) {
						markForThrottling(s"ip");
					}
					log(s"FINE", User.userWithIp(), "Invalid username or password. Username: " + );
					results.add(new KeyValue("error""Invalid username or password."));
					return results;
				}
			}
			if(.length() == 0) {
				log(s"SEVERE", User.userWithUuidAndIp(personUuid), "Blocked authentication for account with no password: Username: " + );
				results.add(new KeyValue("error""This user account has no password."));
				return results;
			}
			p = s.prepare("update person set last_auth=?,last_auth_ip=? where uuid=?");
			s.execute(p.bind(new Date().getTime(), personUuid));
			token = createSession(spersonUuidfirstNamelastName, Long.parseLong(settings.get("session.expiry")));
			Location l = ipLocation(s);
			log(s"INFO", User.userWithUuidAndIp(personUuid), "Authentication success. Location: " + (l == null?"unknown":l.toString()));
			throw new IOException(e);
		}
		results.add(new KeyValue("token"token));
		return results;
	}
	private UUID createOrUpdatePersonUsingLdapAttributes(Session sString usernameMap<StringStringattributesthrows IOException {
		UUID personUuid = null;
		String firstName = attributes.get("givenName");
		String lastName = attributes.get("sn");
		String email = attributes.get("mail");
		PreparedStatement p = s.prepare("select uuid, first_name, last_name from person where username=?");
		ResultSet rs = s.execute(p.bind(username));
		for(Row r : rs) {
			personUuid = r.getUUID(0);
			if((email != null && !email.equals(r.getString(4)))
				|| (firstName != null && !firstName.equals(r.getString(2)))
				|| (lastName != null && !lastName.equals(r.getString(3)))
					) {
				if(email.equals(r.getString(4))) {
					email = null;
				}
				if(firstName.equals(r.getString(2))) {
					firstName = null;
				}
				if(lastName.equals(r.getString(3))) {
					lastName = null;
				}
				updatePersonFromLdap(s, User.userWithUuidAndIp(personUuid), firstNamelastNameemail);
			}
			return personUuid;
		}
		personUuid = addPerson(sfirstNamelastNameemailusernamenullnull);
		log(s"INFO", User.userWithUuidAndIp(personUuid), "Auto created user account using LDAP date for username=" + username);
		return personUuid;
	}
		return "{" +
				"\"current_token\":\"" + Json.escape() + "\"," +
				( == null?"":("\"ip\":\"" + Json.escape() + "\",")) +
				"\"username\":\"" + Json.escape() + "\"" +
				"}";
	}
New to GrepCode? Check out our FAQ X