func (ul *unclaimedLock) Claim(ctx *context.T, call rpc.ServerCall, name string) (security.Blessings, error) { vlog.Infof("Claim called by %q", call.Security().RemoteBlessings()) if strings.ContainsAny(name, security.ChainSeparator) { // TODO(ataly, ashankar): We have to error out in this case because of the current // neighborhood setup wherein the neighborhood-name of a claimed lock's mounttable is // the same as the locks's name. Since neighborhood-names aren't allowed to contain // slashes, we have to disallow slashes in the lock name as well. return security.Blessings{}, NewErrInvalidLockName(ctx, name, security.ChainSeparator) } var ( principal = v23.GetPrincipal(ctx) origDefault, _ = principal.BlessingStore().Default() restore = func() error { // TODO(ataly): Remove roots of current default blessing if needed // (i.e., if current default != origDefault). if err := principal.BlessingStore().SetDefault(origDefault); err != nil { return verror.Convert(verror.ErrInternal, ctx, err) } return nil } ) defer ul.mu.Unlock() ul.mu.Lock() if ul.claimed == nil { return security.Blessings{}, NewErrLockAlreadyClaimed(ctx) } keyBlessing, err := ul.makeKey(principal, name, call.Security().RemoteBlessings().PublicKey()) if err != nil { restore() return security.Blessings{}, verror.Convert(verror.ErrInternal, ctx, err) } // Create a file in the config directory to indicate that lock has been claimed. f, err := os.Create(filepath.Join(ul.configDir, claimFileName)) if err != nil { restore() return security.Blessings{}, verror.Convert(verror.ErrInternal, ctx, err) } f.Close() close(ul.claimed) ul.claimed = nil vlog.Infof("Lock successfullly claimed with name %q", name) return keyBlessing, nil }
func ThrowSwiftError(ctx *context.T, err error, swiftVErrorStructPtr unsafe.Pointer) { id := verror.ErrorID(err) actionCode := verror.Action(err) vErr := verror.Convert(verror.IDAction{id, actionCode}, ctx, err) pcs := verror.Stack(vErr) stacktrace := pcs.String() msg := vErr.Error() var swiftErrorPtr *C.SwiftVError = (*C.SwiftVError)(swiftVErrorStructPtr) (*swiftErrorPtr).identity = C.CString((string)(id)) (*swiftErrorPtr).actionCode = C._GoUint32(actionCode) (*swiftErrorPtr).msg = C.CString(msg) (*swiftErrorPtr).stacktrace = C.CString(stacktrace) }
func (r *recvKeyService) Grant(ctx *context.T, call rpc.ServerCall, lockName string) error { key := call.GrantedBlessings() remoteBlessingNames, _ := security.RemoteBlessingNames(ctx, call.Security()) fmt.Printf("Received key %v for lock %v from user %v\n", key, lockName, vUser(remoteBlessingNames...)) if !r.confirmRecvKey() { return NewErrKeyRejected(ctx, fmt.Sprintf("%v", key), lockName) } if err := saveKeyForLock(ctx, key, lockName); err != nil { return verror.Convert(verror.ErrInternal, ctx, err) } fmt.Println("Key successfully saved") r.notify <- nil return nil }