// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This file was auto-generated by the vanadium vdl tool.
var vdl = require('../../../../../../vdl');





var security = require('./../../../../v23/security');

module.exports = {};



// Types:
var _type1 = new vdl.Type();
var _type2 = new vdl.Type();
var _typeBlessingRootResponse = new vdl.Type();
_type1.kind = vdl.kind.LIST;
_type1.name = "";
_type1.elem = vdl.types.STRING;
_type2.kind = vdl.kind.LIST;
_type2.name = "";
_type2.elem = new security.Caveat()._type;
_typeBlessingRootResponse.kind = vdl.kind.STRUCT;
_typeBlessingRootResponse.name = "v.io/x/ref/services/identity.BlessingRootResponse";
_typeBlessingRootResponse.fields = [{name: "Names", type: _type1}, {name: "PublicKey", type: vdl.types.STRING}];
_type1.freeze();
_type2.freeze();
_typeBlessingRootResponse.freeze();
module.exports.BlessingRootResponse = (vdl.registry.lookupOrCreateConstructor(_typeBlessingRootResponse));




// Consts:



// Errors:



// Services:

  
    
function OAuthBlesser(){}
module.exports.OAuthBlesser = OAuthBlesser;

    
      
OAuthBlesser.prototype.blessUsingAccessToken = function(ctx, serverCall, token) {
  throw new Error('Method BlessUsingAccessToken not implemented');
};
    
      
OAuthBlesser.prototype.blessUsingAccessTokenWithCaveats = function(ctx, serverCall, token, caveats) {
  throw new Error('Method BlessUsingAccessTokenWithCaveats not implemented');
};
     

    
OAuthBlesser.prototype._serviceDescription = {
  name: 'OAuthBlesser',
  pkgPath: 'v.io/x/ref/services/identity',
  doc: "// OAuthBlesser exchanges OAuth access tokens for\n// an email address from an OAuth-based identity provider and uses the email\n// address obtained to bless the client.\n//\n// OAuth is described in RFC 6749 (http://tools.ietf.org/html/rfc6749),\n// though the Google implementation also has informative documentation at\n// https://developers.google.com/accounts/docs/OAuth2\n//\n// WARNING: There is no binding between the channel over which the access\n// token was obtained (typically https) and the channel used to make the RPC\n// (a vanadium virtual circuit). Thus, if Mallory possesses the access token\n// associated with Alice's account she may be able to obtain a blessing with\n// Alice's name on it.\n//\n// TODO(ataly): Get rid of this service once all clients have been\n// switched to use the HTTP OAuthBlessingHandler service.",
  embeds: [],
  methods: [
    
      
    {
    name: 'BlessUsingAccessToken',
    doc: "// BlessUsingAccessToken uses the provided access token to obtain the email\n// address and returns a blessing along with the email address.",
    inArgs: [{
      name: 'token',
      doc: "",
      type: vdl.types.STRING
    },
    ],
    outArgs: [{
      name: 'blessing',
      doc: "",
      type: new security.WireBlessings()._type
    },
    {
      name: 'email',
      doc: "",
      type: vdl.types.STRING
    },
    ],
    inStream: null,
    outStream: null,
    tags: []
  },
    
      
    {
    name: 'BlessUsingAccessTokenWithCaveats',
    doc: "",
    inArgs: [{
      name: 'token',
      doc: "",
      type: vdl.types.STRING
    },
    {
      name: 'caveats',
      doc: "",
      type: _type2
    },
    ],
    outArgs: [{
      name: 'blessing',
      doc: "",
      type: new security.WireBlessings()._type
    },
    {
      name: 'email',
      doc: "",
      type: vdl.types.STRING
    },
    ],
    inStream: null,
    outStream: null,
    tags: []
  },
     
  ]
};

  
    
function MacaroonBlesser(){}
module.exports.MacaroonBlesser = MacaroonBlesser;

    
      
MacaroonBlesser.prototype.bless = function(ctx, serverCall, macaroon) {
  throw new Error('Method Bless not implemented');
};
     

    
MacaroonBlesser.prototype._serviceDescription = {
  name: 'MacaroonBlesser',
  pkgPath: 'v.io/x/ref/services/identity',
  doc: "// MacaroonBlesser returns a blessing given the provided macaroon string.",
  embeds: [],
  methods: [
    
      
    {
    name: 'Bless',
    doc: "// Bless uses the provided macaroon (which contains email and caveats)\n// to return a blessing for the client.",
    inArgs: [{
      name: 'macaroon',
      doc: "",
      type: vdl.types.STRING
    },
    ],
    outArgs: [{
      name: 'blessing',
      doc: "",
      type: new security.WireBlessings()._type
    },
    ],
    inStream: null,
    outStream: null,
    tags: []
  },
     
  ]
};

   
 


