Blame lang/cpp/src/verificationresult.cpp

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