From 7ee6976c7d6125cb556e3a8a7d93eb15b1067634 Mon Sep 17 00:00:00 2001 From: CLARATION Date: Thu, 18 Jun 2026 10:39:34 -0700 Subject: [PATCH] chore: finish half the UI --- .gitignore | 1 + Makefile | 1 + resources/logo.png | Bin 0 -> 6174 bytes src/ui/app.cpp | 206 ++++++++++++++++++++++++++++++++++++++++-- src/utils/constants.h | 2 +- 5 files changed, 199 insertions(+), 11 deletions(-) create mode 100644 resources/logo.png diff --git a/.gitignore b/.gitignore index 03d924b..6044614 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ build/ .DS_Store src/exploit/payloads/ src/exploit/userland/ +src/exploit/logo.h diff --git a/Makefile b/Makefile index d4b2925..b240319 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ payloads: echo " XXD $$file"; \ xxd -i $$file > src/exploit/$$file.h; \ done + xxd -i resources/logo.png > src/exploit/logo.h palera1n: payloads @cmake -S . -B build \ diff --git a/resources/logo.png b/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c79e82861ab3400ac201c417ca6e7219a27f8dcb GIT binary patch literal 6174 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 literal 0 HcmV?d00001 diff --git a/src/ui/app.cpp b/src/ui/app.cpp index 3b521a2..1720476 100644 --- a/src/ui/app.cpp +++ b/src/ui/app.cpp @@ -1,23 +1,209 @@ #ifdef WITH_GUI + #include "app.hpp" +#include +#include +#include +#include +#include #include #include "../utils/constants.h" +#include "../utils/paleinfo.h" +#include "../utils/log.h" +#include "../exploit/logo.h" -bool PalerainApp::OnInit() { - auto* frame = new wxFrame( - nullptr, - wxID_ANY, - "palera1n - Version " + wxString(PALERAIN_VERSION), - wxDefaultPosition, - wxSize(480, 360), - wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER) - ); +class MainFrame; - new wxStaticText(frame, wxID_ANY, "my cute ui", wxPoint(10, 10)); +class MainPanel : public wxPanel +{ +public: + explicit MainPanel(MainFrame* frame, wxWindow* parent); +}; +class SettingsPanel : public wxPanel +{ +public: + explicit SettingsPanel(MainFrame* frame, wxWindow* parent); +}; + +class MainFrame : public wxFrame +{ +public: + MainFrame() + : wxFrame( + nullptr, + wxID_ANY, + "palera1n – Version beta " + wxString(PALERAIN_VERSION), + wxDefaultPosition, + wxSize(480, 360), + wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER)) + { + auto* root = new wxBoxSizer(wxVERTICAL); + + m_main = new MainPanel(this, this); + m_settings = new SettingsPanel(this, this); + + root->Add(m_main, 1, wxEXPAND); + root->Add(m_settings, 1, wxEXPAND); + + SetSizer(root); + + ShowMain(); + } + + void ShowMain() + { + m_main->Show(); + m_settings->Hide(); + Layout(); + } + + void ShowSettings() + { + m_main->Hide(); + m_settings->Show(); + Layout(); + } + +private: + MainPanel* m_main; + SettingsPanel* m_settings; +}; + +MainPanel::MainPanel(MainFrame* frame, wxWindow* parent) + : wxPanel(parent) +{ + auto* root = new wxBoxSizer(wxVERTICAL); + + wxInitAllImageHandlers(); + + wxMemoryInputStream stream(resources_logo_png, resources_logo_png_len); + wxImage img(stream, wxBITMAP_TYPE_PNG); + wxBitmap bmp(img); + auto* logo = new wxStaticBitmap(this, wxID_ANY, bmp); + + auto* titletext = new wxStaticText(this, wxID_ANY, "Welcome to palera1n!"); + wxFont titlefont = titletext->GetFont(); + titlefont.SetWeight(wxFONTWEIGHT_BOLD); + titletext->SetFont(titlefont); + + auto* left = new wxBoxSizer(wxVERTICAL); + left->Add(titletext, 0, wxTOP | wxLEFT, 10); + + auto* row = new wxBoxSizer(wxHORIZONTAL); + row->Add(left, 0, wxALIGN_TOP); + row->AddStretchSpacer(); + row->Add(logo, 0, wxTOP | wxRIGHT, 10); + root->Add(row, 0, wxEXPAND); + + root->Add(new wxStaticLine(this), 0, wxEXPAND | wxALL, 10); + + auto* credtext = new wxStaticText(this, wxID_ANY, "Made by: asdfugil, kok3shidoll, claration, mineek, staturnz\n\nThanks to: itsnebulalol, llsc12, lrdsnow, nikias (libimobiledevice), Checkra1n\n(Siguza, axi0mx, littlelailo et al.), Procursus (Hayden Seay, Cameron Katri,\nKeto et al.)\n\nWith 💖 from C (claration)"); + root->Add(credtext, 0, wxLEFT | wxRIGHT, 10); + + root->Add(new wxStaticLine(this), 0, wxEXPAND | wxALL, 10); + + auto* notetext = new wxStaticText(this, wxID_ANY, "NOTE: Please ensure you have a backup of your device before applying the\njailbreak. While data loss is unlikely, we won't be responsible if something goes\nwrong. Use at your own risk."); + wxFont notefont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + notefont.SetPointSize(12); + notefont.SetStyle(wxFONTSTYLE_ITALIC); + notetext->SetFont(notefont); + root->Add(notetext, 0, wxLEFT | wxRIGHT, 10); + + root->AddStretchSpacer(); + + auto* btn = new wxButton(this, wxID_ANY, "Options"); + auto* sbtn = new wxButton(this, wxID_ANY, "Start"); + sbtn->Disable(); + btn->Bind(wxEVT_BUTTON, [frame](wxCommandEvent&) + { + frame->ShowSettings(); + }); + auto* bottomRow = new wxBoxSizer(wxHORIZONTAL); + bottomRow->AddStretchSpacer(); + bottomRow->Add(btn, 0, wxALL, 10); + bottomRow->Add(sbtn, 0, wxALL, 10); + root->Add(bottomRow, 0, wxEXPAND); + + SetSizer(root); +} + +SettingsPanel::SettingsPanel(MainFrame* frame, wxWindow* parent) + : wxPanel(parent) +{ + auto* root = new wxBoxSizer(wxVERTICAL); + + root->Add(new wxStaticText(this, wxID_ANY, + "You may set the following options. If you don't know what they mean you'll\n" + "probably have no reason to set them."), 0, wxALL, 10); + + auto* option_safemode = new wxCheckBox(this, wxID_ANY, "Safe Mode"); + auto* option_verbose = new wxCheckBox(this, wxID_ANY, "Verbose Boot"); + auto* option_revert = new wxCheckBox(this, wxID_ANY, "Restore System"); + auto* option_dark_blockchain = new wxCheckBox(this, wxID_ANY, "Dark Blockchain"); + + option_safemode->SetValue(palerain_flags & palerain_option_safemode); + option_verbose->SetValue(palerain_flags & palerain_option_verbose_boot); + option_revert->SetValue(palerain_flags & palerain_option_force_revert); + option_dark_blockchain->SetValue(true); + + option_safemode->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e) + { + if (e.IsChecked()) + palerain_flags |= palerain_option_safemode; + else + palerain_flags &= ~palerain_option_safemode; + }); + option_verbose->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e) + { + if (e.IsChecked()) + palerain_flags |= palerain_option_verbose_boot; + else + palerain_flags &= ~palerain_option_verbose_boot; + }); + option_revert->Bind(wxEVT_CHECKBOX, [&](wxCommandEvent& e) + { + if (e.IsChecked()) + palerain_flags |= palerain_option_force_revert; + else + palerain_flags &= ~palerain_option_force_revert; + }); + + root->Add(option_safemode, 0, wxLEFT | wxRIGHT, 10); + root->Add(option_verbose, 0, wxLEFT | wxRIGHT | wxTOP, 10); + + root->Add(new wxStaticText(this, wxID_ANY, "Boot Arguments:"), 0, wxALL, 10); + auto* bootArgs = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize); + root->Add(bootArgs, 0, wxLEFT | wxRIGHT | wxEXPAND, 30); + + root->Add(option_revert, 0, wxLEFT | wxRIGHT | wxTOP, 10); + root->Add(option_dark_blockchain, 0, wxLEFT | wxRIGHT | wxTOP, 10); + + root->AddStretchSpacer(); + + auto* back = new wxButton(this, wxID_ANY, "Back"); + + back->Bind(wxEVT_BUTTON, [frame](wxCommandEvent&) + { + frame->ShowMain(); + }); + + auto* bottomRow = new wxBoxSizer(wxHORIZONTAL); + bottomRow->AddStretchSpacer(); + bottomRow->Add(back, 0, wxALL, 10); + + root->Add(bottomRow, 0, wxEXPAND); + + SetSizer(root); +} + +bool PalerainApp::OnInit() +{ + auto* frame = new MainFrame(); frame->Show(true); return true; } wxIMPLEMENT_APP_NO_MAIN(PalerainApp); + #endif // WITH_GUI diff --git a/src/utils/constants.h b/src/utils/constants.h index 1cb9f67..777e5fc 100644 --- a/src/utils/constants.h +++ b/src/utils/constants.h @@ -1,7 +1,7 @@ #ifndef CONSTANTS_H #define CONSTANTS_H -#define PALERAIN_VERSION "3.0.0" +#define PALERAIN_VERSION "2.4.0" #include