| //***************************************************************************** |
| // @@@ START COPYRIGHT @@@ |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| //// @@@ END COPYRIGHT @@@ |
| //***************************************************************************** |
| |
| #ifndef PRIVMGR_USERP_H |
| #define PRIVMGR_USERP_H |
| |
| #include <string> |
| #include <vector> |
| #include <bitset> |
| #include "PrivMgrDefs.h" |
| |
| class ComSecurityKey; |
| class ComDiagsArea; |
| |
| // Contents of file |
| class PrivMgrObjectInfo; |
| class ObjectPrivsRow; |
| class PrivMgrUserPrivs; |
| |
| // Forward references |
| class PrivMgrPrivileges; |
| class NATable; |
| |
| // **************************************************************************** |
| // * |
| // * Class: PrivMgrObjectInfo |
| // * Description: This class describes object details needed to perform |
| // * describe requests |
| // * |
| // **************************************************************************** |
| class PrivMgrObjectInfo |
| { |
| public: |
| |
| PrivMgrObjectInfo( const int64_t objectUID, |
| const std::string objectName, |
| const int32_t objectOwner, |
| const int32_t schemaOwner, |
| const ComObjectType objectType) |
| : objectOwner_ (objectOwner), |
| objectName_ (objectName), |
| schemaOwner_ (schemaOwner), |
| objectUID_ (objectUID), |
| objectType_ (objectType) |
| {} |
| |
| |
| PrivMgrObjectInfo(const NATable *naTable); |
| |
| const int32_t getObjectOwner() { return objectOwner_; } |
| const std::string getObjectName() { return objectName_; } |
| const int32_t getSchemaOwner() { return schemaOwner_; } |
| const int64_t getObjectUID() { return objectUID_; } |
| const ComObjectType getObjectType() { return objectType_; } |
| const std::vector<std::string> &getColumnList() { return columnList_; } |
| |
| private: |
| |
| int64_t objectUID_; |
| std::string objectName_; |
| int32_t objectOwner_; |
| int32_t schemaOwner_; |
| ComObjectType objectType_; |
| std::vector<std::string> columnList_; |
| }; |
| |
| // **************************************************************************** |
| // class: ObjectPrivsRow |
| // |
| // **************************************************************************** |
| class ObjectPrivsRow |
| { |
| public: |
| char objectName[(MAX_SQL_IDENTIFIER_NAME_LEN*3) + 2 + 1]; |
| ComObjectType objectType; |
| int32_t granteeID; |
| char granteeName[MAX_USERNAME_LEN * 2 + 1]; |
| ComGranteeType granteeType; |
| int32_t grantorID; |
| char grantorName[MAX_USERNAME_LEN * 2 + 1]; |
| ComGrantorType grantorType; |
| int64_t privilegesBitmap; |
| int64_t grantableBitmap; |
| }; |
| |
| |
| // ***************************************************************************** |
| // * |
| // * Class: PrivMgrUserPrivs |
| // * Description: This class encapsulates privileges associated with an object |
| // * for a user. |
| // * |
| // ***************************************************************************** |
| class PrivMgrUserPrivs |
| { |
| public: |
| |
| PrivMgrUserPrivs() |
| : hasPublicPriv_(false) |
| {} |
| |
| static std::string convertPrivTypeToLiteral(PrivType which) |
| { |
| std::string privilege; |
| switch (which) |
| { |
| case SELECT_PRIV: |
| privilege = "SELECT"; |
| break; |
| case INSERT_PRIV: |
| privilege = "INSERT"; |
| break; |
| case DELETE_PRIV: |
| privilege = "DELETE"; |
| break; |
| case UPDATE_PRIV: |
| privilege = "UPDATE"; |
| break; |
| case USAGE_PRIV: |
| privilege = "USAGE"; |
| break; |
| case REFERENCES_PRIV: |
| privilege = "REFERENCES"; |
| break; |
| case EXECUTE_PRIV: |
| privilege = "EXECUTE"; |
| break; |
| case CREATE_PRIV: |
| privilege = "CREATE"; |
| break; |
| case ALTER_PRIV: |
| privilege = "ALTER"; |
| break; |
| case DROP_PRIV: |
| privilege = "DROP"; |
| break; |
| case ALL_DML: |
| privilege = "ALL_DML"; |
| break; |
| case ALL_DDL: |
| privilege = "ALL_DDL"; |
| break; |
| case ALL_PRIVS: |
| privilege = "ALL"; |
| break; |
| default: |
| privilege = "UNKNOWN"; |
| } |
| return privilege; |
| } |
| |
| |
| // Object level |
| bool hasObjectSelectPriv() const {return objectBitmap_.test(SELECT_PRIV);} |
| bool hasObjectInsertPriv() const {return objectBitmap_.test(INSERT_PRIV);} |
| bool hasObjectDeletePriv() const {return objectBitmap_.test(DELETE_PRIV);} |
| bool hasObjectUpdatePriv() const {return objectBitmap_.test(UPDATE_PRIV);} |
| bool hasObjectUsagePriv() const {return objectBitmap_.test(USAGE_PRIV);} |
| bool hasObjectReferencePriv() const {return objectBitmap_.test(REFERENCES_PRIV);} |
| bool hasObjectExecutePriv() const {return objectBitmap_.test(EXECUTE_PRIV);} |
| bool hasObjectAlterPriv() const {return objectBitmap_.test(ALTER_PRIV);} |
| bool hasObjectDropPriv() const {return objectBitmap_.test(DROP_PRIV);} |
| bool hasSelectPriv() const {return schemaPrivBitmap_.test(SELECT_PRIV) || objectBitmap_.test(SELECT_PRIV);} |
| bool hasInsertPriv() const {return schemaPrivBitmap_.test(INSERT_PRIV) || objectBitmap_.test(INSERT_PRIV);} |
| bool hasDeletePriv() const {return schemaPrivBitmap_.test(DELETE_PRIV) || objectBitmap_.test(DELETE_PRIV);} |
| bool hasUpdatePriv() const {return schemaPrivBitmap_.test(UPDATE_PRIV) || objectBitmap_.test(UPDATE_PRIV);} |
| bool hasUsagePriv() const {return schemaPrivBitmap_.test(USAGE_PRIV) || objectBitmap_.test(USAGE_PRIV);} |
| bool hasReferencePriv() const {return schemaPrivBitmap_.test(REFERENCES_PRIV) || objectBitmap_.test(REFERENCES_PRIV);} |
| bool hasExecutePriv() const {return schemaPrivBitmap_.test(EXECUTE_PRIV) || objectBitmap_.test(EXECUTE_PRIV);} |
| bool hasCreatePriv() const {return schemaPrivBitmap_.test(CREATE_PRIV);} |
| bool hasAlterPriv() const {return schemaPrivBitmap_.test(ALTER_PRIV) || objectBitmap_.test(ALTER_PRIV);} |
| bool hasDropPriv() const {return schemaPrivBitmap_.test(DROP_PRIV) || objectBitmap_.test(DROP_PRIV);} |
| bool hasAllObjectPriv() const {return objectBitmap_.all();} |
| bool hasAnyObjectPriv() const {return objectBitmap_.any();} |
| bool hasPriv(PrivType which) const |
| { |
| bool hasPriv = false; |
| switch (which) |
| { |
| case SELECT_PRIV: |
| hasPriv = hasSelectPriv(); |
| break; |
| case INSERT_PRIV: |
| hasPriv = hasInsertPriv(); |
| break; |
| case DELETE_PRIV: |
| hasPriv = hasDeletePriv(); |
| break; |
| case UPDATE_PRIV: |
| hasPriv = hasUpdatePriv(); |
| break; |
| case USAGE_PRIV: |
| hasPriv = hasUsagePriv(); |
| break; |
| case REFERENCES_PRIV: |
| hasPriv = hasReferencePriv(); |
| break; |
| case EXECUTE_PRIV: |
| hasPriv = hasExecutePriv(); |
| break; |
| |
| // other privileges defined in the PrivType enum are not yet supported |
| default: |
| hasPriv = false; |
| } |
| return hasPriv; |
| } |
| |
| bool hasObjectPriv(PrivType which) const |
| { |
| bool hasPriv = false; |
| switch (which) |
| { |
| case SELECT_PRIV: |
| hasPriv = hasObjectSelectPriv(); |
| break; |
| case INSERT_PRIV: |
| hasPriv = hasObjectInsertPriv(); |
| break; |
| case DELETE_PRIV: |
| hasPriv = hasObjectDeletePriv(); |
| break; |
| case UPDATE_PRIV: |
| hasPriv = hasObjectUpdatePriv(); |
| break; |
| case USAGE_PRIV: |
| hasPriv = hasObjectUsagePriv(); |
| break; |
| case REFERENCES_PRIV: |
| hasPriv = hasObjectReferencePriv(); |
| break; |
| case EXECUTE_PRIV: |
| hasPriv = hasObjectExecutePriv(); |
| break; |
| |
| // other privileges defined in the PrivType enum are not yet supported |
| default: |
| hasPriv = false; |
| } |
| return hasPriv; |
| } |
| |
| bool hasAllDMLPriv() const |
| { |
| return (hasSelectPriv() && |
| hasInsertPriv() && |
| hasDeletePriv() && |
| hasUpdatePriv() && |
| hasReferencePriv()); |
| } |
| |
| bool hasAllLibraryPriv() const |
| { return (hasUpdatePriv() && hasUsagePriv()); } |
| |
| bool hasAllUdrPriv() const |
| { return hasExecutePriv(); } |
| |
| bool hasAllDDLPriv() const |
| {return (hasCreatePriv() && hasAlterPriv() && hasDropPriv());} |
| |
| bool hasWGOOption(PrivType privType) const |
| {return grantableBitmap_.test(privType);} |
| |
| bool hasColSelectPriv(const int32_t ordinal) const {return hasColPriv(SELECT_PRIV,ordinal);} |
| bool hasColInsertPriv(const int32_t ordinal) const {return hasColPriv(INSERT_PRIV,ordinal);} |
| bool hasColUpdatePriv(const int32_t ordinal) const {return hasColPriv(UPDATE_PRIV,ordinal);} |
| bool hasColReferencePriv(const int32_t ordinal) const {return hasColPriv(REFERENCES_PRIV,ordinal);} |
| bool hasAnyColPriv() const |
| { |
| return (!colPrivsList_.empty()); |
| } |
| |
| bool hasAnyColPriv(const PrivType privType) const |
| { |
| |
| PrivColIterator columnIterator; |
| for (columnIterator = colPrivsList_.begin(); |
| columnIterator != colPrivsList_.end(); ++columnIterator) |
| { |
| if (columnIterator->second.test(privType)) |
| return true; |
| |
| } |
| |
| return false; |
| } |
| |
| |
| bool hasColPriv(PrivType privType,const int32_t ordinal) const |
| { |
| // If no privileges for that column, return false. |
| if (colPrivsList_.count(ordinal) <= 0) |
| return false; |
| |
| switch (privType) |
| { |
| case SELECT_PRIV: |
| case INSERT_PRIV: |
| case REFERENCES_PRIV: |
| case UPDATE_PRIV: |
| { |
| PrivColIterator columnIterator = colPrivsList_.find(ordinal); |
| if (columnIterator == colPrivsList_.end()) |
| return false; |
| |
| return columnIterator->second.test(privType); |
| break; |
| } |
| // other privileges not column privs |
| default: |
| return false; |
| } |
| return false; |
| } |
| |
| PrivColList & getColPrivList() {return colPrivsList_;} |
| void setColPrivList(PrivColList colPrivsList) |
| {colPrivsList_ = colPrivsList;} |
| |
| PrivColList & getColGrantableList() {return colGrantableList_;} |
| void setColGrantableList(PrivColList colGrantableList) |
| {colGrantableList_ = colGrantableList;} |
| |
| PrivColumnBitmap getColumnPrivBitmap(const int32_t ordinal) |
| { |
| if (colPrivsList_.empty() || colPrivsList_.count(ordinal) == 0) |
| return emptyBitmap_; |
| |
| return colPrivsList_[ordinal]; |
| } |
| |
| PrivColumnBitmap getColumnGrantableBitmap(const int32_t ordinal) |
| { |
| if (colGrantableList_.empty() || colGrantableList_.count(ordinal) == 0) |
| return emptyBitmap_; |
| |
| return colGrantableList_[ordinal]; |
| } |
| |
| PrivMgrBitmap getObjectBitmap() {return objectBitmap_;} |
| void setObjectBitmap (PrivMgrBitmap objectBitmap) |
| {objectBitmap_ = objectBitmap;} |
| |
| PrivMgrBitmap getGrantableBitmap() {return grantableBitmap_;} |
| void setGrantableBitmap (PrivMgrBitmap grantableBitmap) |
| {grantableBitmap_ = grantableBitmap;} |
| |
| void setOwnerDefaultPrivs() |
| { objectBitmap_.set(); grantableBitmap_.set(); } |
| |
| PrivSchemaBitmap getSchemaPrivBitmap() {return schemaPrivBitmap_;} |
| void setSchemaPrivBitmap (PrivSchemaBitmap schemaPrivBitmap) |
| {schemaPrivBitmap_ = schemaPrivBitmap;} |
| |
| PrivSchemaBitmap getSchemaGrantableBitmap() {return schemaGrantableBitmap_;} |
| void setSchemaGrantableBitmap (PrivSchemaBitmap schemaGrantableBitmap) |
| {schemaGrantableBitmap_ = schemaGrantableBitmap;} |
| |
| bool getHasPublicPriv() { return hasPublicPriv_; } |
| void setHasPublicPriv(bool hasPublicPriv) {hasPublicPriv_ = hasPublicPriv;} |
| void initUserPrivs (PrivMgrDesc &privsOfTheGrantor); |
| bool initUserPrivs ( const std::vector<int32_t> &roleIDs, |
| const TrafDesc *priv_desc, |
| const int32_t userID, |
| const int64_t objectUID, |
| NASet<ComSecurityKey> & secKeySet); |
| |
| private: |
| PrivObjectBitmap objectBitmap_; |
| PrivObjectBitmap grantableBitmap_; |
| PrivColList colPrivsList_; |
| PrivColList colGrantableList_; |
| PrivSchemaBitmap schemaPrivBitmap_; |
| PrivSchemaBitmap schemaGrantableBitmap_; |
| PrivColumnBitmap emptyBitmap_; |
| bool hasPublicPriv_; |
| }; |
| |
| #endif |
| |