[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-pim
Subject: Re: [Kde-pim] reminder program on alarm.
From: Mario Teijeiro Otero <emeteo () escomposlinux ! org>
Date: 2005-06-29 17:53:26
Message-ID: 200506291953.31170.emeteo () escomposlinux ! org
[Download RAW message or body]
[Attachment #2 (multipart/signed)]
[Attachment #4 (multipart/mixed)]
On Saturday 25 June 2005 17:49, David Jarvie wrote:
> Your patch doesn't appear to comply with RFC2445, which specifies that any
> program arguments should be stored in the DESCRIPTION property of the
> alarm. The ATTACH property, which is where the alarm->programFile() is
> stored, should contain only the program name/path/URL. You need to modify
> it to use Alarm::programArguments() etc. for the arguments.
The attached patch does that.
There is a security risk: in a shared calendar some mate can to use a
dangerous program. Should be gook can enable this feature only when the user
select it, other way don't inoke the procedure.
Regards,
--
Keep away software patents from Europe.
GPG Fingerprint: 7788 5526 6B2A 47BE 9618 8F48 30AB 1CF9 7799 71DC
http://cernicalo.escomposlinux.org
["program_alarmevent.diff" (text/x-diff)]
Index: koeditorgeneral.cpp
===================================================================
--- koeditorgeneral.cpp (revisión: 428201)
+++ koeditorgeneral.cpp (copia de trabajo)
@@ -48,11 +48,13 @@
#include <kstandarddirs.h>
#include <ktextedit.h>
#include <krestrictedline.h>
+#include <kshell.h>
#include <libkcal/todo.h>
#include <libkcal/event.h>
#include <libkdepim/kdateedit.h>
+#include <libkdepim/kpimurlrequesterdlg.h>
#include "koprefs.h"
#include "koglobals.h"
@@ -260,17 +262,49 @@
void KOEditorGeneral::pickAlarmProgram()
{
if (!mAlarmProgramButton->isOn()) {
+ mAlarmProgramLast = mAlarmProgram;
+ mAlarmProgramArgsLast = mAlarmProgramArgs;
mAlarmProgram = "";
+ mAlarmProgramArgs = "";
QToolTip::remove(mAlarmProgramButton);
QToolTip::add(mAlarmProgramButton, i18n("No program set"));
} else {
- QString fileName(KFileDialog::getOpenFileName(QString::null, QString::null, 0));
- if (!fileName.isEmpty()) {
- mAlarmProgram = fileName;
- QToolTip::remove(mAlarmProgramButton);
- QString dispStr = i18n("Running '%1'").arg(fileName);
- QToolTip::add(mAlarmProgramButton, dispStr);
- mAlarmSoundButton->setOn(false);
+ KURL uri = KPimURLRequesterDlg::getURL(
+ mAlarmProgramLast + " " + mAlarmProgramArgsLast,
+ i18n(
+ "Command to be executed on reminder. You can use these macros:\n\n"
+ "\t\%c - Categories\n"
+ "\t\%d - Description\n"
+ "\t\%D - Start date\n"
+ "\t\%e - End date\n"
+ "\t\%l - Location \n"
+ "\t\%o - Organizer\n"
+ "\t\%s - Summary\n"
+ ), mAlarmProgramButton,
+ i18n("Set program...") );
+ if (!uri.isEmpty()) {
+ QString lineCmd = uri.pathOrURL();
+ int errorArgs;
+ QStringList args = KShell::splitArgs( lineCmd,KShell::NoOptions,&errorArgs );
+ if ( errorArgs )
+ {
+ KMessageBox::error( mAlarmProgramButton,
+ i18n( "There is an error on command line: \"Unterminated quoted string\"" ),
+ i18n( "Command reminder" ) );
+ pickAlarmProgram();
+ } else {
+ mAlarmProgram = args[ 0 ];
+ args.remove( args.first() );
+ mAlarmProgramArgs = args.join( " " );
+
+ mAlarmProgramLast = mAlarmProgram;
+ mAlarmProgramArgsLast = mAlarmProgramArgs;
+ QToolTip::remove(mAlarmProgramButton);
+ QString dispStr = i18n("Running '%1 %2'").arg( mAlarmProgram )
+ .arg( mAlarmProgramArgs );
+ QToolTip::add(mAlarmProgramButton, dispStr);
+ mAlarmSoundButton->setOn(false);
+ }
}
}
if (mAlarmProgram.isEmpty())
@@ -397,8 +431,10 @@
if (alarm->type() == Alarm::Procedure) {
mAlarmProgram = alarm->programFile();
+ mAlarmProgramArgs = alarm->programArguments();
mAlarmProgramButton->setOn(true);
- QString dispStr = i18n("Running '%1'").arg(mAlarmProgram);
+ QString dispStr = i18n("Running '%1 %2' ").arg(mAlarmProgram)
+ .arg( mAlarmProgramArgs );
QToolTip::add(mAlarmProgramButton, dispStr);
}
else if (alarm->type() == Alarm::Audio) {
@@ -449,7 +485,7 @@
alarm->setDisplayAlarm(QString::null);
// FIXME: Make sure all alarm options are correctly set and don't erase other options!
if (!mAlarmProgram.isEmpty() && mAlarmProgramButton->isOn())
- alarm->setProcedureAlarm(mAlarmProgram);
+ alarm->setProcedureAlarm( mAlarmProgram, mAlarmProgramArgs );
// FIXME: Deal with multiple alarms
break; // For now, stop after the first alarm
Index: koeditorgeneral.h
===================================================================
--- koeditorgeneral.h (revisión: 428201)
+++ koeditorgeneral.h (copia de trabajo)
@@ -120,6 +120,10 @@
QString mCategories;
QString mAlarmSound;
QString mAlarmProgram;
+ QString mAlarmProgramArgs;
+ QString mAlarmProgramLast;
+ QString mAlarmProgramArgsLast;
+
};
#endif
Index: korgac/alarmdialog.cpp
===================================================================
--- korgac/alarmdialog.cpp (revisión: 428201)
+++ korgac/alarmdialog.cpp (copia de trabajo)
@@ -38,11 +38,13 @@
#include <kprocess.h>
#include <kaudioplayer.h>
#include <kdebug.h>
+#include <kmacroexpander.h>
#include <kmessagebox.h>
#include <knotifyclient.h>
#include <kcombobox.h>
#include <kwin.h>
#include <klockfile.h>
+#include <kshell.h>
#include <libkcal/event.h>
@@ -197,14 +199,55 @@
for ( it = alarms.begin(); it != alarms.end(); ++it ) {
Alarm *alarm = *it;
// FIXME: Check whether this should be done for all multiple alarms
- if (alarm->type() == Alarm::Procedure) {
- kdDebug(5890) << "Starting program: '" << alarm->programFile() << "'" << endl;
+ if (alarm->type() == Alarm::Procedure && !alarm->programFile().isEmpty() ) {
KProcess proc;
- proc << QFile::encodeName(alarm->programFile());
+ QString expanded;
+ //FIXME: programFile should be a URL (RFC2445 p.72)
+ proc << QFile::encodeName( alarm->programFile() );
+ kdDebug( 5890 ) << "Program name: " << alarm->programFile()<< endl;
+ kdDebug( 5890 ) << "Arguments: " << alarm->programArguments()<< endl;
+ //
+ // Arguments
+ if (!alarm->programArguments().isEmpty() ) {
+ QMap<QChar,QString> subst;
+ subst.insert( 'c', mIncidence->categoriesStr() );
+ subst.insert( 'd', mIncidence->description() );
+ subst.insert( 'D', mIncidence->dtStart().toString());
+ subst.insert( 'e', mIncidence->dtEnd().toString() );
+ subst.insert( 'l', mIncidence->location() );
+ subst.insert( 'o', mIncidence->organizer().fullName() );
+ subst.insert( 's', mIncidence->summary() );
+
+ //If the procedure failures on reading, no procedure is invoked
+ //(RFC2445 p.71)
+ expanded = KMacroExpander::expandMacrosShellQuote(
+ alarm->programArguments(), subst );
+
+ if ( expanded.isEmpty() ) {
+ kdDebug( 5890 ) << "error on expanding arguments: " << expanded << endl;
+ continue; //continue with the next alarms
+ }
+
+ kdDebug( 5890 ) << "Arguments expanded: " << expanded << endl;
+
+ int err;
+ proc << KShell::splitArgs( expanded, KShell::NoOptions, &err );
+
+ if ( err ) {
+ kdDebug( 5890 ) << "error on spliting arguments: " << expanded << endl;
+ continue; //continue with the next alarms
+ }
+
+ }
+
+ kdDebug(5890) << "Starting program: '" << alarm->programFile()
+ << " " << expanded << "'" << endl;
proc.start(KProcess::DontCare);
+
}
else if (alarm->type() == Alarm::Audio) {
beeped = true;
+ //FIXME: audioFile should be a URL (RFC2445 p.72)
KAudioPlayer::play(QFile::encodeName(alarm->audioFile()));
}
}
[Attachment #8 (application/pgp-signature)]
_______________________________________________
kde-pim mailing list
kde-pim@kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
kde-pim home page at http://pim.kde.org/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic