Files
2026-07-13 12:32:25 +08:00

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"
}
}