~juju-qa/ubuntu/xenial/juju/2.0-rc2

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/permission/access.go

  • Committer: Nicholas Skaggs
  • Date: 2016-09-30 14:39:30 UTC
  • mfrom: (1.8.1)
  • Revision ID: nicholas.skaggs@canonical.com-20160930143930-vwwhrefh6ftckccy
import upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2016 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package permission
 
5
 
 
6
import (
 
7
        "github.com/juju/errors"
 
8
        "github.com/juju/schema"
 
9
)
 
10
 
 
11
// Access represents a level of access.
 
12
type Access string
 
13
 
 
14
const (
 
15
        // UndefinedAccess is not a valid access type. It is the value
 
16
        // used when access is not defined at all.
 
17
        UndefinedAccess Access = ""
 
18
 
 
19
        // Model Permissions
 
20
 
 
21
        // ReadAccess allows a user to read information about a permission subject,
 
22
        // without being able to make any changes.
 
23
        ReadAccess Access = "read"
 
24
 
 
25
        // WriteAccess allows a user to make changes to a permission subject.
 
26
        WriteAccess Access = "write"
 
27
 
 
28
        // AdminAccess allows a user full control over the subject.
 
29
        AdminAccess Access = "admin"
 
30
 
 
31
        // Controller permissions
 
32
 
 
33
        // LoginAccess allows a user to log-ing into the subject.
 
34
        LoginAccess Access = "login"
 
35
 
 
36
        // AddModelAccess allows user to add new models in subjects supporting it.
 
37
        AddModelAccess Access = "addmodel"
 
38
 
 
39
        // SuperuserAccess allows user unrestricted permissions in the subject.
 
40
        SuperuserAccess Access = "superuser"
 
41
)
 
42
 
 
43
// Validate returns error if the current is not a valid access level.
 
44
func (a Access) Validate() error {
 
45
        switch a {
 
46
        case UndefinedAccess, AdminAccess, ReadAccess, WriteAccess,
 
47
                LoginAccess, AddModelAccess, SuperuserAccess:
 
48
                return nil
 
49
        }
 
50
        return errors.NotValidf("access level %s", a)
 
51
}
 
52
 
 
53
// ValidateModelAccess returns error if the passed access is not a valid
 
54
// model access level.
 
55
func ValidateModelAccess(access Access) error {
 
56
        switch access {
 
57
        case ReadAccess, WriteAccess, AdminAccess:
 
58
                return nil
 
59
        }
 
60
        return errors.NotValidf("%q model access", access)
 
61
}
 
62
 
 
63
//ValidateControllerAccess returns error if the passed access is not a valid
 
64
// controller access level.
 
65
func ValidateControllerAccess(access Access) error {
 
66
        switch access {
 
67
        case LoginAccess, AddModelAccess, SuperuserAccess:
 
68
                return nil
 
69
        }
 
70
        return errors.NotValidf("%q controller access", access)
 
71
}
 
72
 
 
73
// EqualOrGreaterModelAccessThan returns true if the provided access is equal or
 
74
// less than the current.
 
75
func (a Access) EqualOrGreaterModelAccessThan(access Access) bool {
 
76
        if a == access {
 
77
                return true
 
78
        }
 
79
        switch a {
 
80
        case UndefinedAccess:
 
81
                return false
 
82
        case ReadAccess:
 
83
                return access == UndefinedAccess
 
84
        case WriteAccess:
 
85
                return access == ReadAccess ||
 
86
                        access == UndefinedAccess
 
87
        case AdminAccess, SuperuserAccess:
 
88
                return access == ReadAccess ||
 
89
                        access == WriteAccess
 
90
        }
 
91
        return false
 
92
}
 
93
 
 
94
// EqualOrGreaterControllerAccessThan returns true if the provided access is equal or
 
95
// less than the current.
 
96
func (a Access) EqualOrGreaterControllerAccessThan(access Access) bool {
 
97
        if a == access {
 
98
                return true
 
99
        }
 
100
        switch a {
 
101
        case UndefinedAccess:
 
102
                return false
 
103
        case LoginAccess:
 
104
                return access == UndefinedAccess
 
105
        case AddModelAccess:
 
106
                return access == UndefinedAccess ||
 
107
                        access == LoginAccess
 
108
        case SuperuserAccess:
 
109
                return access == UndefinedAccess ||
 
110
                        access == LoginAccess ||
 
111
                        access == AddModelAccess
 
112
        }
 
113
        return false
 
114
}
 
115
 
 
116
// accessField returns a Checker that accepts a string value only
 
117
// and returns a valid Access or an error.
 
118
func accessField() schema.Checker {
 
119
        return accessC{}
 
120
}
 
121
 
 
122
type accessC struct{}
 
123
 
 
124
func (c accessC) Coerce(v interface{}, path []string) (interface{}, error) {
 
125
        s := schema.String()
 
126
        in, err := s.Coerce(v, path)
 
127
        if err != nil {
 
128
                return nil, err
 
129
        }
 
130
        access := Access(in.(string))
 
131
        if err := access.Validate(); err != nil {
 
132
                return nil, errors.Trace(err)
 
133
        }
 
134
        return access, nil
 
135
}