[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