Yair Zaslavsky has uploaded a new change for review.

Change subject: aaa: using new extensions API in InternalDirectory
......................................................................

aaa: using new extensions API in InternalDirectory

Topic: AAA
Change-Id: I958443292da0455e0a12039fac98eebb9b17dee2
Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
---
A 
backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/AuthenticatorProxy.java
A 
backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/DirectoryProxy.java
M 
backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/internal/InternalDirectory.java
3 files changed, 304 insertions(+), 75 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/26477/1

diff --git 
a/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/AuthenticatorProxy.java
 
b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/AuthenticatorProxy.java
new file mode 100644
index 0000000..e38f7cd
--- /dev/null
+++ 
b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/AuthenticatorProxy.java
@@ -0,0 +1,54 @@
+package org.ovirt.engine.core.aaa;
+
+import java.util.Properties;
+
+import org.ovirt.engine.api.extensions.Base;
+import org.ovirt.engine.api.extensions.ExtMap;
+import org.ovirt.engine.api.extensions.aaa.Authn;
+import org.ovirt.engine.api.extensionsold.AAAExtensionException;
+import org.ovirt.engine.core.extensions.mgr.ExtensionProxy;
+
+public class AuthenticatorProxy extends Authenticator {
+
+    private ExtensionProxy extension;
+
+    public AuthenticatorProxy(ExtensionProxy extension) {
+        this.extension = extension;
+    }
+
+    @Override
+    @Deprecated
+    public void init() {
+    }
+
+    @Override
+    @Deprecated
+    public void authenticate(String user, String password) {
+        ExtMap inputMap = new ExtMap().mput(
+                Base.InvokeKeys.COMMAND, 
Authn.InvokeCommands.AUTHENTICATE_CREDENTIALS
+                ).mput(
+                        Authn.InvokeKeys.USER, user
+                ).mput(
+                        Authn.InvokeKeys.CREDENTIALS, password
+                );
+        ExtMap outputMap = extension.invoke(inputMap);
+        if (outputMap.<Integer> get(Authn.InvokeKeys.RESULT) == 
Authn.AuthResult.CREDENTIALS_INVALID) {
+            throw new 
AAAExtensionException(AAAExtensionException.AAAExtensionError.INCORRECT_CREDENTIALS,
 "");
+        }
+    }
+
+    @Override
+    @Deprecated
+    public String getName() {
+        return (String) extension.getContext().<String> 
get(Base.ContextKeys.INSTANCE_NAME);
+    }
+
+    @Override
+    @Deprecated
+    public String getProfileName() {
+        return (String) extension.getContext().<Properties> 
get(Base.ContextKeys.CONFIGURATION)
+                .getProperty("ovirt.engine.aaa.authn.profile.name");
+    }
+
+}
+
diff --git 
a/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/DirectoryProxy.java
 
b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/DirectoryProxy.java
new file mode 100644
index 0000000..66f6f9f
--- /dev/null
+++ 
b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/DirectoryProxy.java
@@ -0,0 +1,171 @@
+package org.ovirt.engine.core.aaa;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.ovirt.engine.api.extensions.Base;
+import org.ovirt.engine.api.extensions.ExtMap;
+import org.ovirt.engine.api.extensions.aaa.Authn;
+import org.ovirt.engine.api.extensions.aaa.Authz;
+import org.ovirt.engine.core.extensions.mgr.ExtensionProxy;
+
+public class DirectoryProxy extends Directory {
+
+    private ExtensionProxy extension;
+
+    public DirectoryProxy(ExtensionProxy extension) {
+        this.extension = extension;
+    }
+
+    @Deprecated
+    @Override
+    public void init() {
+    }
+
+    @Deprecated
+    @Override
+    public DirectoryUser findUser(String name) {
+        ExtMap authRecord = new ExtMap().mput(
+                Authn.AuthRecord.PRINCIPAL, name);
+        ExtMap inputMap = new ExtMap().mput(
+                Base.InvokeKeys.COMMAND, 
Authz.InvokeCommands.FETCH_PRINCIPAL_RECORD
+        ).mput(Authn.InvokeKeys.AUTH_RECORD,  authRecord);
+        ExtMap outputMap = extension.invoke(inputMap);
+        ExtMap principalRecord = 
outputMap.<ExtMap>get(Authz.InvokeKeys.PRINCIPAL_RECORD);
+        if (principalRecord == null) {
+            return null;
+        }
+
+        return mapPrincipalRecord(principalRecord);
+    }
+
+    @Deprecated
+    @Override
+    public DirectoryUser findUserById(String id) {
+        List<DirectoryUser> users = findUsers(Arrays.asList(id));
+        if (users.isEmpty()) {
+            return null;
+        }
+        return users.get(0);
+    }
+
+    @Deprecated
+    @Override
+    public List<DirectoryUser> findUsers(List<String> ids) {
+        ExtMap inputMap = new ExtMap().mput(
+                Base.InvokeKeys.COMMAND, 
Authz.InvokeCommands.QUERY_PRINCIPALS_BY_IDS_OPEN
+                ).mput(Authz.InvokeKeys.PRINCIPAL_IDS, ids);
+        ExtMap outputMap = extension.invoke(inputMap);
+        return populateUsers(outputMap);
+    }
+
+    @Deprecated
+    @Override
+    public DirectoryGroup findGroup(String name) {
+        return null;
+    }
+
+    @Deprecated
+    @Override
+    public DirectoryGroup findGroupById(String id) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Deprecated
+    @Override
+    public List<DirectoryUser> queryUsers(String query) {
+        ExtMap inputMap = new ExtMap().mput(
+                Base.InvokeKeys.COMMAND, 
Authz.InvokeCommands.QUERY_PRINCIPALS_OPEN
+                ).mput(Authz.InvokeKeys.QUERY, query);
+        ExtMap outputMap = extension.invoke(inputMap);
+        return populateUsers(outputMap);
+    }
+
+    private List<DirectoryUser> populateUsers(ExtMap outputMap) {
+        List<DirectoryUser> directoryUsers = new ArrayList<>();
+        Object queryOpaque = outputMap.get(Authz.InvokeKeys.QUERY_OPAQUE);
+        while (true) {
+            ExtMap inputMap = new ExtMap().mput(
+                    Base.InvokeKeys.COMMAND, Authz.InvokeCommands.QUERY_EXECUTE
+                    ).mput(Authz.InvokeKeys.QUERY_OPAQUE, queryOpaque);
+            outputMap = extension.invoke(inputMap);
+            ExtMap result = outputMap.get(Authz.InvokeKeys.QUERY_RESULT);
+            queryOpaque = outputMap.get(Authz.InvokeKeys.QUERY_OPAQUE);
+            if (result == null) {
+                break;
+            }
+            directoryUsers.add(mapPrincipalRecord(result));
+        }
+        ExtMap inputMap = new ExtMap().mput(
+                Base.InvokeKeys.COMMAND, Authz.InvokeCommands.QUERY_CLOSE
+                ).mput(Authz.InvokeKeys.QUERY_OPAQUE, queryOpaque);
+        outputMap = extension.invoke(inputMap);
+        return directoryUsers;
+    }
+
+    private List<DirectoryGroup> populateGroups(ExtMap outputMap) {
+        List<DirectoryGroup> directoryGroups = new ArrayList<>();
+        Object queryOpaque = outputMap.get(Authz.InvokeKeys.QUERY_OPAQUE);
+        while (true) {
+            ExtMap inputMap = new ExtMap().mput(
+                    Base.InvokeKeys.COMMAND, Authz.InvokeCommands.QUERY_EXECUTE
+                    ).mput(Authz.InvokeKeys.QUERY_OPAQUE, queryOpaque);
+            outputMap = extension.invoke(inputMap);
+            ExtMap result = outputMap.get(Authz.InvokeKeys.QUERY_RESULT);
+            queryOpaque = outputMap.get(Authz.InvokeKeys.QUERY_OPAQUE);
+            if (result == null) {
+                break;
+            }
+            directoryGroups.add(mapGroupRecord(result));
+        }
+        ExtMap inputMap = new ExtMap().mput(
+                Base.InvokeKeys.COMMAND, Authz.InvokeCommands.QUERY_CLOSE
+                ).mput(Authz.InvokeKeys.QUERY_OPAQUE, queryOpaque);
+        outputMap = extension.invoke(inputMap);
+        return directoryGroups;
+    }
+
+    @Deprecated
+    @Override
+    public List<DirectoryGroup> queryGroups(String query) {
+        ExtMap inputMap = new ExtMap().mput(
+                Base.InvokeKeys.COMMAND, Authz.InvokeCommands.QUERY_GROUPS_OPEN
+                ).mput(Authz.InvokeKeys.QUERY, query);
+        ExtMap outputMap = extension.invoke(inputMap);
+        return populateGroups(outputMap);
+    }
+
+    private DirectoryUser mapPrincipalRecord(ExtMap principalRecord) {
+        DirectoryUser directoryUser = new DirectoryUser(
+                extension.getContext().<String> 
get(Base.ContextKeys.INSTANCE_NAME),
+                principalRecord.<String> get(Authz.PrincipalRecord.NAME),
+                principalRecord.<String> get(Authz.PrincipalRecord.ID)
+                );
+        directoryUser.setDepartment(principalRecord.<String> 
get(Authz.PrincipalRecord.DEPARTMENT));
+        directoryUser.setFirstName(principalRecord.<String> 
get(Authz.PrincipalRecord.FIRST_NAME));
+        directoryUser.setLastName(principalRecord.<String> 
get(Authz.PrincipalRecord.LAST_NAME));
+        directoryUser.setEmail(principalRecord.<String> 
get(Authz.PrincipalRecord.EMAIL));
+        directoryUser.setTitle(principalRecord.<String> 
get(Authz.PrincipalRecord.TITLE));
+        List<DirectoryGroup> directoryGroups = new ArrayList<DirectoryGroup>();
+        List<ExtMap> groups = principalRecord.<List<ExtMap>> 
get(Authz.PrincipalRecord.GROUPS);
+        if (groups != null) {
+            for (ExtMap group : groups) {
+                directoryGroups.add(mapGroupRecord(group));
+            }
+        }
+        return directoryUser;
+    }
+
+    private DirectoryGroup mapGroupRecord(ExtMap group) {
+        DirectoryGroup directoryGroup = new DirectoryGroup(
+                extension.getContext().<String> 
get(Base.ContextKeys.INSTANCE_NAME),
+                group.<String> get(Authz.GroupRecord.NAME),
+                group.<String> get(Authz.GroupRecord.ID)
+                );
+        // TODO - groups the group is member of?
+        return directoryGroup;
+    }
+
+}
diff --git 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/internal/InternalDirectory.java
 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/internal/InternalDirectory.java
index 997b472..ff4e52f 100644
--- 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/internal/InternalDirectory.java
+++ 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/internal/InternalDirectory.java
@@ -1,18 +1,20 @@
 package org.ovirt.engine.extensions.aaa.builtin.internal;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.Arrays;
 import java.util.Properties;
 
-import org.ovirt.engine.core.aaa.Directory;
-import org.ovirt.engine.core.aaa.DirectoryGroup;
-import org.ovirt.engine.core.aaa.DirectoryUser;
+import org.ovirt.engine.api.extensions.Base;
+import org.ovirt.engine.api.extensions.ExtMap;
+import org.ovirt.engine.api.extensions.ExtUUID;
+import org.ovirt.engine.api.extensions.Extension;
+import org.ovirt.engine.api.extensions.aaa.Authz;
+import org.ovirt.engine.api.extensions.aaa.Authz.InvokeCommands;
+import org.ovirt.engine.core.common.utils.Pair;
 
 /**
  * This directory contains only the internal user as specified in the {@code 
AdminUser} configuration parameter.
  */
-public class InternalDirectory extends Directory {
+public class InternalDirectory implements Extension {
     /**
      *
      */
@@ -24,87 +26,89 @@
      */
     private static final String ADMIN_ID = 
"fdfc627c-d875-11e0-90f0-83df133b58cc";
 
-    /**
-     * The only user supported by this directory.
-     */
-    private DirectoryUser admin;
+    private ExtMap context;
 
-    /**
-     * {@inheritDoc}
-     */
+    private String userName;
+
+    private ExtMap adminUser;
+
     @Override
-    public DirectoryUser findUser(String name) {
-        return getAdminName().equals(name) ? admin : null;
+    public void invoke(ExtMap input, ExtMap output) {
+        try {
+            ExtUUID commandType = input.<ExtUUID> get(Base.InvokeKeys.COMMAND);
+            if (commandType.equals(Base.InvokeCommands.INITIALIZE)) {
+                doInit(input, output);
+            }
+            if 
(commandType.equals(Authz.InvokeCommands.FETCH_PRINCIPAL_RECORD)) {
+                doFetchPrincipalOutput(input, output);
+            }
+            if (commandType.equals(Authz.InvokeCommands.QUERY_CLOSE)) {
+                // Do nothing
+            }
+            if 
(commandType.equals(Authz.InvokeCommands.QUERY_PRINCIPALS_BY_IDS_OPEN)) {
+                fillOpaque(output, commandType);
+            }
+            if 
(commandType.equals(Authz.InvokeCommands.QUERY_PRINCIPALS_OPEN)) {
+                fillOpaque(output, commandType);
+            }
+            if 
(commandType.equals(Authz.InvokeCommands.QUERY_GROUPS_BY_IDS_OPEN)) {
+                fillOpaque(output, commandType);
+            }
+            if (commandType.equals(Authz.InvokeCommands.QUERY_EXECUTE)) {
+                doQueryExecute(input, output);
+            }
+
+            output.mput(Base.InvokeKeys.RESULT, Base.InvokeResult.SUCCESS);
+        } catch (Exception ex) {
+            output.mput(Base.InvokeKeys.RESULT, Base.InvokeResult.FAILED);
+            output.mput(Base.InvokeKeys.MESSAGE, ex.getMessage());
+        }
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public DirectoryUser findUserById(String id) {
-        return ADMIN_ID.equals(id)? admin: null;
-    }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<DirectoryUser> findUsers(List<String> ids) {
-        List<DirectoryUser> users = new ArrayList<>(ids.size());
-        for (String id : ids) {
-            DirectoryUser user = findUserById(id);
-            if (user != null) {
-                users.add(user);
+    private void doQueryExecute(ExtMap input, ExtMap output) {
+        Pair<ExtUUID, Boolean> opaque = input.<Pair<ExtUUID, Boolean>> 
get(Authz.InvokeKeys.QUERY_OPAQUE);
+        ExtUUID queryType = opaque.getFirst();
+        boolean firstCall = opaque.getSecond();
+        if (queryType.equals(InvokeCommands.QUERY_PRINCIPALS_BY_IDS_OPEN) || 
queryType.equals(InvokeCommands.QUERY_PRINCIPALS_OPEN)) {
+            // Since there is a single user in the directory, execute
+            if (firstCall) {
+                opaque.setSecond(false);
+                output.mput(
+                        Authz.InvokeKeys.QUERY_RESULT, Arrays.asList(adminUser)
+                ).mput(
+                        Authz.InvokeKeys.QUERY_OPAQUE, opaque
+                );
+            } else {
+                output.mput(
+                        Authz.InvokeKeys.QUERY_RESULT, null
+                ).mput(
+                        Authz.InvokeKeys.QUERY_OPAQUE, opaque
+                );
             }
         }
-        return users;
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public DirectoryGroup findGroup(String name) {
-        return null;
+    private void fillOpaque(ExtMap output, ExtUUID queryType) {
+        output.mput(Authz.InvokeKeys.QUERY_OPAQUE, new Pair<ExtUUID, 
Boolean>(queryType, true));
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public DirectoryGroup findGroupById(String id) {
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<DirectoryUser> queryUsers(String query) {
-        return Collections.singletonList(admin);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<DirectoryGroup> queryGroups(String query) {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public void init() {
-        admin = new DirectoryUser(getName(), ADMIN_ID, getAdminName());
-        admin.setAdmin(true);
-        context.put(ExtensionProperties.AUTHOR, "The oVirt Project");
-        context.put(ExtensionProperties.EXTENSION_NAME, "Internal 
Authorization (Built-in)");
-        context.put(ExtensionProperties.LICENSE, "ASL 2.0");
-        context.put(ExtensionProperties.HOME, "http://www.ovirt.org";);
-        context.put(ExtensionProperties.VERSION, "N/A");
+    private void doFetchPrincipalOutput(ExtMap input, ExtMap output) {
+        output.mput(
+                Authz.InvokeKeys.PRINCIPAL_RECORD, adminUser);
 
     }
 
-    private String getAdminName() {
-        return ((Properties) 
context.get(ExtensionProperties.CONFIGURATION)).getProperty("config.authz.user.name");
+    private void doInit(ExtMap input, ExtMap output) {
+        context = input.<ExtMap> get(Base.InvokeKeys.CONTEXT);
+        context.mput(Base.ContextKeys.CONFIGURATION_SENSITIVE_KEYS, 
"config.authn.user.password").
+        mput(Base.ContextKeys.EXTENSION_NAME, "Internal Authorization 
(Built-in").
+        mput(Base.ContextKeys.LICENSE, "ASL 2.0").
+        mput(Base.ContextKeys.HOME_URL, "http://www.ovirt.org";).
+        mput(Base.ContextKeys.VERSION, "N/A");
+        userName = context.<Properties> 
get(Base.ContextKeys.CONFIGURATION).getProperty("config.authz.user.name");
+        adminUser = new ExtMap().
+                mput(Authz.PrincipalRecord.NAME, userName).
+                mput(Authz.PrincipalRecord.ID, ADMIN_ID);
     }
 }


-- 
To view, visit http://gerrit.ovirt.org/26477
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I958443292da0455e0a12039fac98eebb9b17dee2
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to