107 lines
3.2 KiB
C++
107 lines
3.2 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef nss_policy_h_
|
|
#define nss_policy_h_
|
|
|
|
#include "prtypes.h"
|
|
#include "secoid.h"
|
|
#include "nss.h"
|
|
|
|
namespace nss_test {
|
|
|
|
// container class to hold all a temp policy
|
|
class NssPolicy {
|
|
public:
|
|
NssPolicy() : oid_(SEC_OID_UNKNOWN), set_(0), clear_(0) {}
|
|
NssPolicy(SECOidTag _oid, PRUint32 _set, PRUint32 _clear)
|
|
: oid_(_oid), set_(_set), clear_(_clear) {}
|
|
NssPolicy(const NssPolicy &p)
|
|
: oid_(p.oid_), set_(p.set_), clear_(p.clear_) {}
|
|
// clone the current policy for this oid
|
|
NssPolicy(SECOidTag _oid) : oid_(_oid), set_(0), clear_(0) {
|
|
NSS_GetAlgorithmPolicy(_oid, &set_);
|
|
clear_ = ~set_;
|
|
}
|
|
SECOidTag oid(void) const { return oid_; }
|
|
PRUint32 set(void) const { return set_; }
|
|
PRUint32 clear(void) const { return clear_; }
|
|
operator bool() const { return oid_ != SEC_OID_UNKNOWN; }
|
|
|
|
private:
|
|
SECOidTag oid_;
|
|
PRUint32 set_;
|
|
PRUint32 clear_;
|
|
};
|
|
|
|
// container class to hold a temp option
|
|
class NssOption {
|
|
public:
|
|
NssOption() : id_(-1), value_(0) {}
|
|
NssOption(PRInt32 _id, PRInt32 _value) : id_(_id), value_(_value) {}
|
|
NssOption(const NssOption &o) : id_(o.id_), value_(o.value_) {}
|
|
// clone the current option for this id
|
|
NssOption(PRInt32 _id) : id_(_id), value_(0) { NSS_OptionGet(id_, &value_); }
|
|
PRInt32 id(void) const { return id_; }
|
|
PRInt32 value(void) const { return value_; }
|
|
operator bool() const { return id_ != -1; }
|
|
|
|
private:
|
|
PRInt32 id_;
|
|
PRInt32 value_;
|
|
};
|
|
|
|
// set the policy indicated in NssPolicy and restor the old policy
|
|
// when we go out of scope
|
|
class NssManagePolicy {
|
|
public:
|
|
NssManagePolicy(const NssPolicy &p, const NssOption &o)
|
|
: policy_(p), save_policy_(~(PRUint32)0), option_(o), save_option_(0) {
|
|
if (p) {
|
|
(void)NSS_GetAlgorithmPolicy(p.oid(), &save_policy_);
|
|
(void)NSS_SetAlgorithmPolicy(p.oid(), p.set(), p.clear());
|
|
}
|
|
if (o) {
|
|
(void)NSS_OptionGet(o.id(), &save_option_);
|
|
(void)NSS_OptionSet(o.id(), o.value());
|
|
}
|
|
}
|
|
~NssManagePolicy() {
|
|
if (policy_) {
|
|
(void)NSS_SetAlgorithmPolicy(policy_.oid(), save_policy_, ~save_policy_);
|
|
}
|
|
if (option_) {
|
|
(void)NSS_OptionSet(option_.id(), save_option_);
|
|
}
|
|
}
|
|
|
|
private:
|
|
NssPolicy policy_;
|
|
PRUint32 save_policy_;
|
|
NssOption option_;
|
|
PRInt32 save_option_;
|
|
};
|
|
|
|
// wrapping PRFileDesc this way ensures that tests that attempt to access
|
|
// PRFileDesc always correctly apply
|
|
// the policy that was bound to that socket with TlsAgent::SetPolicy().
|
|
class NssManagedFileDesc {
|
|
public:
|
|
NssManagedFileDesc(PRFileDesc *fd, const NssPolicy &policy,
|
|
const NssOption &option)
|
|
: fd_(fd), managed_policy_(policy, option) {}
|
|
PRFileDesc *get(void) const { return fd_; }
|
|
operator PRFileDesc *() const { return fd_; }
|
|
bool operator==(PRFileDesc *fd) const { return fd_ == fd; }
|
|
|
|
private:
|
|
PRFileDesc *fd_;
|
|
NssManagePolicy managed_policy_;
|
|
};
|
|
|
|
} // namespace nss_test
|
|
|
|
#endif
|