// main.cpp : main module of the plugin // #include "gnupgplugin.h" HINSTANCE dllinstance; PLUGINLINK *pluginLink; PLUGININFO pluginInfo = { sizeof(PLUGININFO), "GnuPG Plugin (Ansi/Unicode)", 0x00070002, // version dword "OpenPGP/GnuPG Plugin v0.7.0.2 by Zakhar V. Bardymov ("__DATE__")\n" " based on GnuPG Plugin v0.0.0.4 by Harald Treder", "Harald Treder, Zakhar V. Bardymov", "harald.treder(at)gmx.de, zvb(at)irkutsk.ru", "GPLv2", "http://www.miranda-im.org", UNICODE_AWARE, // right now the only flag, UNICODE_AWARE, is recognized here 0 // doesn't replace anything built-in }; struct MM_INTERFACE mmi; struct LIST_INTERFACE li; struct UTF8_INTERFACE utfi; UINT storepassphraseschecked; UINT autoimportpublickeyschecked; UINT loggingonchecked; char starttag[plugintagsize]; char endtag[plugintagsize]; char *pluginid="GnuPGPlugin"; char logfile[fullfilenamesize]; // zeichenketten zur identifizierung von werten in der datenbank char *dbexecutable="Executable"; char *dbhomedirectory="HomeDirectory"; char *dbstorepassphrases="StorePassphrases"; char *dbautoimportpublickeys="AutoImportPublicKeys"; char *dblistpublickeys="ListPublicKeys"; char *dblistsecretkeys="ListSecretKeys"; char *dbimportpublickey="ImportPublicKey"; char *dbexportpublickey="ExportPublicKey"; char *dbdetectuserid="DetectUserID"; char *dbencrypt="Encrypt"; char *dbdecrypt="Decrypt"; char *dbtempdir="Tempdir"; char *dbkeyuserid="KeyUserID"; char *dbkey="Key"; char *dbkeymodified="KeyModified"; char *dbuseencryption="UseEncryption"; char *dbstarttag="StartTag"; char *dbendtag="EndTag"; char *dbloggingon="LoggingOn"; char *dblogfile="LogFile"; void ErrorMessage(const char *alevel, const char *atext, const char *ahint) { char buf[errormessagesize]; strcpy(buf,Translate(atext)); strcat(buf," "); strcat(buf,Translate(ahint)); MessageBoxA(NULL,buf,Translate(alevel),MB_OK); } void LogMessage(const char *astart, const char *atext, const char *aend) { if (loggingonchecked!=BST_CHECKED) return; FILE *log=fopen(logfile,"a"); if (log) { fputs(astart,log); fputs(atext,log); fputs(aend,log); fclose(log); } } // DllMain extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { dllinstance=hinstDLL; return TRUE; } int AddContact(WPARAM wparam, LPARAM lparam) { CallService(MS_PROTO_ADDTOCONTACT,wparam,(LPARAM)pluginid); return 0; } void getcontactsetting(char *ostr, const char *key, const char *defstr) // zvb: Created to be used in MainInit. { DBVARIANT dbv; int err=DBGetContactSetting(NULL,pluginid,key,&dbv); strcpy(ostr,(!err?dbv.pszVal:defstr)); DBFreeVariant(&dbv); } int MainInit(WPARAM wparam, LPARAM lparam) { PROTOCOLDESCRIPTOR pd; CLISTMENUITEM cmi; HANDLE hcontact; // zvb: slightly more readable now: getcontactsetting(gpgExecutable,dbexecutable,txtgpgexecutable); getcontactsetting(gpgHomeDirectory,dbhomedirectory,txtgpghomedirectory); getcontactsetting(gpgArgsListPublicKeys,dblistpublickeys,txtgpgargslistpublickeys); getcontactsetting(gpgArgsListSecretKeys,dblistsecretkeys,txtgpgargslistsecretkeys); getcontactsetting(gpgArgsImportPublicKey,dbimportpublickey,txtgpgargsimportpublickey); getcontactsetting(gpgArgsExportPublicKey,dbexportpublickey,txtgpgargsexportpublickey); getcontactsetting(gpgArgsDetectUserID,dbdetectuserid,txtgpgargsdetectuserid); getcontactsetting(gpgArgsEncrypt,dbencrypt,txtgpgargsencrypt); getcontactsetting(gpgArgsDecrypt,dbdecrypt,txtgpgargsdecrypt); getcontactsetting(gpgTempdir,dbtempdir,txtgpgtempdir); getcontactsetting(starttag,dbstarttag,"\r\n"); getcontactsetting(endtag,dbendtag,"\r\n"); getcontactsetting(logfile,dblogfile,"c:\\miranda-gnupg.log"); loggingonchecked=DBGetContactSettingDword(NULL,pluginid,dbloggingon,BST_UNCHECKED); storepassphraseschecked =DBGetContactSettingDword(NULL,pluginid,dbstorepassphrases,BST_CHECKED); autoimportpublickeyschecked =DBGetContactSettingDword(NULL,pluginid,dbautoimportpublickeys,BST_CHECKED); if (existsFile(gpgExecutable)) { updateKeyUserIDs(publickeyuserid); updateKeyUserIDs(secretkeyuserid); } else ErrorMessage(txtwarning,txtinvalidexecutable,txtverifyoptions); HookEvent(ME_OPT_INITIALISE,OptionsInit); HookEvent(ME_USERINFO_INITIALISE,UserInfoInit); // register encryption protocol ZeroMemory(&pd,sizeof(pd)); pd.cbSize=sizeof(PROTOCOLDESCRIPTOR); pd.szName=pluginid; pd.type=PROTOTYPE_ENCRYPTION; CallService(MS_PROTO_REGISTERMODULE,0,(LPARAM)&pd); // send/receive functions registration CreateProtoServiceFunction(pluginid,PSR_MESSAGE,RecvMsgSvc); CreateProtoServiceFunction(pluginid,PSS_MESSAGE,SendMsgSvc); // zvb: let the Unicode calls be served by them too. CreateProtoServiceFunction(pluginid,PSR_MESSAGE"W",RecvMsgSvc); CreateProtoServiceFunction(pluginid,PSS_MESSAGE"W",SendMsgSvc); // add the protocol to all contacts found in DB for ( hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); hcontact; hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hcontact,0) ) if (!CallService(MS_PROTO_ISPROTOONCONTACT,(WPARAM)hcontact,(LPARAM)pluginid)) CallService(MS_PROTO_ADDTOCONTACT,(WPARAM)hcontact,(LPARAM)pluginid); // kontakte zur laufzeit in die protokoll kette einhaengen HookEvent(ME_DB_CONTACT_ADDED,AddContact); CreateServiceFunction(svcuseencryption,UseEncryptionService); CreateServiceFunction(svcsendpublickey,SendPublicKeyService); // set contact menu items ZeroMemory(&cmi,sizeof(cmi)); cmi.cbSize=sizeof(CLISTMENUITEM); // encryption menuitem cmi.pszName=Translate(txtuseencryption); cmi.position=menuitemposition; cmi.pszService=svcuseencryption; useencryption=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&cmi); // sendpublickey menuitem cmi.pszName=Translate(txtsendpublickey); cmi.position=menuitemposition+1; cmi.pszService=svcsendpublickey; sendpublickey=(HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&cmi); // hook event fuer menumodifikation HookEvent(ME_CLIST_PREBUILDCONTACTMENU,UpdateContactMenu); return 0; } // MirandaPluginInfo extern "C" __declspec(dllexport) PLUGININFO *MirandaPluginInfo(DWORD mirandaVersion) { /* if (mirandaVersion