# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: CredCommon.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10\x43redCommon.proto\x12\x1eorg.apache.airavata.mft.common\"\x1e\n\rUserTokenAuth\x12\r\n\x05token\x18\x01 \x01(\t\"2\n\x0cPasswordAuth\x12\x10\n\x08userName\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\"@\n\tAgentAuth\x12\r\n\x05token\x18\x01 \x01(\t\x12\x0f\n\x07\x61gentId\x18\x02 \x01(\t\x12\x13\n\x0b\x61gentSecret\x18\x03 \x01(\t\"\xcb\x01\n\x0c\x44\x65legateAuth\x12\x0e\n\x06userId\x18\x01 \x01(\t\x12\x10\n\x08\x63lientId\x18\x02 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x03 \x01(\t\x12P\n\nproperties\x18\x04 \x03(\x0b\x32<.org.apache.airavata.mft.common.DelegateAuth.PropertiesEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb0\x02\n\tAuthToken\x12\x46\n\ruserTokenAuth\x18\x01 \x01(\x0b\x32-.org.apache.airavata.mft.common.UserTokenAuthH\x00\x12>\n\tagentAuth\x18\x02 \x01(\x0b\x32).org.apache.airavata.mft.common.AgentAuthH\x00\x12\x44\n\x0c\x64\x65legateAuth\x18\x03 \x01(\x0b\x32,.org.apache.airavata.mft.common.DelegateAuthH\x00\x12\x44\n\x0cpasswordAuth\x18\x04 \x01(\x0b\x32,.org.apache.airavata.mft.common.PasswordAuthH\x00\x42\x0f\n\rauthMechanismB\x02P\x01\x62\x06proto3')



_USERTOKENAUTH = DESCRIPTOR.message_types_by_name['UserTokenAuth']
_PASSWORDAUTH = DESCRIPTOR.message_types_by_name['PasswordAuth']
_AGENTAUTH = DESCRIPTOR.message_types_by_name['AgentAuth']
_DELEGATEAUTH = DESCRIPTOR.message_types_by_name['DelegateAuth']
_DELEGATEAUTH_PROPERTIESENTRY = _DELEGATEAUTH.nested_types_by_name['PropertiesEntry']
_AUTHTOKEN = DESCRIPTOR.message_types_by_name['AuthToken']
UserTokenAuth = _reflection.GeneratedProtocolMessageType('UserTokenAuth', (_message.Message,), {
  'DESCRIPTOR' : _USERTOKENAUTH,
  '__module__' : 'CredCommon_pb2'
  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.common.UserTokenAuth)
  })
_sym_db.RegisterMessage(UserTokenAuth)

PasswordAuth = _reflection.GeneratedProtocolMessageType('PasswordAuth', (_message.Message,), {
  'DESCRIPTOR' : _PASSWORDAUTH,
  '__module__' : 'CredCommon_pb2'
  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.common.PasswordAuth)
  })
_sym_db.RegisterMessage(PasswordAuth)

AgentAuth = _reflection.GeneratedProtocolMessageType('AgentAuth', (_message.Message,), {
  'DESCRIPTOR' : _AGENTAUTH,
  '__module__' : 'CredCommon_pb2'
  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.common.AgentAuth)
  })
_sym_db.RegisterMessage(AgentAuth)

DelegateAuth = _reflection.GeneratedProtocolMessageType('DelegateAuth', (_message.Message,), {

  'PropertiesEntry' : _reflection.GeneratedProtocolMessageType('PropertiesEntry', (_message.Message,), {
    'DESCRIPTOR' : _DELEGATEAUTH_PROPERTIESENTRY,
    '__module__' : 'CredCommon_pb2'
    # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.common.DelegateAuth.PropertiesEntry)
    })
  ,
  'DESCRIPTOR' : _DELEGATEAUTH,
  '__module__' : 'CredCommon_pb2'
  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.common.DelegateAuth)
  })
_sym_db.RegisterMessage(DelegateAuth)
_sym_db.RegisterMessage(DelegateAuth.PropertiesEntry)

AuthToken = _reflection.GeneratedProtocolMessageType('AuthToken', (_message.Message,), {
  'DESCRIPTOR' : _AUTHTOKEN,
  '__module__' : 'CredCommon_pb2'
  # @@protoc_insertion_point(class_scope:org.apache.airavata.mft.common.AuthToken)
  })
_sym_db.RegisterMessage(AuthToken)

if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  DESCRIPTOR._serialized_options = b'P\001'
  _DELEGATEAUTH_PROPERTIESENTRY._options = None
  _DELEGATEAUTH_PROPERTIESENTRY._serialized_options = b'8\001'
  _USERTOKENAUTH._serialized_start=52
  _USERTOKENAUTH._serialized_end=82
  _PASSWORDAUTH._serialized_start=84
  _PASSWORDAUTH._serialized_end=134
  _AGENTAUTH._serialized_start=136
  _AGENTAUTH._serialized_end=200
  _DELEGATEAUTH._serialized_start=203
  _DELEGATEAUTH._serialized_end=406
  _DELEGATEAUTH_PROPERTIESENTRY._serialized_start=357
  _DELEGATEAUTH_PROPERTIESENTRY._serialized_end=406
  _AUTHTOKEN._serialized_start=409
  _AUTHTOKEN._serialized_end=713
# @@protoc_insertion_point(module_scope)
