github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/controlleruser.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  	"time"
    10  
    11  	"github.com/juju/errors"
    12  	"gopkg.in/juju/names.v2"
    13  	"gopkg.in/mgo.v2"
    14  	"gopkg.in/mgo.v2/txn"
    15  
    16  	"github.com/juju/juju/permission"
    17  )
    18  
    19  const defaultControllerPermission = permission.LoginAccess
    20  
    21  // setAccess changes the user's access permissions on the controller.
    22  func (st *State) setControllerAccess(access permission.Access, userGlobalKey string) error {
    23  	if err := permission.ValidateControllerAccess(access); err != nil {
    24  		return errors.Trace(err)
    25  	}
    26  	op := updatePermissionOp(controllerKey(st.ControllerUUID()), userGlobalKey, access)
    27  
    28  	err := st.runTransaction([]txn.Op{op})
    29  	if err == txn.ErrAborted {
    30  		return errors.NotFoundf("existing permissions")
    31  	}
    32  	return errors.Trace(err)
    33  }
    34  
    35  // controllerUser a model userAccessDoc.
    36  func (st *State) controllerUser(user names.UserTag) (userAccessDoc, error) {
    37  	controllerUser := userAccessDoc{}
    38  	controllerUsers, closer := st.getCollection(controllerUsersC)
    39  	defer closer()
    40  
    41  	username := strings.ToLower(user.Canonical())
    42  	err := controllerUsers.FindId(username).One(&controllerUser)
    43  	if err == mgo.ErrNotFound {
    44  		return userAccessDoc{}, errors.NotFoundf("controller user %q", user.Canonical())
    45  	}
    46  	// DateCreated is inserted as UTC, but read out as local time. So we
    47  	// convert it back to UTC here.
    48  	controllerUser.DateCreated = controllerUser.DateCreated.UTC()
    49  	return controllerUser, nil
    50  }
    51  
    52  func createControllerUserOps(controllerUUID string, user, createdBy names.UserTag, displayName string, dateCreated time.Time, access permission.Access) []txn.Op {
    53  	creatorname := createdBy.Canonical()
    54  	doc := &userAccessDoc{
    55  		ID:          userAccessID(user),
    56  		ObjectUUID:  controllerUUID,
    57  		UserName:    user.Canonical(),
    58  		DisplayName: displayName,
    59  		CreatedBy:   creatorname,
    60  		DateCreated: dateCreated,
    61  	}
    62  	ops := []txn.Op{
    63  		createPermissionOp(controllerKey(controllerUUID), userGlobalKey(userAccessID(user)), access),
    64  		{
    65  			C:      controllerUsersC,
    66  			Id:     userAccessID(user),
    67  			Assert: txn.DocMissing,
    68  			Insert: doc,
    69  		},
    70  	}
    71  	return ops
    72  }
    73  
    74  func removeControllerUserOps(controllerUUID string, user names.UserTag) []txn.Op {
    75  	return []txn.Op{
    76  		removePermissionOp(controllerKey(controllerUUID), userGlobalKey(userAccessID(user))),
    77  		{
    78  			C:      controllerUsersC,
    79  			Id:     userAccessID(user),
    80  			Assert: txn.DocExists,
    81  			Remove: true,
    82  		}}
    83  
    84  }
    85  
    86  // RemoveControllerUser removes a user from the database.
    87  func (st *State) removeControllerUser(user names.UserTag) error {
    88  	ops := removeControllerUserOps(st.ControllerUUID(), user)
    89  	err := st.runTransaction(ops)
    90  	if err == txn.ErrAborted {
    91  		err = errors.NewNotFound(nil, fmt.Sprintf("controller user %q does not exist", user.Canonical()))
    92  	}
    93  	if err != nil {
    94  		return errors.Trace(err)
    95  	}
    96  	return nil
    97  }