Blame lang/cpp/src/verificationresult.cpp

Packit d7e8d0
/*
Packit d7e8d0
  verificationresult.cpp - wraps a gpgme verify result
Packit d7e8d0
  Copyright (C) 2004 Klarälvdalens Datakonsult AB
Packit d7e8d0
  2016 Bundesamt für Sicherheit in der Informationstechnik
Packit d7e8d0
  Software engineering by Intevation GmbH
Packit d7e8d0
Packit d7e8d0
  This file is part of GPGME++.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is free software; you can redistribute it and/or
Packit d7e8d0
  modify it under the terms of the GNU Library General Public
Packit d7e8d0
  License as published by the Free Software Foundation; either
Packit d7e8d0
  version 2 of the License, or (at your option) any later version.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is distributed in the hope that it will be useful,
Packit d7e8d0
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d7e8d0
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit d7e8d0
  GNU Library General Public License for more details.
Packit d7e8d0
Packit d7e8d0
  You should have received a copy of the GNU Library General Public License
Packit d7e8d0
  along with GPGME++; see the file COPYING.LIB.  If not, write to the
Packit d7e8d0
  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit d7e8d0
  Boston, MA 02110-1301, USA.
Packit d7e8d0
*/
Packit d7e8d0
Packit d7e8d0
#ifdef HAVE_CONFIG_H
Packit d7e8d0
 #include "config.h"
Packit d7e8d0
#endif
Packit d7e8d0
Packit d7e8d0
#include <verificationresult.h>
Packit d7e8d0
#include <notation.h>
Packit d7e8d0
#include "result_p.h"
Packit d7e8d0
#include "util.h"
Packit d7e8d0
#include "key.h"
Packit d7e8d0
#include "context.h"
Packit d7e8d0
Packit d7e8d0
#include <gpgme.h>
Packit d7e8d0
Packit d7e8d0
#include <istream>
Packit d7e8d0
#include <algorithm>
Packit d7e8d0
#include <iterator>
Packit d7e8d0
#include <string>
Packit d7e8d0
#include <cstring>
Packit d7e8d0
#include <cstdlib>
Packit d7e8d0
Packit d7e8d0
#include <string.h>
Packit d7e8d0
Packit d7e8d0
class GpgME::VerificationResult::Private
Packit d7e8d0
{
Packit d7e8d0
public:
Packit d7e8d0
    explicit Private(const gpgme_verify_result_t r)
Packit d7e8d0
    {
Packit d7e8d0
        if (!r) {
Packit d7e8d0
            return;
Packit d7e8d0
        }
Packit d7e8d0
        if (r->file_name) {
Packit d7e8d0
            file_name = r->file_name;
Packit d7e8d0
        }
Packit d7e8d0
        // copy recursively, using compiler-generated copy ctor.
Packit d7e8d0
        // We just need to handle the pointers in the structs:
Packit d7e8d0
        for (gpgme_signature_t is = r->signatures ; is ; is = is->next) {
Packit d7e8d0
            gpgme_signature_t scopy = new _gpgme_signature(*is);
Packit d7e8d0
            if (is->fpr) {
Packit d7e8d0
                scopy->fpr = strdup(is->fpr);
Packit d7e8d0
            }
Packit d7e8d0
// PENDING(marc) why does this crash on Windows in strdup()?
Packit d7e8d0
# ifndef _WIN32
Packit d7e8d0
            if (is->pka_address) {
Packit d7e8d0
                scopy->pka_address = strdup(is->pka_address);
Packit d7e8d0
            }
Packit d7e8d0
# else
Packit d7e8d0
            scopy->pka_address = 0;
Packit d7e8d0
# endif
Packit d7e8d0
            scopy->next = 0;
Packit d7e8d0
            sigs.push_back(scopy);
Packit d7e8d0
            // copy keys
Packit d7e8d0
            if (scopy->key) {
Packit d7e8d0
                keys.push_back(Key(scopy->key, true));
Packit d7e8d0
            } else {
Packit d7e8d0
                keys.push_back(Key());
Packit d7e8d0
            }
Packit d7e8d0
            // copy notations:
Packit d7e8d0
            nota.push_back(std::vector<Nota>());
Packit d7e8d0
            purls.push_back(0);
Packit d7e8d0
            for (gpgme_sig_notation_t in = is->notations ; in ; in = in->next) {
Packit d7e8d0
                if (!in->name) {
Packit d7e8d0
                    if (in->value) {
Packit d7e8d0
                        purls.back() = strdup(in->value);   // policy url
Packit d7e8d0
                    }
Packit d7e8d0
                    continue;
Packit d7e8d0
                }
Packit d7e8d0
                Nota n = { 0, 0, in->flags };
Packit d7e8d0
                n.name = strdup(in->name);
Packit d7e8d0
                if (in->value) {
Packit d7e8d0
                    n.value = strdup(in->value);
Packit d7e8d0
                }
Packit d7e8d0
                nota.back().push_back(n);
Packit d7e8d0
            }
Packit d7e8d0
        }
Packit d7e8d0
    }
Packit d7e8d0
    ~Private()
Packit d7e8d0
    {
Packit d7e8d0
        for (std::vector<gpgme_signature_t>::iterator it = sigs.begin() ; it != sigs.end() ; ++it) {
Packit d7e8d0
            std::free((*it)->fpr);
Packit d7e8d0
            std::free((*it)->pka_address);
Packit d7e8d0
            delete *it; *it = 0;
Packit d7e8d0
        }
Packit d7e8d0
        for (std::vector< std::vector<Nota> >::iterator it = nota.begin() ; it != nota.end() ; ++it) {
Packit d7e8d0
            for (std::vector<Nota>::iterator jt = it->begin() ; jt != it->end() ; ++jt) {
Packit d7e8d0
                std::free(jt->name);  jt->name = 0;
Packit d7e8d0
                std::free(jt->value); jt->value = 0;
Packit d7e8d0
            }
Packit d7e8d0
        }
Packit d7e8d0
        std::for_each(purls.begin(), purls.end(), &std::free);
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    struct Nota {
Packit d7e8d0
        char *name;
Packit d7e8d0
        char *value;
Packit d7e8d0
        gpgme_sig_notation_flags_t flags;
Packit d7e8d0
    };
Packit d7e8d0
Packit d7e8d0
    std::vector<gpgme_signature_t> sigs;
Packit d7e8d0
    std::vector< std::vector<Nota> > nota;
Packit d7e8d0
    std::vector<GpgME::Key> keys;
Packit d7e8d0
    std::vector<char *> purls;
Packit d7e8d0
    std::string file_name;
Packit d7e8d0
    Protocol proto;
Packit d7e8d0
};
Packit d7e8d0
Packit d7e8d0
GpgME::VerificationResult::VerificationResult(gpgme_ctx_t ctx, int error)
Packit d7e8d0
    : GpgME::Result(error), d()
Packit d7e8d0
{
Packit d7e8d0
    init(ctx);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::VerificationResult::VerificationResult(gpgme_ctx_t ctx, const Error &error)
Packit d7e8d0
    : GpgME::Result(error), d()
Packit d7e8d0
{
Packit d7e8d0
    init(ctx);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
void GpgME::VerificationResult::init(gpgme_ctx_t ctx)
Packit d7e8d0
{
Packit d7e8d0
    if (!ctx) {
Packit d7e8d0
        return;
Packit d7e8d0
    }
Packit d7e8d0
    gpgme_verify_result_t res = gpgme_op_verify_result(ctx);
Packit d7e8d0
    if (!res) {
Packit d7e8d0
        return;
Packit d7e8d0
    }
Packit d7e8d0
    d.reset(new Private(res));
Packit d7e8d0
    gpgme_protocol_t proto = gpgme_get_protocol(ctx);
Packit d7e8d0
    d->proto = proto == GPGME_PROTOCOL_OpenPGP ? OpenPGP :
Packit d7e8d0
               proto == GPGME_PROTOCOL_CMS ? CMS :
Packit d7e8d0
               UnknownProtocol;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
make_standard_stuff(VerificationResult)
Packit d7e8d0
Packit d7e8d0
const char *GpgME::VerificationResult::fileName() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->file_name.c_str() : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
unsigned int GpgME::VerificationResult::numSignatures() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->sigs.size() : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Signature GpgME::VerificationResult::signature(unsigned int idx) const
Packit d7e8d0
{
Packit d7e8d0
    return Signature(d, idx);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::vector<GpgME::Signature> GpgME::VerificationResult::signatures() const
Packit d7e8d0
{
Packit d7e8d0
    if (!d) {
Packit d7e8d0
        return std::vector<Signature>();
Packit d7e8d0
    }
Packit d7e8d0
    std::vector<Signature> result;
Packit d7e8d0
    result.reserve(d->sigs.size());
Packit d7e8d0
    for (unsigned int i = 0 ; i < d->sigs.size() ; ++i) {
Packit d7e8d0
        result.push_back(Signature(d, i));
Packit d7e8d0
    }
Packit d7e8d0
    return result;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Signature::Signature(const std::shared_ptr<VerificationResult::Private> &parent, unsigned int i)
Packit d7e8d0
    : d(parent), idx(i)
Packit d7e8d0
{
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Signature::Signature() : d(), idx(0) {}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Signature::isNull() const
Packit d7e8d0
{
Packit d7e8d0
    return !d || idx >= d->sigs.size() ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Signature::Summary GpgME::Signature::summary() const
Packit d7e8d0
{
Packit d7e8d0
    if (isNull()) {
Packit d7e8d0
        return None;
Packit d7e8d0
    }
Packit d7e8d0
    gpgme_sigsum_t sigsum = d->sigs[idx]->summary;
Packit d7e8d0
    unsigned int result = 0;
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_VALID) {
Packit d7e8d0
        result |= Valid;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_GREEN) {
Packit d7e8d0
        result |= Green;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_RED) {
Packit d7e8d0
        result |= Red;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_KEY_REVOKED) {
Packit d7e8d0
        result |= KeyRevoked;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_KEY_EXPIRED) {
Packit d7e8d0
        result |= KeyExpired;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_SIG_EXPIRED) {
Packit d7e8d0
        result |= SigExpired;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_KEY_MISSING) {
Packit d7e8d0
        result |= KeyMissing;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_CRL_MISSING) {
Packit d7e8d0
        result |= CrlMissing;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_CRL_TOO_OLD) {
Packit d7e8d0
        result |= CrlTooOld;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_BAD_POLICY) {
Packit d7e8d0
        result |= BadPolicy;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_SYS_ERROR) {
Packit d7e8d0
        result |= SysError;
Packit d7e8d0
    }
Packit d7e8d0
    if (sigsum & GPGME_SIGSUM_TOFU_CONFLICT) {
Packit d7e8d0
        result |= TofuConflict;
Packit d7e8d0
    }
Packit d7e8d0
    return static_cast<Summary>(result);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Signature::fingerprint() const
Packit d7e8d0
{
Packit d7e8d0
    return isNull() ? 0 : d->sigs[idx]->fpr ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Error GpgME::Signature::status() const
Packit d7e8d0
{
Packit d7e8d0
    return Error(isNull() ? 0 : d->sigs[idx]->status);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
time_t GpgME::Signature::creationTime() const
Packit d7e8d0
{
Packit d7e8d0
    return static_cast<time_t>(isNull() ? 0 : d->sigs[idx]->timestamp);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
time_t GpgME::Signature::expirationTime() const
Packit d7e8d0
{
Packit d7e8d0
    return static_cast<time_t>(isNull() ? 0 : d->sigs[idx]->exp_timestamp);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Signature::neverExpires() const
Packit d7e8d0
{
Packit d7e8d0
    return expirationTime() == (time_t)0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Signature::isWrongKeyUsage() const
Packit d7e8d0
{
Packit d7e8d0
    return !isNull() && d->sigs[idx]->wrong_key_usage;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Signature::isVerifiedUsingChainModel() const
Packit d7e8d0
{
Packit d7e8d0
    return !isNull() && d->sigs[idx]->chain_model;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Signature::isDeVs() const
Packit d7e8d0
{
Packit d7e8d0
    return !isNull() && d->sigs[idx]->is_de_vs;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Signature::PKAStatus GpgME::Signature::pkaStatus() const
Packit d7e8d0
{
Packit d7e8d0
    if (!isNull()) {
Packit d7e8d0
        return static_cast<PKAStatus>(d->sigs[idx]->pka_trust);
Packit d7e8d0
    }
Packit d7e8d0
    return UnknownPKAStatus;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Signature::pkaAddress() const
Packit d7e8d0
{
Packit d7e8d0
    if (!isNull()) {
Packit d7e8d0
        return d->sigs[idx]->pka_address;
Packit d7e8d0
    }
Packit d7e8d0
    return 0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Signature::Validity GpgME::Signature::validity() const
Packit d7e8d0
{
Packit d7e8d0
    if (isNull()) {
Packit d7e8d0
        return Unknown;
Packit d7e8d0
    }
Packit d7e8d0
    switch (d->sigs[idx]->validity) {
Packit d7e8d0
    default:
Packit d7e8d0
    case GPGME_VALIDITY_UNKNOWN:   return Unknown;
Packit d7e8d0
    case GPGME_VALIDITY_UNDEFINED: return Undefined;
Packit d7e8d0
    case GPGME_VALIDITY_NEVER:     return Never;
Packit d7e8d0
    case GPGME_VALIDITY_MARGINAL:  return Marginal;
Packit d7e8d0
    case GPGME_VALIDITY_FULL:      return Full;
Packit d7e8d0
    case GPGME_VALIDITY_ULTIMATE:  return Ultimate;
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
char GpgME::Signature::validityAsString() const
Packit d7e8d0
{
Packit d7e8d0
    if (isNull()) {
Packit d7e8d0
        return '?';
Packit d7e8d0
    }
Packit d7e8d0
    switch (d->sigs[idx]->validity) {
Packit d7e8d0
    default:
Packit d7e8d0
    case GPGME_VALIDITY_UNKNOWN:   return '?';
Packit d7e8d0
    case GPGME_VALIDITY_UNDEFINED: return 'q';
Packit d7e8d0
    case GPGME_VALIDITY_NEVER:     return 'n';
Packit d7e8d0
    case GPGME_VALIDITY_MARGINAL:  return 'm';
Packit d7e8d0
    case GPGME_VALIDITY_FULL:      return 'f';
Packit d7e8d0
    case GPGME_VALIDITY_ULTIMATE:  return 'u';
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Error GpgME::Signature::nonValidityReason() const
Packit d7e8d0
{
Packit d7e8d0
    return Error(isNull() ? 0 : d->sigs[idx]->validity_reason);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
unsigned int GpgME::Signature::publicKeyAlgorithm() const
Packit d7e8d0
{
Packit d7e8d0
    if (!isNull()) {
Packit d7e8d0
        return d->sigs[idx]->pubkey_algo;
Packit d7e8d0
    }
Packit d7e8d0
    return 0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Signature::publicKeyAlgorithmAsString() const
Packit d7e8d0
{
Packit d7e8d0
    if (!isNull()) {
Packit d7e8d0
        return gpgme_pubkey_algo_name(d->sigs[idx]->pubkey_algo);
Packit d7e8d0
    }
Packit d7e8d0
    return 0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
unsigned int GpgME::Signature::hashAlgorithm() const
Packit d7e8d0
{
Packit d7e8d0
    if (!isNull()) {
Packit d7e8d0
        return d->sigs[idx]->hash_algo;
Packit d7e8d0
    }
Packit d7e8d0
    return 0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Signature::hashAlgorithmAsString() const
Packit d7e8d0
{
Packit d7e8d0
    if (!isNull()) {
Packit d7e8d0
        return gpgme_hash_algo_name(d->sigs[idx]->hash_algo);
Packit d7e8d0
    }
Packit d7e8d0
    return 0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Signature::policyURL() const
Packit d7e8d0
{
Packit d7e8d0
    return isNull() ? 0 : d->purls[idx] ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Notation GpgME::Signature::notation(unsigned int nidx) const
Packit d7e8d0
{
Packit d7e8d0
    return GpgME::Notation(d, idx, nidx);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::vector<GpgME::Notation> GpgME::Signature::notations() const
Packit d7e8d0
{
Packit d7e8d0
    if (isNull()) {
Packit d7e8d0
        return std::vector<GpgME::Notation>();
Packit d7e8d0
    }
Packit d7e8d0
    std::vector<GpgME::Notation> result;
Packit d7e8d0
    result.reserve(d->nota[idx].size());
Packit d7e8d0
    for (unsigned int i = 0 ; i < d->nota[idx].size() ; ++i) {
Packit d7e8d0
        result.push_back(GpgME::Notation(d, idx, i));
Packit d7e8d0
    }
Packit d7e8d0
    return result;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Key GpgME::Signature::key() const
Packit d7e8d0
{
Packit d7e8d0
    if (isNull()) {
Packit d7e8d0
        return Key();
Packit d7e8d0
    }
Packit d7e8d0
    return d->keys[idx];
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Key GpgME::Signature::key(bool search, bool update) const
Packit d7e8d0
{
Packit d7e8d0
    if (isNull()) {
Packit d7e8d0
        return Key();
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    GpgME::Key ret = key();
Packit d7e8d0
    if (ret.isNull() && search) {
Packit d7e8d0
        auto ctx = Context::createForProtocol (d->proto);
Packit d7e8d0
        if (ctx) {
Packit d7e8d0
            ctx->setKeyListMode(KeyListMode::Local |
Packit d7e8d0
                        KeyListMode::Signatures |
Packit d7e8d0
                        KeyListMode::SignatureNotations |
Packit d7e8d0
                        KeyListMode::Validate |
Packit d7e8d0
                        KeyListMode::WithTofu);
Packit d7e8d0
            Error e;
Packit d7e8d0
            ret = d->keys[idx] = ctx->key(fingerprint(), e, false);
Packit d7e8d0
            delete ctx;
Packit d7e8d0
        }
Packit d7e8d0
    }
Packit d7e8d0
    if (update) {
Packit d7e8d0
        d->keys[idx].update();
Packit d7e8d0
        ret = d->keys[idx];
Packit d7e8d0
    }
Packit d7e8d0
    return ret;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
class GpgME::Notation::Private
Packit d7e8d0
{
Packit d7e8d0
public:
Packit d7e8d0
    Private() : d(), sidx(0), nidx(0), nota(0) {}
Packit d7e8d0
    Private(const std::shared_ptr<VerificationResult::Private> &priv, unsigned int sindex, unsigned int nindex)
Packit d7e8d0
        : d(priv), sidx(sindex), nidx(nindex), nota(0)
Packit d7e8d0
    {
Packit d7e8d0
Packit d7e8d0
    }
Packit d7e8d0
    Private(gpgme_sig_notation_t n)
Packit d7e8d0
        : d(), sidx(0), nidx(0), nota(n ? new _gpgme_sig_notation(*n) : 0)
Packit d7e8d0
    {
Packit d7e8d0
        if (nota && nota->name) {
Packit d7e8d0
            nota->name = strdup(nota->name);
Packit d7e8d0
        }
Packit d7e8d0
        if (nota && nota->value) {
Packit d7e8d0
            nota->value = strdup(nota->value);
Packit d7e8d0
        }
Packit d7e8d0
    }
Packit d7e8d0
    Private(const Private &other)
Packit d7e8d0
        : d(other.d), sidx(other.sidx), nidx(other.nidx), nota(other.nota)
Packit d7e8d0
    {
Packit d7e8d0
        if (nota) {
Packit d7e8d0
            nota->name = strdup(nota->name);
Packit d7e8d0
            nota->value = strdup(nota->value);
Packit d7e8d0
        }
Packit d7e8d0
    }
Packit d7e8d0
    ~Private()
Packit d7e8d0
    {
Packit d7e8d0
        if (nota) {
Packit d7e8d0
            std::free(nota->name);  nota->name = 0;
Packit d7e8d0
            std::free(nota->value); nota->value = 0;
Packit d7e8d0
            delete nota;
Packit d7e8d0
        }
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    std::shared_ptr<VerificationResult::Private> d;
Packit d7e8d0
    unsigned int sidx, nidx;
Packit d7e8d0
    gpgme_sig_notation_t nota;
Packit d7e8d0
};
Packit d7e8d0
Packit d7e8d0
GpgME::Notation::Notation(const std::shared_ptr<VerificationResult::Private> &parent, unsigned int sindex, unsigned int nindex)
Packit d7e8d0
    : d(new Private(parent, sindex, nindex))
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Notation::Notation(gpgme_sig_notation_t nota)
Packit d7e8d0
    : d(new Private(nota))
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Notation::Notation() : d() {}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Notation::isNull() const
Packit d7e8d0
{
Packit d7e8d0
    if (!d) {
Packit d7e8d0
        return true;
Packit d7e8d0
    }
Packit d7e8d0
    if (d->d) {
Packit d7e8d0
        return d->sidx >= d->d->nota.size() || d->nidx >= d->d->nota[d->sidx].size() ;
Packit d7e8d0
    }
Packit d7e8d0
    return !d->nota;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Notation::name() const
Packit d7e8d0
{
Packit d7e8d0
    return
Packit d7e8d0
        isNull() ? 0 :
Packit d7e8d0
        d->d ? d->d->nota[d->sidx][d->nidx].name :
Packit d7e8d0
        d->nota ? d->nota->name : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Notation::value() const
Packit d7e8d0
{
Packit d7e8d0
    return
Packit d7e8d0
        isNull() ? 0 :
Packit d7e8d0
        d->d ? d->d->nota[d->sidx][d->nidx].value :
Packit d7e8d0
        d->nota ? d->nota->value : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Notation::Flags GpgME::Notation::flags() const
Packit d7e8d0
{
Packit d7e8d0
    return
Packit d7e8d0
        convert_from_gpgme_sig_notation_flags_t(
Packit d7e8d0
            isNull() ? 0 :
Packit d7e8d0
            d->d ? d->d->nota[d->sidx][d->nidx].flags :
Packit d7e8d0
            d->nota ? d->nota->flags : 0);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Notation::isHumanReadable() const
Packit d7e8d0
{
Packit d7e8d0
    return flags() & HumanReadable;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Notation::isCritical() const
Packit d7e8d0
{
Packit d7e8d0
    return flags() & Critical;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::ostream &GpgME::operator<<(std::ostream &os, const VerificationResult &result)
Packit d7e8d0
{
Packit d7e8d0
    os << "GpgME::VerificationResult(";
Packit d7e8d0
    if (!result.isNull()) {
Packit d7e8d0
        os << "\n error:      " << result.error()
Packit d7e8d0
           << "\n fileName:   " << protect(result.fileName())
Packit d7e8d0
           << "\n signatures:\n";
Packit d7e8d0
        const std::vector<Signature> sigs = result.signatures();
Packit d7e8d0
        std::copy(sigs.begin(), sigs.end(),
Packit d7e8d0
                  std::ostream_iterator<Signature>(os, "\n"));
Packit d7e8d0
    }
Packit d7e8d0
    return os << ')';
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::ostream &GpgME::operator<<(std::ostream &os, Signature::PKAStatus pkaStatus)
Packit d7e8d0
{
Packit d7e8d0
#define OUTPUT( x ) if ( !(pkaStatus & (GpgME::Signature:: x)) ) {} else do { os << #x " "; } while(0)
Packit d7e8d0
    os << "GpgME::Signature::PKAStatus(";
Packit d7e8d0
    OUTPUT(UnknownPKAStatus);
Packit d7e8d0
    OUTPUT(PKAVerificationFailed);
Packit d7e8d0
    OUTPUT(PKAVerificationSucceeded);
Packit d7e8d0
#undef OUTPUT
Packit d7e8d0
    return os << ')';
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::ostream &GpgME::operator<<(std::ostream &os, Signature::Summary summary)
Packit d7e8d0
{
Packit d7e8d0
#define OUTPUT( x ) if ( !(summary & (GpgME::Signature:: x)) ) {} else do { os << #x " "; } while(0)
Packit d7e8d0
    os << "GpgME::Signature::Summary(";
Packit d7e8d0
    OUTPUT(Valid);
Packit d7e8d0
    OUTPUT(Green);
Packit d7e8d0
    OUTPUT(Red);
Packit d7e8d0
    OUTPUT(KeyRevoked);
Packit d7e8d0
    OUTPUT(KeyExpired);
Packit d7e8d0
    OUTPUT(SigExpired);
Packit d7e8d0
    OUTPUT(KeyMissing);
Packit d7e8d0
    OUTPUT(CrlMissing);
Packit d7e8d0
    OUTPUT(CrlTooOld);
Packit d7e8d0
    OUTPUT(BadPolicy);
Packit d7e8d0
    OUTPUT(SysError);
Packit d7e8d0
    OUTPUT(TofuConflict);
Packit d7e8d0
#undef OUTPUT
Packit d7e8d0
    return os << ')';
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::ostream &GpgME::operator<<(std::ostream &os, const Signature &sig)
Packit d7e8d0
{
Packit d7e8d0
    os << "GpgME::Signature(";
Packit d7e8d0
    if (!sig.isNull()) {
Packit d7e8d0
        os << "\n Summary:                   " << sig.summary()
Packit d7e8d0
           << "\n Fingerprint:               " << protect(sig.fingerprint())
Packit d7e8d0
           << "\n Status:                    " << sig.status()
Packit d7e8d0
           << "\n creationTime:              " << sig.creationTime()
Packit d7e8d0
           << "\n expirationTime:            " << sig.expirationTime()
Packit d7e8d0
           << "\n isWrongKeyUsage:           " << sig.isWrongKeyUsage()
Packit d7e8d0
           << "\n isVerifiedUsingChainModel: " << sig.isVerifiedUsingChainModel()
Packit d7e8d0
           << "\n pkaStatus:                 " << sig.pkaStatus()
Packit d7e8d0
           << "\n pkaAddress:                " << protect(sig.pkaAddress())
Packit d7e8d0
           << "\n validity:                  " << sig.validityAsString()
Packit d7e8d0
           << "\n nonValidityReason:         " << sig.nonValidityReason()
Packit d7e8d0
           << "\n publicKeyAlgorithm:        " << protect(sig.publicKeyAlgorithmAsString())
Packit d7e8d0
           << "\n hashAlgorithm:             " << protect(sig.hashAlgorithmAsString())
Packit d7e8d0
           << "\n policyURL:                 " << protect(sig.policyURL())
Packit d7e8d0
           << "\n isDeVs                     " << sig.isDeVs()
Packit d7e8d0
           << "\n notations:\n";
Packit d7e8d0
        const std::vector<Notation> nota = sig.notations();
Packit d7e8d0
        std::copy(nota.begin(), nota.end(),
Packit d7e8d0
                  std::ostream_iterator<Notation>(os, "\n"));
Packit d7e8d0
    }
Packit d7e8d0
    return os << ')';
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::ostream &GpgME::operator<<(std::ostream &os, Notation::Flags flags)
Packit d7e8d0
{
Packit d7e8d0
    os << "GpgME::Notation::Flags(";
Packit d7e8d0
#define OUTPUT( x ) if ( !(flags & (GpgME::Notation:: x)) ) {} else do { os << #x " "; } while(0)
Packit d7e8d0
    OUTPUT(HumanReadable);
Packit d7e8d0
    OUTPUT(Critical);
Packit d7e8d0
#undef OUTPUT
Packit d7e8d0
    return os << ')';
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::ostream &GpgME::operator<<(std::ostream &os, const Notation &nota)
Packit d7e8d0
{
Packit d7e8d0
    os << "GpgME::Signature::Notation(";
Packit d7e8d0
    if (!nota.isNull()) {
Packit d7e8d0
        os << "\n name:  " << protect(nota.name())
Packit d7e8d0
           << "\n value: " << protect(nota.value())
Packit d7e8d0
           << "\n flags: " << nota.flags()
Packit d7e8d0
           << '\n';
Packit d7e8d0
    }
Packit d7e8d0
    return os << ")";
Packit d7e8d0
}