#region Copyright notice and license // Copyright 2015 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #endregion using System; using System.Collections.Generic; using System.Threading.Tasks; using Grpc.Core.Internal; using Grpc.Core.Utils; namespace Grpc.Core { /// /// Client-side channel credentials. Used for creation of a secure channel. /// public abstract class ChannelCredentials { static readonly ChannelCredentials InsecureInstance = new InsecureCredentials(); /// /// Creates a new instance of channel credentials /// public ChannelCredentials() { } /// /// Returns instance of credentials that provides no security and /// will result in creating an unsecure channel with no encryption whatsoever. /// public static ChannelCredentials Insecure { get { return InsecureInstance; } } /// /// Creates a new instance of ChannelCredentials class by composing /// given channel credentials with call credentials. /// /// Channel credentials. /// Call credentials. /// The new composite ChannelCredentials public static ChannelCredentials Create(ChannelCredentials channelCredentials, CallCredentials callCredentials) { return new CompositeChannelCredentials(channelCredentials, callCredentials); } /// /// Populates channel credentials configurator with this instance's configuration. /// End users never need to invoke this method as it is part of internal implementation. /// public abstract void InternalPopulateConfiguration(ChannelCredentialsConfiguratorBase configurator, object state); /// /// Returns true if this credential type allows being composed by CompositeCredentials. /// internal virtual bool IsComposable => false; private sealed class InsecureCredentials : ChannelCredentials { public override void InternalPopulateConfiguration(ChannelCredentialsConfiguratorBase configurator, object state) { configurator.SetInsecureCredentials(state); } } /// /// Credentials that allow composing one object and /// one or more objects into a single . /// private sealed class CompositeChannelCredentials : ChannelCredentials { readonly ChannelCredentials channelCredentials; readonly CallCredentials callCredentials; /// /// Initializes a new instance of CompositeChannelCredentials class. /// The resulting credentials object will be composite of all the credentials specified as parameters. /// /// channelCredentials to compose /// channelCredentials to compose public CompositeChannelCredentials(ChannelCredentials channelCredentials, CallCredentials callCredentials) { this.channelCredentials = GrpcPreconditions.CheckNotNull(channelCredentials); this.callCredentials = GrpcPreconditions.CheckNotNull(callCredentials); if (!channelCredentials.IsComposable) { throw new ArgumentException(string.Format("CallCredentials can't be composed with {0}. CallCredentials must be used with secure channel credentials like SslCredentials.", channelCredentials.GetType().Name)); } } public override void InternalPopulateConfiguration(ChannelCredentialsConfiguratorBase configurator, object state) { configurator.SetCompositeCredentials(state, channelCredentials, callCredentials); } } } }