backend/wbpublic/grtdb/dbobject_roles.cpp (164 lines of code) (raw):

/* * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2.0, * as published by the Free Software Foundation. * * This program is designed to work with certain software (including * but not limited to OpenSSL) that is licensed under separate terms, as * designated in a particular file or component or in included license * documentation. The authors of MySQL hereby grant you an additional * permission to link the program and your derivative works with the * separately licensed software that they have either included with * the program or referenced in the documentation. * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License, version 2.0, for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dbobject_roles.h" #include "base/string_utilities.h" using namespace bec; using namespace grt; //-------------------------------------------------------------------------------------------------- ObjectRoleListBE::ObjectRoleListBE(DBObjectEditorBE *owner, const db_mgmt_RdbmsRef &rdbms) : _owner(owner), _privilege_list(this, rdbms) { _rdbms = rdbms; refresh(); } //-------------------------------------------------------------------------------------------------- void ObjectRoleListBE::refresh() { _role_privs.clear(); db_DatabaseObjectRef object(_owner->get_dbobject()); grt::ListRef<db_Role> roles(_owner->get_catalog()->roles()); for (size_t c = roles.count(), i = 0; i < c; i++) { for (size_t d = roles[i]->privileges().count(), j = 0; j < d; j++) { if (roles[i]->privileges()[j]->databaseObject() == object) { _role_privs.push_back(roles[i]->privileges()[j]); break; } } } } //-------------------------------------------------------------------------------------------------- size_t ObjectRoleListBE::count() { return _role_privs.size(); } //-------------------------------------------------------------------------------------------------- bool ObjectRoleListBE::get_field_grt(const NodeId &node, ColumnId column, grt::ValueRef &value) { switch ((Columns)column) { case Name: { db_RolePrivilegeRef role_privs(_role_privs[node[0]]); std::string name; grt::ListRef<db_mgmt_PrivilegeMapping> mappings(_rdbms->privilegeNames()); grt::StringListRef privileges; for (size_t c = mappings.count(), i = 0; i < c; i++) { if (role_privs->databaseObject().is_valid() && role_privs->databaseObject().is_instance(mappings[i]->structName())) { privileges = mappings[i]->privileges(); break; } } if (privileges.is_valid()) { for (grt::StringListRef::const_iterator iter = privileges.begin(); iter != privileges.end(); ++iter) { const size_t idx = role_privs->privileges().get_index(*iter); if (idx != BaseListRef::npos) { if (!name.empty()) name.append(", "); name.append((*iter).c_str()); } } } if (name.empty()) name = db_RoleRef::cast_from(role_privs->owner())->name(); else name = std::string(db_RoleRef::cast_from(role_privs->owner())->name().c_str()).append(" (").append(name).append(")"); value = grt::StringRef(name); } return true; } return false; } //-------------------------------------------------------------------------------------------------- void ObjectRoleListBE::add_role_for_privileges(const db_RoleRef &role) { grt::ListRef<db_RolePrivilege> role_privs(role->privileges()); db_DatabaseObjectRef object(_owner->get_dbobject()); for (size_t c = role_privs.count(), i = 0; i < c; i++) { if (role_privs[i]->databaseObject() == object) return; } db_RolePrivilegeRef role_priv(grt::Initialized); role_priv->owner(role); role_priv->databaseObject(_owner->get_dbobject()); AutoUndoEdit undo(_owner); role->privileges().insert(role_priv); undo.end(_("Add Role to Object Privileges")); refresh(); } //-------------------------------------------------------------------------------------------------- void ObjectRoleListBE::remove_role_from_privileges(const db_RoleRef &role) { grt::ListRef<db_RolePrivilege> role_privs(role->privileges()); db_DatabaseObjectRef object(_owner->get_dbobject()); for (size_t c = role_privs.count(), i = 0; i < c; i++) { if (role_privs[i]->databaseObject() == object) { // grt::AutoUndo undo; AutoUndoEdit undo(_owner); role_privs.remove(i); undo.end(_("Remove Role from Object Privileges")); break; } } refresh(); } //-------------------------------------------------------------------------------------------------- void ObjectRoleListBE::select_role(const NodeId &node) { _selected_node = node; _privilege_list.refresh(); } //-------------------------------------------------------------------------------------------------- db_RolePrivilegeRef ObjectRoleListBE::get_selected() { if (_selected_node.is_valid()) { if (_selected_node[0] < count()) return _role_privs[_selected_node[0]]; } return db_RolePrivilegeRef(); } //-------------------------------------------------------------------------------------------------- ObjectPrivilegeListBE::ObjectPrivilegeListBE(ObjectRoleListBE *owner, const db_mgmt_RdbmsRef &rdbms) : _owner(owner), _rdbms(rdbms) { } //-------------------------------------------------------------------------------------------------- size_t ObjectPrivilegeListBE::count() { if (_privileges.is_valid()) return _privileges.count(); return 0; } //-------------------------------------------------------------------------------------------------- void ObjectPrivilegeListBE::refresh() { db_RolePrivilegeRef role_privilege(_owner->get_selected()); _privileges.clear(); if (role_privilege.is_valid()) { grt::ListRef<db_mgmt_PrivilegeMapping> mappings(_rdbms->privilegeNames()); for (size_t c = mappings.count(), i = 0; i < c; i++) { if (role_privilege->databaseObject().is_valid() && role_privilege->databaseObject().is_instance(mappings[i]->structName())) { _privileges = mappings[i]->privileges(); break; } } } } //-------------------------------------------------------------------------------------------------- bool ObjectPrivilegeListBE::get_field_grt(const NodeId &node, ColumnId column, grt::ValueRef &value) { if (node[0] >= count()) return false; db_RolePrivilegeRef role_privilege(_owner->get_selected()); switch ((Columns)column) { case Enabled: { // Check that requested privilege is valid. const int ret = (role_privilege.is_valid() && (BaseListRef::npos != role_privilege->privileges().get_index(_privileges.get(node[0])))); value = grt::IntegerRef(ret); return true; } case Name: value = _privileges.get(node[0]); return true; } return false; } //-------------------------------------------------------------------------------------------------- bool ObjectPrivilegeListBE::set_field(const NodeId &node, ColumnId column, ssize_t value) { db_RolePrivilegeRef role_privilege(_owner->get_selected()); size_t index; if (node[0] >= count()) return false; switch ((Columns)column) { case Enabled: if ((index = role_privilege->privileges().get_index(_privileges.get(node[0]))) == BaseListRef::npos) { if (value) { AutoUndoEdit undo(_owner->get_owner()); role_privilege->privileges().insert(_privileges.get(node[0])); undo.end(_("Add object privilege to role")); } } else { if (!value) { AutoUndoEdit undo(_owner->get_owner()); role_privilege->privileges().remove(index); undo.end(_("Remove object privilege from role")); } } return true; case Name: return false; } return false; } //--------------------------------------------------------------------------------------------------