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}