268 lines
7.6 KiB
Go
268 lines
7.6 KiB
Go
// Copyright 2024 Dolthub, Inc.
|
|
//
|
|
// Licensed 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.
|
|
|
|
package auth
|
|
|
|
// Privilege represents some permission for a database object.
|
|
// https://www.postgresql.org/docs/15/ddl-priv.html
|
|
type Privilege string
|
|
|
|
const (
|
|
Privilege_SELECT = "r"
|
|
Privilege_INSERT = "a"
|
|
Privilege_UPDATE = "w"
|
|
Privilege_DELETE = "d"
|
|
Privilege_TRUNCATE = "D"
|
|
Privilege_REFERENCES = "x"
|
|
Privilege_TRIGGER = "t"
|
|
Privilege_CREATE = "C"
|
|
Privilege_CONNECT = "c"
|
|
Privilege_TEMPORARY = "T"
|
|
Privilege_EXECUTE = "X"
|
|
Privilege_USAGE = "U"
|
|
Privilege_SET = "s"
|
|
Privilege_ALTER_SYSTEM = "A"
|
|
Privilege_DROP = "Y"
|
|
)
|
|
|
|
// PrivilegeObject is the database object that privileges are applied to.
|
|
// https://www.postgresql.org/docs/15/ddl-priv.html
|
|
type PrivilegeObject byte
|
|
|
|
const (
|
|
PrivilegeObject_DATABASE PrivilegeObject = iota
|
|
PrivilegeObject_DOMAIN
|
|
PrivilegeObject_FUNCTION // Also applies to procedures and routines
|
|
PrivilegeObject_FOREIGN_DATA_WRAPPER
|
|
PrivilegeObject_FOREIGN_SERVER
|
|
PrivilegeObject_LANGUAGE
|
|
PrivilegeObject_LARGE_OBJECT
|
|
PrivilegeObject_PARAMETER
|
|
PrivilegeObject_SCHEMA
|
|
PrivilegeObject_SEQUENCE
|
|
PrivilegeObject_TABLE
|
|
PrivilegeObject_TABLE_COLUMN
|
|
PrivilegeObject_TABLESPACE
|
|
PrivilegeObject_TYPE
|
|
)
|
|
|
|
// GrantedPrivilege specifies details.
|
|
type GrantedPrivilege struct {
|
|
Privilege
|
|
GrantedBy RoleID
|
|
}
|
|
|
|
// GetAllPrivileges returns every Privilege.
|
|
func GetAllPrivileges() []Privilege {
|
|
return []Privilege{
|
|
Privilege_SELECT,
|
|
Privilege_INSERT,
|
|
Privilege_UPDATE,
|
|
Privilege_DELETE,
|
|
Privilege_TRUNCATE,
|
|
Privilege_REFERENCES,
|
|
Privilege_TRIGGER,
|
|
Privilege_CREATE,
|
|
Privilege_CONNECT,
|
|
Privilege_TEMPORARY,
|
|
Privilege_EXECUTE,
|
|
Privilege_USAGE,
|
|
Privilege_SET,
|
|
Privilege_ALTER_SYSTEM,
|
|
Privilege_DROP,
|
|
}
|
|
}
|
|
|
|
// GetAllPrivilegeObjects returns every PrivilegeObject.
|
|
func GetAllPrivilegeObjects() []PrivilegeObject {
|
|
return []PrivilegeObject{
|
|
PrivilegeObject_DATABASE,
|
|
PrivilegeObject_DOMAIN,
|
|
PrivilegeObject_FUNCTION,
|
|
PrivilegeObject_FOREIGN_DATA_WRAPPER,
|
|
PrivilegeObject_FOREIGN_SERVER,
|
|
PrivilegeObject_LANGUAGE,
|
|
PrivilegeObject_LARGE_OBJECT,
|
|
PrivilegeObject_PARAMETER,
|
|
PrivilegeObject_SCHEMA,
|
|
PrivilegeObject_SEQUENCE,
|
|
PrivilegeObject_TABLE,
|
|
PrivilegeObject_TABLE_COLUMN,
|
|
PrivilegeObject_TABLESPACE,
|
|
PrivilegeObject_TYPE,
|
|
}
|
|
}
|
|
|
|
// ACLAbbreviation returns the name of the privilege using the Access Control List abbreviation.
|
|
func (p Privilege) ACLAbbreviation() string {
|
|
return string(p)
|
|
}
|
|
|
|
// String returns the name of the privilege (uppercased).
|
|
func (p Privilege) String() string {
|
|
switch p {
|
|
case Privilege_SELECT:
|
|
return "SELECT"
|
|
case Privilege_INSERT:
|
|
return "INSERT"
|
|
case Privilege_UPDATE:
|
|
return "UPDATE"
|
|
case Privilege_DELETE:
|
|
return "DELETE"
|
|
case Privilege_TRUNCATE:
|
|
return "TRUNCATE"
|
|
case Privilege_REFERENCES:
|
|
return "REFERENCES"
|
|
case Privilege_TRIGGER:
|
|
return "TRIGGER"
|
|
case Privilege_CREATE:
|
|
return "CREATE"
|
|
case Privilege_CONNECT:
|
|
return "CONNECT"
|
|
case Privilege_TEMPORARY:
|
|
return "TEMPORARY"
|
|
case Privilege_EXECUTE:
|
|
return "EXECUTE"
|
|
case Privilege_USAGE:
|
|
return "USAGE"
|
|
case Privilege_SET:
|
|
return "SET"
|
|
case Privilege_ALTER_SYSTEM:
|
|
return "ALTER SYSTEM"
|
|
case Privilege_DROP:
|
|
return "DROP"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// AllPrivileges returns all valid privileges that may be applied to this object.
|
|
func (po PrivilegeObject) AllPrivileges() []Privilege {
|
|
switch po {
|
|
case PrivilegeObject_DATABASE:
|
|
return []Privilege{Privilege_CREATE, Privilege_TEMPORARY, Privilege_CONNECT, Privilege_DROP}
|
|
case PrivilegeObject_DOMAIN:
|
|
return []Privilege{Privilege_USAGE, Privilege_DROP}
|
|
case PrivilegeObject_FUNCTION:
|
|
return []Privilege{Privilege_EXECUTE, Privilege_DROP}
|
|
case PrivilegeObject_FOREIGN_DATA_WRAPPER:
|
|
return []Privilege{Privilege_USAGE, Privilege_DROP}
|
|
case PrivilegeObject_FOREIGN_SERVER:
|
|
return []Privilege{Privilege_USAGE, Privilege_DROP}
|
|
case PrivilegeObject_LANGUAGE:
|
|
return []Privilege{Privilege_USAGE, Privilege_DROP}
|
|
case PrivilegeObject_LARGE_OBJECT:
|
|
return []Privilege{Privilege_SELECT, Privilege_UPDATE, Privilege_DROP}
|
|
case PrivilegeObject_PARAMETER:
|
|
return []Privilege{Privilege_SET, Privilege_ALTER_SYSTEM, Privilege_DROP}
|
|
case PrivilegeObject_SCHEMA:
|
|
return []Privilege{Privilege_USAGE, Privilege_CREATE, Privilege_DROP}
|
|
case PrivilegeObject_SEQUENCE:
|
|
return []Privilege{Privilege_SELECT, Privilege_UPDATE, Privilege_USAGE, Privilege_DROP}
|
|
case PrivilegeObject_TABLE:
|
|
return []Privilege{Privilege_INSERT, Privilege_SELECT, Privilege_UPDATE, Privilege_DELETE, Privilege_TRUNCATE, Privilege_REFERENCES, Privilege_TRIGGER, Privilege_DROP}
|
|
case PrivilegeObject_TABLE_COLUMN:
|
|
return []Privilege{Privilege_INSERT, Privilege_SELECT, Privilege_UPDATE, Privilege_REFERENCES, Privilege_DROP}
|
|
case PrivilegeObject_TABLESPACE:
|
|
return []Privilege{Privilege_CREATE, Privilege_DROP}
|
|
case PrivilegeObject_TYPE:
|
|
return []Privilege{Privilege_USAGE, Privilege_DROP}
|
|
default:
|
|
panic("unknown privilege object")
|
|
}
|
|
}
|
|
|
|
// DefaultPublicPrivileges return the default PUBLIC privileges for this object.
|
|
func (po PrivilegeObject) DefaultPublicPrivileges() []Privilege {
|
|
switch po {
|
|
case PrivilegeObject_DATABASE:
|
|
return []Privilege{Privilege_TEMPORARY, Privilege_CONNECT}
|
|
case PrivilegeObject_DOMAIN:
|
|
return []Privilege{Privilege_USAGE}
|
|
case PrivilegeObject_FUNCTION:
|
|
return []Privilege{Privilege_EXECUTE}
|
|
case PrivilegeObject_FOREIGN_DATA_WRAPPER:
|
|
return nil
|
|
case PrivilegeObject_FOREIGN_SERVER:
|
|
return nil
|
|
case PrivilegeObject_LANGUAGE:
|
|
return []Privilege{Privilege_USAGE}
|
|
case PrivilegeObject_LARGE_OBJECT:
|
|
return nil
|
|
case PrivilegeObject_PARAMETER:
|
|
return nil
|
|
case PrivilegeObject_SCHEMA:
|
|
return nil
|
|
case PrivilegeObject_SEQUENCE:
|
|
return nil
|
|
case PrivilegeObject_TABLE:
|
|
return nil
|
|
case PrivilegeObject_TABLE_COLUMN:
|
|
return nil
|
|
case PrivilegeObject_TABLESPACE:
|
|
return nil
|
|
case PrivilegeObject_TYPE:
|
|
return []Privilege{Privilege_USAGE}
|
|
default:
|
|
panic("unknown privilege object")
|
|
}
|
|
}
|
|
|
|
// IsValid returns whether the given Privilege is valid for the PrivilegeObject, as not all privileges are valid for all
|
|
// objects.
|
|
func (po PrivilegeObject) IsValid(privilege Privilege) bool {
|
|
for _, poPriv := range po.AllPrivileges() {
|
|
if privilege == poPriv {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// String returns the name of the privilege (uppercased).
|
|
func (po PrivilegeObject) String() string {
|
|
switch po {
|
|
case PrivilegeObject_DATABASE:
|
|
return "DATABASE"
|
|
case PrivilegeObject_DOMAIN:
|
|
return "DOMAIN"
|
|
case PrivilegeObject_FUNCTION:
|
|
return "FUNCTION"
|
|
case PrivilegeObject_FOREIGN_DATA_WRAPPER:
|
|
return "FOREIGN DATA WRAPPER"
|
|
case PrivilegeObject_FOREIGN_SERVER:
|
|
return "FOREIGN SERVER"
|
|
case PrivilegeObject_LANGUAGE:
|
|
return "LANGUAGE"
|
|
case PrivilegeObject_LARGE_OBJECT:
|
|
return "LARGE_OBJECT"
|
|
case PrivilegeObject_PARAMETER:
|
|
return "PARAMETER"
|
|
case PrivilegeObject_SCHEMA:
|
|
return "SCHEMA"
|
|
case PrivilegeObject_SEQUENCE:
|
|
return "SEQUENCE"
|
|
case PrivilegeObject_TABLE:
|
|
return "TABLE"
|
|
case PrivilegeObject_TABLE_COLUMN:
|
|
return "TABLE COLUMN"
|
|
case PrivilegeObject_TABLESPACE:
|
|
return "TABLESPACE"
|
|
case PrivilegeObject_TYPE:
|
|
return "TYPE"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|