|
- // Copyright 2011 Google Inc. All rights reserved.
- // Use of this source code is governed by the Apache 2.0
- // license that can be found in the LICENSE file.
-
- package appengine
-
- import (
- "time"
-
- "golang.org/x/net/context"
-
- "google.golang.org/appengine/internal"
- pb "google.golang.org/appengine/internal/app_identity"
- modpb "google.golang.org/appengine/internal/modules"
- )
-
- // AppID returns the application ID for the current application.
- // The string will be a plain application ID (e.g. "appid"), with a
- // domain prefix for custom domain deployments (e.g. "example.com:appid").
- func AppID(c context.Context) string { return internal.AppID(c) }
-
- // DefaultVersionHostname returns the standard hostname of the default version
- // of the current application (e.g. "my-app.appspot.com"). This is suitable for
- // use in constructing URLs.
- func DefaultVersionHostname(c context.Context) string {
- return internal.DefaultVersionHostname(c)
- }
-
- // ModuleName returns the module name of the current instance.
- func ModuleName(c context.Context) string {
- return internal.ModuleName(c)
- }
-
- // ModuleHostname returns a hostname of a module instance.
- // If module is the empty string, it refers to the module of the current instance.
- // If version is empty, it refers to the version of the current instance if valid,
- // or the default version of the module of the current instance.
- // If instance is empty, ModuleHostname returns the load-balancing hostname.
- func ModuleHostname(c context.Context, module, version, instance string) (string, error) {
- req := &modpb.GetHostnameRequest{}
- if module != "" {
- req.Module = &module
- }
- if version != "" {
- req.Version = &version
- }
- if instance != "" {
- req.Instance = &instance
- }
- res := &modpb.GetHostnameResponse{}
- if err := internal.Call(c, "modules", "GetHostname", req, res); err != nil {
- return "", err
- }
- return *res.Hostname, nil
- }
-
- // VersionID returns the version ID for the current application.
- // It will be of the form "X.Y", where X is specified in app.yaml,
- // and Y is a number generated when each version of the app is uploaded.
- // It does not include a module name.
- func VersionID(c context.Context) string { return internal.VersionID(c) }
-
- // InstanceID returns a mostly-unique identifier for this instance.
- func InstanceID() string { return internal.InstanceID() }
-
- // Datacenter returns an identifier for the datacenter that the instance is running in.
- func Datacenter(c context.Context) string { return internal.Datacenter(c) }
-
- // ServerSoftware returns the App Engine release version.
- // In production, it looks like "Google App Engine/X.Y.Z".
- // In the development appserver, it looks like "Development/X.Y".
- func ServerSoftware() string { return internal.ServerSoftware() }
-
- // RequestID returns a string that uniquely identifies the request.
- func RequestID(c context.Context) string { return internal.RequestID(c) }
-
- // AccessToken generates an OAuth2 access token for the specified scopes on
- // behalf of service account of this application. This token will expire after
- // the returned time.
- func AccessToken(c context.Context, scopes ...string) (token string, expiry time.Time, err error) {
- req := &pb.GetAccessTokenRequest{Scope: scopes}
- res := &pb.GetAccessTokenResponse{}
-
- err = internal.Call(c, "app_identity_service", "GetAccessToken", req, res)
- if err != nil {
- return "", time.Time{}, err
- }
- return res.GetAccessToken(), time.Unix(res.GetExpirationTime(), 0), nil
- }
-
- // Certificate represents a public certificate for the app.
- type Certificate struct {
- KeyName string
- Data []byte // PEM-encoded X.509 certificate
- }
-
- // PublicCertificates retrieves the public certificates for the app.
- // They can be used to verify a signature returned by SignBytes.
- func PublicCertificates(c context.Context) ([]Certificate, error) {
- req := &pb.GetPublicCertificateForAppRequest{}
- res := &pb.GetPublicCertificateForAppResponse{}
- if err := internal.Call(c, "app_identity_service", "GetPublicCertificatesForApp", req, res); err != nil {
- return nil, err
- }
- var cs []Certificate
- for _, pc := range res.PublicCertificateList {
- cs = append(cs, Certificate{
- KeyName: pc.GetKeyName(),
- Data: []byte(pc.GetX509CertificatePem()),
- })
- }
- return cs, nil
- }
-
- // ServiceAccount returns a string representing the service account name, in
- // the form of an email address (typically app_id@appspot.gserviceaccount.com).
- func ServiceAccount(c context.Context) (string, error) {
- req := &pb.GetServiceAccountNameRequest{}
- res := &pb.GetServiceAccountNameResponse{}
-
- err := internal.Call(c, "app_identity_service", "GetServiceAccountName", req, res)
- if err != nil {
- return "", err
- }
- return res.GetServiceAccountName(), err
- }
-
- // SignBytes signs bytes using a private key unique to your application.
- func SignBytes(c context.Context, bytes []byte) (keyName string, signature []byte, err error) {
- req := &pb.SignForAppRequest{BytesToSign: bytes}
- res := &pb.SignForAppResponse{}
-
- if err := internal.Call(c, "app_identity_service", "SignForApp", req, res); err != nil {
- return "", nil, err
- }
- return res.GetKeyName(), res.GetSignatureBytes(), nil
- }
-
- func init() {
- internal.RegisterErrorCodeMap("app_identity_service", pb.AppIdentityServiceError_ErrorCode_name)
- internal.RegisterErrorCodeMap("modules", modpb.ModulesServiceError_ErrorCode_name)
- }
|