From c71084b2cb231295b02db7f09e982a2830b480a5 Mon Sep 17 00:00:00 2001 From: Timm Date: Tue, 25 Mar 2014 18:21:02 +0100 Subject: [PATCH 1/6] First attempt to implement the argument feature --- command-execute.c | 77 +++++++++++++++++++++++++++++++++---------- command-execute64.so | Bin 11848 -> 13258 bytes 2 files changed, 60 insertions(+), 17 deletions(-) diff --git a/command-execute.c b/command-execute.c index b445f50..2635ced 100644 --- a/command-execute.c +++ b/command-execute.c @@ -33,23 +33,62 @@ #ifndef _PIDGIN_CONVERSATION_H_ typedef enum { - PIDGIN_UNSEEN_NONE, - PIDGIN_UNSEEN_EVENT, - PIDGIN_UNSEEN_NO_LOG, - PIDGIN_UNSEEN_TEXT, - PIDGIN_UNSEEN_NICK + PIDGIN_UNSEEN_NONE, + PIDGIN_UNSEEN_EVENT, + PIDGIN_UNSEEN_NO_LOG, + PIDGIN_UNSEEN_TEXT, + PIDGIN_UNSEEN_NICK } PidginUnseenState; #endif -void execute(const char *cmd) { +/* Replace orig with rep in str */ +char *str_replace(char *str, char *orig, char *rep) { + static char buffer[4096]; + char *p; + + if(!(p = strstr(str, orig))) { + return str; + } + + strncpy(buffer, str, p-str); + buffer[p-str] = '\0'; + + sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); + + return buffer; +} + +char *get_command_with_args(char *cmd, char *sender, char *message) { + // Put sender and message into the command string + cmd = str_replace(cmd, "%m", message); + cmd = str_replace(cmd, "%s", sender); + return cmd; +} + +void execute(const char *cmd, char *sender, char *message) { if(strcmp(cmd,"") != 0) { - /* Execute command */ - if(g_spawn_command_line_async(cmd, NULL) == TRUE) { - purple_debug_info(PLUGIN_ID, "Command executed\n"); + // There is a command + if(purple_prefs_get_bool("/plugins/core/tymm-command-execute/arguments")) { + // The user wants the arguments being parsed + char *cmd_args = get_command_with_args(cmd, sender, message); + + if(system(cmd_args) != -1) { + purple_debug_info(PLUGIN_ID, "Command executed\n"); + purple_debug_info(PLUGIN_ID, cmd_args); + } else { + purple_debug_warning(PLUGIN_ID, "There was a problem executing the command\n"); + } } else { - purple_debug_warning(PLUGIN_ID, "There was a problem executing the command\n"); + // No arguments + if(system(cmd) != -1) { + purple_debug_info(PLUGIN_ID, "Command executed\n"); + purple_debug_info(PLUGIN_ID, cmd); + } else { + purple_debug_warning(PLUGIN_ID, "There was a problem executing the command\n"); + } } } else { + // There is no command purple_debug_warning(PLUGIN_ID, "No command found\n"); } } @@ -66,25 +105,25 @@ static void cmdexe_conversation_updated(PurpleConversation *conv, PurpleConvUpda /* Check if the conversation_updated signal has been emitted by a new message or something else */ if(has_unseen_state || has_unseen_count) { - const char *cmd = purple_prefs_get_string("/plugins/core/tymm-command-execute/command"); - execute(cmd); + //const char *cmd = purple_prefs_get_string("/plugins/core/tymm-command-execute/command"); + //execute(cmd, sender, message); } } } -static void cmdexe_received_im_msg(PurpleConversation *conv, PurpleConvUpdateType type) { +static void cmdexe_received_im_msg(PurpleAccount *account, char *sender, char *message, PurpleConversation *conv, PurpleMessageFlags flags) { /* Check if the user wants to execute the command on _every_ received IM */ if(purple_prefs_get_bool("/plugins/core/tymm-command-execute/execute_always")) { const char *cmd = purple_prefs_get_string("/plugins/core/tymm-command-execute/command"); - execute(cmd); + execute(cmd, sender, message); } } -static void cmdexe_received_chat_msg() { +static void cmdexe_received_chat_msg(PurpleAccount *account, char *sender, char *message, PurpleConversation *conv, PurpleMessageFlags flags) { /* Check if the user wants to execute the command _everytime_ the user receives a chat message */ if(purple_prefs_get_bool("/plugins/core/tymm-command-execute/execute_chat")) { const char *cmd = purple_prefs_get_string("/plugins/core/tymm-command-execute/command"); - execute(cmd); + execute(cmd, sender, message); } } @@ -131,6 +170,9 @@ static PurplePluginPrefFrame *plugin_config_frame(PurplePlugin *plugin) { ppref = purple_plugin_pref_new_with_name_and_label("/plugins/core/tymm-command-execute/execute_chat", "Execute command on new chat messages"); purple_plugin_pref_frame_add(frame, ppref); + ppref = purple_plugin_pref_new_with_name_and_label("/plugins/core/tymm-command-execute/arguments", "Enable arguments (%s sender, %m message)"); + purple_plugin_pref_frame_add(frame, ppref); + return frame; } @@ -155,7 +197,7 @@ static PurplePluginInfo info = { PURPLE_PRIORITY_DEFAULT, PLUGIN_ID, "Command execute", - "1.0", + "1.1", "Command execution for pidgin and finch", "Takes a command which will be executed either on every new IM or on every conversation update. It can also act on new chat messages.", "tymm ", @@ -178,6 +220,7 @@ static void init_plugin(PurplePlugin *plugin) { purple_prefs_add_string("/plugins/core/tymm-command-execute/command", ""); purple_prefs_add_bool("/plugins/core/tymm-command-execute/execute_always", FALSE); purple_prefs_add_bool("/plugins/core/tymm-command-execute/execute_chat", FALSE); + purple_prefs_add_bool("/plugins/core/tymm-command-execute/arguments", FALSE); } PURPLE_INIT_PLUGIN(command-execute, init_plugin, info) diff --git a/command-execute64.so b/command-execute64.so index 2528afc5d0990cb170e0b762dadf071c96c91d6d..720a112a99df285a2df613313bbd82de79cf5c4e 100755 GIT binary patch literal 13258 zcmc&)eQ;FQb-&UAk!_G<;@B#N@W7G{Nm)J;Iru}i00S#32*D83*z{?&`y{QqU)g;N z63N6$1(Y?GN1+`Tr}b2&NlP;A#C1F#r|qP&ak1-ZI&xZj7*AsqTD!Z{V+(&!Vmqk6 zbKg0uyHC5s=|8>F+w;!veB5(C-hKDpcOTf;xv93MMo9{&I}~y44Ia|Yf)k7R2BclB zRdevWNG;I1v!_Kf?hY*QAfZZG8lXJp;5y9m!wWoIXyYucrq*8LQL(E9OLn7dH_CQG z$GIp%>)4#!(KW(yKW%0`p`=S``|EC$?$b@0ok61>tb~f)mtaS6e%xfnNktCe+PrO- z8ZA6L|8Vr+xqR`(n;O3L!1?2!TVg?^uEy1Z>v~*V73w!|UytiLT+O&BEycA27lnT< zF0zveF7KtC(4ubskwANd2Te&KC68zVH5+EYyHNT-|T;6?3;i0A4k9b<2!;s zKmFC+3x70xzW&_5zFq&~uCwl=znDltt!fG&`Vn6xJPB=y(KOtON~wguR7L+=2%PG` zpIU)e@WiY75pRERPrCG691Vh@c>p9E`K@-ppyUhs`zQGlJ9R-(GOR_ z7gzCJ z9d|rgWr-c>50is%JhmT-TlU&J*u#c+IGc5{DxJ%uKoAux2JYk7(EptE`)`Gfp}ljyQCWe=2kU?y7bz;jI6W({y_OP^8kSa&3tO$BdOwxcVSL7horUmtC{iVDHFb5KXV?RTM)zRvR3^GyOsHk zy#E?`FdgA}jNs$^;v8ILX-9$!Kkmc#(hC;pv=2Yd_=FFCg7Jb6AEC(u(xeZ6n(>Q1 z{3-UMc>Iz$+j+iJ=fk(t1O%zkhfi=ltn%Sq%nL2~XZ`d-OZ%fa0?i#H^&7bPiXSv^ z37u>X8#v9QB#juj%(F=LIOCM3*<+qIaC6=?X5cbMBtI`0xH*p=H*j+vdD_6GF38V> zfy>xTc)`GF-X>|%z!wP!deOjTZl}fE?o?iyt4XReaGDcJYBX?}i;}F#z-g{3$ue-6 zGm>nXfpe2Mb?Z@)3R;7PsS$_&!oEPD~-SyhA(; zRB>GM=ZL2+Ssc^+S>mZH79ZFAtHe_mERJgar^Hj&D~@RXMdGQ;6$dr{Eb-Lr#kA)C zmU!xV#V*Z1K|FP>;&#n{pLpsz#dggfC!V@Yah2x3O+0m#qNVwx#M2{MY}EXN#8cNO zD$V~M@eRaJUINgvpLpsD#R<)4h^H=49M}B)#8cB3$28wfJT-aoam{~)cxvk6sOEPN zPeVa*MDtsSrzS5BYJNTO)YQea=5HmQnz+~np4uyPWcG@AmI@slb8Dx@b;FHF3JuR* z+W^^c+h;&_g_d6o_xflrLpA9{8 z?#@uncqo4=^wOoAw*S;~+Wx05?9Y<@VB0^zPUUV24YmCMGPuaU?#>MzX*-G#3oB5A zg+Bc3IW>C}iZ$<^?4cBFSbP9QQs{PVgIB`LU5wyt4(^k?5dZyv;cIGqPw^f&DDJ?| z$jIG=Z&NJ{xBU=ZDwIE2_$;ycGYGP<{g)(Z{T@k%+q%)m3VR6hq-#9s*8oHM_awb@ zT6&Eq{h24dMA9YG(hDDH&)1=w!nPfx5SW&pCTafky(b$MtGh$_4-5BbXYwQWeQ&*h3|R_K~Lci%M@;bOfnt`<>SrhQolqs z4CvVIYo0`(Y|6h|cnNw3$8xiWKAhz?g^t|UjE)*_ZbbiVI@wcd@BG__Xt?z@$_g6A zKZiByFO`t&tRw$Q;dP4lAPV@8?xv3XbBHEF zeJB4~$MSy<4KMmKn9ls!Lh{3@sm}b{>rc(PK^49UrepZ_g`wfj*;KbbL18=d@2nmx z>?3da(-baZUfA4uB--5A39hO0h}&!-zGZ0JK~yib@4K*l1h$1yI7CH*rBxLw``+R( zpz{8W@)W2%le#=nR32(;@J{9C5cCCI(eHQU|E=%`usk@{aNr0vV*U)G59Qw~{OkkD z;(6-mXK_1pamw9~{1)hTYHI;O_$PE6ua$=n?{lL=D+Lm{%L7nSa=!#qrV{kv#+?q z(vNK@zqtw7J&WuLEjsJglhhc)ZP$^fvs$}t2=}Wm6yCe2V|&@--tf4aU<%o3;__$i zE!r@_z>F%XLxJe^sydQcC*xWhyd}`Bif@#;u3C{xVfmZcrq=EBn^@i6n+V6^L0H{^@~rfhL)n#-#mY)qK%%pRGSWtGrB}){m9!kJ zS_dpFZmo{3*0N;EwNlCW0Ddg42PhjW+vVEN$H>QvQWUO>7iX9CLi*yScAQ4Rec7}h~ zp}eKD?CXm~`mBAic--oCq_0FR2fG_ihT5*IRpGJ(nT^RU9JD%ID-uSA@odTpN2mwr z4pG)DL5jD}b<^2fSFY?uM!9b4g}T#8CzF1?l5{E6TpzeC3Q7~gRqszt4T6sU&(zcj z&@`UY7eFUK3!vNaxYpr;ejIca=ynVOyFmv*`$4-fh>n7efxZB0;k7XdN=fGOHT!p{ zn*PR`>*s!=j`sYUAzO&+#Cx8ts&Cv>-?XLSs(p2X>dpnXedcq`OUa&eFgz;@u{}n> zy86bU+S)&^uOr5jQ#nQUv^qM#1d?tygERi)x-e^Ka7 z{t7*c>mleZLz{)kUr5*E&Qf56A;~_7?0a~qxBpM~w5LL8u18Ay_VbvR{YqK8%RY;& zt+?4r-%4b^h2ow3M^aKm{?_Ziq5p<06$3#@8-LyhNVxlHkE^Fo!%u_$7Bx}Ne z$EsrsEq%voYB%3Vzm>fVS!1qcM}nt$F)wjb|EI)oDL>4{b^O~|fJwXNSzS#sFNSDN zEwA_7{lERn_dI_9PjQ2vV)_cxH<(^vI)@8zEz=vB-pq6p(=RjaVY-*;A*PQo{R^f~ zF+Iif6{c@6y})!%gBSU=OmAd*GgB$o;37+ID^luj)HS4ERa7!S*$0$;KiTJ#eLdO7 zlYKkcr;~j-*@rV+mfgxeTp4&7rrq4Mxs0A)w0XmZTdiexIo&b5hCUzsLU7HB*5%%f zQo-y%!VPzWx*3o5$sMLEPOvwb3wGyXaZJ>rN^^bTY@Z572a>S#D7M74gtqAMnk{2& z$TChmOa^?Hj=L(TzhMMjryuwFOGYr0(p$_yr;ooh^hIGSoM&N&Gnw#!XCe3ZN1z7p z;Y2KgtW$7^pPi)$GNg5GKP_$YLO zKqRq~aY^_fWEU{DNd7XO3Jq!Nnf46h#DOatM#&4lA zUPDDE86SnG_-O1Ddl@fZ@=W zHiUk|XJ0y>!sF?aRB=WUJAn@1#>`*l3qs|+Df<5SA7p!a4s?=_2TarQVrQ|`pA_pT zaJnzGA2*DgD~Yn55P$xo5SaF-*hNk;5I@)v*K#|^cSgemhQIe+8V_w!G|ma1Cp zW&Sk6o7#STKmROjDMYb9w!i|1dDX|Xe;&Hj_rzZ22XYQ*oXaoWK=PM#a0B>q}FO=)oDH-p}@hg;!h zpLrg{^MesZ#zDg%fRRGRH3LSzjY`I=a{OwX1GG#?-v@9KMaCIZ7{G}!89&PLYj7^m zG9i5*K#=mho5BE2#L079j$fzb`7Fnq)F?l9<+!Xmr%|uJ&#X^+j%KOzQ`4H>9rgQ~ z3guc3ycVn8F5kN04#r1(_?H;>ucLdl|LOSU`Pi%Rnf3e_`;m1ySe?Fy-x{1E^taaw zz$=yORp1oAtOLj|rMGYqKEdObqfwzX9vJAv0=bv!2R$obRebPY~UjxMsa<{0buFfQw!wTxG5$FFMrMm1=D?1jw( z8lTy3kFbA#e>DZ!&UsN zNH`uhjx?%B#?87peEE&wsNk+fCRJI@y@Tha&H&qXF4=G-db3 zQ{8j~&`o8sb~x9su;9lDMto}u-n{CTHSkBE5*aBkXfH>%Ic1Xq9I^Q%@X?^vNefvn#VhJ09B3{>I0?K z4t-(+iq2QIx0|O6%TIcu0`)P^%btJbGmCnA2|jUFv)pCn1DoDK&2ml7+&p$EUm00s zwrHgjs@z!8d!+`wbD(nS6G4{Fn)(j?ayIOyy!y(I+?LL^!kckqbo#_+C7h~4p9IyX zIxCcE`arBiQfgj(-qbu9DjG9-2O9ixhmEVA;x$go@?qQZ=Fz=Cs*;h_lT2saPKTlCq$A@5Jp833rQ@M9#Z92In=r+O2{D0K z{hfQy*?sS6AJFL^y*qEuJHPXBKi|Fg-FLn+Ff`cQ)TAV}sQVOg`85XVV?q2Dz5(e| zJ!%F1Z&Mqz?(({5$=%R80|`~i(g5YL0@r?)?_Xzdp_LY`rYezoNt3^vloeHb_wXUL z`MKfBeNzYi_@>WZ``q$JZof91eBB|RH{jZcs}0wua8aTrS&i#vVmN&o^ftaHzwNlz zGQWyxm{1#slXU+|2-f40@=6_P3~a#Ff$LUWG<T+~*Cla7ps zlk--KTGqFZFv^q4|G>bjZ%uuB{^@`I`LkdCm-}M>dGU*fZ~dp)D{a60>DyHO$kd`% zs!nPUU;0PfQyIhQc2v3%{$nUM!n;x6MmW{o3OfgXFhc)B$Qt>%C!#zv5qGOU9vCDlAEhT*zb~YJiS_$va3dWwMA;Gksn6Fo7@zbEuf@~zP4>fXl(OydOfG8| zJ*VK=wz5;%l&9=55M}Qf*=Hx+f;*lndTwE4Uw=B6bw`}hv}mF?>6 zZF{s>G=mFJHmP#hyKPj=I+ngTy#McA-@77Sn7kirtstn$Dp$+|D= zN*~Ychk1P$TrYUgx7J%^R$GUJ&xi0PUhJkq_`QtJgz&wLpA6v_XfZ>Y3*na;KNZ4< z+0W?^K1GW#(wPu`l;@eVA^bA8!$JsGGXF4@_Q|t;Pp75xq4inTXaf3txPSeR`*5z3 zw%_l=dCR5o!#-U0A0(J!oYs8qTCG3h!~J`KlRjMbPGm6W!~OfqQ$C#XkaXIIuNM&X zj1QMKBJo)tPJ0naFZgiU>qwgS;r=bf1s~2^W^Jio`_zzpp8yEDy*u7)5r55kl ziU0PEeYhijf<)Czi%56eMLY~ubwTr+h^L`Yo!9&Z;%Nv}&uV@x@znLz)0$sNJau_> zPV>#g(-5xCX#O{=z*9A<_pt+Z79Yx7?7;(~7AIZ5%^UZVDg{uhn@7kv8XuC~O>FUHUP;{JHkLcIJ^{KwZy+WzJzwEa&!*#C^|XL`58 zPL+N)e!O=#WXQ7ornfr&Om8#FUFk&)D--xT^3w8FC^o%&evDGAed7sKiH1jSXDiIS zjVRo&uQ#>2@es=23>dx^7mif_5Duyb@HaPiu=0Ish1uTU!4Qa-&sQEIw){E@SvmV# zl60>p$!zZ{AeA2wWTej;>CcU{3nQlTmvyOUqyvCqJ4Vu{>(WQ{?ZwB>&mD}HKdAhz zR$ent!+W;-?=d*z<=5inmn$(8rcyT2Q6oK5mv)f!Nh4imq~EDa-+|x-8uyQ*iE8bm z^Sj5`>^C;MjLpFIdCKyaAHwN6qwqF0=xld)K;acq_!a)*vupm$D0BrBo`Xy>o}0N} zd7q_0w*9@zX$ZbHU)l+m%gAE3x19(c=;|S4*uL>Wo!w1FMmzTH^VRRcsC^?9;}O%+ z|E_Uu^$o~$_t)zOr|)a0m@dwm{8sA`-M(=Kg{4fJAg_3k5soTXJ9QQ(NKEp_#6I8H z{u~NW+3B;t_yHA>?aS#dJR-k^pBug!)TfA3#sDeC5Ud3Psl z_fmC#M7Fcte_?942vYf~hI*f*=6tX6ufHLM-X9q5CF07jKVH2JN^^RS;AwYHw&)f- ztKaNV?^S%G{JY34r93uqZc-K8gqu3%Cby(ATQbG*I-i(uJdLoq#e3l7N;oRGTfFH^ zW()6wx5)l@IA<|rjpa&N=$23zHw(p5){~NmE44kgO_3k#59mL$y>C3@q|!0CxDVCe zYF;9WTPeS-jq-y;@57;tG+;LAwG!mAmW$p0w1t-hYtKGwb2jH$xomnGe-_st%Dy** zJGGxrkT2KQcG8p1bWvM1%%5_mhO{znvFMEB{RruQ;h${P$OPWgtVyS6Iaa=q!z)^b zTM(}ZmN(%_jaQn2e7t|7*KZn6e4$asas?}&O5)AU!rP677rg|Q=@I8im-3dLot#J| zCalR+I&F=*(w9lg#aoA@m2i+@x|p+^1oe>aut2lLsKgVV zmoMJCb?Z1XDvi=8(St$;fegZ}rgk_Vx~1jwBVcG@Kl$s$#XRVR_ZJsWfyVLlya4(F z=ta=Yc!;ioo&xQ}14i>j4=Bw$he1z)&VW*qJyO$`4ydN7j;32yU)M@!gI$o(SxyJ? z>LcB@j={Fhz3rp0%r{3mU+BS9h`Nn9r( zcL^}^gkMfG*+s~+b$Qw^|7+lzQ8$O=d)hjVw6%`5b&O~g^8Z6zQ;_$N{GqmveJk5q zlyDIN5$L~R}18sSb^y0dngCZx0 zlDxOcdzwMb`5xWVJ0K<5L(BQx8UxqPJ=QZX?}fK8&&{gO8VQp3Luv;~B41`$r58rr z|LWRej-VONU*0Ls@Qu79&9j^zKlNqiSFyiNrdS(wI?DTPR#O*ftRTs_l6Mr@TkmJb zf}i99OS#3K#yKU)4_gmie!bHLj?I+jIXiWk`7U;Z;iToXasB^HaxNb(!ypfUN12W> zJ;wCwOuxmGcNWe~|MAIbV?T1UWyD^8z^^kn?~j|Fv_0NQIz4&I^L*$8)>;`|q_jKj@C8 zFx~Hr-4olfrTb2Eqg1Roo$;JeP_JOCplX*|*1y&S0nQw%rMfp9<8Ir%ulS2C<>>0)vL8WMp6#IF;5n5qh$|(8E{MH9s znp4GI=4GKW4?{&KnfHW`z}q$zSZH{bIwM4%<%wqjJeQChMxu@H!ynfQe4Dnf2Rm z<9Sr5-UG2N5jmq0`c%kXz8?#v_jP{~JHbxi#-G1@{}3wcq3DO)sXt|VdJZU^=EE|f zt+HSnajpF*PfE|?qI>DT@b_NYd-_v2|I-lq?Q4f@eAqT58L<=TKk@lp+)y7$F=gK) z-^auHVg7m8w)^a5Uv!ucZNvIu{zceQ5heeleC~eq6WYHFTN-;}FYCU1r(fXu)AK_~ z@|SV20L-6%5AUmb_yO6ht?GYbFZ9)rz3j`5vi;e*slF3Cq5l!Gmv!Ibjc8}6|E!R| zH^7rGslR+r?4gh1NRp4?>hqBBRoqY(+XP@L_Oibfu@pxr4R^^~bcl{{{_prf+>4#S z#LL(hjOfWthC9U@Rw~C%Tv8vIzv%gFl)rVCvELkeV8Zzut;YW?D6OoAevKBCSk|{7 z-csA=2k~WUzCk5hFssWt6VzX!Wc>)@*O?P%KZyGlw2I94eo+hFT4f#&;!EQbNZx{# zROa2F{_0v>P7rVKy;%EctIdN!{q|ZMOAyD?$n#YYzoGVhE{LzKy?+Jq8*bf{h&6MDyO^$=rasp|IN6(Z@AzoeTYlf3qyrc$q+^JBjGcQ_b|Sd@xBlqXI$QE zX#YcL1b7o7n)=pTnxEJINYVjlk)!zLB51fLj62h8c{|cQn2 zq>=w@1b%}3gvZHTg#O*yj#wdQF@MQ z!ZG$(YTOtLR?4PxPEsW@NqieXd{F(Xf-Rp~SSDXw>{Q04FD_x24!*U3bJKoJK#>j) z(zmufcwpDQ0efKhL5l3stt$7)Vot)G><1qk-nDN}KQs{HCEB}(9)4igkp1xB;K6|r zdt}!GLj!g#NN7pmmOt`J7l7i58bk`|Sg((X$KrS^G>;Cp`lu+hj|jDr03>~0!;xJ6 zC@A?F#Ug)aGztRac9wxBEnyl(im`_YpCCk->4k7&qO6(sIEl!a%HGU!OlZ%tRvo55OVKxBvhE From c6103687d364c53c3dd6446185d3ddb4a62cf285 Mon Sep 17 00:00:00 2001 From: Timm Date: Wed, 26 Mar 2014 14:00:34 +0100 Subject: [PATCH 2/6] Describing new feature --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 78f064b..679656e 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,9 @@ If this does not work for you, you maybe have to compile the plugin yourself: gcc command-execute.c -O2 -Wall -fpic `pkg-config --cflags glib-2.0` -I/path/to/your/libpurple/headers -shared -o command-execute.so ## Why? I wrote this plugin because non of the existing command execution plugins worked for Pidgin _and_ Finch. + +## TODO + +- Provide .so files for every platform. + +- Implement a feature which makes passing arguments like %m for message or %s for sender possible. This is already kind of implemented in the develop branch. I wouldn't recommend using it though since it is still buggy and probably not secure (remote command injection). From 19dbbaf574b499d69e120b4efcffd00a81b57651 Mon Sep 17 00:00:00 2001 From: Timm Date: Sat, 29 Mar 2014 16:49:50 +0100 Subject: [PATCH 3/6] Fixed bugs. Passing arguments works now. Still untested and probably not secure though --- command-execute.c | 31 ++++++++++++++++--------------- command-execute64.so | Bin 13258 -> 13655 bytes 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/command-execute.c b/command-execute.c index 2635ced..448deb6 100644 --- a/command-execute.c +++ b/command-execute.c @@ -42,27 +42,27 @@ typedef enum #endif /* Replace orig with rep in str */ -char *str_replace(char *str, char *orig, char *rep) { - static char buffer[4096]; +void str_replace(char* buffer, char *str, char *orig, char *rep) { char *p; - if(!(p = strstr(str, orig))) { - return str; - } - - strncpy(buffer, str, p-str); - buffer[p-str] = '\0'; + if((p = strstr(str, orig))) { + // str up to the first character of orig + strncpy(buffer, str, p-str); - sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); + // append rep to buffer + strcat(buffer, rep); - return buffer; + // append (end - orig) to buffer + strcat(buffer, p+strlen(orig)); + strcat(buffer, "\0"); + } } -char *get_command_with_args(char *cmd, char *sender, char *message) { +void get_command_with_args(char *buffer, char *cmd, char *sender, char *message) { // Put sender and message into the command string - cmd = str_replace(cmd, "%m", message); - cmd = str_replace(cmd, "%s", sender); - return cmd; + char tmp[4096]; + str_replace(tmp, cmd, "$sender", sender); + str_replace(buffer, tmp, "$msg", message); } void execute(const char *cmd, char *sender, char *message) { @@ -70,7 +70,8 @@ void execute(const char *cmd, char *sender, char *message) { // There is a command if(purple_prefs_get_bool("/plugins/core/tymm-command-execute/arguments")) { // The user wants the arguments being parsed - char *cmd_args = get_command_with_args(cmd, sender, message); + char cmd_args[4096]; + get_command_with_args(cmd_args, cmd, sender, message); if(system(cmd_args) != -1) { purple_debug_info(PLUGIN_ID, "Command executed\n"); diff --git a/command-execute64.so b/command-execute64.so index 720a112a99df285a2df613313bbd82de79cf5c4e..efe67a93d7386af1ece0c857760eb8cf4a38c921 100755 GIT binary patch literal 13655 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 Y=iH0lfOAh+xp(|j&^j89f3M{K0NHEqHvj+t literal 13258 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 Date: Sat, 29 Mar 2014 16:57:47 +0100 Subject: [PATCH 4/6] Updated. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 679656e..63775ce 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Command-execute is a plugin for Pidgin and Finch which lets you execute a comman It can also act on new chat messages. A conversation update is triggered everytime a message is received which you did not see yet. For example that applies for messages which occur in a window which is in the background of Finch. + +You can pass the name of the sender and the received message by using $sender and $msg in the command. Before that you have to activate this feature in the configuration menu. This feature is untested and probably not secure. I wouldn't recommend using it at the moment. ## How? Just put the `command-execute.so` file into your Pidgin/Finch plugin directory. Normally this is `~/.purple/plugins/` or `/usr/lib/pidgin/`. @@ -17,5 +19,3 @@ I wrote this plugin because non of the existing command execution plugins worked ## TODO - Provide .so files for every platform. - -- Implement a feature which makes passing arguments like %m for message or %s for sender possible. This is already kind of implemented in the develop branch. I wouldn't recommend using it though since it is still buggy and probably not secure (remote command injection). From 6bebee6908ed7226e0107f02821d7bbac5181b15 Mon Sep 17 00:00:00 2001 From: Timm Date: Sat, 29 Mar 2014 17:07:37 +0100 Subject: [PATCH 5/6] Removed unnecessary section. --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 63775ce..f50bcd2 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,6 @@ Normally this is `~/.purple/plugins/` or `/usr/lib/pidgin/`. If this does not work for you, you maybe have to compile the plugin yourself: gcc command-execute.c -O2 -Wall -fpic `pkg-config --cflags glib-2.0` -I/path/to/your/libpurple/headers -shared -o command-execute.so -## Why? -I wrote this plugin because non of the existing command execution plugins worked for Pidgin _and_ Finch. ## TODO From 0f5a3927a2c74ff8c5e7b179e80a3f87158ea145 Mon Sep 17 00:00:00 2001 From: Wommel Date: Fri, 22 Dec 2017 16:30:18 +0100 Subject: [PATCH 6/6] use exec and fixed arguments instead of system to avoid escaping hell --- command-execute.c | 55 +++++++++++------------------------------------ 1 file changed, 12 insertions(+), 43 deletions(-) diff --git a/command-execute.c b/command-execute.c index 448deb6..f5556cd 100644 --- a/command-execute.c +++ b/command-execute.c @@ -16,10 +16,12 @@ * along with this program; if not, see . */ + #define PURPLE_PLUGINS #include #include +#include #include #include "notify.h" @@ -41,52 +43,19 @@ typedef enum } PidginUnseenState; #endif -/* Replace orig with rep in str */ -void str_replace(char* buffer, char *str, char *orig, char *rep) { - char *p; - - if((p = strstr(str, orig))) { - // str up to the first character of orig - strncpy(buffer, str, p-str); - - // append rep to buffer - strcat(buffer, rep); - - // append (end - orig) to buffer - strcat(buffer, p+strlen(orig)); - strcat(buffer, "\0"); - } -} - -void get_command_with_args(char *buffer, char *cmd, char *sender, char *message) { - // Put sender and message into the command string - char tmp[4096]; - str_replace(tmp, cmd, "$sender", sender); - str_replace(buffer, tmp, "$msg", message); -} - void execute(const char *cmd, char *sender, char *message) { if(strcmp(cmd,"") != 0) { - // There is a command - if(purple_prefs_get_bool("/plugins/core/tymm-command-execute/arguments")) { - // The user wants the arguments being parsed - char cmd_args[4096]; - get_command_with_args(cmd_args, cmd, sender, message); - - if(system(cmd_args) != -1) { - purple_debug_info(PLUGIN_ID, "Command executed\n"); - purple_debug_info(PLUGIN_ID, cmd_args); - } else { - purple_debug_warning(PLUGIN_ID, "There was a problem executing the command\n"); - } + pid_t pid = fork(); + if (pid == -1) { + // error, failed to fork() + } else if (pid > 0) { + purple_debug_info(PLUGIN_ID, "Command executed\n"); + purple_debug_info(PLUGIN_ID, cmd); } else { - // No arguments - if(system(cmd) != -1) { - purple_debug_info(PLUGIN_ID, "Command executed\n"); - purple_debug_info(PLUGIN_ID, cmd); - } else { - purple_debug_warning(PLUGIN_ID, "There was a problem executing the command\n"); - } + // we are the child + execl(cmd,cmd,sender,message,(char *) NULL); + purple_debug_warning(PLUGIN_ID, "There was a problem executing the command\n"); + _exit(EXIT_FAILURE); // exec never returns } } else { // There is no command