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

#include "net/base/auth.h"
#include "net/base/zap.h"

namespace net {

AuthChallengeInfo::AuthChallengeInfo() : is_proxy(false) {
}

bool AuthChallengeInfo::Equals(const AuthChallengeInfo& that) const {
  return (this->is_proxy == that.is_proxy &&
          this->challenger.Equals(that.challenger) &&
          this->scheme == that.scheme &&
          this->realm == that.realm);
}

AuthChallengeInfo::~AuthChallengeInfo() {
}

AuthData::AuthData() : state(AUTH_STATE_NEED_AUTH) {
}

AuthData::~AuthData() {
}

AuthCredentials::AuthCredentials() {
}

AuthCredentials::AuthCredentials(const string16& username,
                                 const string16& password)
    : username_(username),
      password_(password) {
}

AuthCredentials::~AuthCredentials() {
}

void AuthCredentials::Set(const string16& username, const string16& password) {
  username_ = username;
  password_ = password;
}

bool AuthCredentials::Equals(const AuthCredentials& other) const {
  return username_ == other.username_ && password_ == other.password_;
}

bool AuthCredentials::Empty() const {
  return username_.empty() && password_.empty();
}

void AuthCredentials::Zap() {
  ZapString(&password_);
}

}  // namespace net
