+
+ /* These must be done before we call Bad as that might set one
+ of the nags.
+ */
+ BOOST_FOREACH (cxml::NodePtr i, f.node_children("Nagged")) {
+ int const id = i->number_attribute<int>("Id");
+ if (id >= 0 && id < NAG_COUNT) {
+ _nagged[id] = raw_convert<int>(i->content());
+ }
+ }
+
+ optional<BadReason> bad;
+
+ BOOST_FOREACH (dcp::Certificate const & i, _signer_chain->unordered()) {
+ if (i.has_utf8_strings()) {
+ bad = BAD_SIGNER_UTF8_STRINGS;
+ }
+ }
+
+ if (!_signer_chain->chain_valid() || !_signer_chain->private_key_valid()) {
+ bad = BAD_SIGNER_INCONSISTENT;
+ }
+
+ if (!_decryption_chain->chain_valid() || !_decryption_chain->private_key_valid()) {
+ bad = BAD_DECRYPTION_INCONSISTENT;
+ }
+
+ if (bad) {
+ optional<bool> const remake = Bad(*bad);
+ if (remake && *remake) {
+ switch (*bad) {
+ case BAD_SIGNER_UTF8_STRINGS:
+ case BAD_SIGNER_INCONSISTENT:
+ _signer_chain = create_certificate_chain ();
+ break;
+ case BAD_DECRYPTION_INCONSISTENT:
+ _decryption_chain = create_certificate_chain ();
+ break;
+ }
+ }
+ }
+