From 1181f7ff5c8456ecc6191cce1a29d166fbbc6d8c Mon Sep 17 00:00:00 2001 From: NIRMAL MANOJ C Date: Thu, 21 May 2020 02:08:20 +0530 Subject: [PATCH] Cutter RC Editor - Part B (basic editor) (#2162) --- .../images/InitializationScriptEditor.png | Bin 0 -> 57714 bytes docs/source/user-docs.rst | 1 + docs/source/user-docs/preferences.rst | 11 ++ .../preferences/initialization-script.rst | 17 +++ src/Cutter.pro | 3 + src/core/Cutter.cpp | 41 +++++--- src/core/Cutter.h | 6 +- .../preferences/InitializationFileEditor.cpp | 72 +++++++++++++ .../preferences/InitializationFileEditor.h | 31 ++++++ .../preferences/InitializationFileEditor.ui | 54 ++++++++++ src/dialogs/preferences/PreferencesDialog.cpp | 7 ++ src/img/icons/initialization.svg | 99 ++++++++++++++++++ src/img/icons/light/initialization.svg | 99 ++++++++++++++++++ src/resources.qrc | 2 + 14 files changed, 428 insertions(+), 15 deletions(-) create mode 100644 docs/source/images/InitializationScriptEditor.png create mode 100644 docs/source/user-docs/preferences.rst create mode 100644 docs/source/user-docs/preferences/initialization-script.rst create mode 100644 src/dialogs/preferences/InitializationFileEditor.cpp create mode 100644 src/dialogs/preferences/InitializationFileEditor.h create mode 100644 src/dialogs/preferences/InitializationFileEditor.ui create mode 100644 src/img/icons/initialization.svg create mode 100644 src/img/icons/light/initialization.svg diff --git a/docs/source/images/InitializationScriptEditor.png b/docs/source/images/InitializationScriptEditor.png new file mode 100644 index 0000000000000000000000000000000000000000..6e72c1f824c2d0f0377adbb1fb644436e6cada0a GIT binary patch literal 57714 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 Ns*;vsr933${{W?kVC4V+ literal 0 HcmV?d00001 diff --git a/docs/source/user-docs.rst b/docs/source/user-docs.rst index e78c484a..d9cf7ca7 100644 --- a/docs/source/user-docs.rst +++ b/docs/source/user-docs.rst @@ -13,4 +13,5 @@ Cutter is an advanced reverse engineering platform that is powered by radare2. T user-docs/command-line user-docs/menus + user-docs/preferences diff --git a/docs/source/user-docs/preferences.rst b/docs/source/user-docs/preferences.rst new file mode 100644 index 00000000..7189df32 --- /dev/null +++ b/docs/source/user-docs/preferences.rst @@ -0,0 +1,11 @@ +Preferences +===================== +This part of the documentation will provide the reader with information about different preferences available. +Preferences can be opened by clicking ``Edit -> Preferences``. + +.. toctree:: + :maxdepth: 2 + :glob: + + preferences/initialization-script + preferences/* \ No newline at end of file diff --git a/docs/source/user-docs/preferences/initialization-script.rst b/docs/source/user-docs/preferences/initialization-script.rst new file mode 100644 index 00000000..fa92a5a5 --- /dev/null +++ b/docs/source/user-docs/preferences/initialization-script.rst @@ -0,0 +1,17 @@ +Initialization Script +=================================== + +On the launch of Cutter, it loads ``.cutterrc`` files from various locations if they are present. The directories from where ``.cutterrc`` files are loaded are all directories of type ``QStandardPaths::AppConfigLocation``. These locations vary according to OS. You can visit `here `__ to see all the locations. + +If multiple ``.cutterrc`` scripts are present in different directories, all of them will be loaded. In case of conflicting or contradictory commands, the corresponding command in the script loaded last will override all the previous commands. Cutter has a GUI editor for Initialization Script whose description is given below. The script from the editor will be the last loaded initialization script and hence will override all the previous scripts in the event of conflicting commands. + +Initialization Script Editor +----------------------------------- + +.. image:: ../../images/InitializationScriptEditor.png + :alt: Image of Initialization Script Editor + + +**Description:** You can add new commands and modify existing commands here. To save the script, click on the ``Save`` button. If you want to see the changes you have made without restarting Cutter, you can use the ``Execute`` button. The hyperlink that shows the location of the script will open the directory containing the script on click. + +**Steps to open:** ``Edit -> Preferences -> Initialization Script`` diff --git a/src/Cutter.pro b/src/Cutter.pro index 5ea3a78b..5f18dd53 100644 --- a/src/Cutter.pro +++ b/src/Cutter.pro @@ -344,6 +344,7 @@ SOURCES += \ dialogs/preferences/AppearanceOptionsWidget.cpp \ dialogs/preferences/GraphOptionsWidget.cpp \ dialogs/preferences/PreferenceCategory.cpp \ + dialogs/preferences/InitializationFileEditor.cpp \ widgets/QuickFilterView.cpp \ widgets/ClassesWidget.cpp \ widgets/ResourcesWidget.cpp \ @@ -484,6 +485,7 @@ HEADERS += \ dialogs/preferences/AppearanceOptionsWidget.h \ dialogs/preferences/PreferenceCategory.h \ dialogs/preferences/GraphOptionsWidget.h \ + dialogs/preferences/InitializationFileEditor.h \ widgets/QuickFilterView.h \ widgets/ClassesWidget.h \ widgets/ResourcesWidget.h \ @@ -598,6 +600,7 @@ FORMS += \ dialogs/preferences/PreferencesDialog.ui \ dialogs/preferences/AppearanceOptionsWidget.ui \ dialogs/preferences/GraphOptionsWidget.ui \ + dialogs/preferences/InitializationFileEditor.ui \ widgets/QuickFilterView.ui \ widgets/DecompilerWidget.ui \ widgets/ClassesWidget.ui \ diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp index b485cc38..3cf87f6a 100644 --- a/src/core/Cutter.cpp +++ b/src/core/Cutter.cpp @@ -240,34 +240,49 @@ RCoreLocked CutterCore::core() return RCoreLocked(this); } -QVector CutterCore::getCutterRCDirectories() const +QDir CutterCore::getCutterRCDefaultDirectory() const { - QVector result; - result.push_back(QDir::home()); + return QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); +} + +QVector CutterCore::getCutterRCFilePaths() const +{ + QVector result; + result.push_back(QFileInfo(QDir::home(), ".cutterrc").absoluteFilePath()); QStringList locations = QStandardPaths::standardLocations(QStandardPaths::AppConfigLocation); for (auto &location : locations) { - result.push_back(QDir(location)); + result.push_back(QFileInfo(QDir(location), ".cutterrc").absoluteFilePath()); } + result.push_back(QFileInfo(getCutterRCDefaultDirectory(), "rc").absoluteFilePath()); // File in config editor is from this path return result; } void CutterCore::loadCutterRC() { CORE_LOCK(); - - const auto result = getCutterRCDirectories(); - for(auto &dir : result){ - if(!dir.exists())continue; - auto cutterRCFileInfo = QFileInfo(dir, ".cutterrc"); - auto path = cutterRCFileInfo.absoluteFilePath(); - if (!cutterRCFileInfo.isFile()) { + const auto result = getCutterRCFilePaths(); + for(auto &cutterRCFilePath : result){ + auto cutterRCFileInfo = QFileInfo(cutterRCFilePath); + if (!cutterRCFileInfo.exists() || !cutterRCFileInfo.isFile()) { continue; } - qInfo() << "Loading initialization file from" << path; - r_core_cmd_file(core, path.toUtf8().constData()); + qInfo() << "Loading initialization file from " << cutterRCFilePath; + r_core_cmd_file(core, cutterRCFilePath.toUtf8().constData()); } } +void CutterCore::loadDefaultCutterRC() +{ + CORE_LOCK(); + auto cutterRCFilePath = QFileInfo(getCutterRCDefaultDirectory(), "rc").absoluteFilePath(); + const auto cutterRCFileInfo = QFileInfo(cutterRCFilePath); + if (!cutterRCFileInfo.exists() || !cutterRCFileInfo.isFile()) { + return; + } + qInfo() << "Loading initialization file from " << cutterRCFilePath; + r_core_cmd_file(core, cutterRCFilePath.toUtf8().constData()); +} + QList CutterCore::sdbList(QString path) { diff --git a/src/core/Cutter.h b/src/core/Cutter.h index 593f9ed7..777270a2 100644 --- a/src/core/Cutter.h +++ b/src/core/Cutter.h @@ -46,7 +46,9 @@ public: void initialize(bool loadPlugins = true); void loadCutterRC(); - + void loadDefaultCutterRC(); + QDir getCutterRCDefaultDirectory() const; + AsyncTaskManager *getAsyncTaskManager() { return asyncTaskManager; } RVA getOffset() const { return core_->offset; } @@ -710,7 +712,7 @@ private: QSharedPointer debugTask; R2TaskDialog *debugTaskDialog; - QVector getCutterRCDirectories() const; + QVector getCutterRCFilePaths() const; }; class RCoreLocked diff --git a/src/dialogs/preferences/InitializationFileEditor.cpp b/src/dialogs/preferences/InitializationFileEditor.cpp new file mode 100644 index 00000000..0356e722 --- /dev/null +++ b/src/dialogs/preferences/InitializationFileEditor.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "InitializationFileEditor.h" +#include "ui_InitializationFileEditor.h" + +#include "PreferencesDialog.h" + +#include "common/Helpers.h" +#include "common/Configuration.h" + +InitializationFileEditor::InitializationFileEditor(PreferencesDialog *dialog) + : QDialog(dialog), + ui(new Ui::InitializationFileEditor) +{ + ui->setupUi(this); + connect(ui->saveRC, &QDialogButtonBox::accepted, this, &InitializationFileEditor::saveCutterRC); + connect(ui->executeNow, &QDialogButtonBox::accepted, this, &InitializationFileEditor::executeCutterRC); + connect(ui->ConfigFileEdit, &QPlainTextEdit::modificationChanged, ui->saveRC, &QWidget::setEnabled); + + const QDir cutterRCDirectory = Core()->getCutterRCDefaultDirectory(); + auto cutterRCFileInfo = QFileInfo(cutterRCDirectory, "rc"); + QString cutterRCLocation = cutterRCFileInfo.absoluteFilePath(); + + ui->cutterRCLoaded->setTextInteractionFlags(Qt::TextBrowserInteraction); + ui->cutterRCLoaded->setOpenExternalLinks(true); + ui->cutterRCLoaded->setText(tr("Script is loaded from %2") + .arg(QUrl::fromLocalFile(cutterRCDirectory.absolutePath()).toString(), cutterRCLocation.toHtmlEscaped())); + + ui->executeNow->button(QDialogButtonBox::Retry)->setText("Execute"); + ui->ConfigFileEdit->clear(); + if(cutterRCFileInfo.exists()){ + QFile cutterRC(cutterRCLocation); + if(cutterRC.open(QIODevice::ReadWrite | QIODevice::Text)){ + ui->ConfigFileEdit->setPlainText(cutterRC.readAll()); + } + cutterRC.close(); + } + ui->saveRC->setDisabled(true); +} + +InitializationFileEditor::~InitializationFileEditor() {}; + + +void InitializationFileEditor::saveCutterRC(){ + const QDir cutterRCDirectory = Core()->getCutterRCDefaultDirectory(); + if(!cutterRCDirectory.exists()){ + cutterRCDirectory.mkpath("."); + } + auto cutterRCFileInfo = QFileInfo(cutterRCDirectory, "rc"); + QString cutterRCLocation = cutterRCFileInfo.absoluteFilePath(); + + QFile cutterRC(cutterRCLocation); + if(cutterRC.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)){ + QTextStream out(&cutterRC); + QString text = ui->ConfigFileEdit->toPlainText(); + out << text; + cutterRC.close(); + } + ui->ConfigFileEdit->document()->setModified(false); +} + +void InitializationFileEditor::executeCutterRC(){ + saveCutterRC(); + Core()->loadDefaultCutterRC(); +} diff --git a/src/dialogs/preferences/InitializationFileEditor.h b/src/dialogs/preferences/InitializationFileEditor.h new file mode 100644 index 00000000..b302458e --- /dev/null +++ b/src/dialogs/preferences/InitializationFileEditor.h @@ -0,0 +1,31 @@ +#ifndef INITIALIZATIONFILEEDITOR_H +#define INITIALIZATIONFILEEDITOR_H + +#include +#include +#include +#include "core/Cutter.h" + +class PreferencesDialog; + +namespace Ui { +class InitializationFileEditor; +} + +class InitializationFileEditor : public QDialog +{ + Q_OBJECT + +public: + explicit InitializationFileEditor(PreferencesDialog *dialog); + ~InitializationFileEditor(); + void saveCutterRC(); + void executeCutterRC(); + +private: + std::unique_ptr ui; + +}; + + +#endif //INITIALIZATIONFILEEDITOR_H \ No newline at end of file diff --git a/src/dialogs/preferences/InitializationFileEditor.ui b/src/dialogs/preferences/InitializationFileEditor.ui new file mode 100644 index 00000000..30c5ece8 --- /dev/null +++ b/src/dialogs/preferences/InitializationFileEditor.ui @@ -0,0 +1,54 @@ + + + InitializationFileEditor + + + + 0 + 0 + 667 + 486 + + + + CutterRC Editor + + + + + + TextLabel + + + + + + + + 649 + 16777215 + + + + QDialogButtonBox::Save + + + + + + + + + + QDialogButtonBox::Retry + + + false + + + + + + + + diff --git a/src/dialogs/preferences/PreferencesDialog.cpp b/src/dialogs/preferences/PreferencesDialog.cpp index f6fc69b8..f8b30394 100644 --- a/src/dialogs/preferences/PreferencesDialog.cpp +++ b/src/dialogs/preferences/PreferencesDialog.cpp @@ -6,6 +6,7 @@ #include "GraphOptionsWidget.h" #include "DebugOptionsWidget.h" #include "PluginsOptionsWidget.h" +#include "InitializationFileEditor.h" #include "PreferenceCategory.h" @@ -51,6 +52,11 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) tr("Plugins"), new PluginsOptionsWidget(this), QIcon(":/img/icons/plugins.svg") + }, + { + tr("Initialization Script"), + new InitializationFileEditor(this), + QIcon(":/img/icons/initialization.svg") } }; @@ -114,6 +120,7 @@ void PreferencesDialog::chooseThemeIcons() { QStringLiteral("Graph"), QStringLiteral("graph.svg") }, { QStringLiteral("Appearance"), QStringLiteral("polar.svg") }, { QStringLiteral("Plugins"), QStringLiteral("plugins.svg") }, + { QStringLiteral("Initialization Script"), QStringLiteral("initialization.svg") }, }; QList> supportedIconsNames; diff --git a/src/img/icons/initialization.svg b/src/img/icons/initialization.svg new file mode 100644 index 00000000..b248f327 --- /dev/null +++ b/src/img/icons/initialization.svg @@ -0,0 +1,99 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/img/icons/light/initialization.svg b/src/img/icons/light/initialization.svg new file mode 100644 index 00000000..87014521 --- /dev/null +++ b/src/img/icons/light/initialization.svg @@ -0,0 +1,99 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/resources.qrc b/src/resources.qrc index aabd289f..a072e2ff 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -56,6 +56,8 @@ img/icons/graph_white.svg img/icons/graph.svg img/icons/light/graph.svg + img/icons/initialization.svg + img/icons/light/initialization.svg img/icons/hexdump_light.svg img/icons/hexdump_white.svg img/icons/bug.svg