Chromium Code Reviews| Index: appengine/logdog/coordinator/context.go |
| diff --git a/appengine/logdog/coordinator/context.go b/appengine/logdog/coordinator/context.go |
| index 6ca78c5af37332f33b7ed1c436cfaefc12da72d3..2d87cff0e4c82f1239726672b085c6c36c879d12 100644 |
| --- a/appengine/logdog/coordinator/context.go |
| +++ b/appengine/logdog/coordinator/context.go |
| @@ -13,6 +13,26 @@ import ( |
| "golang.org/x/net/context" |
| ) |
| +// NamespaceAccessType specifies the type of namespace access that is being |
| +// requested for WithProjectNamespace. |
| +type NamespaceAccessType int |
| + |
| +const ( |
| + // NamespaceAccessNoAuth grants unconditional access to a project's namespace. |
|
nodir
2016/05/19 16:43:17
please clarify that this simply skips the check
dnj (Google)
2016/05/19 22:52:04
Done.
|
| + // |
| + // This must only be used by endpoints that enforce admin- or service-only |
| + // access. |
| + NamespaceAccessNoAuth NamespaceAccessType = iota |
| + |
| + // NamespaceAccessREAD enforces READ permission access to a project's |
| + // namespace. |
| + NamespaceAccessREAD |
| + |
| + // NamespaceAccessWRITE enforces WRITE permission access to a project's |
| + // namespace. |
| + NamespaceAccessWRITE |
| +) |
| + |
| type servicesKeyType int |
| // WithServices installs the supplied Services instance into a Context. |
| @@ -38,20 +58,7 @@ func GetServices(c context.Context) Services { |
| // |
| // If the current user does not have READ permission for the project, a |
| // MembershipError will be returned. |
|
nodir
2016/05/19 16:43:17
this comment needs an update
dnj (Google)
2016/05/19 22:52:04
Done.
|
| -func WithProjectNamespace(c *context.Context, project luciConfig.ProjectName) error { |
| - return withProjectNamespaceImpl(c, project, true) |
| -} |
| - |
| -// WithProjectNamespaceNoAuth sets the current namespace to the project name. It |
| -// does NOT assert that the current user has project access. This should only be |
| -// used for service functions that are not acting on behalf of a user. |
| -// |
| -// It will fail if the project name is invalid. |
| -func WithProjectNamespaceNoAuth(c *context.Context, project luciConfig.ProjectName) error { |
| - return withProjectNamespaceImpl(c, project, false) |
| -} |
| - |
| -func withProjectNamespaceImpl(c *context.Context, project luciConfig.ProjectName, auth bool) error { |
| +func WithProjectNamespace(c *context.Context, project luciConfig.ProjectName, at NamespaceAccessType) error { |
| // TODO(dnj): REQUIRE this to be non-empty once namespacing is mandatory. |
| if project == "" { |
| return nil |
| @@ -62,12 +69,25 @@ func withProjectNamespaceImpl(c *context.Context, project luciConfig.ProjectName |
| return err |
| } |
| - // Validate the user's READ access to the named project, if authenticating. |
| - if auth { |
| + // Validate the current user has the requested access. |
| + switch at { |
| + case NamespaceAccessNoAuth: |
| + break |
| + |
| + case NamespaceAccessREAD: |
| if err := IsProjectReader(*c, project); err != nil { |
| - log.WithError(err).Errorf(*c, "User cannot access requested project.") |
| + log.WithError(err).Errorf(*c, "User denied READ access to requested project.") |
| + return err |
| + } |
| + |
| + case NamespaceAccessWRITE: |
| + if err := IsProjectWriter(*c, project); err != nil { |
| + log.WithError(err).Errorf(*c, "User denied WRITE access to requested project.") |
| return err |
| } |
| + |
| + default: |
| + return fmt.Errorf("unknown access type: %v", at) |
| } |
| pns := ProjectNamespace(project) |