aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Elvio Basello2008-05-20 23:22:02 +0000
committerGravatar Elvio Basello2008-05-20 23:22:02 +0000
commit4c75d1c556270484edc5bbc85bbf691eb22d1c24 (patch)
treeca52c9c0aa46149ea37702c2f5b2a0aa6a9c7485
parentfix (diff)
downloadKVIrc-4c75d1c556270484edc5bbc85bbf691eb22d1c24.tar.gz
KVIrc-4c75d1c556270484edc5bbc85bbf691eb22d1c24.tar.bz2
KVIrc-4c75d1c556270484edc5bbc85bbf691eb22d1c24.zip
more work on addon manager (wip)
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@1833 17fca916-40b9-46aa-a4ea-0a15b648b75c
-rw-r--r--src/modules/addon/addonfunctions.cpp82
-rw-r--r--src/modules/addon/addonfunctions.h1
-rw-r--r--src/modules/addon/libkviaddon.cpp2
-rw-r--r--src/modules/addon/managementdialog.cpp2
4 files changed, 80 insertions, 7 deletions
diff --git a/src/modules/addon/addonfunctions.cpp b/src/modules/addon/addonfunctions.cpp
index 1f8379333..cd3728a16 100644
--- a/src/modules/addon/addonfunctions.cpp
+++ b/src/modules/addon/addonfunctions.cpp
@@ -30,13 +30,18 @@
#include "kvi_app.h"
#include "kvi_htmldialog.h"
#include "kvi_iconmanager.h"
+#include "kvi_fileutils.h"
#include "kvi_miscutils.h"
#include "kvi_sourcesdate.h"
#include "kvi_frame.h"
+#include "kvi_kvs_script.h"
+#include <QDir>
#include <q3mimefactory.h>
#define KviTalMimeSourceFactory Q3MimeSourceFactory
+#include <stdlib.h>
+
namespace KviAddonFunctions
{
bool notAValidAddonPackage(QString &szError)
@@ -49,6 +54,7 @@ namespace KviAddonFunctions
{
KviPointerHashTable<QString,QString> * pInfoFields;
QString * pValue;
+ QString szErr;
bool bInstall;
QByteArray * pByteArray;
KviHtmlDialogData hd;
@@ -59,7 +65,7 @@ namespace KviAddonFunctions
KviPackageReader r;
if(!r.readHeader(szAddonPackageFileName))
{
- QString szErr = r.lastError();
+ szErr = r.lastError();
KviQString::sprintf(szError,__tr2qs_ctx("The selected file does not seem to be a valid KVIrc package: %Q","addon"),&szErr);
return false;
}
@@ -221,12 +227,55 @@ namespace KviAddonFunctions
if(bInstall)
{
- QString szUnpackPath;
- g_pApp->getLocalKvircDirectory(szUnpackPath,KviApp::Themes);
+
+/*
+[02:25:41] <Pragma> (occhio a non cancellare niente di importante eh... bisogna sempre fare attenzione a fare i delete)
+[02:25:50] <Pragma> ed occhio anche agli attacchi
+[02:26:02] <Pragma> quando parsi dei file esterni che potrebbero essere forgiati
+[02:26:19] <Pragma> pensa sempre 3 volte a cosa potrebbe succedere
+[02:26:41] <Pragma> tipo se dentro il pacchetto ti ci mettono un path tipo "../../etc/passwd"
+[02:27:03] <Pragma> qui magari bisogna intervienire pure sullo spacchettatore eh
+[02:27:10] <Pragma> guarda un pò insomma
+[02:27:22] <Pragma> la gente co ste cose ci va a nozze
+*/
+ // Check for dir existence
+ QString szTmpPath, szUnpackPath;
+ QString szRandomDir = createRandomDir();
+
+ g_pApp->getLocalKvircDirectory(szTmpPath,KviApp::Tmp);
+ KviQString::ensureLastCharIs(szTmpPath,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szUnpackPath = szTmpPath + szRandomDir;
+ QDir szTmpDir(szUnpackPath);
+
+ while(szTmpDir.exists())
+ {
+ szRandomDir = createRandomDir();
+ szUnpackPath = szTmpPath + szRandomDir;
+ szTmpDir = QDir(szUnpackPath);
+ }
+ debug("szUnpackPath: %s",szUnpackPath.toUtf8().data());
+
+ // Unpack addon package into the random tmp dir
if(!r.unpack(szAddonPackageFileName,szUnpackPath))
{
- QString szErr2 = r.lastError();
- KviQString::sprintf(szError,__tr2qs_ctx("Failed to unpack the selected file: %Q","addon"),&szErr2);
+ szErr = r.lastError();
+ KviQString::sprintf(szError,__tr2qs_ctx("Failed to unpack the selected file: %Q","addon"),&szErr);
+ return true;
+ }
+
+ // Now we have all stuff in ~/.config/KVIrc/tmp/$rand
+ KviKvsScript::run("parse " + szUnpackPath + "/install.kvs",g_pActiveWindow);
+
+ // Remove all files
+ QDir * pDir = new QDir(szUnpackPath);
+ QStringList list = pDir->entryList(QDir::AllEntries,QDir::DirsFirst);
+ debug("Path: %s",szUnpackPath.toUtf8().data());
+ debug("Count: %d",list.count());
+
+ if(!KviFileUtils::deleteDir(szUnpackPath))
+ {
+ szErr = __tr2qs_ctx("One or more files can't be deleted","addon");
+ KviQString::sprintf(szError,__tr2qs_ctx("Failed to unpack the selected file: %Q","addon"),&szErr);
return true;
}
}
@@ -286,4 +335,27 @@ namespace KviAddonFunctions
&szAddonSubdirectory
);
}
+
+ QString createRandomDir()
+ {
+ QString szDirName;
+ char chars[] = {
+ 'A','B','C','D','E','F','G','H',
+ 'I','J','K','L','M','N','O','P',
+ 'Q','R','S','T','U','V','W','X',
+ 'Y','Z','a','b','c','d','e','f',
+ 'g','h','i','j','k','l','m','n',
+ 'o','p','q','r','s','t','u','v',
+ 'w','x','y','z','-','_','.'
+ };
+
+ // Generate dir name
+ for(int i=0;i<10;i++)
+ {
+ int n = rand() % sizeof(chars);
+ szDirName.append(chars[n]);
+ }
+
+ return szDirName;
+ }
};
diff --git a/src/modules/addon/addonfunctions.h b/src/modules/addon/addonfunctions.h
index 045b7a52f..e93c4a13f 100644
--- a/src/modules/addon/addonfunctions.h
+++ b/src/modules/addon/addonfunctions.h
@@ -47,6 +47,7 @@ namespace KviAddonFunctions
const QString &szAddonDate,
const QString &szAddonAddonEngineVersion
);
+ QString createRandomDir();
};
diff --git a/src/modules/addon/libkviaddon.cpp b/src/modules/addon/libkviaddon.cpp
index d8d8a40b7..909728efe 100644
--- a/src/modules/addon/libkviaddon.cpp
+++ b/src/modules/addon/libkviaddon.cpp
@@ -619,7 +619,7 @@ static bool addon_kvs_cmd_dialog(KviKvsModuleCommandCall * c)
@syntax:
addon.install <package_path:string>
@description:
- Attempts to install the addons in the package specified by <package_path>.
+ Attempts to install the addon in the package specified by <package_path>.
*/
static bool addon_kvs_cmd_install(KviKvsModuleCommandCall * c)
diff --git a/src/modules/addon/managementdialog.cpp b/src/modules/addon/managementdialog.cpp
index 5bd17aa9a..08b72a075 100644
--- a/src/modules/addon/managementdialog.cpp
+++ b/src/modules/addon/managementdialog.cpp
@@ -79,7 +79,7 @@ KviScriptAddonListViewItem::KviScriptAddonListViewItem(KviTalListWidget *v,KviKv
setText(t);
QPixmap * p = a->icon();
- if (p) setIcon(*p);
+ if (p) setIcon(*p);
}
KviScriptAddonListViewItem::~KviScriptAddonListViewItem()