// NewKey creates a new key. // kind cannot be empty. // Either one or both of stringID and intID must be zero. If both are zero, // the key returned is incomplete. // parent must either be a complete key or nil. func NewKey(c appengine.Context, kind, stringID string, intID int64, parent *Key) *Key { // If there's a parent key, use its namespace. // Otherwise, do a fake RPC to try to get a namespace if c is a namespacedContext (or wraps one). var namespace string if parent != nil { namespace = parent.namespace } else { namespace = internal.VirtAPI(c, "GetNamespace") } return &Key{ kind: kind, stringID: stringID, intID: intID, parent: parent, appID: c.FullyQualifiedAppID(), namespace: namespace, } }
// Current returns the currently logged-in user, // or nil if the user is not signed in. func Current(c appengine.Context) *User { u := &User{ Email: internal.VirtAPI(c, "user:Email"), AuthDomain: internal.VirtAPI(c, "user:AuthDomain"), ID: internal.VirtAPI(c, "user:ID"), Admin: internal.VirtAPI(c, "user:IsAdmin") == "1", FederatedIdentity: internal.VirtAPI(c, "user:FederatedIdentity"), FederatedProvider: internal.VirtAPI(c, "user:FederatedProvider"), } if u.Email == "" && u.FederatedIdentity == "" { return nil } return u }
func newAddReq(c appengine.Context, task *Task, queueName string) (*pb.TaskQueueAddRequest, error) { if queueName == "" { queueName = "default" } eta := task.ETA if eta.IsZero() { eta = time.Now().Add(task.Delay) } else if task.Delay != 0 { panic("taskqueue: both Delay and ETA are set") } req := &pb.TaskQueueAddRequest{ QueueName: []byte(queueName), TaskName: []byte(task.Name), EtaUsec: proto.Int64(eta.UnixNano() / 1e3), } method := task.method() if method == "PULL" { // Pull-based task req.Body = task.Payload req.Mode = pb.TaskQueueMode_PULL.Enum() if task.Tag != "" { req.Tag = []byte(task.Tag) } } else { // HTTP-based task if v, ok := pb.TaskQueueAddRequest_RequestMethod_value[method]; ok { req.Method = pb.TaskQueueAddRequest_RequestMethod(v).Enum() } else { return nil, fmt.Errorf("taskqueue: bad method %q", method) } req.Url = []byte(task.Path) for k, vs := range task.Header { for _, v := range vs { req.Header = append(req.Header, &pb.TaskQueueAddRequest_Header{ Key: []byte(k), Value: []byte(v), }) } } if method == "POST" || method == "PUT" { req.Body = task.Payload } // Namespace headers. if _, ok := task.Header[currentNamespace]; !ok { // Fetch the current namespace of this request. ns := internal.VirtAPI(c, "GetNamespace") req.Header = append(req.Header, &pb.TaskQueueAddRequest_Header{ Key: []byte(currentNamespace), Value: []byte(ns), }) } if _, ok := task.Header[defaultNamespace]; !ok { // Fetch the X-AppEngine-Default-Namespace header of this request. if ns := internal.VirtAPI(c, "GetDefaultNamespace"); ns != "" { req.Header = append(req.Header, &pb.TaskQueueAddRequest_Header{ Key: []byte(defaultNamespace), Value: []byte(ns), }) } } } if task.RetryOptions != nil { req.RetryParameters = task.RetryOptions.toRetryParameters() } return req, nil }
// IsAdmin returns true if the current user is signed in and // is currently registered as an administrator of the application. func IsAdmin(c appengine.Context) bool { return internal.VirtAPI(c, "user:IsAdmin") == "1" }