Blame lang/cpp/src/gpgadduserideditinteractor.cpp

Packit d7e8d0
/*
Packit d7e8d0
  gpgadduserideditinteractor.cpp - Edit Interactor to add a new UID to an OpenPGP key
Packit d7e8d0
  Copyright (C) 2008 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 "gpgadduserideditinteractor.h"
Packit d7e8d0
Packit d7e8d0
#include "error.h"
Packit d7e8d0
Packit d7e8d0
#include <gpgme.h>
Packit d7e8d0
Packit d7e8d0
#include <cstring>
Packit d7e8d0
Packit d7e8d0
using std::strcmp;
Packit d7e8d0
Packit d7e8d0
// avoid conflict (msvc)
Packit d7e8d0
#ifdef ERROR
Packit d7e8d0
# undef ERROR
Packit d7e8d0
#endif
Packit d7e8d0
Packit d7e8d0
using namespace GpgME;
Packit d7e8d0
Packit d7e8d0
GpgAddUserIDEditInteractor::GpgAddUserIDEditInteractor()
Packit d7e8d0
    : EditInteractor(),
Packit d7e8d0
      m_name(),
Packit d7e8d0
      m_email(),
Packit d7e8d0
      m_comment()
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgAddUserIDEditInteractor::~GpgAddUserIDEditInteractor() {}
Packit d7e8d0
Packit d7e8d0
void GpgAddUserIDEditInteractor::setNameUtf8(const std::string &name)
Packit d7e8d0
{
Packit d7e8d0
    m_name = name;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
void GpgAddUserIDEditInteractor::setEmailUtf8(const std::string &email)
Packit d7e8d0
{
Packit d7e8d0
    m_email = email;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
void GpgAddUserIDEditInteractor::setCommentUtf8(const std::string &comment)
Packit d7e8d0
{
Packit d7e8d0
    m_comment = comment;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
// work around --enable-final
Packit d7e8d0
namespace GpgAddUserIDEditInteractor_Private
Packit d7e8d0
{
Packit d7e8d0
enum {
Packit d7e8d0
    START = EditInteractor::StartState,
Packit d7e8d0
    COMMAND,
Packit d7e8d0
    NAME,
Packit d7e8d0
    EMAIL,
Packit d7e8d0
    COMMENT,
Packit d7e8d0
    QUIT,
Packit d7e8d0
    SAVE,
Packit d7e8d0
Packit d7e8d0
    ERROR = EditInteractor::ErrorState
Packit d7e8d0
};
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgAddUserIDEditInteractor::action(Error &err) const
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
    using namespace GpgAddUserIDEditInteractor_Private;
Packit d7e8d0
Packit d7e8d0
    switch (state()) {
Packit d7e8d0
    case COMMAND:
Packit d7e8d0
        return "adduid";
Packit d7e8d0
    case NAME:
Packit d7e8d0
        return m_name.c_str();
Packit d7e8d0
    case EMAIL:
Packit d7e8d0
        return m_email.c_str();
Packit d7e8d0
    case COMMENT:
Packit d7e8d0
        return m_comment.c_str();
Packit d7e8d0
    case QUIT:
Packit d7e8d0
        return "quit";
Packit d7e8d0
    case SAVE:
Packit d7e8d0
        return "Y";
Packit d7e8d0
    case START:
Packit d7e8d0
    case ERROR:
Packit d7e8d0
        return 0;
Packit d7e8d0
    default:
Packit d7e8d0
        err = Error::fromCode(GPG_ERR_GENERAL);
Packit d7e8d0
        return 0;
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
unsigned int GpgAddUserIDEditInteractor::nextState(unsigned int status, const char *args, Error &err) const
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
    static const Error GENERAL_ERROR     = Error::fromCode(GPG_ERR_GENERAL);
Packit d7e8d0
    static const Error INV_NAME_ERROR    = Error::fromCode(GPG_ERR_INV_NAME);
Packit d7e8d0
    static const Error INV_EMAIL_ERROR   = Error::fromCode(GPG_ERR_INV_USER_ID);
Packit d7e8d0
    static const Error INV_COMMENT_ERROR = Error::fromCode(GPG_ERR_INV_USER_ID);
Packit d7e8d0
Packit d7e8d0
    if (needsNoResponse(status)) {
Packit d7e8d0
        return state();
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    using namespace GpgAddUserIDEditInteractor_Private;
Packit d7e8d0
Packit d7e8d0
    switch (state()) {
Packit d7e8d0
    case START:
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keyedit.prompt") == 0) {
Packit d7e8d0
            return COMMAND;
Packit d7e8d0
        }
Packit d7e8d0
        err = GENERAL_ERROR;
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    case COMMAND:
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keygen.name") == 0) {
Packit d7e8d0
            return NAME;
Packit d7e8d0
        }
Packit d7e8d0
        err = GENERAL_ERROR;
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    case NAME:
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keygen.email") == 0) {
Packit d7e8d0
            return EMAIL;
Packit d7e8d0
        }
Packit d7e8d0
        err = GENERAL_ERROR;
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keygen.name") == 0) {
Packit d7e8d0
            err = INV_NAME_ERROR;
Packit d7e8d0
        }
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    case EMAIL:
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keygen.comment") == 0) {
Packit d7e8d0
            return COMMENT;
Packit d7e8d0
        }
Packit d7e8d0
        err = GENERAL_ERROR;
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keygen.email") == 0) {
Packit d7e8d0
            err = INV_EMAIL_ERROR;
Packit d7e8d0
        }
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    case COMMENT:
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keyedit.prompt") == 0) {
Packit d7e8d0
            return QUIT;
Packit d7e8d0
        }
Packit d7e8d0
        err = GENERAL_ERROR;
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keygen.comment") == 0) {
Packit d7e8d0
            err = INV_COMMENT_ERROR;
Packit d7e8d0
        }
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    case QUIT:
Packit d7e8d0
        if (status == GPGME_STATUS_GET_BOOL &&
Packit d7e8d0
                strcmp(args, "keyedit.save.okay") == 0) {
Packit d7e8d0
            return SAVE;
Packit d7e8d0
        }
Packit d7e8d0
        err = GENERAL_ERROR;
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    case ERROR:
Packit d7e8d0
        if (status == GPGME_STATUS_GET_LINE &&
Packit d7e8d0
                strcmp(args, "keyedit.prompt") == 0) {
Packit d7e8d0
            return QUIT;
Packit d7e8d0
        }
Packit d7e8d0
        err = lastError();
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    default:
Packit d7e8d0
        err = GENERAL_ERROR;
Packit d7e8d0
        return ERROR;
Packit d7e8d0
    }
Packit d7e8d0
}