forked from cheng/wallet
Now UI is working well enough to finally introduce secret management
First thing that is actually part of the final use case
This commit is contained in:
parent
25ec24936f
commit
e3ba96799c
24
app.cpp
24
app.cpp
@ -19,9 +19,9 @@ App::~App()
|
||||
|
||||
bool App::OnInit()
|
||||
{ if (wxApp::OnInit()) {
|
||||
SetVendorName(_T("rho")); /* This causes the non volatile config data to be stored under the rho on
|
||||
SetVendorName(wxT("rho")); /* This causes the non volatile config data to be stored under the rho on
|
||||
windows.*/
|
||||
SetAppName(_T("wallet")); /* This causes the non volatile config data to be stored under rho\wallet
|
||||
SetAppName(wxT("wallet")); /* This causes the non volatile config data to be stored under rho\wallet
|
||||
We will generally place data in the database, and if additional executables need their own data
|
||||
in the config, they will create their own subkey under Computer\HKEY_CURRENT_USER\Software\rho */
|
||||
pConfig = std::unique_ptr<wxConfigBase>(wxConfigBase::Get());
|
||||
@ -91,7 +91,7 @@ bool App::OnExceptionInMainLoop()
|
||||
error = wsz_program + _wx(sz_unknown_error);
|
||||
errorCode = 8;
|
||||
}
|
||||
wxLogError(_T("%s"), error);
|
||||
wxLogError(wxT("%s"), error);
|
||||
wxMessageDialog dlg(singletonFrame, error, wsz_error, wxICON_ERROR);
|
||||
dlg.SetId(myID_ERRORMESSAGE);
|
||||
dlg.ShowModal();
|
||||
@ -103,7 +103,7 @@ void App::OnInitCmdLine(wxCmdLineParser& parser)
|
||||
{
|
||||
parser.SetDesc(g_cmdLineDesc);
|
||||
// must refuse '/' as parameter starter or cannot use "/path" style paths
|
||||
parser.SetSwitchChars(_T("-"));
|
||||
parser.SetSwitchChars(wxT("-"));
|
||||
//Command line parameters
|
||||
parser.SetLogo(wsz_commandLineLogo);
|
||||
parser.AddUsageText(wsz_usageText);
|
||||
@ -117,30 +117,30 @@ bool App::OnCmdLineParsed(wxCmdLineParser& parser)
|
||||
{
|
||||
case wxCMD_LINE_SWITCH:
|
||||
optionName = arg.GetShortName();
|
||||
if (optionName == _T("t")) {
|
||||
if (optionName == wxT("t")) {
|
||||
m_unit_test = !arg.IsNegated();
|
||||
}
|
||||
else if (optionName == _T("l")) {
|
||||
else if (optionName == wxT("l")) {
|
||||
m_display = !arg.IsNegated();
|
||||
}
|
||||
else if (optionName == _T("d")) {
|
||||
else if (optionName == wxT("d")) {
|
||||
m_display |= m_display_in_front = !arg.IsNegated();
|
||||
}
|
||||
else if (optionName == _T("f")) {
|
||||
else if (optionName == wxT("f")) {
|
||||
m_log_focus_events = !arg.IsNegated();
|
||||
if (m_log_focus_events) {
|
||||
Bind(
|
||||
wxEVT_IDLE,
|
||||
+[](wxIdleEvent& event) { //Since this function is only ever used once, never being unbound, using a lambda to avoid naming it.
|
||||
static wxWindow* lastFocus = (wxWindow*)NULL;
|
||||
//wxLogMessage(_T("OnIdle"));
|
||||
//wxLogMessage(wxT("OnIdle"));
|
||||
wxWindow* curFocus = ::wxWindow::FindFocus();
|
||||
if (curFocus != lastFocus && curFocus)
|
||||
{
|
||||
lastFocus = curFocus;
|
||||
wxString name{ "" };
|
||||
do {
|
||||
name = wxString(_T("/")) + curFocus->GetClassInfo()->GetClassName() + _T(":") + curFocus->GetName() + name;
|
||||
name = wxString(wxT("/")) + curFocus->GetClassInfo()->GetClassName() + wxT(":") + curFocus->GetName() + name;
|
||||
} while (curFocus = curFocus->GetParent());
|
||||
wxLogMessage(name);
|
||||
}
|
||||
@ -149,11 +149,11 @@ bool App::OnCmdLineParsed(wxCmdLineParser& parser)
|
||||
);
|
||||
}
|
||||
}
|
||||
else if (optionName == _T("q")) {
|
||||
else if (optionName == wxT("q")) {
|
||||
m_quick_unit_test = !arg.IsNegated();
|
||||
m_complete_unit_test = m_complete_unit_test && !m_quick_unit_test;
|
||||
}
|
||||
else if (optionName == _T("c")) {
|
||||
else if (optionName == wxT("c")) {
|
||||
m_complete_unit_test = !arg.IsNegated();
|
||||
m_quick_unit_test = m_quick_unit_test && !m_complete_unit_test;
|
||||
}
|
||||
|
@ -1,12 +1,11 @@
|
||||
#include "stdafx.h"
|
||||
using ro::base58;
|
||||
display_wallet::display_wallet(wxWindow* parent, wxFileName& walletfile) :
|
||||
wxPanel(parent, myID_WALLET_UI, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("Wallet")),
|
||||
wxPanel(parent, myID_WALLET_UI, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, wxT("Wallet")),
|
||||
m_db(nullptr),
|
||||
m_menuitem_close(this, &display_wallet::close_menu_event_handler),
|
||||
m_menuitem_add_name(this, &display_wallet::add_name_event_handler)
|
||||
{
|
||||
wxLogMessage(_T("Loading %s"), walletfile.GetFullPath());
|
||||
wxLogMessage(wxT("Loading %s"), walletfile.GetFullPath());
|
||||
if (!walletfile.IsOk() || !walletfile.HasName() || !walletfile.HasExt()) throw MyException("unexpected file name");
|
||||
if (!walletfile.FileExists())throw MyException(
|
||||
walletfile.GetFullPath().append(" does not exist.").ToUTF8()
|
||||
@ -62,7 +61,6 @@ display_wallet::display_wallet(wxWindow* parent, wxFileName& walletfile) :
|
||||
singletonFrame->m_LastUsedSqlite.Assign(walletfile);
|
||||
|
||||
wxMenu* menuFile{ singletonFrame->GetMenuBar()->GetMenu(0) };
|
||||
m_menuitem_close.Insert(menuFile, 1, "close", "close wallet");
|
||||
singletonFrame->GetMenuBar()->EnableTop(1, true); //enable edit menu.
|
||||
wxMenu* menuEdit{ singletonFrame->GetMenuBar()->GetMenu(1) };
|
||||
m_menuitem_add_name.Insert(menuEdit, 0, "add name", "create new Zooko identity");
|
||||
@ -88,10 +86,14 @@ void display_wallet::add_name_event_handler(wxCommandEvent& event) {
|
||||
wxOK | wxCANCEL);
|
||||
if (dialog.ShowModal() == wxID_OK)
|
||||
{
|
||||
wxMessageBox(dialog.GetValue(), "Got string", wxOK | wxICON_INFORMATION, this);
|
||||
std::string zookoNickname(dialog.GetValue().ToUTF8());
|
||||
sql_insert_name insert_name(m_db);
|
||||
auto zookoNickname_psz = zookoNickname.c_str();
|
||||
insert_name(
|
||||
zookoNickname_psz,
|
||||
m_MasterSecret(zookoNickname_psz).timesBase()
|
||||
);
|
||||
}
|
||||
sql_insert_name insert_name(m_db);
|
||||
insert_name(dialog.GetValue().ToUTF8(), m_MasterSecret(dialog.GetValue().ToUTF8()).timesBase());
|
||||
}
|
||||
|
||||
|
||||
|
@ -12,7 +12,6 @@ private:
|
||||
wxBoxSizer* m_rSizer;
|
||||
void close_menu_event_handler(wxCommandEvent&);
|
||||
void add_name_event_handler(wxCommandEvent&);
|
||||
MenuLink m_menuitem_close;
|
||||
MenuLink m_menuitem_add_name;
|
||||
void OnClose(wxCloseEvent& event);
|
||||
};
|
||||
|
139
frame.cpp
139
frame.cpp
@ -8,20 +8,20 @@ Frame* singletonFrame{nullptr};
|
||||
|
||||
void Frame::RestorePositionFromConfig(const wxSize& bestSize) {
|
||||
// SetPath() understands ".." but you should probably never use it.
|
||||
singletonApp->pConfig->SetPath(_T("/MainFrame")); wxPoint scr{ wxSystemSettings::GetMetric(wxSYS_SCREEN_X), wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) };
|
||||
singletonApp->pConfig->SetPath(wxT("/MainFrame")); wxPoint scr{ wxSystemSettings::GetMetric(wxSYS_SCREEN_X), wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) };
|
||||
// restore frame position and size
|
||||
int x = singletonApp->pConfig->ReadLong(_T("x"), scr.x / 4);
|
||||
int y = singletonApp->pConfig->ReadLong(_T("y"), scr.y / 4);
|
||||
int w = singletonApp->pConfig->ReadLong(_T("w"), scr.x / 2);
|
||||
int h = singletonApp->pConfig->ReadLong(_T("h"), scr.y / 2);
|
||||
int x = singletonApp->pConfig->ReadLong(wxT("x"), scr.x / 4);
|
||||
int y = singletonApp->pConfig->ReadLong(wxT("y"), scr.y / 4);
|
||||
int w = singletonApp->pConfig->ReadLong(wxT("w"), scr.x / 2);
|
||||
int h = singletonApp->pConfig->ReadLong(wxT("h"), scr.y / 2);
|
||||
w = std::min(std::max(std::max(w, scr.x / 5), bestSize.GetWidth()), 8 * scr.x / 9);
|
||||
h = std::min(std::max(std::max(h, scr.y / 9), bestSize.GetHeight()), 4 * scr.y / 5);
|
||||
x = std::max(scr.x / 12, std::min(x, scr.x - w - scr.x / 12));
|
||||
y = std::max(scr.y / 10, std::min(y, scr.y - h - scr.y / 10));
|
||||
this->Move(x, y);
|
||||
this->Maximize(singletonApp->pConfig->ReadBool(_T("Maximized"), false));
|
||||
this->Maximize(singletonApp->pConfig->ReadBool(wxT("Maximized"), false));
|
||||
this->SetSize(w, h);
|
||||
singletonApp->pConfig->SetPath(_T("/"));
|
||||
singletonApp->pConfig->SetPath(wxT("/"));
|
||||
if (singletonApp->m_display || m_pLogWindow != nullptr) {
|
||||
m_pLogWindow->GetFrame()->SetSize(w, h);
|
||||
if (singletonApp->m_display_in_front) {
|
||||
@ -40,22 +40,22 @@ void Frame::RestorePositionFromConfig(const wxSize& bestSize) {
|
||||
|
||||
void Frame::StorePositionToConfig() {
|
||||
if (singletonApp->pConfig) {
|
||||
singletonApp->pConfig->SetPath(_T("/MainFrame"));
|
||||
singletonApp->pConfig->SetPath(wxT("/MainFrame"));
|
||||
if (this->IsMaximized()) {
|
||||
singletonApp->pConfig->Write(_T("Maximized"), true);
|
||||
singletonApp->pConfig->Write(wxT("Maximized"), true);
|
||||
}
|
||||
else {
|
||||
// save the frame position
|
||||
int x, y, w, h;
|
||||
this->GetSize(&w, &h);
|
||||
this->GetPosition(&x, &y);
|
||||
singletonApp->pConfig->Write(_T("x"), (long)x);
|
||||
singletonApp->pConfig->Write(_T("y"), (long)y);
|
||||
singletonApp->pConfig->Write(_T("w"), (long)w);
|
||||
singletonApp->pConfig->Write(_T("h"), (long)h);
|
||||
singletonApp->pConfig->Write(_T("Maximized"), false);
|
||||
singletonApp->pConfig->Write(wxT("x"), (long)x);
|
||||
singletonApp->pConfig->Write(wxT("y"), (long)y);
|
||||
singletonApp->pConfig->Write(wxT("w"), (long)w);
|
||||
singletonApp->pConfig->Write(wxT("h"), (long)h);
|
||||
singletonApp->pConfig->Write(wxT("Maximized"), false);
|
||||
}
|
||||
singletonApp->pConfig->SetPath(_T("/"));
|
||||
singletonApp->pConfig->SetPath(wxT("/"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -85,12 +85,12 @@ try {
|
||||
m_pLogWindow->GetFrame()->SetName(sz_unit_test_log);
|
||||
m_pLogWindow->GetFrame()->SetIcon(wxICON(AAArho));
|
||||
if (singletonApp->m_unit_test) {
|
||||
wxLogMessage(_T("Command line specified %s unit test with%s exit on completion of unit test."),
|
||||
singletonApp->m_complete_unit_test?_T("complete"): singletonApp->m_quick_unit_test?_T("quick"):_T(""),
|
||||
singletonApp->m_display ? _T("out") : _T(""));
|
||||
wxLogMessage(_T("If an error occurs during unit test, the program will return a non zero "
|
||||
wxLogMessage(wxT("Command line specified %s unit test with%s exit on completion of unit test."),
|
||||
singletonApp->m_complete_unit_test?wxT("complete"): singletonApp->m_quick_unit_test?wxT("quick"):wxT(""),
|
||||
singletonApp->m_display ? wxT("out") : wxT(""));
|
||||
wxLogMessage(wxT("If an error occurs during unit test, the program will return a non zero "
|
||||
"error number on exit."));
|
||||
wxLogMessage(_T(""));
|
||||
wxLogMessage(wxT(""));
|
||||
}
|
||||
}else {
|
||||
wxLog::EnableLogging(false);
|
||||
@ -102,18 +102,18 @@ try {
|
||||
&UnitTest
|
||||
);
|
||||
if (singletonApp->m_log_focus_events) {
|
||||
wxLogMessage(_T("Logging focus events"));
|
||||
wxLogMessage(_T(""));
|
||||
wxLogMessage(wxT("Logging focus events"));
|
||||
wxLogMessage(wxT(""));
|
||||
}
|
||||
if (singletonApp->m_params.empty()) {
|
||||
wxLogMessage(_T("No wallet specified. Attempting to open last used wallet"));
|
||||
wxLogMessage(wxT("No wallet specified. Attempting to open last used wallet"));
|
||||
}else {
|
||||
wxString subcommands( _T(""));
|
||||
wxString subcommands( wxT(""));
|
||||
for (auto& str : singletonApp->m_params) {
|
||||
subcommands += str + _T(" ");
|
||||
subcommands += str + wxT(" ");
|
||||
}
|
||||
wxLogMessage(_T("command argument%s %s"), singletonApp->m_params.size()==1?"":"s", subcommands);
|
||||
wxLogMessage(_T("attempting to open %s"), singletonApp->m_params[0]);
|
||||
wxLogMessage(wxT("command argument%s %s"), singletonApp->m_params.size()==1?"":"s", subcommands);
|
||||
wxLogMessage(wxT("attempting to open %s"), singletonApp->m_params[0]);
|
||||
}
|
||||
SetIcon(wxICON(AAArho)); //Does not appear to do anything. Maybe it does something in Unix.
|
||||
//wxICON is a namestring on windows, and a symbol on Unix
|
||||
@ -128,12 +128,13 @@ try {
|
||||
|
||||
menuFile->Append(wxID_OPEN, menu_strings[0].tail[2][0], menu_strings[0].tail[2][1]);
|
||||
menuFile->Bind(wxEVT_MENU, &Frame::OnFileOpen, this, wxID_OPEN);
|
||||
menuFile->Append(wxID_DELETE, menu_strings[0].tail[3][0], menu_strings[0].tail[3][1] + m_LastUsedSqlite.GetFullPath());
|
||||
wxLogMessage(m_LastUsedSqlite.GetFullPath()+" wallet path");
|
||||
menuFile->Bind(wxEVT_MENU, &Frame::OnDelete, this, wxID_DELETE); menuFile->Append(myID_DELETECONFIG, menu_strings[0].tail[4][0], menu_strings[0].tail[4][1] + m_LastUsedSqlite.GetFullPath());
|
||||
{ auto _ = new wxMenuItem(menuFile, wxID_CLOSE);
|
||||
_->SetHelp(menu_strings[0].tail[3][1] + m_LastUsedSqlite.GetFullPath());
|
||||
menuFile->Append(_);
|
||||
menuFile->Bind(wxEVT_MENU, &Frame::OnMyCloseMPanel, this, wxID_CLOSE);
|
||||
}
|
||||
menuFile->Append(myID_DELETECONFIG, menu_strings[0].tail[4][0], menu_strings[0].tail[4][1] + m_LastUsedSqlite.GetFullPath());
|
||||
menuFile->Bind(wxEVT_MENU, &Frame::OnDeleteConfiguration, this, myID_DELETECONFIG);
|
||||
menuFile->Append(myID_MYEXIT,"my exit, testing destruction");
|
||||
menuFile->Bind(wxEVT_MENU, &Frame::OnMyCloseMpanel, this, myID_MYEXIT);
|
||||
menuFile->Append(wxID_EXIT);
|
||||
menuFile->Bind(wxEVT_MENU, &Frame::OnExit, this, wxID_EXIT);
|
||||
|
||||
@ -148,7 +149,7 @@ try {
|
||||
CreateStatusBar();
|
||||
menuBar->EnableTop(1, false); //disable edit menu.
|
||||
// child controls
|
||||
m_LastUsedSqlite.Assign(singletonApp->pConfig->Read(_T("/Wallet/LastUsed"), _T("")));
|
||||
m_LastUsedSqlite.Assign(singletonApp->pConfig->Read(wxT("/Wallet/LastUsed"), wxT("")));
|
||||
if (!m_LastUsedSqlite.IsOk() || !m_LastUsedSqlite.HasName() || !m_LastUsedSqlite.HasExt()) {
|
||||
m_panel = new welcome_to_rhocoin(this); //Owner is "this", via the base class wxFrame. m_panel is a
|
||||
// non owning pointer in the derived class that duplicates the owning pointer in the base class.
|
||||
@ -169,11 +170,6 @@ try {
|
||||
queue_error_message(e.what());
|
||||
}
|
||||
}
|
||||
void Frame::OnMyCloseMpanel(wxCommandEvent& event) {
|
||||
if (m_panel) {
|
||||
m_panel->Close(true);
|
||||
}
|
||||
}
|
||||
|
||||
void Frame::OnExit(wxCommandEvent& event) {
|
||||
if (m_panel) {
|
||||
@ -187,7 +183,7 @@ void Frame::OnClose(wxCloseEvent& event) {
|
||||
// This event gives you the opportunity to clean up anything that needs explicit cleanup, albeit if you have done your work right nothing should need explicit cleanup,
|
||||
// and to object to the closing in a "file not saved" type situation.
|
||||
// https://docs.wxwidgets.org/trunk/classwx_close_event.html
|
||||
if (sqlite3_shutdown())wxMessageBox(_T(R"|(Sqlite3 shutdown error)|"), wsz_error, wxICON_ERROR);
|
||||
if (sqlite3_shutdown())wxMessageBox(wxT(R"|(Sqlite3 shutdown error)|"), wsz_error, wxICON_ERROR);
|
||||
DestroyChildren();
|
||||
Destroy(); //Default handler will destroy the window. This is our handler for the user calling close, replacing the default handler.
|
||||
}
|
||||
@ -205,17 +201,17 @@ void Frame::OnDeleteConfiguration(wxCommandEvent&)
|
||||
{
|
||||
if (pConfig->DeleteAll())
|
||||
{
|
||||
wxLogMessage(_T("Config file/registry key successfully deleted."));
|
||||
wxLogMessage(wxT("Config file/registry key successfully deleted."));
|
||||
wxConfigBase::DontCreateOnDemand();
|
||||
pConfig.release();
|
||||
}
|
||||
else
|
||||
{
|
||||
wxLogError(_T("Deleting config file/registry key failed."));
|
||||
wxLogError(wxT("Deleting config file/registry key failed."));
|
||||
}
|
||||
}
|
||||
else {
|
||||
wxLogError(_T("No config to delete!"));
|
||||
wxLogError(wxT("No config to delete!"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -271,6 +267,17 @@ COMMIT;)|");
|
||||
}
|
||||
}
|
||||
|
||||
class hide_panel {
|
||||
wxPanel* oldpanel;
|
||||
public:
|
||||
hide_panel(wxPanel* v): oldpanel(v){
|
||||
v->Hide();
|
||||
}
|
||||
~hide_panel() {
|
||||
if (oldpanel == singletonFrame->m_panel) oldpanel->Show();
|
||||
}
|
||||
};
|
||||
|
||||
void Frame::OnSaveNew(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxFileDialog dialog(this,
|
||||
@ -279,25 +286,27 @@ void Frame::OnSaveNew(wxCommandEvent& WXUNUSED(event))
|
||||
sz_default_wallet_name,
|
||||
sz_wallet_files_title,
|
||||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
|
||||
|
||||
dialog.SetFilterIndex(1);
|
||||
|
||||
if (dialog.ShowModal() == wxID_OK)
|
||||
{
|
||||
wxLogMessage("%s, filter %d",
|
||||
dialog.GetPath(), dialog.GetFilterIndex());
|
||||
hide_panel hid(m_panel);
|
||||
wxString wxStrWallet{ dialog.GetDirectory() + "/" + dialog.GetFilename() };
|
||||
wxFileName wxFileWallet(wxStrWallet);
|
||||
ristretto255::hash<256> WalletSecret{ wxStrWallet.ToUTF8() };
|
||||
NewWallet(wxFileWallet, WalletSecret);
|
||||
wxLogMessage("new wallet created: %s", wxStrWallet);
|
||||
display_wallet* panel = new display_wallet(this, wxFileWallet);
|
||||
if (m_panel)m_panel->Destroy();
|
||||
m_panel = panel;
|
||||
m_panel->Show();
|
||||
}
|
||||
wxString wxStrWallet{ dialog.GetDirectory() + "/" + dialog.GetFilename() };
|
||||
wxFileName wxFileWallet(wxStrWallet);
|
||||
ristretto255::hash<256> WalletSecret{ wxStrWallet.ToUTF8() };
|
||||
NewWallet(wxFileWallet, WalletSecret);
|
||||
wxLogMessage("new wallet created: %s", wxStrWallet);
|
||||
wxConfigBase::Get()->Write(_T("/Wallet/ LastUsed"), wxStrWallet);
|
||||
}
|
||||
|
||||
void Frame::OnFileOpen(wxCommandEvent&) {
|
||||
wxString directory{ _T("") };
|
||||
wxString file{ _T("") };
|
||||
wxString directory{ wxT("") };
|
||||
wxString file{ wxT("") };
|
||||
if (m_LastUsedSqlite.IsOk()) {
|
||||
directory = m_LastUsedSqlite.GetPath();
|
||||
file = m_LastUsedSqlite.GetFullName();
|
||||
@ -318,7 +327,7 @@ void Frame::OnFileOpen(wxCommandEvent&) {
|
||||
}
|
||||
|
||||
void Frame::RecreateWalletFromExistingSecret(wxCommandEvent&) {
|
||||
wxMessageBox(_T("new wallet existing secret event"), _T(""));
|
||||
wxMessageBox(wxT("new wallet existing secret event"), wxT(""));
|
||||
auto standardpaths = wxStandardPaths::Get();
|
||||
wxFileDialog dialog(this,
|
||||
sz_new_wallet_existing_secret,
|
||||
@ -336,22 +345,24 @@ void Frame::RecreateWalletFromExistingSecret(wxCommandEvent&) {
|
||||
}
|
||||
}
|
||||
|
||||
void Frame::OnDelete(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
singletonApp->pConfig->SetPath(_T("/Wallet"));
|
||||
wxFileName LastUsedSqlite(singletonApp->pConfig->Read(_T("LastUsed"), _T("")));
|
||||
singletonApp->pConfig->DeleteEntry(_T("LastUsed"));
|
||||
if (LastUsedSqlite.IsOk() && LastUsedSqlite.FileExists()) {
|
||||
if (wxRemoveFile(LastUsedSqlite.GetFullPath()))wxLogMessage(_T("Deleting % s"), LastUsedSqlite.GetFullPath());
|
||||
void Frame::OnMyCloseMPanel(wxCommandEvent& event) {
|
||||
if (m_panel) {
|
||||
if (!m_panel->Close(false)) throw MyException("Close cancelled");
|
||||
}
|
||||
LastUsedSqlite.Clear();
|
||||
assert(m_panel == nullptr);
|
||||
singletonApp->pConfig->SetPath(wxT("/Wallet"));
|
||||
if (singletonApp->pConfig->Read(wxT("LastUsed"), wxT("")) == m_LastUsedSqlite.GetFullPath()) {
|
||||
singletonApp->pConfig->DeleteEntry(wxT("LastUsed"));
|
||||
m_LastUsedSqlite.Clear();
|
||||
}
|
||||
assert(m_panel == nullptr);
|
||||
}
|
||||
|
||||
void Frame::OnMenuOpen(wxMenuEvent& evt) {
|
||||
auto pMenu(evt.GetMenu());
|
||||
if (pMenu) {
|
||||
auto label(pMenu->GetTitle());
|
||||
wxLogMessage(_T("Open menu \"%s\""), label);
|
||||
wxLogMessage(wxT("Open menu \"%s\""), label);
|
||||
}
|
||||
}
|
||||
|
||||
@ -361,7 +372,7 @@ Frame::~Frame() {
|
||||
wxConfigBase* pConfig = wxConfigBase::Get();
|
||||
if (pConfig == nullptr)return;
|
||||
StorePositionToConfig();
|
||||
if (singletonApp->pConfig->Read(_T("/Wallet/LastUsed"), _T("")) != m_LastUsedSqlite.GetFullPath()) {
|
||||
pConfig->Write(_T("/Wallet/LastUsed"), m_LastUsedSqlite.GetFullPath());
|
||||
if (singletonApp->pConfig->Read(wxT("/Wallet/LastUsed"), wxT("")) != m_LastUsedSqlite.GetFullPath()) {
|
||||
pConfig->Write(wxT("/Wallet/LastUsed"), m_LastUsedSqlite.GetFullPath());
|
||||
}
|
||||
}
|
||||
|
7
frame.h
7
frame.h
@ -70,22 +70,19 @@ private:
|
||||
void StorePositionToConfig(void);
|
||||
void RestorePositionFromConfig(const wxSize&);
|
||||
void OnExit(wxCommandEvent&);
|
||||
void OnClose(wxCloseEvent&);
|
||||
void OnAbout(wxCommandEvent&);
|
||||
void OnDeleteConfiguration(wxCommandEvent&);
|
||||
void OnMyCloseMpanel(wxCommandEvent&);
|
||||
|
||||
void OnMyCloseMPanel(wxCommandEvent&);
|
||||
|
||||
public:
|
||||
void OnSaveNew(wxCommandEvent&);
|
||||
void NewWallet(wxFileName&, ristretto255::hash<256>&);
|
||||
void RecreateWalletFromExistingSecret(wxCommandEvent&);
|
||||
void OnFileOpen(wxCommandEvent&);
|
||||
|
||||
void OnClose(wxCloseEvent& event);
|
||||
private:
|
||||
void OnMenuOpen(wxMenuEvent&);
|
||||
public:
|
||||
void OnDelete(wxCommandEvent&);
|
||||
void OnFirstUse(wxCommandEvent&);
|
||||
|
||||
public:
|
||||
|
@ -76,7 +76,7 @@ static const char * file_menu_strings[][2]{
|
||||
{"&New wallet...", "New wallet file From new secret"},
|
||||
{"Existing secret...","New Wallet File From the secret of an old wallet"},
|
||||
{"&Open existing wallet file...",""},
|
||||
{"&Delete Wallet File","Delete"},
|
||||
{nullptr,"Close"},
|
||||
{"&Reset defaults","Delete config file"}};
|
||||
|
||||
const menu_string menu_strings_[]{
|
||||
|
@ -72,6 +72,16 @@ namespace ro {
|
||||
CompileSizedString() {
|
||||
*(this->rbegin()) = '0';
|
||||
}
|
||||
CompileSizedString(char *psz) {
|
||||
auto tsz{ this->rbegin() };
|
||||
*tsz = '0';
|
||||
if (psz != nullptr) {
|
||||
auto usz = tsz + strlen;
|
||||
while (tsz < usz && *psz != '\0')
|
||||
*tsz++ = *psz++;
|
||||
*tsz = '\0';
|
||||
}
|
||||
}
|
||||
operator char* () & {
|
||||
char* pc = &(static_cast<std::array<char, stringlen + 1>*>(this)->operator[](0));
|
||||
return pc;
|
||||
|
@ -41,16 +41,16 @@ protected:
|
||||
virtual int Enter(wxDialog* dlg) wxOVERRIDE
|
||||
{
|
||||
wxLogMessage(
|
||||
_T("Showing %s:%s dialog"),
|
||||
wxT("Showing %s:%s dialog"),
|
||||
dlg->GetClassInfo()->GetClassName(),
|
||||
dlg->GetLabel()
|
||||
);
|
||||
auto x = dlg->GetId();
|
||||
switch (x) {
|
||||
case myID_ERRORMESSAGE:
|
||||
wxLogMessage(_T("\tError message modal dialog"));
|
||||
wxLogMessage(wxT("\tError message modal dialog"));
|
||||
unit_test_action = next_action;
|
||||
wxLogMessage(_T("\tClosing dialog"));
|
||||
wxLogMessage(wxT("\tClosing dialog"));
|
||||
return wxID_OK;
|
||||
default:
|
||||
return wxID_NONE;
|
||||
@ -82,7 +82,7 @@ static bool EndUnitTest() {
|
||||
ILogMessage("Passed Unit Test");
|
||||
}
|
||||
else {
|
||||
wxLogMessage(_T("\nFailed Unit Test\nunit test error %d\n%s"),
|
||||
wxLogMessage(wxT("\nFailed Unit Test\nunit test error %d\n%s"),
|
||||
errorCode, _wx(szError.c_str())
|
||||
);
|
||||
}
|
||||
@ -251,12 +251,12 @@ static bool CheckForUtfEnvironment(void) {
|
||||
ILogMessage("\tChecking for UTF locale.");
|
||||
try {
|
||||
bool utfEnvironment{ true };
|
||||
wxString utfError{ _T("") };
|
||||
wxString utfError{ wxT("") };
|
||||
if constexpr (b_WINDOWS) {
|
||||
auto ACP{ GetACP() };
|
||||
utfEnvironment = utfEnvironment && (ACP == 65001);
|
||||
if (!utfEnvironment) {
|
||||
utfError += wxString::Format(_T("current code page %d—should be 65001☹, "), ACP);
|
||||
utfError += wxString::Format(wxT("current code page %d—should be 65001☹, "), ACP);
|
||||
}
|
||||
}
|
||||
auto FontEncoding{ wxLocale::GetSystemEncoding() };
|
||||
@ -269,11 +269,11 @@ static bool CheckForUtfEnvironment(void) {
|
||||
|| (FontEncoding == wxFONTENCODING_SYSTEM)
|
||||
);
|
||||
if (!utfEnvironment) {
|
||||
utfError = wxString::Format(_T("%swxFontEncoding %d—should be %d☹"),
|
||||
utfError = wxString::Format(wxT("%swxFontEncoding %d—should be %d☹"),
|
||||
utfError,
|
||||
FontEncoding,
|
||||
wxFONTENCODING_UTF8);
|
||||
wxLogMessage(_T("%s"), utfError);
|
||||
wxLogMessage(wxT("%s"), utfError);
|
||||
}
|
||||
if (!utfEnvironment) { throw MyException(utfError); }
|
||||
}
|
||||
@ -367,19 +367,19 @@ static bool OpenWallet(void) {
|
||||
wallet file.*/
|
||||
ILogMessage("\tWallet file");
|
||||
assert(singletonApp->pConfig);
|
||||
singletonApp->pConfig->SetPath(_T("/Wallet"));
|
||||
wxFileName LastUsedSqlite(singletonApp->pConfig->Read(_T("LastUsed"), _T("")));
|
||||
singletonApp->pConfig->SetPath(wxT("/Wallet"));
|
||||
wxFileName LastUsedSqlite(singletonApp->pConfig->Read(wxT("LastUsed"), wxT("")));
|
||||
bool fWalletNameOk{ false };
|
||||
wxStandardPaths& StandardPaths(wxStandardPaths::Get());
|
||||
StandardPaths.UseAppInfo(3);
|
||||
wxFileName DefaultSqlite(StandardPaths.GetUserLocalDataDir(), "default.wallet");
|
||||
wxLogMessage(_T("\t\tLastUsed=\"%s\""), LastUsedSqlite.GetFullPath());
|
||||
wxLogMessage(wxT("\t\tLastUsed=\"%s\""), LastUsedSqlite.GetFullPath());
|
||||
if (!LastUsedSqlite.IsOk() || !LastUsedSqlite.HasName() || !LastUsedSqlite.HasExt()) {
|
||||
wxLogMessage(_T("\t\tDefault=\"%s\""), DefaultSqlite.GetFullPath());
|
||||
wxLogMessage(wxT("\t\tDefault=\"%s\""), DefaultSqlite.GetFullPath());
|
||||
assert(DefaultSqlite.IsOk() && DefaultSqlite.HasName() && DefaultSqlite.HasExt());
|
||||
if (DefaultSqlite.FileExists()) {
|
||||
LastUsedSqlite = DefaultSqlite;
|
||||
singletonApp->pConfig->Write(_T("LastUsed"), DefaultSqlite.GetFullPath());
|
||||
singletonApp->pConfig->Write(wxT("LastUsed"), DefaultSqlite.GetFullPath());
|
||||
fWalletNameOk = true;
|
||||
}
|
||||
}
|
||||
@ -408,7 +408,7 @@ static bool OpenWallet(void) {
|
||||
}
|
||||
const char* name = read_name.name();
|
||||
if(MasterSecret(name).timesBase()!=*pubkey)throw MyException(R"|(Public key of name fails to correspond)|");
|
||||
wxLogMessage(_T("\t\t\"%s\" has expected public key 0x%s"), name, (wxString)(bin2hex(*pubkey)));
|
||||
wxLogMessage(wxT("\t\t\"%s\" has expected public key 0x%s"), name, (wxString)(bin2hex(*pubkey)));
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -440,16 +440,16 @@ CREATE TABLE "Misc"(
|
||||
);
|
||||
COMMIT;)|");
|
||||
LastUsedSqlite = DefaultSqlite;
|
||||
singletonApp->pConfig->Write(_T("LastUsed"), DefaultSqlite.GetFullPath());
|
||||
wxLogMessage(_T("\t\tConstructing default wallet %s"), DefaultSqlite.GetFullPath());
|
||||
singletonApp->pConfig->Write(wxT("LastUsed"), DefaultSqlite.GetFullPath());
|
||||
wxLogMessage(wxT("\t\tConstructing default wallet %s"), DefaultSqlite.GetFullPath());
|
||||
// We now have a working wallet file with no valid data. Attempting to create a strong random secret, a name, and public and private keys for that name.
|
||||
|
||||
wxLogMessage(_T("\t\tGenerating random 128 bit wallet secret"));
|
||||
wxLogMessage(wxT("\t\tGenerating random 128 bit wallet secret"));
|
||||
auto text_secret{ DeriveTextSecret(ristretto255::scalar::random(), 1) };
|
||||
ro::msec start_time{ ro::msec_since_epoch() };
|
||||
ristretto255::CMasterSecret MasterSecret(DeriveStrongSecret(&text_secret[0]) );
|
||||
decltype(start_time) end_time{ ro::msec_since_epoch() };
|
||||
wxLogMessage(_T("\t\tStrong secret derivation took %d milliseconds"), (end_time - start_time).count());
|
||||
wxLogMessage(wxT("\t\tStrong secret derivation took %d milliseconds"), (end_time - start_time).count());
|
||||
sql_update_to_misc update_to_misc(db.get());
|
||||
update_to_misc(1, WALLET_FILE_IDENTIFIER);
|
||||
update_to_misc(2, WALLET_FILE_SCHEMA_VERSION_0_0);
|
||||
@ -689,30 +689,30 @@ static bool TestShareSecretGenerationSpeed(void) {
|
||||
szError = "Fail\tro:deserialize ro:deserialize on integers produced unexpected results.";
|
||||
ILogError(szError.c_str());
|
||||
}
|
||||
wxLogMessage(_T("\tLibsodium constants\n\t\tsizeof(crypto_secretstream_xchacha20poly1305_state)=%d"), int(sizeof(crypto_secretstream_xchacha20poly1305_state)));
|
||||
wxLogMessage(_T("\t\tcrypto_generichash_KEYBYTES=%d"), crypto_generichash_KEYBYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_secretstream_xchacha20poly1305_KEYBYTES=%d"), crypto_secretstream_xchacha20poly1305_KEYBYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_secretstream_xchacha20poly1305_HEADERBYTES=%d"), crypto_secretstream_xchacha20poly1305_HEADERBYTES);
|
||||
wxLogMessage(_T("\t\tchecksum size == crypto_secretstream_xchacha20poly1305_ABYTES ==%d"), crypto_secretstream_xchacha20poly1305_ABYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_pwhash_OPSLIMIT_MIN ==\t%08x"), crypto_pwhash_OPSLIMIT_MIN);
|
||||
wxLogMessage(_T("\t\tcrypto_pwhash_OPSLIMIT_MODERATE ==\t%08x"), crypto_pwhash_OPSLIMIT_MODERATE);
|
||||
wxLogMessage(_T("\t\tcrypto_pwhash_OPSLIMIT_SENSITIVE ==\t%08x"), crypto_pwhash_OPSLIMIT_SENSITIVE);
|
||||
wxLogMessage(_T("\t\tcrypto_pwhash_OPSLIMIT_MAX ==\t%08x"), crypto_pwhash_OPSLIMIT_MAX);
|
||||
wxLogMessage(_T("\t\tcrypto_pwhash_MEMLIMIT_MIN ==\t%08x"), crypto_pwhash_MEMLIMIT_MIN);
|
||||
wxLogMessage(_T("\t\tcrypto_pwhash_MEMLIMIT_MODERATE==%08x"), crypto_pwhash_MEMLIMIT_MODERATE);
|
||||
wxLogMessage(_T("\t\tcrypto_pwhash_MEMLIMIT_SENSITIVE==\t%08x"), crypto_pwhash_MEMLIMIT_SENSITIVE);
|
||||
wxLogMessage(_T("\t\tcrypto_auth_BYTES ==\t\t%08x"), crypto_auth_BYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_stream_chacha20_NONCEBYTES\t%08x"), crypto_stream_chacha20_NONCEBYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_stream_chacha20_KEYBYTES ==\t%08x"), crypto_stream_chacha20_KEYBYTES);
|
||||
wxLogMessage(_T("\t\tchacha20 is 2^(256+128) 512 bit pseudo random blocks"));
|
||||
wxLogMessage(_T("\t\tcrypto_stream_xchacha20_NONCEBYTES\t%08x"), crypto_stream_xchacha20_NONCEBYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_stream_xchacha20_KEYBYTES ==\t%08x"), crypto_stream_chacha20_KEYBYTES);
|
||||
wxLogMessage(_T("\t\txchacha20 is 2^512 512 bit pseudo random blocks"));
|
||||
wxLogMessage(_T("\t\tmin hash size is %d bits"), crypto_generichash_BYTES_MIN * 8);
|
||||
wxLogMessage(_T("\t\tmax hash size is %d bits"), crypto_generichash_BYTES_MAX * 8);
|
||||
wxLogMessage(_T("\t\tcrypto_shorthash_BYTES\t== %08x"), crypto_shorthash_BYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_shorthash_KEYBYTES\t== %08x"), crypto_shorthash_KEYBYTES);
|
||||
wxLogMessage(_T("\t\tcrypto_auth_BYTES\t\t== %08x"), crypto_auth_BYTES);
|
||||
wxLogMessage(wxT("\tLibsodium constants\n\t\tsizeof(crypto_secretstream_xchacha20poly1305_state)=%d"), int(sizeof(crypto_secretstream_xchacha20poly1305_state)));
|
||||
wxLogMessage(wxT("\t\tcrypto_generichash_KEYBYTES=%d"), crypto_generichash_KEYBYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_secretstream_xchacha20poly1305_KEYBYTES=%d"), crypto_secretstream_xchacha20poly1305_KEYBYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_secretstream_xchacha20poly1305_HEADERBYTES=%d"), crypto_secretstream_xchacha20poly1305_HEADERBYTES);
|
||||
wxLogMessage(wxT("\t\tchecksum size == crypto_secretstream_xchacha20poly1305_ABYTES ==%d"), crypto_secretstream_xchacha20poly1305_ABYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_pwhash_OPSLIMIT_MIN ==\t%08x"), crypto_pwhash_OPSLIMIT_MIN);
|
||||
wxLogMessage(wxT("\t\tcrypto_pwhash_OPSLIMIT_MODERATE ==\t%08x"), crypto_pwhash_OPSLIMIT_MODERATE);
|
||||
wxLogMessage(wxT("\t\tcrypto_pwhash_OPSLIMIT_SENSITIVE ==\t%08x"), crypto_pwhash_OPSLIMIT_SENSITIVE);
|
||||
wxLogMessage(wxT("\t\tcrypto_pwhash_OPSLIMIT_MAX ==\t%08x"), crypto_pwhash_OPSLIMIT_MAX);
|
||||
wxLogMessage(wxT("\t\tcrypto_pwhash_MEMLIMIT_MIN ==\t%08x"), crypto_pwhash_MEMLIMIT_MIN);
|
||||
wxLogMessage(wxT("\t\tcrypto_pwhash_MEMLIMIT_MODERATE==%08x"), crypto_pwhash_MEMLIMIT_MODERATE);
|
||||
wxLogMessage(wxT("\t\tcrypto_pwhash_MEMLIMIT_SENSITIVE==\t%08x"), crypto_pwhash_MEMLIMIT_SENSITIVE);
|
||||
wxLogMessage(wxT("\t\tcrypto_auth_BYTES ==\t\t%08x"), crypto_auth_BYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_stream_chacha20_NONCEBYTES\t%08x"), crypto_stream_chacha20_NONCEBYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_stream_chacha20_KEYBYTES ==\t%08x"), crypto_stream_chacha20_KEYBYTES);
|
||||
wxLogMessage(wxT("\t\tchacha20 is 2^(256+128) 512 bit pseudo random blocks"));
|
||||
wxLogMessage(wxT("\t\tcrypto_stream_xchacha20_NONCEBYTES\t%08x"), crypto_stream_xchacha20_NONCEBYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_stream_xchacha20_KEYBYTES ==\t%08x"), crypto_stream_chacha20_KEYBYTES);
|
||||
wxLogMessage(wxT("\t\txchacha20 is 2^512 512 bit pseudo random blocks"));
|
||||
wxLogMessage(wxT("\t\tmin hash size is %d bits"), crypto_generichash_BYTES_MIN * 8);
|
||||
wxLogMessage(wxT("\t\tmax hash size is %d bits"), crypto_generichash_BYTES_MAX * 8);
|
||||
wxLogMessage(wxT("\t\tcrypto_shorthash_BYTES\t== %08x"), crypto_shorthash_BYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_shorthash_KEYBYTES\t== %08x"), crypto_shorthash_KEYBYTES);
|
||||
wxLogMessage(wxT("\t\tcrypto_auth_BYTES\t\t== %08x"), crypto_auth_BYTES);
|
||||
}
|
||||
catch (const std::exception & e) {
|
||||
errorCode = 15;
|
||||
@ -820,7 +820,7 @@ static bool TestShareSecretGenerationSpeed(void) {
|
||||
{
|
||||
auto end_time{ std::chrono::high_resolution_clock::now() };
|
||||
auto time_to_do_crypto{ std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time) };
|
||||
wxLogMessage(_T("\t\ttest of ristretto test vectors took %lld microseconds"), time_to_do_crypto.count());
|
||||
wxLogMessage(wxT("\t\ttest of ristretto test vectors took %lld microseconds"), time_to_do_crypto.count());
|
||||
ILogMessage("\tTesting generation of shared secrets.");
|
||||
start_time = std::chrono::high_resolution_clock::now();
|
||||
scalar sclrAnonSessionSecretKey{ scalar::random() };
|
||||
|
Loading…
Reference in New Issue
Block a user