package interfaces
import (
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/auth/user"
"k8s.io/kubernetes/pkg/util/sets"
authorizationapi "github.com/openshift/origin/pkg/authorization/api"
)
type Policy interface {
Name() string
Namespace() string
Roles() map[string]Role
}
type PolicyBinding interface {
Name() string
Namespace() string
PolicyRef() kapi.ObjectReference
RoleBindings() map[string]RoleBinding
}
type Role interface {
Name() string
Namespace() string
Rules() []authorizationapi.PolicyRule
}
type RoleBinding interface {
Name() string
Namespace() string
RoleRef() kapi.ObjectReference
Users() sets.String
Groups() sets.String
// AppliesToUser returns true if the provided user matches this role binding
AppliesToUser(user.Info) bool
}
func NewClusterPolicyAdapter(policy *authorizationapi.ClusterPolicy) Policy {
return ClusterPolicyAdapter{policy: policy}
}
func NewLocalPolicyAdapter(policy *authorizationapi.Policy) Policy {
return PolicyAdapter{policy: policy}
}
func NewClusterPolicyBindingAdapter(policyBinding *authorizationapi.ClusterPolicyBinding) PolicyBinding {
return ClusterPolicyBindingAdapter{policyBinding: policyBinding}
}
func NewLocalPolicyBindingAdapter(policyBinding *authorizationapi.PolicyBinding) PolicyBinding {
return PolicyBindingAdapter{policyBinding: policyBinding}
}
func NewClusterPolicyBindingAdapters(list *authorizationapi.ClusterPolicyBindingList) []PolicyBinding {
ret := make([]PolicyBinding, 0, len(list.Items))
for i := range list.Items {
ret = append(ret, NewClusterPolicyBindingAdapter(&list.Items[i]))
}
return ret
}
func NewLocalPolicyBindingAdapters(list *authorizationapi.PolicyBindingList) []PolicyBinding {
ret := make([]PolicyBinding, 0, len(list.Items))
for i := range list.Items {
ret = append(ret, NewLocalPolicyBindingAdapter(&list.Items[i]))
}
return ret
}
func NewClusterRoleBindingAdapter(roleBinding *authorizationapi.ClusterRoleBinding) RoleBinding {
return ClusterRoleBindingAdapter{roleBinding: roleBinding}
}
func NewLocalRoleBindingAdapter(roleBinding *authorizationapi.RoleBinding) RoleBinding {
return RoleBindingAdapter{roleBinding: roleBinding}
}
func NewClusterRoleAdapter(role *authorizationapi.ClusterRole) Role {
return ClusterRoleAdapter{role: role}
}
func NewLocalRoleAdapter(role *authorizationapi.Role) Role {
return RoleAdapter{role: role}
}
type PolicyAdapter struct {
policy *authorizationapi.Policy
adaptedRoles map[string]Role
}
func (a PolicyAdapter) Name() string {
return a.policy.Name
}
func (a PolicyAdapter) Namespace() string {
return a.policy.Namespace
}
func (a PolicyAdapter) Roles() map[string]Role {
if a.adaptedRoles == nil {
adaptedRoles := map[string]Role{}
for key := range a.policy.Roles {
adaptedRoles[key] = RoleAdapter{a.policy.Roles[key]}
}
a.adaptedRoles = adaptedRoles
}
return a.adaptedRoles
}
type RoleAdapter struct {
role *authorizationapi.Role
}
func (a RoleAdapter) Name() string {
return a.role.Name
}
func (a RoleAdapter) Namespace() string {
return a.role.Namespace
}
func (a RoleAdapter) Rules() []authorizationapi.PolicyRule {
return a.role.Rules
}
type ClusterPolicyAdapter struct {
policy *authorizationapi.ClusterPolicy
adaptedRoles map[string]Role
}
func (a ClusterPolicyAdapter) Name() string {
return a.policy.Name
}
func (a ClusterPolicyAdapter) Namespace() string {
return a.policy.Namespace
}
func (a ClusterPolicyAdapter) Roles() map[string]Role {
if a.adaptedRoles == nil {
adaptedRoles := map[string]Role{}
for key := range a.policy.Roles {
adaptedRoles[key] = ClusterRoleAdapter{a.policy.Roles[key]}
}
a.adaptedRoles = adaptedRoles
}
return a.adaptedRoles
}
type ClusterRoleAdapter struct {
role *authorizationapi.ClusterRole
}
func (a ClusterRoleAdapter) Name() string {
return a.role.Name
}
func (a ClusterRoleAdapter) Namespace() string {
return a.role.Namespace
}
func (a ClusterRoleAdapter) Rules() []authorizationapi.PolicyRule {
return a.role.Rules
}
type PolicyBindingAdapter struct {
policyBinding *authorizationapi.PolicyBinding
adaptedRoleBindings map[string]RoleBinding
}
func (a PolicyBindingAdapter) Name() string {
return a.policyBinding.Name
}
func (a PolicyBindingAdapter) Namespace() string {
return a.policyBinding.Namespace
}
func (a PolicyBindingAdapter) PolicyRef() kapi.ObjectReference {
return a.policyBinding.PolicyRef
}
func (a PolicyBindingAdapter) RoleBindings() map[string]RoleBinding {
if a.adaptedRoleBindings == nil {
adaptedRoleBindings := map[string]RoleBinding{}
for key := range a.policyBinding.RoleBindings {
adaptedRoleBindings[key] = RoleBindingAdapter{a.policyBinding.RoleBindings[key]}
}
a.adaptedRoleBindings = adaptedRoleBindings
}
return a.adaptedRoleBindings
}
type RoleBindingAdapter struct {
roleBinding *authorizationapi.RoleBinding
}
func (a RoleBindingAdapter) Name() string {
return a.roleBinding.Name
}
func (a RoleBindingAdapter) Namespace() string {
return a.roleBinding.Namespace
}
func (a RoleBindingAdapter) RoleRef() kapi.ObjectReference {
return a.roleBinding.RoleRef
}
func (a RoleBindingAdapter) Users() sets.String {
users, _ := authorizationapi.StringSubjectsFor(a.roleBinding.Namespace, a.roleBinding.Subjects)
return sets.NewString(users...)
}
func (a RoleBindingAdapter) Groups() sets.String {
_, groups := authorizationapi.StringSubjectsFor(a.roleBinding.Namespace, a.roleBinding.Subjects)
return sets.NewString(groups...)
}
// AppliesToUser returns true if this binding applies to the provided user.
func (a RoleBindingAdapter) AppliesToUser(user user.Info) bool {
if authorizationapi.SubjectsContainUser(a.roleBinding.Subjects, a.roleBinding.Namespace, user.GetName()) {
return true
}
if authorizationapi.SubjectsContainAnyGroup(a.roleBinding.Subjects, user.GetGroups()) {
return true
}
return false
}
type ClusterPolicyBindingAdapter struct {
policyBinding *authorizationapi.ClusterPolicyBinding
adaptedRoleBindings map[string]RoleBinding
}
func (a ClusterPolicyBindingAdapter) Name() string {
return a.policyBinding.Name
}
func (a ClusterPolicyBindingAdapter) Namespace() string {
return a.policyBinding.Namespace
}
func (a ClusterPolicyBindingAdapter) PolicyRef() kapi.ObjectReference {
return a.policyBinding.PolicyRef
}
func (a ClusterPolicyBindingAdapter) RoleBindings() map[string]RoleBinding {
if a.adaptedRoleBindings == nil {
adaptedRoleBindings := map[string]RoleBinding{}
for key := range a.policyBinding.RoleBindings {
adaptedRoleBindings[key] = ClusterRoleBindingAdapter{a.policyBinding.RoleBindings[key]}
}
a.adaptedRoleBindings = adaptedRoleBindings
}
return a.adaptedRoleBindings
}
type ClusterRoleBindingAdapter struct {
roleBinding *authorizationapi.ClusterRoleBinding
}
func (a ClusterRoleBindingAdapter) Name() string {
return a.roleBinding.Name
}
func (a ClusterRoleBindingAdapter) Namespace() string {
return a.roleBinding.Namespace
}
func (a ClusterRoleBindingAdapter) RoleRef() kapi.ObjectReference {
return a.roleBinding.RoleRef
}
func (a ClusterRoleBindingAdapter) Users() sets.String {
users, _ := authorizationapi.StringSubjectsFor(a.roleBinding.Namespace, a.roleBinding.Subjects)
return sets.NewString(users...)
}
func (a ClusterRoleBindingAdapter) Groups() sets.String {
_, groups := authorizationapi.StringSubjectsFor(a.roleBinding.Namespace, a.roleBinding.Subjects)
return sets.NewString(groups...)
}
// AppliesToUser returns true if this binding applies to the provided user.
func (a ClusterRoleBindingAdapter) AppliesToUser(user user.Info) bool {
if authorizationapi.SubjectsContainUser(a.roleBinding.Subjects, a.roleBinding.Namespace, user.GetName()) {
return true
}
if authorizationapi.SubjectsContainAnyGroup(a.roleBinding.Subjects, user.GetGroups()) {
return true
}
return false
}