Hello Alon Bar-Lev,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/26441

to review the following change.

Change subject: aaa: Introducing  attach_user_to_su_role
......................................................................

aaa: Introducing  attach_user_to_su_role

1. Introducing a function to attach role for user on system object
2. Removed attach_user_to_su_role
3. Moved generation of permission id to DB (changed manage domains code)
4. Introduced ovirt-engine-role.sh script to add role to authz user.

Change-Id: I7c6e25aa5f187ae06bd105f5493acacda355730a
Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
Signed-off-by: Alon Bar-Lev  <alo...@redhat.com>
---
M 
backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/tools/ManageDomainsDAOImpl.java
M ovirt-engine.spec.in
A packaging/bin/ovirt-engine-role.sh
M packaging/dbscripts/common_sp.sql
4 files changed, 128 insertions(+), 28 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/41/26441/1

diff --git 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/tools/ManageDomainsDAOImpl.java
 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/tools/ManageDomainsDAOImpl.java
index 5c5039a..595ec4a 100644
--- 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/tools/ManageDomainsDAOImpl.java
+++ 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/tools/ManageDomainsDAOImpl.java
@@ -4,8 +4,6 @@
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.sql.Types;
-import java.util.UUID;
 
 import javax.sql.DataSource;
 
@@ -15,8 +13,9 @@
 
 public class ManageDomainsDAOImpl implements ManageDomainsDAO {
 
+    private static final String SUPER_USER = "SuperUser";
     private DataSource ds;
-    private String actionQuery = "select attach_user_to_su_role(?,?,?,?)";
+    private String actionQuery = "select attach_user_to_role(?,?,?,?)";
     private String selectQuery = "select get_user_permissions_for_domain(?,?)";
     private final static Logger log = 
Logger.getLogger(ManageDomainsDAOImpl.class);
 
@@ -33,11 +32,10 @@
             log.info("uuid: " + userId + " username: " + userName + " domain: 
" + domain);
             connection = ds.getConnection();
             prepareStatement = connection.prepareStatement(actionQuery);
-            String permissionId = UUID.randomUUID().toString();
-            prepareStatement.setObject(1, permissionId, Types.OTHER);
-            prepareStatement.setString(2, userId);
-            prepareStatement.setString(3, userName);
-            prepareStatement.setString(4, domain);
+            prepareStatement.setString(1, userId);
+            prepareStatement.setString(2, userName);
+            prepareStatement.setString(3, domain);
+            prepareStatement.setString(4, SUPER_USER);
             result = prepareStatement.execute();
         } finally {
             DbUtils.closeQuietly(prepareStatement, connection);
diff --git a/ovirt-engine.spec.in b/ovirt-engine.spec.in
index bf4e089..fe07409 100644
--- a/ovirt-engine.spec.in
+++ b/ovirt-engine.spec.in
@@ -1009,6 +1009,7 @@
 %{engine_data}/bin/engine-config.sh
 %{engine_data}/bin/engine-manage-domains.sh
 %{engine_data}/bin/engine-prolog.sh
+%{engine_data}/bin/ovirt-engine-role.sh
 %{engine_data}/conf/jaas.conf
 %{engine_data}/services/ovirt-engine-notifier
 %{engine_etc}/engine-config/engine-config.*properties
diff --git a/packaging/bin/ovirt-engine-role.sh 
b/packaging/bin/ovirt-engine-role.sh
new file mode 100755
index 0000000..41e16ab
--- /dev/null
+++ b/packaging/bin/ovirt-engine-role.sh
@@ -0,0 +1,109 @@
+#!/bin/sh
+
+. "$(dirname "$(readlink -f "$0")")"/engine-prolog.sh
+
+generatePgPass() {
+       local password="${ENGINE_DB_PASSWORD}"
+
+       #
+       # we need client side psql library
+       # version as at least in rhel for 8.4
+       # the password within pgpassfile is
+       # not escaped.
+       # the simplest way is to checkout psql
+       # utility version.
+       #
+       if ! psql -V | grep -q ' 8\.'; then
+               password="$(echo "${password}" | sed -e 's/\\/\\\\/g' -e 
's/:/\\:/g')"
+       fi
+
+       export PGPASSFILE="${MYTEMP}/.pgpass"
+       touch "${PGPASSFILE}" || die "Can't create ${PGPASSFILE}"
+       chmod 0600 "${PGPASSFILE}" || die "Can't chmod ${PGPASSFILE}"
+
+       cat > "${PGPASSFILE}" << __EOF__
+${ENGINE_DB_HOST}:${ENGINE_DB_PORT}:${ENGINE_DB_DATABASE}:${ENGINE_DB_USER}:${password}
+__EOF__
+}
+
+usage() {
+       cat << __EOF__
+Usage: $0 [OPTIONS]
+Manage user roles.
+
+    --command=command        Command.
+        add                      Add role.
+    --user-name              User name.
+    --provider=name          Name of authorization provider instace.
+    --provider-id=id         Unique user id within provider.
+    --role=role              Role name.
+
+Interesting roles:
+
+    SuperUser
+        Role of administrator.
+__EOF__
+}
+
+cleanup() {
+       [ -n "${MYTEMP}" ] && rm -fr "${MYTEMP}" ]
+}
+trap cleanup 0
+
+COMMAND=
+USER_NAME=
+PROVIDER=
+PROVIDER_ID=
+ROLE=
+
+while [ -n "$1" ]; do
+       x="$1"
+       v="${x#*=}"
+       shift
+       case "${x}" in
+               --command=*)
+                       COMMAND="${v}"
+                       case "${COMMAND}" in
+                               add) ;;
+                               *) die "Invalid command '${COMMAND}'" ;;
+                       esac
+               ;;
+               --user-name=*)
+                       USER_NAME="${v}"
+               ;;
+               --provider=*)
+                       PROVIDER="${v}"
+               ;;
+               --provider-id=*)
+                       PROVIDER_ID="${v}"
+               ;;
+               --role=*)
+                       ROLE="${v}"
+               ;;
+               --help)
+                       usage
+                       exit 0
+               ;;
+               *)
+                       usage
+                       exit 1
+               ;;
+       esac
+done
+
+[ -n "${COMMAND}" ] || die "Please specify command"
+[ -n "${USER_NAME}" ] || die "Please specify user name"
+[ -n "${PROVIDER}" ] || die "Please specify provider"
+[ -n "${PROVIDER_ID}" ] || die "Please specify provider id"
+[ -n "${ROLE}" ] || die "Please specify role"
+
+MYTEMP="$(mktemp -d)"
+generatePgPass
+psql -h "${ENGINE_DB_HOST}" -p "${ENGINE_DB_PORT}" -U "${ENGINE_DB_USER}" -c "
+       select attach_user_to_role(
+               '${PROVIDER_ID}',
+               '${USER_NAME}',
+               '${PROVIDER}',
+               '${ROLE}'
+       );
+" > /dev/null
diff --git a/packaging/dbscripts/common_sp.sql 
b/packaging/dbscripts/common_sp.sql
index 0e5a04c..aa14456 100644
--- a/packaging/dbscripts/common_sp.sql
+++ b/packaging/dbscripts/common_sp.sql
@@ -257,34 +257,26 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
-
-
-CREATE OR REPLACE FUNCTION attach_user_to_su_role(
-    v_permission_id uuid,
-    v_user_id VARCHAR(255),
-    v_name VARCHAR(255),
-    v_domain VARCHAR(255)
+CREATE OR REPLACE FUNCTION attach_user_to_role (
+    v_domain_entry_id text,
+    v_user_name VARCHAR(255),
+    v_domain VARCHAR(255),
+    v_role_name VARCHAR(255)
 )
 RETURNS void AS
 $BODY$
-   DECLARE
-   v_document  VARCHAR(64);
-   input_uuid uuid;
-   v_external_id BYTEA;
+DECLARE
+   gen_user_id uuid;
+   input_role_id uuid;
 BEGIN
-   input_uuid = CAST( v_user_id AS uuid );
-
+   select uuid_generate_v1() into gen_user_id;
+   select roles.id into input_role_id from roles where roles.name = 
v_role_name;
    -- The external identifier is the user identifier converted to an array of
    -- bytes:
-   v_external_id := decode(replace(v_user_id::text, '-', ''), 'hex');
-
-insert into 
users(user_id,external_id,name,domain,username,groups,active,last_admin_check_status)
 select input_uuid, v_external_id, v_name, v_domain, v_name,'',true,true where 
not exists (select user_id,name,domain,username,groups,active from users where 
user_id = input_uuid);
-
-insert into permissions(id,role_id,ad_element_id,object_id,object_type_id) 
select v_permission_id, '00000000-0000-0000-0000-000000000001', input_uuid, 
getGlobalIds('system'), 1 where not exists(select 
role_id,ad_element_id,object_id,object_type_id from permissions where role_id = 
'00000000-0000-0000-0000-000000000001' and ad_element_id = input_uuid and 
object_id= getGlobalIds('system') and object_type_id = 1);
+   insert into 
users(user_id,external_id,name,domain,username,groups,active,last_admin_check_status)
 select gen_user_id, v_domain_entry_id, v_user_name, v_domain, 
v_user_name,'',true,true where not exists (select 
gen_user_id,name,domain,username,groups,active from users where external_id = 
v_domain_entry_id);
+   insert into permissions(id,role_id,ad_element_id,object_id,object_type_id) 
select uuid_generate_v1(),  input_role_id, gen_user_id, getGlobalIds('system'), 
1 where not exists(select role_id,ad_element_id,object_id,object_type_id from 
permissions where role_id = input_role_id and ad_element_id = gen_user_id and 
object_id= getGlobalIds('system') and object_type_id = 1);
 END; $BODY$
-
 LANGUAGE plpgsql;
-
 
 -- a method for adding an action group to a role if doesn't exist
 CREATE OR REPLACE FUNCTION fn_db_add_action_group_to_role(v_role_id UUID, 
v_action_group_id INTEGER)


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

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

Reply via email to