001package org.kepler.webview.server.auth; 002 003import io.vertx.core.AsyncResult; 004import io.vertx.core.Future; 005import io.vertx.core.Handler; 006import io.vertx.core.json.JsonObject; 007import io.vertx.ext.auth.AbstractUser; 008import io.vertx.ext.auth.AuthProvider; 009 010/** NOTE: do not use this class if in clustering mode 011 * since ClusterSerializable not implemented. 012 * 013 */ 014public class DrupalUser extends AbstractUser { 015 016 public DrupalUser() {} 017 018 public DrupalUser(JsonObject loginJson, String groupsField, String fullNameField, String role) { 019 _loginJson = loginJson; 020 _role = role; 021 022 _principal = new JsonObject().put("username", loginJson.getJsonObject("user").getString("name")); 023 _principal.put("fullname", _getDrupalField(loginJson, fullNameField, loginJson.getJsonObject("user").getString("name"))); 024 _principal.put("groups", _getDrupalField(loginJson, groupsField, null)); 025 } 026 027 @Override 028 public JsonObject principal() { 029 return _principal; 030 } 031 032 @Override 033 public void setAuthProvider(AuthProvider provider) { 034 } 035 036 @Override 037 protected void doIsPermitted(String authority, Handler<AsyncResult<Boolean>> handler) { 038 Boolean found = Boolean.FALSE; 039 for(Object value: _loginJson.getJsonObject("user").getJsonObject("roles").getMap().values()) { 040 if(value.equals(_role)) { 041 found = Boolean.TRUE; 042 break; 043 } 044 }; 045 handler.handle(Future.succeededFuture(found)); 046 } 047 048 private static String _getDrupalField(JsonObject loginJson, String fieldName, String defaultValue) { 049 050 if(loginJson.getJsonObject("user").containsKey(fieldName)) { 051 // groupsField key may be an empty array, so check type 052 // before assuming it's a JsonObject. 053 Object fieldObject = loginJson.getJsonObject("user").getValue(fieldName); 054 if(fieldObject instanceof JsonObject) { 055 return ((JsonObject)fieldObject) 056 .getJsonArray("und") 057 .getJsonObject(0) 058 .getString("value"); 059 } 060 } 061 return defaultValue; 062 } 063 064 private JsonObject _loginJson; 065 private JsonObject _principal; 066 private String _role; 067}