/*
 *
 * 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.
 *
 */

#ifndef GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H
#define GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H

#include <iterator>
#include <vector>

#include <grpcpp/impl/codegen/config.h>
#include <grpcpp/impl/codegen/string_ref.h>

struct grpc_auth_context;
struct grpc_auth_property;
struct grpc_auth_property_iterator;

namespace grpc {
class SecureAuthContext;

typedef std::pair<grpc::string_ref, grpc::string_ref> AuthProperty;

class AuthPropertyIterator
    : public std::iterator<std::input_iterator_tag, const AuthProperty> {
 public:
  ~AuthPropertyIterator();
  AuthPropertyIterator& operator++();
  AuthPropertyIterator operator++(int);
  bool operator==(const AuthPropertyIterator& rhs) const;
  bool operator!=(const AuthPropertyIterator& rhs) const;
  const AuthProperty operator*();

 protected:
  AuthPropertyIterator();
  AuthPropertyIterator(const grpc_auth_property* property,
                       const grpc_auth_property_iterator* iter);

 private:
  friend class SecureAuthContext;
  const grpc_auth_property* property_;
  // The following items form a grpc_auth_property_iterator.
  const grpc_auth_context* ctx_;
  size_t index_;
  const char* name_;
};

/// Class encapsulating the Authentication Information.
///
/// It includes the secure identity of the peer, the type of secure transport
/// used as well as any other properties required by the authorization layer.
class AuthContext {
 public:
  virtual ~AuthContext() {}

  /// Returns true if the peer is authenticated.
  virtual bool IsPeerAuthenticated() const = 0;

  /// A peer identity.
  ///
  /// It is, in general, comprised of one or more properties (in which case they
  /// have the same name).
  virtual std::vector<grpc::string_ref> GetPeerIdentity() const = 0;
  virtual grpc::string GetPeerIdentityPropertyName() const = 0;

  /// Returns all the property values with the given name.
  virtual std::vector<grpc::string_ref> FindPropertyValues(
      const grpc::string& name) const = 0;

  /// Iteration over all the properties.
  virtual AuthPropertyIterator begin() const = 0;
  virtual AuthPropertyIterator end() const = 0;

  /// Mutation functions: should only be used by an AuthMetadataProcessor.
  virtual void AddProperty(const grpc::string& key,
                           const grpc::string_ref& value) = 0;
  virtual bool SetPeerIdentityPropertyName(const grpc::string& name) = 0;
};

}  // namespace grpc

#endif  // GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H
