woodpecker/server/datastore/perm.go
2014-09-28 18:36:24 -07:00

80 lines
2 KiB
Go

package datastore
import (
"code.google.com/p/go.net/context"
"github.com/drone/drone/shared/model"
)
type Permstore interface {
// GetPerm retrieves the User's permission from
// the datastore for the given repository.
GetPerm(user *model.User, repo *model.Repo) (*model.Perm, error)
// PostPerm saves permission in the datastore.
PostPerm(perm *model.Perm) error
// PutPerm saves permission in the datastore.
PutPerm(perm *model.Perm) error
// DelPerm removes permission from the datastore.
DelPerm(perm *model.Perm) error
}
// GetPerm retrieves the User's permission from
// the datastore for the given repository.
func GetPerm(c context.Context, user *model.User, repo *model.Repo) (*model.Perm, error) {
// if the user is a gues they should only be granted
// read access to public repositories.
switch {
case user == nil && repo.Private:
return &model.Perm{
Guest: true,
Read: false,
Write: false,
Admin: false}, nil
case user == nil && !repo.Private:
return &model.Perm{
Guest: true,
Read: true,
Write: false,
Admin: false}, nil
}
// if the user is authenticated we'll retireive the
// permission details from the database.
perm, err := FromContext(c).GetPerm(user, repo)
if err == nil && perm.ID != 0 {
return perm, err
}
switch {
// if the user is a system admin grant super access.
case user.Admin == true:
perm.Read = true
perm.Write = true
perm.Admin = true
perm.Guest = true
// if the repo is public, grant read access only.
case repo.Private == false:
perm.Read = true
perm.Guest = true
}
return perm, err
}
// PostPerm saves permission in the datastore.
func PostPerm(c context.Context, perm *model.Perm) error {
return FromContext(c).PostPerm(perm)
}
// PutPerm saves permission in the datastore.
func PutPerm(c context.Context, perm *model.Perm) error {
return FromContext(c).PutPerm(perm)
}
// DelPerm removes permission from the datastore.
func DelPerm(c context.Context, perm *model.Perm) error {
return FromContext(c).DelPerm(perm)
}