open_toontown_panda3d/direct/src/plugin/p3dCert.h

118 lines
2.9 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file p3dCert.h
* @author rdb
* @date 2011-03-08
*/
#ifndef P3DCERT_H
#define P3DCERT_H
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#define OPENSSL_NO_KRB5
#include "openssl/x509.h"
#include "openssl/x509_vfy.h"
#include "openssl/pem.h"
#include <string>
#include <iostream>
#include <stdio.h>
class ViewCertDialog;
#ifndef STACK_OF
// At some point, presumably in 1.0.0, openssl went to the STACK_OF() macro
// system to typedef the contents of a stack. Unfortunately, that new API
// is different. We define some macros here here for backward compatiblity.
#define STACK_OF(type) STACK
#define sk_X509_push(stack, item) sk_push((stack), (char *)(item))
#define sk_X509_free(stack) sk_free(stack)
#define sk_X509_new(cmp) sk_new(cmp)
#endif
/**
* This is the primary dialog of this application.
*
* This dialog is presented to the user when he/she clicks on the red
* authorization button on the splash window. It tells the user the status of
* the application's signature, and invites the user to approve the signature
* or cancel.
*/
class AuthDialog : public Fl_Window {
public:
#ifdef _WIN32
AuthDialog(const std::wstring &cert_filename, const std::wstring &cert_dir);
#else
AuthDialog(const std::string &cert_filename, const std::string &cert_dir);
#endif
virtual ~AuthDialog();
static void run_clicked(Fl_Widget *w, void *data);
static void view_cert_clicked(Fl_Widget *w, void *data);
static void cancel_clicked(Fl_Widget *w, void *data);
void approve_cert();
private:
#ifdef _WIN32
void read_cert_file(const std::wstring &cert_filename);
#else
void read_cert_file(const std::string &cert_filename);
#endif
void get_friendly_name();
void verify_cert();
int load_certificates_from_der_ram(X509_STORE *store,
const char *data, size_t data_size);
void layout();
void get_text(char *header, size_t hlen, char *text, size_t tlen);
public:
ViewCertDialog *_view_cert_dialog;
private:
#ifdef _WIN32
std::wstring _cert_dir;
#else
std::string _cert_dir;
#endif
X509 *_cert;
STACK_OF(X509) *_stack;
char _header[64];
char _text[1024];
char _text_clean[2048];
std::string _friendly_name;
int _verify_result;
};
/**
* This is the detailed view of the particular certificate.
*/
class ViewCertDialog : public Fl_Window {
public:
ViewCertDialog(AuthDialog *auth_dialog, X509 *cert);
virtual ~ViewCertDialog();
static void run_clicked(Fl_Widget *w, void *data);
static void cancel_clicked(Fl_Widget *w, void *data);
private:
void layout();
private:
AuthDialog *_auth_dialog;
X509 *_cert;
};
#endif