diff options
Diffstat (limited to 'secureim')
83 files changed, 12274 insertions, 0 deletions
diff --git a/secureim/!whatsnew.txt b/secureim/!whatsnew.txt new file mode 100644 index 0000000..eeb792d --- /dev/null +++ b/secureim/!whatsnew.txt @@ -0,0 +1,595 @@ +
+Verison 1.0.12.4 [28-04-2010]
+
+[*] fix bug with advanced icon set to "NONE" && enable extaicons plugin
+
+
+Verison 1.0.12.3 [18-05-2009]
+
+[*] fixed crash on filetransfer
+[*] advanced messages for replaced RSA keys
+[+] show SHA1 for all public keys
+[*] new format private key
+[+] export/import public keys
+[+] export/import my private key
+
+
+Verison 1.0.12.2 [07-05-2009]
+
+[*] some memory leak fixed
+[*] some security fixes
+[+] use KeyExchangeTimeout for RSA/AES keyexchange
+[+] show RSA Public key flag in Options dialog
+[+] reset RSA public key for contact
+[+] copy SHA1 of my RSA public key to Clipboard
+[*] context menu on RClick in columns "Mode","Status","-"
+
+
+Verison 1.0.12.1 [04-05-2009]
+
+[*] native mode fixes
+[+] add support for folders plugin
+[+] auto switch to RSA/AES mode, if possible
+[+] _Filter sequence fixed (last in sent & first in recv)
+[+] GPG temp path
+
+
+Verison 1.0.12.0 [28-04-2009]
+
+[*] rewrite icons library
+[+] add support for extraicon plugin
+[+] RSA/AES Secure File Transfer
+[+] mode in context menu
+
+
+Verison 1.0.11.4 [22-04-2009]
+
+[*] patch from Billy_Bons
+
+
+Verison 1.0.11.3 [22-04-2009]
+
+[+] option "Disabled" for RSA/AES
+[+] change status to "Disabled" for "Disabled" on other side
+
+
+Verison 1.0.11.2 [21-04-2009]
+
+[+] option "Not secured for NotOnList"
+[+] auto switch mode to RSA/AES and to Native on message type
+[+] auto accept RSA key
+[+] auto established RSA/AES connection ("Always if Possible" flag)
+
+
+Verison 1.0.11.1 [20-04-2009]
+
+[*] compile with new Miranda headers
+[*] fix metacontacts handling
+
+
+Verison 1.0.11.0 [08-08-2008]
+
+[*] some code rewrite
+[*] fix UTF8 in PGP/GPG messages
+[+] split long messages (per protocol)
+[+] new encryption algorithm RSA/AES
+[*] rewrite handling metacontacts
+
+
+Verison 1.0.10.8 [09-04-2008]
+
+[*] fix store subcontact history in metacontacts (only with today meta svn)
+
+
+Verison 1.0.10.7 [19-01-2008]
+
+[*] change select contact list icon slot
+
+
+Verison 1.0.10.6 [24-12-2007]
+
+[*] some code rewrite
+
+
+Verison 1.0.10.5 [24-12-2007]
+
+[*] fix Load/Unload keys for PGP/GPG
+
+
+Verison 1.0.10.4 [21-12-2007]
+
+[*] fix double UTF8 encoding in PGP/GPG messages
+[*] applied patch from Garthower (MetaContacts & IRC protocol)
+
+
+Verison 1.0.10.3 [15-09-2007]
+
+[*] change work with metacontacts (to work need disable sync subcontact history with metacontact)
+[*] fix secure filesend over metacontact
+[+] new features in options dialog
+[*] unicode fix SetPSK dialog
+[*] change memory allocation functions
+
+
+Verison 1.0.10.2 [19-06-2007]
+
+[*] fix PREF_UTF flag in messages (new bug)
+
+
+Verison 1.0.10.1 [08-06-2007]
+
+[*] fix PREF_UTF flag in messages
+
+
+Verison 1.0.9.37 [04-04-2007]
+
+[*] remove internal SecureIM messages from MetaContacts history
+
+
+Verison 1.0.9.36 [02-04-2007]
+
+[*] fix Established Secure Connection over RTF (in MRA)
+[*] disable icon && menus for non-secured protocols
+[*] hide GPG menu items for no-secured protocols
+
+
+Verison 1.0.9.35 [14-03-2007]
+
+[*] add PluginInfoEx support
+
+
+Verison 1.0.9.34 [28-02-2007]
+
+[*] fix for Secure File Transfer
+
+
+Verison 1.0.9.33 [26-02-2007]
+
+[*] file encryption from RO FS fixed
+
+
+Verison 1.0.9.32 [25-02-2007]
+
+[*] some PGP+GPG fixes
+[+] option "save GPG passphrases" (saved on exit)
+
+
+Verison 1.0.9.31 [22-02-2007]
+
+[*] fix VC71 project
+[*] PGP & GPG can worked anytime
+[+] options 'disable' CList icon
+
+
+Verison 1.0.9.30 [12-01-2007]
+
+[*] hide SecureIM icon in TabSRMM for ChatRoom
+[+] add unicode support in Options Dialog
+
+
+Verison 1.0.9.29 [10-01-2007]
+
+[+] support Unicode in Popups
+[*] fixed Metacontact icon in TabSRMM
+
+
+Verison 1.0.9.28
+
+[*] internal build
+
+
+Verison 1.0.9.27
+
+[*] internal build
+
+
+Verison 1.0.9.26
+
+[*] GPG fixes
+
+
+Verison 1.0.9.25
+
+[*] GPG fixes
+
+
+Verison 1.0.9.24
+
+[*] support ANSI codepage for GPG
+
+
+Verison 1.0.9.23
+
+[*] GPG bugfixes
+
+
+Verison 1.0.9.22
+
+[*] more GPG fixes
+
+
+Verison 1.0.9.21
+
+[+] add option "Log to file" on GPG tab
+[*] small fixes
+
+
+Verison 1.0.9.20
+
+[*] GPG fixes
+
+
+Verison 1.0.9.19
+
+[*] add secureim_icons.dll in installpack
+
+
+Verison 1.0.9.18
+
+[*] small fixes
+
+
+Verison 1.0.9.17
+
+[+] add decode incoming RTF messages
+[+] add GnuPG support
+
+
+Verison 1.0.9.16
+
+[*] fixed language in IcoLib support
+
+
+Verison 1.0.9.15
+
+[*] fixed show not-32bit icons
+[*] fixed IcoLib support
+
+
+Verison 1.0.9.14
+
+[*] resend unencrypted messages fixed
+
+
+Verison 1.0.9.13
+
+[+] add IcoLib support
+
+
+Verison 1.0.9.12
+
+[*] fixed filetransfer
+
+
+Verison 1.0.9.11
+
+[+] split SecureIM & IconPack in different modules
+
+
+Verison 1.0.9.10
+
+[*] fixed "Status in context menu"
+
+
+Verison 1.0.9.9
+
+[+] option "Always secured if possible" (need ICQ.dll from SSS on both side)
+[*] fixed send unencrypted messages, if connection not established
+[*] on default PGP is disabled
+[*] some fixes
+
+
+Verison 1.0.9.8
+
+[*] fix use black background color on popups
+
+
+Verison 1.0.9.7
+
+[+] rename received files (file.dll, file (1).dll, ...)
+[+] increment encrypted filename (file.AESHELL0, file.AESHELL1, ...) for send one file to multiple contacts
+
+
+Verison 1.0.9.6
+
+[+] add ChatRoom checking
+
+
+Verison 1.0.9.5
+
+[*] fix autoload keyrings on PGP6
+
+
+Verison 1.0.9.4
+
+[*] fix remove PGPprivkey
+[*] fix add new contact
+[+] add PopUp plugin detection
+[+] rebuild function for work with lists
+[*] some fixes
+
+
+Verison 1.0.9.3
+
+[+] option "Disable PGP"
+[+] option "Disable keyring use"
+[+] pgp encryption working without installed PGP, only with PGP SDK dlls
+[*] check "MirVer" fixed
+
+Verison 1.0.9.3
+
+[*] internal build
+
+
+Verison 1.0.9.1
+
+[+] PGP v8 are supported (PGP v7 not tested, PGP v9 - NOT supported)
+[+] save sort order in options dialog
+[*] some fixes
+
+
+Verison 1.0.8.4
+
+[*] show icon on CList on Load & Unload PGP keys (you will get "Load PGP KeyID" contact menu item ONLY if you have pre-installed PGP 6)
+
+
+Verison 1.0.8.3
+
+[*] some fixes
+
+
+Verison 1.0.8.2
+
+[+] support for PGP SDK 658 (new menuitem "Load PGP KeyID" | "Unload PGP KeyID")
+
+
+Verison 1.0.8.1
+
+[+] work's on icons ;-)
+[+] some fixes
+
+
+Verison 1.0.8.0
+
+[+] new parameters "p" and "g" in DH keyexchange
+[*] disable keyexchange with invisible contacts ;-)
+
+
+Verison 1.0.7.10
+
+[*] change SecureIM status from context menu (suport for CList_classic)
+[+] add sort in SecureIM options dialog by clicking on column header
+
+
+Verison 1.0.7.9
+
+[+] "Offline Key Timeout"
+[+] "Disable encryption for game plugins"
+[*] change icons :-)
+
+
+Verison 1.0.7.8
+
+[*] bugfixes for "Secure Offline Messages"
+[+] change SecureIM status from context menu (not worked in CList_classic)
+
+
+Verison 1.0.7.7
+
+[*] PSK dialog fixed
+
+
+Verison 1.0.7.6
+
+[+] remake "SecureIM Translate.txt"
+[*] more fixes
+
+
+Verison 1.0.7.5
+
+[*] more fixes
+
+
+Verison 1.0.7.4
+
+[+] add updater support for Crypto++
+
+
+Verison 1.0.7.3
+
+[+] add combine splitted messages (WinPopup proto etc...)
+
+
+Verison 1.0.7.2
+
+[+] add pre-shared keys for Diffie-Hellman key exchange
+
+
+Verison 1.0.7.1
+
+[+] UTF8 encoding moved to Crypto++
+[*] more fixes
+
+
+Verison 1.0.6.5
+
+[+] check version of cryptopp.dll
+[*] fixed "always try"
+
+
+Verison 1.0.6.4
+
+[+] add compress long messages (GZip), need update Crypto++
+[*] more fixes
+
+
+Verison 1.0.6.3
+
+[*] rewrite SecureRecvMsg and SecureSendMsg
+
+
+Verison 1.0.6.2
+
+[*] rewrite SecureFileTransfer, worked in ICQ,Jabber,MSN
+
+
+Verison 1.0.6.1
+
+[+] split crypto engenie and miranda plugin...
+
+
+Version 1.0.5.23
+
+[*] some fixes
+
+
+Version 1.0.5.22
+
+[*] some fixes
+
+
+Version 1.0.5.21
+
+[+] add options "Show a popup on established connection" and "Show a popup on disabled connection"
+
+
+Version 1.0.5.20
+
+[*] rebuild in static mode
+
+
+Version 1.0.5.19
+
+[*] more fixes
+
+
+Version 1.0.5.18
+
+[+] selection of protocols added
+
+
+Version 1.0.5.17
+
+[*] fixed break event chain ME_CLIST_EXTRA_LIST_REBUILD & ME_CLIST_EXTRA_IMAGE_APPLY
+
+
+Version 1.0.5.16
+
+[+] add SecureIM handover on MetaContacts
+[+] Updater plugin support
+
+
+Version 1.0.5.15
+
+[+] MetaContacts removed from options list
+[+] add support for MetaContacts
+[*] any cosmetic fixes
+
+
+Version 1.0.5.14
+
+[+] option "Miranda Client Detection" - check or not client ICQ version (Miranda)
+[*] any cosmetic fixes
+
+
+Version 1.0.5.13
+
+[*] continue of x-status bugfixes
+
+
+Version 1.0.5.12
+
+[*] bug with show x-status icon on icq status bar clist_nicer++ fixed
+
+
+Version 1.0.5.11
+
+[*] plugin version info fixed
+[*] the key exchange timeout limited by 65535 seconds value
+[*] more fixes
+
+
+Version 1.0.5.10
+
+[+] build with msvcr71.dll
+[+] use crypto++ 5.2.3
+[*] more fixes
+
+
+Version 1.0.5.8
+
+[*] rewrite options dialog, work "Apply" button ;-)
+[*] offline key timeout only for send message
+[*] send encrypted offline message if enable flag "Secure Offline Message" and SecureIM status on contact is "Always Try"
+[+] support for IRC protocol
+
+
+Version 1.0.5.7
+
+[*] rewrite more code
+[*] the key exchange timeout limited by 9999 seconds value.
+[+] offline key timeout (2 day)
+
+
+Version 1.0.5.5
+
+[*] plugin check client ICQ version (Miranda,ICQ,QIP,&RQ,...)
+
+
+Version 1.0.5.4c
+
+[*] build in VS 6.0
+[*] miranda memory allocation
+
+
+Version 1.0.5.4
+
+[*] rewrite more code
+[*] the key exchange timeout limited by 999999999 ms value.
+
+
+Version 1.0.5.3b
+
+[*] fix message size detection
+
+
+Version 1.0.5.3
+
+[*] rewrite options dialog and any function
+[+] automatic detect maximum length of message
+[*] always send encrypted offline message if enable flag "Secure Offline Message" and SecureIM status on contact NOT "Disabled"
+
+
+Version 1.0.5.1a
+
+[*] "always try" work fine
+[-] remove indicator from NickName
+[+] base64 encode
+[*] rewite hexconverter
+[+] selective adv1 or adv2 icon
+[+] truecolor icons
+[+] feature "always show icons"
+
+
+Version 1.0.5.0a
+
+[+] unicode support (thanks Nightwish)
+[+] triggered menu (thanks Ghost)
+[-] remove SecureIM Protocols menu (thanks George Hazan)
+[*] change icons (thanks Faith Healer)
+[+] backward compatible (unicode only with new version SecureIM)
+[+] fix any small bags
+
+
+Version 1.0.4.6c
+
+[+] apply all __alex SEH
+
+
+Version 1.0.4.6
+
+[+] crypto++ 5.2
+[+] adv2 icon in CList
+[+] support tabSRMM icon
+[+] apply patches of __alex
+
diff --git a/secureim/SecureIM.dsp b/secureim/SecureIM.dsp new file mode 100644 index 0000000..651de83 --- /dev/null +++ b/secureim/SecureIM.dsp @@ -0,0 +1,299 @@ +# Microsoft Developer Studio Project File - Name="secureim" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=secureim - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "secureim.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "secureim.mak" CFG="secureim - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "secureim - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "secureim - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "secureim - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O1 /I "\source\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /Yu"commonheaders.h" /FD /c
+# SUBTRACT CPP /Fr
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "NDEBUG"
+# ADD RSC /l 0x419 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib msimg32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /base:"0x45000000" /dll /map /machine:I386
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "secureim - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "\source\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /Yu"commonheaders.h" /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "_DEBUG"
+# ADD RSC /l 0x419 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib msimg32.lib /nologo /base:"0x45000000" /dll /incremental:no /map /debug /machine:I386 /pdbtype:sept
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "secureim - Win32 Release"
+# Name "secureim - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\commonheaders.cpp
+# ADD CPP /Yc"commonheaders.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt_check.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt_dll.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt_icons.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt_lists.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt_metacontacts.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt_misc.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt_popups.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\dbevent.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\gettime.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\images.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\language.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\loadicons.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\loadlib.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\main.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\mmi.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\options.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\popupOptions.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\rtfconv.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\splitmsg.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_clist.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_menu.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_proto.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_rsa.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_srmm.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\commonheaders.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\crypt.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cryptopp.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dbevent.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\gettime.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\images.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\language.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\loadicons.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\loadlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\mmi.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\options.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\popupOptions.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\rtfconv.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\secureim.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\splitmsg.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_clist.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_menu.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_proto.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_rsa.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\svcs_srmm.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\version.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\resource.rc
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/secureim/SecureIM.dsw b/secureim/SecureIM.dsw new file mode 100644 index 0000000..bea8e73 --- /dev/null +++ b/secureim/SecureIM.dsw @@ -0,0 +1,41 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "secureim"=.\secureim.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "secureim_icons"=.\secureim_icons.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/secureim/SecureIM_9.sln b/secureim/SecureIM_9.sln new file mode 100644 index 0000000..e64e7fb --- /dev/null +++ b/secureim/SecureIM_9.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "secureim", "secureim_9.vcproj", "{4ADADECA-99D7-410D-8127-CB27210DCC6A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "secureim_icons", "secureim_icons_9.vcproj", "{3FAB6AC7-6B7F-4779-B519-34E8035074A4}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4ADADECA-99D7-410D-8127-CB27210DCC6A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4ADADECA-99D7-410D-8127-CB27210DCC6A}.Debug|Win32.Build.0 = Debug|Win32
+ {4ADADECA-99D7-410D-8127-CB27210DCC6A}.Release|Win32.ActiveCfg = Release|Win32
+ {4ADADECA-99D7-410D-8127-CB27210DCC6A}.Release|Win32.Build.0 = Release|Win32
+ {3FAB6AC7-6B7F-4779-B519-34E8035074A4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3FAB6AC7-6B7F-4779-B519-34E8035074A4}.Debug|Win32.Build.0 = Debug|Win32
+ {3FAB6AC7-6B7F-4779-B519-34E8035074A4}.Release|Win32.ActiveCfg = Release|Win32
+ {3FAB6AC7-6B7F-4779-B519-34E8035074A4}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/secureim/SecureIM_9.vcproj b/secureim/SecureIM_9.vcproj new file mode 100644 index 0000000..7aa5166 --- /dev/null +++ b/secureim/SecureIM_9.vcproj @@ -0,0 +1,496 @@ +<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="secureim"
+ ProjectGUID="{4ADADECA-99D7-410D-8127-CB27210DCC6A}"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\Debug9"
+ IntermediateDirectory=".\Debug9"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ ManagedExtensions="0"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="\source\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="1"
+ PrecompiledHeaderThrough="commonheaders.h"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="comctl32.lib msimg32.lib"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ GenerateMapFile="true"
+ MapExports="true"
+ SubSystem="2"
+ BaseAddress="0x45000000"
+ RandomizedBaseAddress="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\Release9"
+ IntermediateDirectory=".\Release9"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ ManagedExtensions="0"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ FavorSizeOrSpeed="2"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="\source\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ PrecompiledHeaderThrough="commonheaders.h"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="comctl32.lib msimg32.lib"
+ SuppressStartupBanner="true"
+ GenerateMapFile="true"
+ MapExports="true"
+ SubSystem="2"
+ BaseAddress="0x45000000"
+ RandomizedBaseAddress="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ <File
+ RelativePath="resource.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath=".\commonheaders.h"
+ >
+ </File>
+ <File
+ RelativePath=".\crypt.h"
+ >
+ </File>
+ <File
+ RelativePath=".\cryptopp.h"
+ >
+ </File>
+ <File
+ RelativePath=".\dbevent.h"
+ >
+ </File>
+ <File
+ RelativePath=".\gettime.h"
+ >
+ </File>
+ <File
+ RelativePath=".\images.h"
+ >
+ </File>
+ <File
+ RelativePath=".\language.h"
+ >
+ </File>
+ <File
+ RelativePath=".\loadicons.h"
+ >
+ </File>
+ <File
+ RelativePath=".\loadlib.h"
+ >
+ </File>
+ <File
+ RelativePath=".\mmi.h"
+ >
+ </File>
+ <File
+ RelativePath=".\options.h"
+ >
+ </File>
+ <File
+ RelativePath=".\popupOptions.h"
+ >
+ </File>
+ <File
+ RelativePath=".\resource.h"
+ >
+ </File>
+ <File
+ RelativePath=".\rtfconv.h"
+ >
+ </File>
+ <File
+ RelativePath=".\secureim.h"
+ >
+ </File>
+ <File
+ RelativePath=".\splitmsg.h"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_clist.h"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_menu.h"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_proto.h"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_rsa.h"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_srmm.h"
+ >
+ </File>
+ <File
+ RelativePath=".\version.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath=".\commonheaders.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\crypt_check.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\crypt_dll.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\crypt_icons.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\crypt_lists.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\crypt_metacontacts.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\crypt_misc.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\crypt_popups.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\dbevent.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\gettime.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\images.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\language.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\loadicons.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\loadlib.cpp"
+ >
+ </File>
+ <File
+ RelativePath="main.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions=""
+ BasicRuntimeChecks="3"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="mmi.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions=""
+ BasicRuntimeChecks="3"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="options.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions=""
+ BasicRuntimeChecks="3"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="popupOptions.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions=""
+ BasicRuntimeChecks="3"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="1"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\rtfconv.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\splitmsg.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_clist.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_menu.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_proto.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_rsa.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\svcs_srmm.cpp"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/secureim/SecureIM_icons.dsp b/secureim/SecureIM_icons.dsp new file mode 100644 index 0000000..4cbda13 --- /dev/null +++ b/secureim/SecureIM_icons.dsp @@ -0,0 +1,106 @@ +# Microsoft Developer Studio Project File - Name="secureim_icons" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=secureim_icons - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "secureim_icons.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "secureim_icons.mak" CFG="secureim_icons - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "secureim_icons - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "secureim_icons - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "secureim_icons - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_ICONS_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_ICONS_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "NDEBUG"
+# ADD RSC /l 0x419 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /noentry
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:IX86 /noentry
+
+!ELSEIF "$(CFG)" == "secureim_icons - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_ICONS_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_ICONS_EXPORTS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x419 /d "_DEBUG"
+# ADD RSC /l 0x419 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /noentry
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:IX86 /pdbtype:sept /noentry
+
+!ENDIF
+
+# Begin Target
+
+# Name "secureim_icons - Win32 Release"
+# Name "secureim_icons - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\resource_icons.rc
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/secureim/SecureIM_icons_9.vcproj b/secureim/SecureIM_icons_9.vcproj new file mode 100644 index 0000000..8eaaf7f --- /dev/null +++ b/secureim/SecureIM_icons_9.vcproj @@ -0,0 +1,191 @@ +<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="secureim_icons"
+ ProjectGUID="{3FAB6AC7-6B7F-4779-B519-34E8035074A4}"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\Debug9"
+ IntermediateDirectory=".\Debug9"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies=""
+ SuppressStartupBanner="true"
+ GenerateDebugInformation="true"
+ GenerateMapFile="true"
+ ResourceOnlyDLL="true"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\Release9"
+ IntermediateDirectory=".\Release9"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1049"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OptimizeForWindows98="0"
+ ResourceOnlyDLL="true"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ <File
+ RelativePath=".\resource_icons.rc"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/secureim/commonheaders.cpp b/secureim/commonheaders.cpp new file mode 100644 index 0000000..aa6c454 --- /dev/null +++ b/secureim/commonheaders.cpp @@ -0,0 +1,273 @@ +#include "commonheaders.h"
+
+HINSTANCE g_hInst, g_hIconInst;
+PLUGINLINK *pluginLink;
+MM_INTERFACE mmi = {0};
+MUUID interfaces[] = {MIID_SECUREIM, MIID_LAST};
+
+LPCSTR szModuleName = MODULENAME;
+LPCSTR szVersionStr = MODULENAME" DLL ("__VERSION_STRING")";
+char TEMP[MAX_PATH];
+int TEMP_SIZE = 0;
+
+HANDLE g_hEvent[2], g_hMenu[15], g_hCLIcon=0, g_hFolders=0;
+HANDLE *g_hService=NULL;
+HANDLE *g_hHook=NULL;
+int iService=0;
+int iHook=0;
+
+HICON g_hICO[ICO_CNT], g_hPOP[POP_CNT], g_hIEC[1+IEC_CNT*MODE_CNT] = {0};
+IconExtraColumn g_IEC[1+IEC_CNT*MODE_CNT];
+
+int iBmpDepth;
+BOOL bCoreUnicode = false, bMetaContacts = false, bPopupExists = false, bPopupUnicode = false;
+BOOL bPGPloaded = false, bPGPkeyrings = false, bUseKeyrings = false, bPGPprivkey = false;
+BOOL bGPGloaded = false, bGPGkeyrings = false, bSavePass = false;
+BOOL bSFT, bSOM, bASI, bMCD, bSCM, bDGP, bAIP, bNOL, bAAK, bMCM;
+BYTE bADV, bPGP, bGPG;
+DWORD iCoreVersion = 0;
+CRITICAL_SECTION localQueueMutex;
+
+PLUGININFO pluginInfo = {
+ sizeof(PLUGININFO),
+ MODULENAME" (2in1)",
+ __VERSION_DWORD,
+ MODULENAME" plugin for Miranda IM ("__DATE__")",
+ "Johell, Ghost, Nightwish, __alex, Baloo",
+ "Johell@ifrance.com, baloo@bk.ru",
+ "© 2003 Johell, © 2005-09 Baloo",
+ "http://addons.miranda-im.org/details.php?action=viewfile&id=2445",
+ 0, 0
+};
+
+
+PLUGININFOEX pluginInfoEx = {
+ sizeof(PLUGININFOEX),
+ MODULENAME" (2in1)",
+ __VERSION_DWORD,
+ MODULENAME" plugin for Miranda IM ("__DATE__")",
+ "Johell, Ghost, Nightwish, __alex, Baloo",
+ "Johell@ifrance.com, baloo@bk.ru",
+ "© 2003 Johell, © 2005-09 Baloo",
+ "http://addons.miranda-im.org/details.php?action=viewfile&id=2445",
+ 0, 0,
+ MIID_SECUREIM
+};
+
+
+LPSTR myDBGetString(HANDLE hContact,const char *szModule,const char *szSetting) {
+ char *val=NULL;
+ DBVARIANT dbv;
+ dbv.type = DBVT_ASCIIZ;
+ DBGetContactSetting(hContact,szModule,szSetting,&dbv);
+ if( dbv.pszVal && (dbv.type==DBVT_ASCIIZ || dbv.type==DBVT_UTF8 || dbv.type==DBVT_WCHAR) )
+ val = mir_strdup(dbv.pszVal);
+ DBFreeVariant(&dbv);
+ return val;
+}
+
+
+LPSTR myDBGetStringDecode(HANDLE hContact,const char *szModule,const char *szSetting) {
+ char *val = myDBGetString(hContact,szModule,szSetting);
+ if(!val) return NULL;
+ int len = strlen(val)+64;
+ char *buf = (LPSTR)mir_alloc(len);
+ strncpy(buf,val,len); mir_free(val);
+ CallService(MS_DB_CRYPT_DECODESTRING,(WPARAM)len,(LPARAM)buf);
+ return buf;
+}
+
+
+int myDBWriteStringEncode(HANDLE hContact,const char *szModule,const char *szSetting,const char *val) {
+ int len = strlen(val)+64;
+ char *buf = (LPSTR)alloca(len);
+ strncpy(buf,val,len);
+ CallService(MS_DB_CRYPT_ENCODESTRING,(WPARAM)len,(LPARAM)buf);
+ int ret = DBWriteContactSettingString(hContact,szModule,szSetting,buf);
+ return ret;
+}
+
+/*
+int DBWriteString(HANDLE hContact,const char *szModule,const char *szSetting,const char *val) {
+ return DBWriteContactSettingString(hContact,szModule,szSetting,val);
+}
+
+
+int DBGetByte(HANDLE hContact,const char *szModule,const char *szSetting,int errorValue) {
+ return DBGetContactSettingByte(hContact,szModule,szSetting,errorValue);
+}
+
+
+int DBWriteByte(HANDLE hContact,const char *szModule,const char *szSetting,BYTE val) {
+ return DBWriteContactSettingByte(hContact,szModule,szSetting,val);
+}
+
+
+int DBGetWord(HANDLE hContact,const char *szModule,const char *szSetting,int errorValue) {
+ return DBGetContactSettingWord(hContact,szModule,szSetting,errorValue);
+}
+
+
+int DBWriteWord(HANDLE hContact,const char *szModule,const char *szSetting,WORD val) {
+ return DBWriteContactSettingWord(hContact,szModule,szSetting,val);
+}
+*/
+
+void GetFlags() {
+ bSFT = DBGetContactSettingByte(0,szModuleName,"sft",0);
+ bSOM = DBGetContactSettingByte(0,szModuleName,"som",0);
+ bASI = DBGetContactSettingByte(0,szModuleName,"asi",0);
+ bMCD = DBGetContactSettingByte(0,szModuleName,"mcd",0);
+ bSCM = DBGetContactSettingByte(0,szModuleName,"scm",0);
+ bDGP = DBGetContactSettingByte(0,szModuleName,"dgp",0);
+ bAIP = DBGetContactSettingByte(0,szModuleName,"aip",0);
+ bADV = DBGetContactSettingByte(0,szModuleName,"adv",0);
+ bNOL = DBGetContactSettingByte(0,szModuleName,"nol",0);
+ bAAK = DBGetContactSettingByte(0,szModuleName,"aak",0);
+ bMCM = DBGetContactSettingByte(0,szModuleName,"mcm",0);
+}
+
+
+void SetFlags() {
+ DBWriteContactSettingByte(0,szModuleName,"sft",bSFT);
+ DBWriteContactSettingByte(0,szModuleName,"som",bSOM);
+ DBWriteContactSettingByte(0,szModuleName,"asi",bASI);
+ DBWriteContactSettingByte(0,szModuleName,"mcd",bMCD);
+ DBWriteContactSettingByte(0,szModuleName,"scm",bSCM);
+ DBWriteContactSettingByte(0,szModuleName,"dgp",bDGP);
+ DBWriteContactSettingByte(0,szModuleName,"aip",bAIP);
+ DBWriteContactSettingByte(0,szModuleName,"adv",bADV);
+ DBWriteContactSettingByte(0,szModuleName,"nol",bNOL);
+ DBWriteContactSettingByte(0,szModuleName,"aak",bAAK);
+ DBWriteContactSettingByte(0,szModuleName,"mcm",bMCM);
+}
+
+
+/*-----------------------------------------------------*/
+/*
+LPSTR u2a( LPCWSTR src )
+{
+ int codepage = ServiceExists(MS_LANGPACK_GETCODEPAGE)?CallService( MS_LANGPACK_GETCODEPAGE, 0, 0 ):CP_ACP;
+
+ int cbLen = WideCharToMultiByte( codepage, 0, src, -1, NULL, 0, NULL, NULL );
+ LPSTR result = (LPSTR) mir_alloc( cbLen+1 );
+ if ( result == NULL )
+ return NULL;
+
+ WideCharToMultiByte( codepage, 0, src, -1, result, cbLen, NULL, NULL );
+ result[ cbLen ] = 0;
+ return result;
+}
+
+LPWSTR a2u( LPCSTR src )
+{
+ int codepage = ServiceExists(MS_LANGPACK_GETCODEPAGE)?CallService( MS_LANGPACK_GETCODEPAGE, 0, 0 ):CP_ACP;
+
+ int cbLen = MultiByteToWideChar( codepage, 0, src, -1, NULL, 0 );
+
+ LPWSTR result = (LPWSTR) mir_alloc( sizeof(WCHAR)*(cbLen+1));
+ if ( result == NULL )
+ return NULL;
+
+ MultiByteToWideChar( codepage, 0, src, -1, result, cbLen );
+ result[ cbLen ] = 0;
+
+ return result;
+}
+*/
+struct A2U {
+ LPSTR a;
+ LPSTR u;
+};
+typedef A2U* pA2U;
+
+pA2U pa2u;
+int ca2u=0;
+
+LPSTR TranslateU( LPCSTR lpText ) {
+ int i;
+ for(i=0;i<ca2u;i++) {
+ if( pa2u[i].a == lpText ) {
+ return pa2u[i].u;
+ }
+ }
+ ca2u++;
+ pa2u = (pA2U) mir_realloc(pa2u,sizeof(A2U)*ca2u);
+ pa2u[i].a = (LPSTR) lpText;
+ if( bCoreUnicode ) {
+ LPWSTR lpwText = mir_a2u(lpText);
+ LPWSTR lpwTran = TranslateW(lpwText);
+ mir_free(lpwText);
+ pa2u[i].u = mir_strdup(exp->utf8encode(lpwTran));
+ }
+ else {
+ LPSTR lpTran = Translate(lpText);
+ LPWSTR lpwTran = mir_a2u(lpTran);
+ lpTran = exp->utf8encode(lpwTran);
+ mir_free(lpwTran);
+ pa2u[i].u = mir_strdup(lpTran);
+ }
+ return pa2u[i].u;
+}
+
+int msgbox( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) {
+ if( bCoreUnicode ) {
+ LPWSTR lpwText = mir_a2u(lpText);
+ LPWSTR lpwCaption = mir_a2u(lpCaption);
+ int r = MessageBoxW(hWnd,TranslateW(lpwText),TranslateW(lpwCaption),uType);
+ mir_free(lpwCaption);
+ mir_free(lpwText);
+ return r;
+ }
+ return MessageBoxA(hWnd,Translate(lpText),Translate(lpCaption),uType);
+}
+
+void CopyToClipboard(HWND hwnd,LPSTR msg)
+{
+ HGLOBAL hglbCopy;
+ LPSTR lpstrCopy;
+
+ hglbCopy = GlobalAlloc(GMEM_MOVEABLE, lstrlenA(msg)+1);
+ lpstrCopy = (LPSTR)GlobalLock(hglbCopy);
+ lstrcpyA(lpstrCopy, msg);
+ GlobalUnlock(hglbCopy);
+
+ OpenClipboard(NULL);
+ EmptyClipboard();
+ SetClipboardData(CF_TEXT, hglbCopy);
+ CloseClipboard();
+}
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+HANDLE hNetlibUser;
+
+void InitNetlib() {
+ NETLIBUSER nl_user;
+ memset(&nl_user,0,sizeof(nl_user));
+ nl_user.cbSize = sizeof(nl_user);
+ nl_user.szSettingsModule = (LPSTR)szModuleName;
+ nl_user.szDescriptiveName = (LPSTR)szModuleName;
+ nl_user.flags = NUF_NOOPTIONS;
+
+ hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nl_user);
+}
+
+void DeinitNetlib() {
+ if(hNetlibUser)
+ CallService(MS_NETLIB_CLOSEHANDLE, (WPARAM)hNetlibUser, 0);
+}
+
+int Sent_NetLog(const char *fmt,...)
+{
+ va_list va;
+ char szText[1024];
+
+ va_start(va,fmt);
+ mir_vsnprintf(szText,sizeof(szText),fmt,va);
+ va_end(va);
+ return CallService(MS_NETLIB_LOG,(WPARAM)hNetlibUser,(LPARAM)szText);
+}
+#endif
+
+
+// EOF
diff --git a/secureim/commonheaders.h b/secureim/commonheaders.h new file mode 100644 index 0000000..b7576ac --- /dev/null +++ b/secureim/commonheaders.h @@ -0,0 +1,210 @@ +// Windows API
+
+#define WIN32_LEAN_AND_MEAN
+#define NETLIB_LOG
+
+#ifdef _MSC_VER
+#pragma once
+#define _CRT_SECURE_NO_WARNINGS
+// _MSC_VER: 1200=6.0 1300=7.0(2003) 1400=8.0(2005) 1500=9.0(2008)
+#if _MSC_VER >= 1300
+// MSVC 7.0 and above
+#define mir_itoa _itoa
+#define mir_unlink _unlink
+#else
+// MSVC 6.0 and below
+#ifndef _DEBUG
+#pragma optimize("gsy", on)
+#endif
+#endif
+#endif
+
+#ifndef mir_itoa
+#define mir_itoa itoa
+#endif
+
+#ifndef mir_unlink
+#define mir_unlink unlink
+#endif
+
+#ifndef WINVER
+#define WINVER 0x0501
+#endif
+
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0501
+#endif
+
+#ifndef _WIN32_IE
+#define _WIN32_IE 0x0501
+#endif
+
+#ifndef M_SIM_COMMONHEADERS_H
+#define M_SIM_COMMONHEADERS_H
+
+#define MIRANDA_VER 0x0700
+#include <m_stdhdr.h>
+
+// Windows API
+#include <windows.h>
+#include <wingdi.h>
+#include <winsock2.h>
+#include <commdlg.h>
+#include <commctrl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <io.h>
+#include <shlwapi.h>
+#include <process.h>
+#include <time.h>
+
+#define MODULENAME "SecureIM"
+
+#ifndef ListView_SetCheckState
+#define ListView_SetCheckState(hwndLV, i, fCheck) \
+ ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK)
+#endif
+
+#ifndef SIZEOF
+#define SIZEOF(X) (sizeof(X)/sizeof(X[0]))
+#endif
+
+#ifndef M_API_H__
+#define M_API_H__
+
+// Miranda API
+#include "newpluginapi.h"
+#include "m_stdhdr.h"
+#include "m_plugins.h"
+#include "m_system.h"
+#include "m_database.h"
+#include "m_protomod.h"
+#include "m_protosvc.h"
+#include "m_langpack.h"
+#include "m_options.h"
+#include "m_clist.h"
+#include "m_clc.h"
+#include "m_clui.h"
+#include "m_cluiframes.h"
+#include "m_utils.h"
+#include "m_skin.h"
+#include "m_popup.h"
+#include "m_genmenu.h"
+#include "m_icolib.h"
+#include "m_message.h"
+#include "m_netlib.h"
+#include "sdk\m_metacontacts.h"
+#include "sdk\m_updater.h"
+#include "sdk\m_extraicons.h"
+#include "sdk\m_folders.h"
+
+#endif
+
+// my libs
+#include "secureim.h"
+#include "version.h"
+#include "resource.h"
+#include "language.h"
+#include "loadlib.h"
+#include "mmi.h"
+#include "crypt.h"
+#include "gettime.h"
+#include "language.h"
+#include "options.h"
+#include "popupoptions.h"
+#include "loadicons.h"
+#include "rtfconv.h"
+#include "cryptopp.h"
+#include "images.h"
+#include "dbevent.h"
+#include "splitmsg.h"
+#include "svcs_proto.h"
+#include "svcs_clist.h"
+#include "svcs_menu.h"
+#include "svcs_srmm.h"
+#include "svcs_rsa.h"
+
+extern LPCSTR szModuleName;
+extern LPCSTR szVersionStr;
+extern char TEMP[MAX_PATH];
+extern int TEMP_SIZE;
+
+// shared vars
+extern HINSTANCE g_hInst, g_hIconInst;
+extern PLUGINLINK *pluginLink;
+extern PLUGININFO pluginInfo;
+extern PLUGININFOEX pluginInfoEx;
+extern MM_INTERFACE mmi;
+extern MUUID interfaces[];
+
+#define MIID_SECUREIM {0x1B2A39E5, 0xE2F6, 0x494D, { 0x95, 0x8D, 0x18, 0x08, 0xFD, 0x11, 0x0D, 0xD5 }} //1B2A39E5-E2F6-494D-958D-1808FD110DD5
+
+#define PREF_METANODB 0x2000 //!< Flag to indicate message should not be added to db by filter when sending
+#define PREF_SIMNOMETA 0x4000 //!< Flag to indicate message should not be inspected by filter on metacontact
+
+#define DLLEXPORT __declspec(dllexport)
+
+extern "C" {
+
+ DLLEXPORT int Load(PLUGINLINK *);
+ DLLEXPORT PLUGININFO *MirandaPluginInfo(DWORD);
+ DLLEXPORT PLUGININFOEX *MirandaPluginInfoEx(DWORD);
+ DLLEXPORT MUUID* MirandaPluginInterfaces(void);
+ DLLEXPORT int Unload();
+
+}
+
+extern HANDLE g_hEvent[2], g_hMenu[15], g_hCLIcon, g_hFolders;
+extern HANDLE *g_hService;
+extern HANDLE *g_hHook;
+extern int iService, iHook;
+extern HICON g_hICO[ICO_CNT], g_hIEC[1+IEC_CNT*MODE_CNT], g_hPOP[POP_CNT];
+extern IconExtraColumn g_IEC[1+IEC_CNT*MODE_CNT];
+extern int iBmpDepth;
+extern BOOL bCoreUnicode, bMetaContacts, bPopupExists, bPopupUnicode;
+extern BOOL bPGPloaded, bPGPkeyrings, bUseKeyrings, bPGPprivkey;
+extern BOOL bGPGloaded, bGPGkeyrings, bSavePass;
+extern BOOL bSFT, bSOM, bASI, bMCD, bSCM, bDGP, bAIP, bNOL, bAAK, bMCM;
+extern BYTE bADV, bPGP, bGPG;
+extern DWORD iCoreVersion;
+extern CRITICAL_SECTION localQueueMutex;
+
+int onModulesLoaded(WPARAM,LPARAM);
+int onSystemOKToExit(WPARAM,LPARAM);
+
+void AddServiceFunction(LPCSTR,MIRANDASERVICE);
+void AddProtoServiceFunction(LPCSTR,MIRANDASERVICE);
+void AddHookFunction(LPCSTR,MIRANDAHOOK);
+
+LPSTR myDBGetString(HANDLE,const char *,const char *);
+LPSTR myDBGetStringDecode(HANDLE,const char *,const char *);
+int myDBWriteStringEncode(HANDLE,const char *,const char *,const char *);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+extern HANDLE hNetlibUser;
+void InitNetlib();
+void DeinitNetlib();
+int Sent_NetLog(const char *,...);
+#endif
+/*
+int DBWriteString(HANDLE,const char *,const char *,const char *);
+int DBGetByte(HANDLE,const char *,const char *,int);
+int DBWriteByte(HANDLE,const char *,const char *,BYTE);
+int DBGetWord(HANDLE,const char *,const char *,int);
+int DBWriteWord(HANDLE,const char *,const char *,WORD);
+*/
+void GetFlags();
+void SetFlags();
+/*
+LPSTR u2a( LPCWSTR src );
+LPWSTR a2u( LPCSTR src );
+*/
+LPSTR TranslateU( LPCSTR lpText );
+int msgbox( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType );
+void CopyToClipboard(HWND hwnd,LPSTR msg);
+#define msgbox0(a,b,c,d) msgbox(a,b,c,d)
+#define msgbox1(a,b,c,d) msgbox(a,b,c,d)
+
+#endif
+
+// EOF
diff --git a/secureim/crypt.h b/secureim/crypt.h new file mode 100644 index 0000000..e626570 --- /dev/null +++ b/secureim/crypt.h @@ -0,0 +1,183 @@ +#ifndef __CRYPT_H__
+#define __CRYPT_H__
+
+#include "secureim.h"
+#include "cryptopp.h"
+#include "gettime.h"
+
+#define KEYSIZE 256
+#define NAMSIZE 512
+#define DEFMSGS 4096
+
+#define KEY_A_SIG 0x000000
+#define KEY_B_SIG 0x010000
+
+// struct to store all supported protocols
+struct SupPro {
+ LPSTR name;
+ BOOL inspecting;
+ int split_on,tsplit_on;
+ int split_off,tsplit_off;
+};
+typedef SupPro *pSupPro;
+
+// struct to store wainting messages
+struct waitingMessage {
+ LPSTR Message;
+ WPARAM wParam;
+ waitingMessage *nextMessage;
+};
+typedef waitingMessage* pWM;
+
+struct partitionMessage {
+ int id;
+ LPSTR *message; // array of message parts
+ partitionMessage *nextMessage;
+};
+typedef partitionMessage* pPM;
+
+#define HEADER 0xABCD1234
+#define FOOTER 0x9876FEDC
+#define EMPTYH 0xF1E2D3C4
+
+// memory struct for keys
+struct UinKey {
+ u_int header; // HEADER
+ HANDLE hContact; // handle of contact
+ pSupPro proto; // proto struct
+ BYTE mode,tmode; // mode: Native,PGP,GPG,RSA/AES,RSA [0..4]
+ BYTE status,tstatus; // status: Disabled,Enabled,AlwaysTry [0..2] for Native mode
+ LPSTR msgSplitted; // message to combine
+ pPM msgPart; // parts of message
+ pWM msgQueue; // last messages not sended or to resend;
+ BOOL sendQueue; // идет отсылка очереди - не обрабатываются сообщения
+ BOOL offlineKey;
+ char waitForExchange; // 0 - сбросить очередь
+ // 1 - ожидаем
+ // 2 - дослать с шифрованием
+ // 3 - дослать без шифрования с вопросом
+ BOOL decoded; // false on decode error
+ short features;
+ HANDLE cntx; // crypto context
+ BYTE keyLoaded; // ( 1-PGP, 2-GPG ) | 1-RSA
+ BYTE gpgMode,tgpgMode; // 0-UTF8, 1-ANSI
+ char *lastFileRecv;
+ char *lastFileSend;
+ char **fileSend;
+ BOOL finFileRecv;
+ BOOL finFileSend;
+ LPSTR tmp; // tmp text string
+ u_int footer; // FOOTER
+};
+typedef UinKey* pUinKey;
+
+struct TFakeAckParams {
+ inline TFakeAckParams( HANDLE p1, HANDLE p2, LONG p3, LPCSTR p4 ) :
+ hEvent( p1 ),
+ hContact( p2 ),
+ id( p3 ),
+ msg( p4 )
+ {}
+
+ HANDLE hEvent;
+ HANDLE hContact;
+ LONG id;
+ LPCSTR msg;
+};
+
+struct TWaitForExchange {
+ inline TWaitForExchange( HANDLE p1, HANDLE p2 ) :
+ hEvent( p1 ),
+ hContact( p2 )
+ {}
+
+ HANDLE hEvent;
+ HANDLE hContact;
+};
+
+extern char szUIN[NAMSIZE];
+extern char szName[NAMSIZE];
+extern pSupPro proto;
+extern pUinKey clist;
+extern int proto_cnt;
+extern int clist_cnt;
+
+// crypt_lists.cpp
+void loadContactList();
+void freeContactList();
+pUinKey addContact(HANDLE);
+void delContact(HANDLE);
+pSupPro getSupPro(HANDLE);
+pUinKey getUinKey(HANDLE);
+pUinKey getUinCtx(HANDLE);
+void addMsg2Queue(pUinKey,WPARAM,LPSTR);
+
+void getContactName(HANDLE hContact, LPSTR szName);
+void getContactNameA(HANDLE hContact, LPSTR szName);
+void getContactUin(HANDLE hContact, LPSTR szUIN);
+void getContactUinA(HANDLE hContact, LPSTR szUIN);
+
+// crypt_check.cpp
+int getContactStatus(HANDLE);
+
+BOOL isSecureProtocol(HANDLE);
+BYTE isContactSecured(HANDLE);
+BOOL isClientMiranda(pUinKey ptr, BOOL emptyMirverAsMiranda=FALSE);
+BOOL isClientMiranda(HANDLE hContact, BOOL emptyMirverAsMiranda=FALSE);
+BOOL isProtoSmallPackets(HANDLE);
+BOOL isContactInvisible(HANDLE);
+BOOL isNotOnList(HANDLE);
+BOOL isContactNewPG(HANDLE);
+BOOL isContactPGP(HANDLE);
+BOOL isContactGPG(HANDLE);
+BOOL isContactRSAAES(HANDLE);
+BOOL isContactRSA(HANDLE);
+BOOL isChatRoom(HANDLE);
+BOOL isFileExist(LPCSTR);
+BOOL isSecureIM(pUinKey ptr, BOOL emptyMirverAsSecureIM=FALSE);
+BOOL isSecureIM(HANDLE hContact, BOOL emptyMirverAsSecureIM=FALSE);
+
+// crypt_icons.cpp
+HICON mode2icon(int,int);
+HICON mode2icon2(int,int); // создает КОПИЮ иконки, которую надо разрушить
+IconExtraColumn mode2iec(int);
+void RefreshContactListIcons(void);
+void ShowStatusIcon(HANDLE,UINT);
+void ShowStatusIcon(HANDLE);
+void ShowStatusIconNotify(HANDLE);
+
+// crypt_popups.cpp
+//static int CALLBACK PopupDlgProc(HWND,UINT,WPARAM,LPARAM);
+void showPopUp(LPCSTR,HANDLE,HICON,UINT);
+void showPopUpEC(HANDLE);
+void showPopUpDCmsg(HANDLE,LPCSTR);
+void showPopUpDC(HANDLE);
+void showPopUpKS(HANDLE);
+void showPopUpKRmsg(HANDLE,LPCSTR);
+void showPopUpKR(HANDLE);
+void showPopUpSM(HANDLE);
+void showPopUpRM(HANDLE);
+
+// crypt_meta.cpp
+BOOL isProtoMetaContacts(HANDLE);
+BOOL isDefaultSubContact(HANDLE);
+HANDLE getMetaContact(HANDLE);
+HANDLE getMostOnline(HANDLE);
+void DeinitMetaContact(HANDLE);
+
+// crypt_dll.cpp
+LPSTR InitKeyA(pUinKey,int);
+int InitKeyB(pUinKey,LPCSTR);
+void InitKeyX(pUinKey,BYTE*);
+BOOL CalculateKeyX(pUinKey,HANDLE);
+LPSTR encodeMsg(pUinKey,LPARAM);
+LPSTR decodeMsg(pUinKey,LPARAM,LPSTR);
+BOOL LoadKeyPGP(pUinKey);
+BOOL LoadKeyGPG(pUinKey);
+
+// crypt_misc.cpp
+unsigned __stdcall sttFakeAck(LPVOID);
+unsigned __stdcall sttWaitForExchange(LPVOID);
+void waitForExchange(pUinKey ptr, int flag = 1);
+
+#endif
diff --git a/secureim/crypt_check.cpp b/secureim/crypt_check.cpp new file mode 100644 index 0000000..a8e3ba5 --- /dev/null +++ b/secureim/crypt_check.cpp @@ -0,0 +1,267 @@ +#include "commonheaders.h"
+
+
+int getContactStatus(HANDLE hContact) {
+
+ pSupPro ptr = getSupPro(hContact);
+ if (ptr)
+ return DBGetContactSettingWord(hContact, ptr->name, "Status", ID_STATUS_OFFLINE);
+
+ return -1;
+}
+
+
+BOOL isSecureProtocol(HANDLE hContact) {
+
+ pSupPro ptr = getSupPro(hContact);
+ if(!ptr) return false;
+
+ return ptr->inspecting;
+}
+
+
+BYTE isContactSecured(HANDLE hContact) {
+ // нужна проверка на Offline и в этом случае другие статусы
+ if (!clist_cnt) return 0;
+
+ BYTE r=0;
+ if( isProtoMetaContacts(hContact) )
+ hContact = getMostOnline(hContact); // возьмем тот, через который пойдет сообщение
+
+ for(int j=0;j<clist_cnt;j++) {
+ if( clist[j].hContact == hContact ) {
+ if( !clist[j].proto->inspecting ) break;
+ DBVARIANT dbv;
+ r=clist[j].mode;
+ switch(r) {
+ case MODE_NATIVE:
+ if(cpp_keyx(clist[j].cntx)!=0) r|=SECURED;
+ break;
+ case MODE_PGP:
+ DBGetContactSetting(hContact,szModuleName,"pgp",&dbv);
+ if( dbv.type!=0 ) r|=SECURED;
+ DBFreeVariant(&dbv);
+ break;
+ case MODE_GPG:
+ DBGetContactSetting(hContact,szModuleName,"gpg",&dbv);
+ if( dbv.type!=0 ) r|=SECURED;
+ DBFreeVariant(&dbv);
+ break;
+ case MODE_RSAAES:
+ if(exp->rsa_get_state(clist[j].cntx)==7) r|=SECURED;
+ break;
+ case MODE_RSA:
+ if(clist[j].cntx) r|=SECURED;
+ break;
+ }
+ break;
+ }
+ }
+ return r; // (mode&SECURED) - проверка на EST/DIS
+}
+
+
+BOOL isClientMiranda(pUinKey ptr, BOOL emptyMirverAsMiranda) {
+
+ if( !bMCD ) return true;
+ if( !ptr->proto->inspecting ) return false;
+
+ BOOL isMiranda = true;
+ LPSTR mirver = myDBGetString(ptr->hContact,ptr->proto->name,"MirVer");
+ if( mirver ) {
+ isMiranda = (emptyMirverAsMiranda && !*mirver) || (strstr(mirver,"Miranda")!=NULL);
+ mir_free(mirver);
+ }
+ return isMiranda;
+}
+
+
+BOOL isClientMiranda(HANDLE hContact, BOOL emptyMirverAsMiranda) {
+
+ if( !bMCD ) return true;
+ if( !clist_cnt ) return false;
+
+ for(int j=0;j<clist_cnt;j++) {
+ if( clist[j].hContact == hContact ) {
+ return isClientMiranda(&clist[j],emptyMirverAsMiranda);
+ }
+ }
+ return false;
+}
+
+
+BOOL isProtoSmallPackets(HANDLE hContact) {
+
+ if (!clist_cnt) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if( clist[j].hContact == hContact ) {
+ if( !clist[j].proto->inspecting ) break;
+ return strstr(clist[j].proto->name,"IRC")!=NULL ||
+ strstr(clist[j].proto->name,"WinPopup")!=NULL ||
+ strstr(clist[j].proto->name,"VyChat")!=NULL;
+ }
+ }
+ return false;
+}
+
+
+BOOL isContactInvisible(HANDLE hContact) {
+
+ if( !DBGetContactSettingByte(hContact,"CList","Hidden",0) ) {
+ if( !clist_cnt ) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if( clist[j].hContact == hContact ) {
+ if( !clist[j].proto->inspecting ) return false;
+ if( clist[j].waitForExchange ) return false;
+ switch( (int)DBGetContactSettingWord(hContact,clist[j].proto->name,"ApparentMode",0) ) {
+ case 0:
+ return (CallProtoService(clist[j].proto->name,PS_GETSTATUS,0,0)==ID_STATUS_INVISIBLE);
+ case ID_STATUS_ONLINE:
+ return false;
+ case ID_STATUS_OFFLINE:
+ return true;
+ } //switch
+ break;
+ }
+ }// for
+ }
+ return true;
+}
+
+
+BOOL isNotOnList(HANDLE hContact) {
+ return DBGetContactSettingByte(hContact, "CList", "NotOnList", 0);
+}
+
+
+BOOL isContactNewPG(HANDLE hContact) {
+
+ if (!clist_cnt) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if (clist[j].hContact == hContact) {
+ if( !clist[j].proto->inspecting ) break;
+ if( !clist[j].cntx ) break;
+ return (clist[j].features & CPP_FEATURES_NEWPG) != 0;
+ }
+ }
+ return false;
+}
+
+
+BOOL isContactPGP(HANDLE hContact) {
+
+ if(!bPGPloaded || (!bPGPkeyrings && !bPGPprivkey)) return false;
+ if (!clist_cnt) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if (clist[j].hContact == hContact) {
+ if( !clist[j].proto->inspecting ) break;
+ if( clist[j].mode!=MODE_PGP ) break;
+ DBVARIANT dbv;
+ DBGetContactSetting(hContact,szModuleName,"pgp",&dbv);
+ BOOL r=(dbv.type!=0);
+ DBFreeVariant(&dbv);
+ return r;
+ }
+ }
+ return false;
+}
+
+
+BOOL isContactGPG(HANDLE hContact) {
+
+ if(!bGPGloaded || !bGPGkeyrings) return false;
+ if (!clist_cnt) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if (clist[j].hContact == hContact) {
+ if( !clist[j].proto->inspecting ) break;
+ if( clist[j].mode!=MODE_GPG ) break;
+ DBVARIANT dbv;
+ DBGetContactSetting(hContact,szModuleName,"gpg",&dbv);
+ BOOL r=(dbv.type!=0);
+ DBFreeVariant(&dbv);
+ return r;
+ }
+ }
+ return false;
+}
+
+
+BOOL isContactRSAAES(HANDLE hContact) {
+
+ if (!clist_cnt) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if (clist[j].hContact == hContact) {
+ if( !clist[j].proto->inspecting ) break;
+ if( clist[j].mode!=MODE_RSAAES ) break;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+BOOL isContactRSA(HANDLE hContact) {
+
+ if (!clist_cnt) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if (clist[j].hContact == hContact) {
+ if( !clist[j].proto->inspecting ) break;
+ if( clist[j].mode!=MODE_RSA ) break;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+BOOL isChatRoom(HANDLE hContact) {
+
+ if (!clist_cnt) return false;
+ for(int j=0;j<clist_cnt;j++) {
+ if( clist[j].hContact == hContact ) {
+ if( !clist[j].proto->inspecting ) break;
+ return (DBGetContactSettingByte(hContact,clist[j].proto->name,"ChatRoom",0)!=0);
+ }
+ }
+ return false;
+}
+
+
+BOOL isFileExist(LPCSTR filename) {
+ return (GetFileAttributes(filename)!=(UINT)-1);
+}
+
+
+BOOL isSecureIM(pUinKey ptr, BOOL emptyMirverAsSecureIM) {
+
+ if( !bAIP ) return false;
+ if( !ptr->proto->inspecting ) return false;
+
+ BOOL isSecureIM = false;
+ if( bNOL && DBGetContactSettingByte(ptr->hContact,"CList","NotOnList",0) ) {
+ return false;
+ }
+ LPSTR mirver = myDBGetString(ptr->hContact,ptr->proto->name,"MirVer");
+ if( mirver ) {
+ isSecureIM = (emptyMirverAsSecureIM && !*mirver) || (strstr(mirver,"SecureIM")!=NULL) || (strstr(mirver,"secureim")!=NULL);
+ mir_free(mirver);
+ }
+ return isSecureIM;
+}
+
+
+BOOL isSecureIM(HANDLE hContact, BOOL emptyMirverAsSecureIM) {
+
+ if( !bAIP ) return false;
+ if( !clist_cnt ) return false;
+
+ for(int j=0;j<clist_cnt;j++) {
+ if (clist[j].hContact == hContact) {
+ return isSecureIM(&clist[j],emptyMirverAsSecureIM);
+ }
+ }
+ return false;
+}
+
+
+// EOF
diff --git a/secureim/crypt_dll.cpp b/secureim/crypt_dll.cpp new file mode 100644 index 0000000..713374e --- /dev/null +++ b/secureim/crypt_dll.cpp @@ -0,0 +1,236 @@ +#include "commonheaders.h"
+
+
+// generate KeyA pair and return public key
+LPSTR InitKeyA(pUinKey ptr,int features) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("InitKeyA: %04x", features);
+#endif
+ if( !ptr->cntx )
+ ptr->cntx = cpp_create_context(isProtoSmallPackets(ptr->hContact)?CPP_MODE_BASE64:0);
+
+ char *tmp = myDBGetString(ptr->hContact,szModuleName,"PSK");
+ if(tmp) {
+ cpp_init_keyp(ptr->cntx,tmp); // make pre-shared key from password
+ mir_free(tmp);
+ }
+
+ LPSTR pub_text = cpp_init_keya(ptr->cntx,features); // calculate public and private key & fill KeyA
+
+ LPSTR keysig;
+ if(features&CPP_FEATURES_NEWPG) {
+ if(features&KEY_B_SIG)
+ keysig = (LPSTR)SIG_KEYB;
+ else
+ keysig = (LPSTR)SIG_KEYA;
+ }
+ else
+ if(isProtoSmallPackets(ptr->hContact))
+ keysig = (LPSTR)SIG_KEY4;
+ else
+ keysig = (LPSTR)SIG_KEY3;
+
+ int slen = strlen(keysig);
+ int tlen = strlen(pub_text);
+
+ LPSTR keyToSend = (LPSTR) mir_alloc(slen+tlen+1);
+
+ memcpy(keyToSend,keysig,slen);
+ memcpy(keyToSend+slen,pub_text,tlen+1);
+
+ return keyToSend;
+}
+
+// store KeyB into context
+int InitKeyB(pUinKey ptr,LPCSTR key) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("InitKeyB: %s", key);
+#endif
+ if(!ptr->cntx)
+ ptr->cntx = cpp_create_context(isProtoSmallPackets(ptr->hContact)?CPP_MODE_BASE64:0);
+
+ if(!cpp_keyp(ptr->cntx)) {
+ char *tmp = myDBGetString(ptr->hContact,szModuleName,"PSK");
+ if(tmp) {
+ cpp_init_keyp(ptr->cntx,tmp); // make pre-shared key from password
+ mir_free(tmp);
+ }
+ }
+
+ cpp_init_keyb(ptr->cntx,key);
+ ptr->features = cpp_get_features(ptr->cntx);
+
+ return cpp_get_error(ptr->cntx);
+}
+
+
+// store KeyX into context
+void InitKeyX(pUinKey ptr,BYTE *key) {
+
+ if(!ptr->cntx)
+ ptr->cntx = cpp_create_context(isProtoSmallPackets(ptr->hContact)?CPP_MODE_BASE64:0);
+
+ cpp_set_keyx(ptr->cntx,key);
+}
+
+
+// calculate secret key
+BOOL CalculateKeyX(pUinKey ptr,HANDLE hContact) {
+
+ int agr = cpp_calc_keyx(ptr->cntx);
+ if( agr ) {
+ // do this only if key exchanged is ok
+ // we use a 192bit key
+ int keysize = cpp_size_keyx();
+ PBYTE buffer = (PBYTE) alloca(keysize); // buffer for hash
+
+ // store key
+ cpp_get_keyx(ptr->cntx,buffer);
+
+ DBCONTACTWRITESETTING cws;
+ cws.szModule = szModuleName;
+
+ // store key in database
+ cws.szSetting = "offlineKey";
+ cws.value.type = DBVT_BLOB;
+ cws.value.cpbVal = keysize;
+ cws.value.pbVal = buffer;
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)hContact, (LPARAM)&cws);
+
+ // store timeout of key in database (2 days)
+ cws.szSetting = "offlineKeyTimeout";
+ cws.value.type = DBVT_DWORD;
+ cws.value.dVal = gettime()+(60*60*24*DBGetContactSettingWord(0,szModuleName,"okt",2));
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)hContact, (LPARAM)&cws);
+
+ // key exchange is finished
+ showPopUpEC(ptr->hContact);
+ }
+ else {
+ // agree value problem
+ showPopUp(sim002,hContact,g_hPOP[POP_PU_DIS],0);
+ }
+ return agr!=0;
+}
+
+
+// encrypt message
+LPSTR encrypt(pUinKey ptr, LPCSTR szEncMsg) {
+
+ LPSTR szSig = (LPSTR) (ptr->offlineKey?SIG_ENOF:SIG_ENON);
+
+ int slen = strlen(szSig);
+ int clen = strlen(szEncMsg);
+
+ LPSTR szMsg = (LPSTR) mir_alloc(clen+slen+1);
+ memcpy(szMsg, szSig, slen);
+ memcpy(szMsg+slen, szEncMsg, clen+1);
+
+ return szMsg;
+}
+
+
+// encode message
+LPSTR encodeMsg(pUinKey ptr, LPARAM lParam) {
+
+ CCSDATA *pccsd = (CCSDATA *)lParam;
+ LPSTR szNewMsg = NULL;
+ LPSTR szOldMsg = (LPSTR) pccsd->lParam;
+
+ if( pccsd->wParam & PREF_UTF )
+ szNewMsg = encrypt(ptr,cpp_encodeU(ptr->cntx,szOldMsg));
+ else
+ if( pccsd->wParam & PREF_UNICODE )
+ szNewMsg = encrypt(ptr,cpp_encodeW(ptr->cntx,(LPWSTR)(szOldMsg+strlen(szOldMsg)+1)));
+ else
+ szNewMsg = encrypt(ptr,cpp_encodeA(ptr->cntx,szOldMsg));
+
+// pccsd->wParam &= ~(PREF_UNICODE|PREF_UTF);
+ pccsd->wParam &= ~PREF_UNICODE;
+
+ return szNewMsg;
+}
+
+
+// decode message
+LPSTR decodeMsg(pUinKey ptr, LPARAM lParam, LPSTR szEncMsg) {
+
+ CCSDATA *pccsd = (CCSDATA *)lParam;
+ PROTORECVEVENT *ppre = (PROTORECVEVENT *)pccsd->lParam;
+
+ LPSTR szNewMsg = NULL;
+ LPSTR szOldMsg = (ppre->flags&PREF_UTF)?cpp_decodeU(ptr->cntx,szEncMsg):cpp_decode(ptr->cntx,szEncMsg);
+
+ if(szOldMsg == NULL) {
+ ptr->decoded=false;
+ switch(cpp_get_error(ptr->cntx)) {
+ case CPP_ERROR_BAD_LEN:
+ szNewMsg = mir_strdup(Translate(sim102));
+ break;
+ case CPP_ERROR_BAD_CRC:
+ szNewMsg = mir_strdup(Translate(sim103));
+ break;
+ default: {
+ ptr->decoded=true;
+ szNewMsg = mir_strdup(Translate(sim101));
+ }
+ break;
+ }
+ ppre->flags &= ~(PREF_UNICODE|PREF_UTF);
+ pccsd->wParam &= ~(PREF_UNICODE|PREF_UTF);
+ }
+ else {
+ ptr->decoded=true;
+ if( ppre->flags & PREF_UTF ) { // Ґб«Ё Їа®в®Є®« Ї®¤¤Ґа¦Ёў Ґв utf8 - в®Ј¤ ®вЇа ў«пҐ¬ ў utf8
+ int olen = strlen(szOldMsg)+1;
+ szNewMsg = (LPSTR) mir_alloc(olen);
+ memcpy(szNewMsg,szOldMsg,olen);
+ }
+ else {
+ int olen = (strlen(szOldMsg)+1)*(sizeof(WCHAR)+1);
+ szNewMsg = (LPSTR) mir_alloc(olen);
+ memcpy(szNewMsg,szOldMsg,olen);
+ ppre->flags |= PREF_UNICODE;
+ pccsd->wParam |= PREF_UNICODE;
+ }
+ }
+ ppre->szMessage = szNewMsg;
+ return szNewMsg;
+}
+
+
+BOOL LoadKeyPGP(pUinKey ptr) {
+ int mode = DBGetContactSettingByte(ptr->hContact,szModuleName,"pgp_mode",255);
+ if(mode==0) {
+ DBVARIANT dbv;
+ DBGetContactSetting(ptr->hContact,szModuleName,"pgp",&dbv);
+ BOOL r=(dbv.type==DBVT_BLOB);
+ if(r) pgp_set_keyid(ptr->cntx,(PVOID)dbv.pbVal);
+ DBFreeVariant(&dbv);
+ return r;
+ }
+ else
+ if(mode==1) {
+ LPSTR key = myDBGetStringDecode(ptr->hContact,szModuleName,"pgp");
+ if( key ) {
+ pgp_set_key(ptr->cntx,key);
+ mir_free(key);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+BOOL LoadKeyGPG(pUinKey ptr) {
+
+ LPSTR key = myDBGetString(ptr->hContact,szModuleName,"gpg");
+ if( key ) {
+ gpg_set_keyid(ptr->cntx,key);
+ mir_free(key);
+ return 2;
+ }
+ return 0;
+}
+
+// EOF
diff --git a/secureim/crypt_icons.cpp b/secureim/crypt_icons.cpp new file mode 100644 index 0000000..97f86b4 --- /dev/null +++ b/secureim/crypt_icons.cpp @@ -0,0 +1,151 @@ +#include "commonheaders.h"
+
+
+typedef struct {
+ HICON icon;
+ SHORT mode;
+} ICON_CACHE;
+
+
+ICON_CACHE *ICONS_CACHE = NULL;
+int icons_cache = 0;
+
+
+// преобразует mode в HICON который НЕ НУЖНО разрушать в конце
+HICON mode2icon(int mode,int type) {
+
+ int m=mode&0x0f,s=(mode&SECURED)>>4,i; // разобрали на части - режим и состояние
+ HICON icon;
+
+ if( icons_cache ) {
+ for(i=0;i<icons_cache;i++) {
+ if( ICONS_CACHE[i].mode == ((type<<8) | mode) ) {
+ return ICONS_CACHE[i].icon;
+ }
+ }
+ }
+
+ i=s;
+ switch(type) {
+ case 1: i+=IEC_CL_DIS; break;
+ case 2: i+=ICO_CM_DIS; break;
+ case 3: i+=ICO_MW_DIS; break;
+ }
+
+ if( type==1 ) {
+ icon = BindOverlayIcon(g_hIEC[i],g_hICO[ICO_OV_NAT+m]);
+ }
+ else {
+ icon = BindOverlayIcon(g_hICO[i],g_hICO[ICO_OV_NAT+m]);
+ }
+
+ ICONS_CACHE = (ICON_CACHE*) mir_realloc(ICONS_CACHE,sizeof(ICON_CACHE)*(icons_cache+1));
+ ICONS_CACHE[icons_cache].icon = icon;
+ ICONS_CACHE[icons_cache].mode = (type<<8) | mode;
+ icons_cache++;
+
+ return icon;
+}
+
+
+// преобразует mode в HICON который НУЖНО разрушить в конце
+HICON mode2icon2(int mode,int type) {
+ return CopyIcon(mode2icon(mode,type));
+}
+
+
+// преобразует mode в IconExtraColumn который НЕ нужно разрушать в конце
+IconExtraColumn mode2iec(int mode) {
+
+ int m=mode&0x0f,s=(mode&SECURED)>>4; // разобрали на части - режим и состояние
+
+ if( mode==-1 || (!s && !bASI && m!=MODE_PGP && m!=MODE_GPG) ) {
+ return g_IEC[0]; // вернем пустое место
+ }
+
+ int i=1+m*IEC_CNT+IEC_CL_DIS+s;
+ if( g_IEC[i].hImage==(HANDLE)-1 ) {
+/* g_hIEC[i] = mode2icon(mode,1);
+ g_IEC[i].hImage = (HANDLE) CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)g_hIEC[i], (LPARAM)0);*/
+ HICON icon = mode2icon(mode,1);
+ g_IEC[i].hImage = (HANDLE) CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)icon, (LPARAM)0);
+ }
+ return g_IEC[i];
+}
+
+
+// обновляет иконки в clist и в messagew
+void ShowStatusIcon(HANDLE hContact,int mode) {
+
+ HANDLE hMC = getMetaContact(hContact);
+ if( bADV || g_hCLIcon ) { // обновить иконки в clist
+ if( mode!= -1 ) {
+ IconExtraColumn iec=mode2iec(mode);
+ if( g_hCLIcon ) {
+ ExtraIcon_SetIcon(g_hCLIcon, hContact, iec.hImage);
+ if( hMC )
+ ExtraIcon_SetIcon(g_hCLIcon, hMC, iec.hImage);
+ }
+ else {
+ CallService(MS_CLIST_EXTRA_SET_ICON, (WPARAM)hContact, (LPARAM)&iec);
+ if( hMC )
+ CallService(MS_CLIST_EXTRA_SET_ICON, (WPARAM)hMC, (LPARAM)&iec);
+ }
+ }
+ }
+ if( ServiceExists(MS_MSG_MODIFYICON) ) { // обновить иконки в srmm
+ StatusIconData sid;
+ memset(&sid,0,sizeof(sid));
+ sid.cbSize = sizeof(sid);
+ sid.szModule = (char*)szModuleName;
+ for(int i=MODE_NATIVE; i<MODE_CNT;i++) {
+ sid.dwId = i;
+ sid.flags = (mode&SECURED)?0:MBF_DISABLED;
+ if( mode==-1 || (mode&0x0f)!=i || isChatRoom(hContact) )
+ sid.flags |= MBF_HIDDEN; // отключаем все ненужные иконки
+ CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid);
+ if( hMC )
+ CallService(MS_MSG_MODIFYICON, (WPARAM)hMC, (LPARAM)&sid);
+ }
+ }
+}
+
+
+void ShowStatusIcon(HANDLE hContact) {
+ ShowStatusIcon(hContact,isContactSecured(hContact));
+}
+
+
+void ShowStatusIconNotify(HANDLE hContact) {
+ int mode = isContactSecured(hContact);
+ NotifyEventHooks(g_hEvent[(mode&SECURED)!=0], (WPARAM)hContact, 0);
+ ShowStatusIcon(hContact,mode);
+}
+
+
+void RefreshContactListIcons(void) {
+
+ HANDLE hContact;
+// CallService(MS_CLUI_LISTBEGINREBUILD,0,0);
+ if( !g_hCLIcon ) {
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ while (hContact) { // сначала все выключаем
+ ShowStatusIcon(hContact,-1);
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+ // менем местоположение иконки
+ for(int i=0;i<1+MODE_CNT*IEC_CNT;i++){
+ g_IEC[i].ColumnType = bADV;
+ }
+ }
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ while (hContact) { // и снова зажигаем иконку
+ if( isSecureProtocol(hContact) )
+ ShowStatusIcon(hContact);
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+// CallService(MS_CLUI_LISTENDREBUILD,0,0);
+}
+
+
+// EOF
diff --git a/secureim/crypt_lists.cpp b/secureim/crypt_lists.cpp new file mode 100644 index 0000000..d84925c --- /dev/null +++ b/secureim/crypt_lists.cpp @@ -0,0 +1,327 @@ +#include "commonheaders.h"
+
+pSupPro proto=NULL;
+pUinKey clist=NULL;
+int proto_cnt = 0;
+int clist_cnt = 0;
+int clist_inc = 100;
+
+
+void loadSupportedProtocols() {
+ int numberOfProtocols;
+ PROTOCOLDESCRIPTOR **protos;
+ LPSTR szNames = myDBGetString(0,szModuleName,"protos");
+ if( szNames && strchr(szNames,':') == NULL ) {
+ LPSTR tmp = (LPSTR) mir_alloc(2048); int j=0;
+ for(int i=0; szNames[i]; i++) {
+ if( szNames[i] == ';' ) {
+ memcpy((PVOID)(tmp+j),(PVOID)":1:0:0",6); j+=6;
+ }
+ tmp[j++] = szNames[i];
+ }
+ tmp[j] = '\0';
+ SAFE_FREE(szNames); szNames = tmp;
+ DBWriteContactSettingString(0,szModuleName,"protos",szNames);
+ }
+
+ CallService(MS_PROTO_ENUMPROTOCOLS, (WPARAM)&numberOfProtocols, (LPARAM)&protos);
+
+ for (int i=0;i<numberOfProtocols;i++) {
+// if (protos[i]->type == PROTOTYPE_PROTOCOL && protos[i]->szName && (CallProtoService(protos[i]->szName,PS_GETCAPS,PFLAGNUM_2,0)||strcmp(protos[i]->szName,"MetaContacts")==0)) {
+ if (protos[i]->type == PROTOTYPE_PROTOCOL && protos[i]->szName && CallProtoService(protos[i]->szName,PS_GETCAPS,PFLAGNUM_2,0)) {
+ int j = proto_cnt; proto_cnt++;
+ proto = (pSupPro) mir_realloc(proto,sizeof(SupPro)*proto_cnt);
+ memset(&proto[j],0,sizeof(SupPro));
+ proto[j].name = mir_strdup(protos[i]->szName);
+ if( szNames ) {
+ if( proto[j].name ) {
+ char tmp[128]; strcpy(tmp,proto[j].name); strcat(tmp,":");
+ LPSTR szName = strstr(szNames,tmp);
+ if( szName ) {
+ szName = strchr(szName,':');
+ if( szName ) {
+ proto[j].inspecting = (*++szName == '1');
+ szName = strchr(szName,':');
+ if( szName ) {
+ proto[j].split_on = atoi(++szName); proto[j].tsplit_on = proto[j].split_on;
+ szName = strchr(szName,':');
+ if( szName ) {
+ proto[j].split_off = atoi(++szName); proto[j].tsplit_off = proto[j].split_off;
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ proto[j].inspecting = true;
+ }
+ }
+ }
+ SAFE_FREE(szNames);
+}
+
+
+void freeSupportedProtocols() {
+ for (int j=0;j<proto_cnt;j++) {
+ mir_free(proto[j].name);
+ }
+ SAFE_FREE(proto);
+ proto_cnt = 0;
+}
+
+
+pSupPro getSupPro(HANDLE hContact) {
+ int j;
+ for(j=0;j<proto_cnt && !CallService(MS_PROTO_ISPROTOONCONTACT, (WPARAM)hContact, (LPARAM)proto[j].name);j++);
+ if(j==proto_cnt) return NULL;
+ return &proto[j];
+}
+
+
+void MoveToFirstInFilterList(HANDLE hContact) {
+ int i;
+ char str[10];
+ DBVARIANT dbv;
+
+ for(i=0;;i++) {
+ mir_itoa(i,str,10);
+ if( DBGetContactSettingString(hContact,"_Filter",str,&dbv) ) break;
+ if( !strcmp(szModuleName,dbv.pszVal) ) { // нашли мой модуль
+ if( i==0 ) return;
+ DBGetContactSettingString(hContact,"_Filter","0",&dbv);
+ DBWriteContactSettingString(hContact,"_Filter","0",szModuleName);
+ DBWriteContactSettingString(hContact,"_Filter",str,dbv.pszVal);
+ mir_free(dbv.pszVal);
+ return;
+ }
+ mir_free(dbv.pszVal);
+ }
+}
+
+
+void MoveToLastInFilterList(HANDLE hContact) {
+ int i,j;
+ char str[10];
+ char end[10];
+ DBVARIANT dbv;
+
+ for(i=0;;i++) {
+ mir_itoa(i,str,10);
+ if( DBGetContactSettingString(hContact,"_Filter",str,&dbv) ) break;
+ if( !strcmp(szModuleName,dbv.pszVal) ) { // нашли мой модуль
+ j=i;
+ }
+ mir_free(dbv.pszVal);
+ }
+ i--;
+ if( j==i ) return;
+ mir_itoa(i,end,10);
+ mir_itoa(j,str,10);
+ DBGetContactSettingString(hContact,"_Filter",end,&dbv);
+ DBWriteContactSettingString(hContact,"_Filter",str,dbv.pszVal);
+ DBWriteContactSettingString(hContact,"_Filter",end,szModuleName);
+ mir_free(dbv.pszVal);
+ return;
+}
+
+
+// add contact in the list of secureIM users
+pUinKey addContact(HANDLE hContact) {
+ int j;
+ if (hContact) {
+// LPSTR szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ pSupPro proto = getSupPro(hContact);
+ if ( proto ) {
+ if ( !CallService(MS_PROTO_ISPROTOONCONTACT, (WPARAM)hContact, (LPARAM)szModuleName) )
+ CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContact, (LPARAM)szModuleName);
+ MoveToLastInFilterList(hContact);
+ for(j=0;j<clist_cnt;j++) {
+ if( !clist[j].hContact ) break;
+ }
+ if(j==clist_cnt) {
+ clist_cnt+=clist_inc;
+ clist = (pUinKey) mir_realloc(clist,sizeof(UinKey)*clist_cnt);
+ memset(&clist[j],0,sizeof(UinKey)*clist_inc);
+ }
+ else
+ memset(&clist[j],0,sizeof(UinKey));
+ clist[j].header = HEADER;
+ clist[j].footer = FOOTER;
+ clist[j].hContact = hContact;
+ clist[j].proto = proto;
+ clist[j].mode = DBGetContactSettingByte(hContact, szModuleName, "mode", 99);
+ if( clist[j].mode == 99 ) {
+ if( isContactPGP(hContact) ) clist[j].mode = MODE_PGP;
+ else
+ if( isContactGPG(hContact) ) clist[j].mode = MODE_GPG;
+ else
+ clist[j].mode = MODE_RSAAES;
+ DBWriteContactSettingByte(hContact, szModuleName, "mode", clist[j].mode);
+ }
+ clist[j].status = DBGetContactSettingByte(hContact, szModuleName, "StatusID", STATUS_ENABLED);
+ clist[j].gpgMode = DBGetContactSettingByte(hContact, szModuleName, "gpgANSI", 0);
+ return &clist[j];
+ }
+ }
+ return NULL;
+}
+
+
+// delete contact from the list of secureIM users
+void delContact(HANDLE hContact) {
+ if (hContact) {
+ int j;
+ for(j=0;j<clist_cnt;j++) {
+ if(clist[j].hContact == hContact) {
+ cpp_delete_context(clist[j].cntx); clist[j].cntx = 0;
+ clist[j].hContact = 0;
+ SAFE_FREE(clist[j].tmp);
+ SAFE_FREE(clist[j].msgSplitted);
+ clist[j].header = clist[j].footer = EMPTYH;
+ return;
+ }
+ }
+ }
+}
+
+
+// load contactlist in the list of secureIM users
+void loadContactList() {
+
+ freeContactList();
+ loadSupportedProtocols();
+
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ while (hContact) {
+ addContact(hContact);
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+}
+
+
+// free list of secureIM users
+void freeContactList() {
+
+ for(int j=0;j<clist_cnt;j++) {
+ cpp_delete_context(clist[j].cntx);
+ SAFE_FREE(clist[j].tmp);
+ SAFE_FREE(clist[j].msgSplitted);
+ }
+ SAFE_FREE(clist);
+ clist_cnt = 0;
+
+ freeSupportedProtocols();
+}
+
+
+// find user in the list of secureIM users and add him, if unknow
+pUinKey getUinKey(HANDLE hContact) {
+ int j;
+ for(j=0;j<clist_cnt && clist[j].hContact!=hContact;j++);
+ if (j==clist_cnt) return addContact(hContact);
+ return &clist[j];
+}
+
+
+pUinKey getUinCtx(HANDLE cntx) {
+ int j;
+ for(j=0;j<clist_cnt && clist[j].cntx!=cntx;j++);
+ if (j==clist_cnt) return NULL;
+ return &clist[j];
+}
+
+
+// add message to user queue for send later
+void addMsg2Queue(pUinKey ptr,WPARAM wParam,LPSTR szMsg) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("addMsg2Queue: msg: -----\n%s\n-----\n",szMsg);
+#endif
+ pWM ptrMessage;
+
+ EnterCriticalSection(&localQueueMutex);
+
+ if(ptr->msgQueue==NULL){
+ // create new
+ ptr->msgQueue = (pWM) mir_alloc(sizeof(struct waitingMessage));
+ ptrMessage = ptr->msgQueue;
+ }
+ else {
+ // add to list
+ ptrMessage = ptr->msgQueue;
+ while (ptrMessage->nextMessage) {
+ ptrMessage = ptrMessage->nextMessage;
+ }
+ ptrMessage->nextMessage = (pWM) mir_alloc(sizeof(struct waitingMessage));
+ ptrMessage = ptrMessage->nextMessage;
+ }
+
+ ptrMessage->wParam = wParam;
+ ptrMessage->nextMessage = NULL;
+
+ if(wParam & PREF_UNICODE) {
+ int slen = strlen(szMsg)+1;
+ int wlen = wcslen((wchar_t *)(szMsg+slen))+1;
+ ptrMessage->Message = (LPSTR) mir_alloc(slen+wlen*sizeof(WCHAR));
+ memcpy(ptrMessage->Message,szMsg,slen+wlen*sizeof(WCHAR));
+ }
+ else{
+ ptrMessage->Message = mir_strdup(szMsg);
+ }
+
+ LeaveCriticalSection(&localQueueMutex);
+}
+
+
+void getContactNameA(HANDLE hContact, LPSTR szName) {
+ strcpy(szName,(LPCSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,0));
+}
+
+
+void getContactName(HANDLE hContact, LPSTR szName) {
+ if( bCoreUnicode ) wcscpy((LPWSTR)szName,(LPWSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,GCMDF_UNICODE));
+ else getContactNameA(hContact, szName);
+}
+
+
+void getContactUinA(HANDLE hContact, LPSTR szUIN) {
+
+ *szUIN = 0;
+
+ pSupPro ptr = getSupPro(hContact);
+ if(!ptr) return;
+
+ DBVARIANT dbv_uniqueid;
+ LPSTR uID = (LPSTR) CallProtoService(ptr->name, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
+ if( uID==(LPSTR)CALLSERVICE_NOTFOUND ) uID = 0; // Billy_Bons
+ if( uID && DBGetContactSetting(hContact, ptr->name, uID, &dbv_uniqueid)==0 ) {
+ if (dbv_uniqueid.type == DBVT_WORD)
+ sprintf(szUIN, "%u [%s]", dbv_uniqueid.wVal, ptr->name);
+ else
+ if (dbv_uniqueid.type == DBVT_DWORD)
+ sprintf(szUIN, "%u [%s]", (UINT)dbv_uniqueid.dVal, ptr->name);
+ else
+ if (dbv_uniqueid.type == DBVT_BLOB)
+ sprintf(szUIN, "%s [%s]", dbv_uniqueid.pbVal, ptr->name);
+ else
+ sprintf(szUIN, "%s [%s]", dbv_uniqueid.pszVal, ptr->name);
+ }
+ else {
+ strcpy(szUIN, "=== unknown ===");
+ }
+ DBFreeVariant(&dbv_uniqueid);
+}
+
+
+void getContactUin(HANDLE hContact, LPSTR szUIN) {
+ getContactUinA(hContact, szUIN);
+ if( bCoreUnicode && *szUIN ) {
+ LPWSTR tmp = mir_a2u(szUIN);
+ wcscpy((LPWSTR)szUIN, tmp);
+ mir_free(tmp);
+ }
+}
+
+
+// EOF
diff --git a/secureim/crypt_metacontacts.cpp b/secureim/crypt_metacontacts.cpp new file mode 100644 index 0000000..5a24c6c --- /dev/null +++ b/secureim/crypt_metacontacts.cpp @@ -0,0 +1,60 @@ +#include "commonheaders.h"
+
+
+BOOL isProtoMetaContacts(HANDLE hContact) {
+ if(bMetaContacts) {
+ LPSTR proto = (LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if( proto && strcmp(proto,"MetaContacts")==0 ) {
+ return true;
+ }
+ }
+// for(int j=0;j<clist_cnt;j++)
+// if(clist[j].hContact==hContact && clist[j].proto->inspecting)
+// return strstr(clist[j].proto->name,"MetaContacts")!=NULL;
+ return false;
+}
+
+
+BOOL isDefaultSubContact(HANDLE hContact) {
+
+ if(bMetaContacts) {
+ return (HANDLE)CallService(MS_MC_GETDEFAULTCONTACT,(WPARAM)CallService(MS_MC_GETMETACONTACT,(WPARAM)hContact,0),0)==hContact;
+ }
+ return false;
+}
+
+
+HANDLE getMetaContact(HANDLE hContact) {
+
+ if(bMetaContacts) {
+ return (HANDLE)CallService(MS_MC_GETMETACONTACT,(WPARAM)hContact,0);
+ }
+ return 0;
+}
+
+
+HANDLE getMostOnline(HANDLE hContact) {
+
+ if(bMetaContacts) {
+ return (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(WPARAM)hContact,0);
+ }
+ return 0;
+}
+
+
+// remove all secureim connections on subcontacts
+void DeinitMetaContact(HANDLE hContact) {
+
+ HANDLE hMetaContact = isProtoMetaContacts(hContact) ? hContact : getMetaContact(hContact);
+
+ if( hMetaContact ) {
+ for(int i=0;i<CallService(MS_MC_GETNUMCONTACTS,(WPARAM)hMetaContact,0);i++) {
+ HANDLE hSubContact = (HANDLE)CallService(MS_MC_GETSUBCONTACT,(WPARAM)hMetaContact,(LPARAM)i);
+ if( hSubContact && isContactSecured(hSubContact)&SECURED ) {
+ CallContactService(hSubContact,PSS_MESSAGE,(WPARAM)PREF_METANODB,(LPARAM)SIG_DEIN);
+ }
+ }
+ }
+}
+
+// EOF
diff --git a/secureim/crypt_misc.cpp b/secureim/crypt_misc.cpp new file mode 100644 index 0000000..9be742e --- /dev/null +++ b/secureim/crypt_misc.cpp @@ -0,0 +1,139 @@ +#include "commonheaders.h"
+
+
+int SendBroadcast( HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam ) {
+ ACKDATA ack;
+ memset(&ack,0,sizeof(ack));
+ ack.cbSize = sizeof( ACKDATA );
+ ack.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ ack.hContact = hContact;
+ ack.type = type;
+ ack.result = result;
+ ack.hProcess = hProcess;
+ ack.lParam = lParam;
+ return CallService( MS_PROTO_BROADCASTACK, 0, ( LPARAM )&ack );
+}
+
+
+unsigned __stdcall sttFakeAck( LPVOID param ) {
+
+ TFakeAckParams* tParam = ( TFakeAckParams* )param;
+ WaitForSingleObject( tParam->hEvent, INFINITE );
+
+ Sleep( 100 );
+ if ( tParam->msg == NULL )
+ SendBroadcast( tParam->hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, ( HANDLE )tParam->id, 0 );
+ else
+ SendBroadcast( tParam->hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, ( HANDLE )tParam->id, LPARAM( tParam->msg ));
+
+ CloseHandle( tParam->hEvent );
+ delete tParam;
+
+ return 0;
+}
+
+
+unsigned __stdcall sttWaitForExchange( LPVOID param ) {
+
+ TWaitForExchange* tParam = ( TWaitForExchange* )param;
+ WaitForSingleObject( tParam->hEvent, INFINITE );
+
+ pUinKey ptr = getUinKey(tParam->hContact);
+ delete tParam;
+
+ if( !ptr ) return 0;
+
+ for(int i=0;i<DBGetContactSettingWord(0,szModuleName,"ket",10)*10; i++) {
+ Sleep( 100 );
+ if( ptr->waitForExchange != 1 ) break;
+ } // for
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("sttWaitForExchange: %d",ptr->waitForExchange);
+#endif
+ // if keyexchange failed or timeout
+ if( ptr->waitForExchange==1 || ptr->waitForExchange==3 ) { // Їа®вге«® - ®вЇа ў«пҐ¬ Ґ§ иЁда®ў ®, Ґб«Ё ¤®
+ if( ptr->msgQueue && msgbox1(0,sim104,szModuleName,MB_YESNO|MB_ICONQUESTION)==IDYES ) {
+ EnterCriticalSection(&localQueueMutex);
+ ptr->sendQueue = true;
+ pWM ptrMessage = ptr->msgQueue;
+ while( ptrMessage ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("Sent (unencrypted) message from queue: %s",ptrMessage->Message);
+#endif
+ // send unencrypted messages
+ CallContactService(ptr->hContact,PSS_MESSAGE,(WPARAM)ptrMessage->wParam|PREF_METANODB,(LPARAM)ptrMessage->Message);
+ mir_free(ptrMessage->Message);
+ pWM tmp = ptrMessage;
+ ptrMessage = ptrMessage->nextMessage;
+ mir_free(tmp);
+ }
+ ptr->msgQueue = NULL;
+ ptr->sendQueue = false;
+ LeaveCriticalSection(&localQueueMutex);
+ }
+ ptr->waitForExchange = 0;
+ ShowStatusIconNotify(ptr->hContact);
+ }
+ else
+ if( ptr->waitForExchange==2 ) { // ¤®б« вм ®зҐаҐ¤м зҐаҐ§ гбв ®ў«Ґ®Ґ ᮥ¤ЁҐЁҐ
+ EnterCriticalSection(&localQueueMutex);
+ // we need to resend last send back message with new crypto Key
+ pWM ptrMessage = ptr->msgQueue;
+ while (ptrMessage) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("Sent (encrypted) message from queue: %s",ptrMessage->Message);
+#endif
+ // send unencrypted messages
+ CallContactService(ptr->hContact,PSS_MESSAGE,(WPARAM)ptrMessage->wParam|PREF_METANODB,(LPARAM)ptrMessage->Message);
+ mir_free(ptrMessage->Message);
+ pWM tmp = ptrMessage;
+ ptrMessage = ptrMessage->nextMessage;
+ mir_free(tmp);
+ }
+ ptr->msgQueue = NULL;
+ ptr->waitForExchange = 0;
+ LeaveCriticalSection(&localQueueMutex);
+ }
+ else
+ if( ptr->waitForExchange==0 ) { // ®зЁбвЁвм ®зҐаҐ¤м
+ EnterCriticalSection(&localQueueMutex);
+ // we need to resend last send back message with new crypto Key
+ pWM ptrMessage = ptr->msgQueue;
+ while (ptrMessage) {
+ mir_free(ptrMessage->Message);
+ pWM tmp = ptrMessage;
+ ptrMessage = ptrMessage->nextMessage;
+ mir_free(tmp);
+ }
+ ptr->msgQueue = NULL;
+ LeaveCriticalSection(&localQueueMutex);
+ }
+ return 0;
+}
+
+
+// set wait flag and run thread
+void waitForExchange(pUinKey ptr, int flag) {
+ switch( flag ) {
+ case 0: // бЎа®бЁвм
+ case 2: // ¤®б« вм иЁда®ў ®
+ case 3: // ¤®б« вм ҐиЁда®ў ®
+ if( ptr->waitForExchange )
+ ptr->waitForExchange = flag;
+ break;
+ case 1: // § ЇгбвЁвм
+ if( ptr->waitForExchange )
+ break;
+ ptr->waitForExchange = 1;
+ // § ЇгбЄ Ґ¬ ван¤
+ HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
+ unsigned int tID;
+ CloseHandle( (HANDLE) _beginthreadex(NULL, 0, sttWaitForExchange, new TWaitForExchange(hEvent,ptr->hContact), 0, &tID) );
+ SetEvent( hEvent );
+ break;
+ }
+}
+
+
+// EOF
diff --git a/secureim/crypt_popups.cpp b/secureim/crypt_popups.cpp new file mode 100644 index 0000000..e1564a1 --- /dev/null +++ b/secureim/crypt_popups.cpp @@ -0,0 +1,153 @@ +#include "commonheaders.h"
+
+/*
+static int CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ switch(message) {
+ case WM_COMMAND:
+ if (wParam == STN_CLICKED) { // It was a click on the Popup.
+ PUDeletePopUp(hWnd);
+ return TRUE;
+ }
+ break;
+ case UM_FREEPLUGINDATA: {
+ return TRUE; //TRUE or FALSE is the same, it gets ignored.
+ }
+ default:
+ break;
+ }
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+*/
+
+void showPopUp(LPCSTR lpzText,HANDLE hContact,HICON hIcon, UINT type) {
+ //type=0 key colors
+ //type=1 session colors
+ //type=2 SR colors
+
+ if(!bPopupExists) return;
+
+ //hContact = A_VALID_HANDLE_YOU_GOT_FROM_SOMEWHERE;
+ COLORREF colorBackKey = RGB(230,230,255);
+ COLORREF colorTextKey = RGB(0,0,0);
+ COLORREF colorBackSec = RGB(255,255,200);
+ COLORREF colorTextSec = RGB(0,0,0);
+ COLORREF colorBackSR = RGB(200,255,200);
+ COLORREF colorTextSR = RGB(0,0,0);
+ COLORREF colorBack = 0;
+ COLORREF colorText = 0;
+ int timeout=0;
+ int res;
+
+ DBVARIANT dbv_timeout;
+
+ if (type==0) {
+ colorBack=DBGetContactSettingDword(0,szModuleName,"colorKeyb",(UINT)-1);
+ colorText=DBGetContactSettingDword(0,szModuleName,"colorKeyt",(UINT)-1);
+ if (colorBack==(UINT)-1) colorBack=colorBackKey;
+ if (colorText==(UINT)-1) colorText=colorTextKey;
+
+ res=DBGetContactSetting(0,szModuleName,"timeoutKey",&dbv_timeout);
+ if (res==0) timeout=atoi(dbv_timeout.pszVal);
+ DBFreeVariant(&dbv_timeout);
+ }
+ else if (type==1) {
+ colorBack=DBGetContactSettingDword(0,szModuleName,"colorSecb",(UINT)-1);
+ colorText=DBGetContactSettingDword(0,szModuleName,"colorSect",(UINT)-1);
+ if (colorBack==(UINT)-1) colorBack=colorBackSec;
+ if (colorText==(UINT)-1) colorText=colorTextSec;
+
+ res=DBGetContactSetting(0,szModuleName,"timeoutSec",&dbv_timeout);
+ if (res==0) timeout=atoi(dbv_timeout.pszVal);
+ DBFreeVariant(&dbv_timeout);
+ }
+ else if (type>=2) {
+ colorBack=DBGetContactSettingDword(0, szModuleName, "colorSRb", (UINT)-1);
+ colorText=DBGetContactSettingDword(0, szModuleName, "colorSRt", (UINT)-1);
+ if (colorBack==(UINT)-1) colorBack=colorBackSR;
+ if (colorText==(UINT)-1) colorText=colorTextSR;
+
+ res=DBGetContactSetting(0,szModuleName,"timeoutSR",&dbv_timeout);
+ if (res==0) timeout=atoi(dbv_timeout.pszVal);
+ DBFreeVariant(&dbv_timeout);
+ }
+
+ if( bCoreUnicode && bPopupUnicode ) {
+ POPUPDATAW ppd = {0};
+
+ ppd.lchContact = hContact; //Be sure to use a GOOD handle, since this will not be checked.
+ ppd.lchIcon = hIcon;
+ LPWSTR lpwzContactName = (LPWSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,GCMDF_UNICODE);
+ wcscpy(ppd.lpwzContactName, lpwzContactName);
+ LPWSTR lpwzText = mir_a2u(lpzText);
+ wcscpy(ppd.lpwzText, TranslateW(lpwzText));
+ mir_free(lpwzText);
+ ppd.colorBack = colorBack;
+ ppd.colorText = colorText;
+ ppd.iSeconds = timeout;
+// ppd.PluginWindowProc = (WNDPROC)PopupDlgProc;
+
+ //Now that the plugin data has been filled, we add it to the PopUpData.
+// ppd.PluginData = NULL;
+
+ //Now that every field has been filled, we want to see the popup.
+ CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&ppd, 0);
+ }
+ else {
+ POPUPDATAEX ppd = {0};
+
+ ppd.lchContact = hContact; //Be sure to use a GOOD handle, since this will not be checked.
+ ppd.lchIcon = hIcon;
+ LPSTR lpzContactName = (LPSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,0);
+ strcpy(ppd.lpzContactName, lpzContactName);
+ strcpy(ppd.lpzText, Translate(lpzText));
+ ppd.colorBack = colorBack;
+ ppd.colorText = colorText;
+ ppd.iSeconds = timeout;
+// ppd.PluginWindowProc = (WNDPROC)PopupDlgProc;
+
+ //Now that the plugin data has been filled, we add it to the PopUpData.
+// ppd.PluginData = NULL;
+
+ //Now that every field has been filled, we want to see the popup.
+ CallService(MS_POPUP_ADDPOPUPEX, (WPARAM)&ppd, 0);
+ }
+}
+
+
+void showPopUpDCmsg(HANDLE hContact,LPCSTR msg) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "dc",1);
+ if (indic==1) showPopUp(msg,hContact,g_hPOP[POP_PU_DIS],1);
+}
+void showPopUpDC(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "dc",1);
+ if (indic==1) showPopUp(sim006,hContact,g_hPOP[POP_PU_DIS],1);
+}
+void showPopUpEC(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "ec",1);
+ if (indic==1) showPopUp(sim001,hContact,g_hPOP[POP_PU_EST],1);
+}
+void showPopUpKS(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "ks",1);
+ if (indic==1) showPopUp(sim007,hContact,g_hPOP[POP_PU_PRC],0);
+}
+void showPopUpKRmsg(HANDLE hContact,LPCSTR msg) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "kr",1);
+ if (indic==1) showPopUp(msg,hContact,g_hPOP[POP_PU_PRC],0);
+}
+void showPopUpKR(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "kr",1);
+ if (indic==1) showPopUp(sim008,hContact,g_hPOP[POP_PU_PRC],0);
+}
+void showPopUpSM(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "ss",0);
+ if (indic==1) showPopUp(sim009,hContact,g_hPOP[POP_PU_MSS],2);
+ SkinPlaySound("OutgoingSecureMessage");
+}
+void showPopUpRM(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "sr",0);
+ if (indic==1) showPopUp(sim010,hContact,g_hPOP[POP_PU_MSR],2);
+ SkinPlaySound("IncomingSecureMessage");
+}
+
+
+// EOF
diff --git a/secureim/cryptopp.h b/secureim/cryptopp.h new file mode 100644 index 0000000..bfa4e09 --- /dev/null +++ b/secureim/cryptopp.h @@ -0,0 +1,73 @@ +#ifndef __CRYPTOPP_H__
+#define __CRYPTOPP_H__
+
+#define CPP_FEATURES_UTF8 0x01
+#define CPP_FEATURES_BASE64 0x02
+#define CPP_FEATURES_GZIP 0x04
+#define CPP_FEATURES_CRC32 0x08
+#define CPP_FEATURES_PSK 0x10
+#define CPP_FEATURES_NEWPG 0x20
+#define CPP_FEATURES_RSA 0x40
+
+#define CPP_MODE_BASE16 0x0000
+#define CPP_MODE_BASE64 0x0001
+#define CPP_MODE_PGP 0x0002
+#define CPP_MODE_GPG 0x0004
+#define CPP_MODE_GPG_ANSI 0x0008
+#define CPP_MODE_PRIV_KEY 0x0010
+#define CPP_MODE_RSA_2048 0x0020
+#define CPP_MODE_RSA_4096 0x0040
+#define CPP_MODE_RSA CPP_MODE_RSA_4096
+#define CPP_MODE_RSA_ONLY 0x0080
+#define CPP_MODE_RSA_ZLIB 0x0100
+#define CPP_MODE_RSA_BER 0x0200
+
+#define CPP_ERROR_NONE 0
+#define CPP_ERROR_SEH 1
+#define CPP_ERROR_NO_KEYA 2
+#define CPP_ERROR_NO_KEYB 3
+#define CPP_ERROR_NO_KEYX 4
+#define CPP_ERROR_BAD_LEN 5
+#define CPP_ERROR_BAD_CRC 6
+#define CPP_ERROR_NO_PSK 7
+#define CPP_ERROR_BAD_PSK 8
+#define CPP_ERROR_BAD_KEYB 9
+#define CPP_ERROR_NO_PGP_KEY 10
+
+typedef struct {
+ int (__cdecl *rsa_gen_keypair)(short); // генерит RSA-ключи для указанной длины (либо тока 2048, либо 2048 и 4096)
+ int (__cdecl *rsa_get_keypair)(short,PBYTE,int*,PBYTE,int*); // возвращает пару ключей для указанной длины
+ int (__cdecl *rsa_get_keyhash)(short,PBYTE,int*,PBYTE,int*); // возвращает hash пары ключей для указанной длины
+ int (__cdecl *rsa_set_keypair)(short,PBYTE,int); // устанавливает ключи, указанной длины
+ int (__cdecl *rsa_get_pubkey)(HANDLE,PBYTE,int*); // возвращает паблик ключ из указанного контекста
+ int (__cdecl *rsa_set_pubkey)(HANDLE,PBYTE,int); // загружает паблик ключ для указанного контекста
+ void (__cdecl *rsa_set_timeout)(int); // установить таймаут для установки секюрного соединения
+ int (__cdecl *rsa_get_state)(HANDLE); // получить статус указанного контекста
+ int (__cdecl *rsa_get_hash)(PBYTE,int,PBYTE,int*); // вычисляет SHA1(key)
+ int (__cdecl *rsa_connect)(HANDLE); // запускает процесс установки содинения с указанным контекстом
+ int (__cdecl *rsa_disconnect)(HANDLE); // разрывает соединение с указанным контекстом
+ int (__cdecl *rsa_disabled)(HANDLE); // разрывает соединение по причине "disabled"
+ LPSTR (__cdecl *rsa_recv)(HANDLE,LPCSTR); // необходимо передавать сюда все входящие протокольные сообщения
+ int (__cdecl *rsa_send)(HANDLE,LPCSTR); // вызываем для отправки сообщения клиенту
+ int (__cdecl *rsa_encrypt_file)(HANDLE,LPCSTR,LPCSTR);
+ int (__cdecl *rsa_decrypt_file)(HANDLE,LPCSTR,LPCSTR);
+ LPSTR (__cdecl *utf8encode)(LPCWSTR);
+ LPWSTR (__cdecl *utf8decode)(LPCSTR);
+ int (__cdecl *is_7bit_string)(LPCSTR);
+ int (__cdecl *is_utf8_string)(LPCSTR);
+ int (__cdecl *rsa_export_keypair)(short,LPSTR,LPSTR,LPSTR); // export private key
+ int (__cdecl *rsa_import_keypair)(short,LPSTR,LPSTR); // import & activate private key
+ int (__cdecl *rsa_export_pubkey)(HANDLE,LPSTR); // export public key from context
+ int (__cdecl *rsa_import_pubkey)(HANDLE,LPSTR); // import public key into context
+} RSA_EXPORT;
+typedef RSA_EXPORT* pRSA_EXPORT;
+
+typedef struct {
+ int (__cdecl *rsa_inject)(HANDLE,LPCSTR); // вставляет сообщение в очередь на отправку
+ int (__cdecl *rsa_check_pub)(HANDLE,PBYTE,int,PBYTE,int); // проверяет интерактивно SHA и сохраняет ключ, если все нормально
+ void (__cdecl *rsa_notify)(HANDLE,int); // нотификация о смене состояния
+} RSA_IMPORT;
+typedef RSA_IMPORT* pRSA_IMPORT;
+
+
+#endif
diff --git a/secureim/dbevent.cpp b/secureim/dbevent.cpp new file mode 100644 index 0000000..1f6dff1 --- /dev/null +++ b/secureim/dbevent.cpp @@ -0,0 +1,21 @@ +#include "commonheaders.h"
+
+
+void HistoryLog(HANDLE hContact, LPCSTR szText) {
+
+ DBEVENTINFO dbei;
+ memset(&dbei, 0, sizeof(dbei));
+
+ dbei.cbSize = sizeof(dbei);
+ dbei.szModule = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ dbei.flags = DBEF_SENT|DBEF_READ;
+ dbei.timestamp = time(NULL);
+ dbei.eventType = EVENTTYPE_MESSAGE;
+ dbei.cbBlob = strlen(szText) + 1;
+ dbei.pBlob = (PBYTE)szText;
+
+ CallService(MS_DB_EVENT_ADD, (WPARAM)0, (LPARAM)&dbei);
+}
+
+
+// EOF
diff --git a/secureim/dbevent.h b/secureim/dbevent.h new file mode 100644 index 0000000..68719c2 --- /dev/null +++ b/secureim/dbevent.h @@ -0,0 +1,8 @@ +#ifndef __DBEVENT_H__
+#define __DBEVENT_H__
+
+#include <windows.h>
+
+void HistoryLog(HANDLE,LPCSTR);
+
+#endif
diff --git a/secureim/gettime.cpp b/secureim/gettime.cpp new file mode 100644 index 0000000..529a8e0 --- /dev/null +++ b/secureim/gettime.cpp @@ -0,0 +1,29 @@ +#include "commonheaders.h"
+
+
+/* FILETIME unit is 100 nanoseconds */
+const static long div_100_nsec = 10000000;
+
+/* POSIX or Unix Epoch (1-Jan-1970 00:00) in FILETIME units */
+#ifdef _MSC_VER
+const static ULONGLONG ix_epoch = 116444736000000000;
+#else
+const static ULONGLONG ix_epoch = 116444736000000000LL;
+#endif
+
+DWORD gettime(void) {
+
+ ULONGLONG diff_100_nsec;
+ union {
+ FILETIME f;
+ ULARGE_INTEGER u;
+ } now;
+
+ GetSystemTimeAsFileTime( &now.f );
+
+ diff_100_nsec = now.u.QuadPart - ix_epoch;
+
+ return (DWORD)( diff_100_nsec / div_100_nsec );
+}
+
+// EOF
diff --git a/secureim/gettime.h b/secureim/gettime.h new file mode 100644 index 0000000..e84276c --- /dev/null +++ b/secureim/gettime.h @@ -0,0 +1,8 @@ +#ifndef __GETTIME_H__
+#define __GETTIME_H__
+
+#include <windows.h>
+
+DWORD gettime(void);
+
+#endif
diff --git a/secureim/icons/cl_dis.ico b/secureim/icons/cl_dis.ico Binary files differnew file mode 100644 index 0000000..53209bc --- /dev/null +++ b/secureim/icons/cl_dis.ico diff --git a/secureim/icons/cl_est.ico b/secureim/icons/cl_est.ico Binary files differnew file mode 100644 index 0000000..8b42e2c --- /dev/null +++ b/secureim/icons/cl_est.ico diff --git a/secureim/icons/cm_dis.ico b/secureim/icons/cm_dis.ico Binary files differnew file mode 100644 index 0000000..53209bc --- /dev/null +++ b/secureim/icons/cm_dis.ico diff --git a/secureim/icons/cm_est.ico b/secureim/icons/cm_est.ico Binary files differnew file mode 100644 index 0000000..dd6f805 --- /dev/null +++ b/secureim/icons/cm_est.ico diff --git a/secureim/icons/mw_dis.ico b/secureim/icons/mw_dis.ico Binary files differnew file mode 100644 index 0000000..53209bc --- /dev/null +++ b/secureim/icons/mw_dis.ico diff --git a/secureim/icons/mw_est.ico b/secureim/icons/mw_est.ico Binary files differnew file mode 100644 index 0000000..8b42e2c --- /dev/null +++ b/secureim/icons/mw_est.ico diff --git a/secureim/icons/ov_gpg.ico b/secureim/icons/ov_gpg.ico Binary files differnew file mode 100644 index 0000000..d823cf8 --- /dev/null +++ b/secureim/icons/ov_gpg.ico diff --git a/secureim/icons/ov_nat.ico b/secureim/icons/ov_nat.ico Binary files differnew file mode 100644 index 0000000..37000bd --- /dev/null +++ b/secureim/icons/ov_nat.ico diff --git a/secureim/icons/ov_pgp.ico b/secureim/icons/ov_pgp.ico Binary files differnew file mode 100644 index 0000000..c365c48 --- /dev/null +++ b/secureim/icons/ov_pgp.ico diff --git a/secureim/icons/ov_rsa.ico b/secureim/icons/ov_rsa.ico Binary files differnew file mode 100644 index 0000000..a659463 --- /dev/null +++ b/secureim/icons/ov_rsa.ico diff --git a/secureim/icons/pu_dis.ico b/secureim/icons/pu_dis.ico Binary files differnew file mode 100644 index 0000000..53209bc --- /dev/null +++ b/secureim/icons/pu_dis.ico diff --git a/secureim/icons/pu_est.ico b/secureim/icons/pu_est.ico Binary files differnew file mode 100644 index 0000000..8b42e2c --- /dev/null +++ b/secureim/icons/pu_est.ico diff --git a/secureim/icons/pu_msg.ico b/secureim/icons/pu_msg.ico Binary files differnew file mode 100644 index 0000000..5964ead --- /dev/null +++ b/secureim/icons/pu_msg.ico diff --git a/secureim/icons/pu_prc.ico b/secureim/icons/pu_prc.ico Binary files differnew file mode 100644 index 0000000..822c55a --- /dev/null +++ b/secureim/icons/pu_prc.ico diff --git a/secureim/icons/st_dis.ico b/secureim/icons/st_dis.ico Binary files differnew file mode 100644 index 0000000..16c5bcf --- /dev/null +++ b/secureim/icons/st_dis.ico diff --git a/secureim/icons/st_ena.ico b/secureim/icons/st_ena.ico Binary files differnew file mode 100644 index 0000000..fa67cbd --- /dev/null +++ b/secureim/icons/st_ena.ico diff --git a/secureim/icons/st_try.ico b/secureim/icons/st_try.ico Binary files differnew file mode 100644 index 0000000..9f4c685 --- /dev/null +++ b/secureim/icons/st_try.ico diff --git a/secureim/images.cpp b/secureim/images.cpp new file mode 100644 index 0000000..7006d4d --- /dev/null +++ b/secureim/images.cpp @@ -0,0 +1,358 @@ +#include "commonheaders.h"
+
+
+void HalfBitmap32Alpha(HBITMAP hBitmap)
+{
+ BITMAP bmp;
+ DWORD dwLen;
+ BYTE *p;
+ int x, y;
+
+ GetObject(hBitmap, sizeof(bmp), &bmp);
+
+ if (bmp.bmBitsPixel != 32)
+ return;
+
+ dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8);
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ return;
+ memset(p, 0, dwLen);
+
+ GetBitmapBits(hBitmap, dwLen, p);
+
+ for (y = 0; y < bmp.bmHeight; ++y) {
+ BYTE *px = p + bmp.bmWidth * 4 * y;
+
+ for (x = 0; x < bmp.bmWidth; ++x)
+ {
+ px[3]>>=1;
+ px += 4;
+ }
+ }
+
+ SetBitmapBits(hBitmap, dwLen, p);
+
+ free(p);
+}
+
+
+// Make a bitmap all transparent, but only if it is a 32bpp
+void MakeBmpTransparent(HBITMAP hBitmap)
+{
+ BITMAP bmp;
+ DWORD dwLen;
+ BYTE *p;
+
+ GetObject(hBitmap, sizeof(bmp), &bmp);
+
+ if (bmp.bmBitsPixel != 32)
+ return;
+
+ dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8);
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ return;
+
+ memset(p, 0, dwLen);
+ SetBitmapBits(hBitmap, dwLen, p);
+
+ free(p);
+}
+
+
+// Correct alpha from bitmaps loaded without it (it cames with 0 and should be 255)
+void CorrectBitmap32Alpha(HBITMAP hBitmap, BOOL force)
+{
+ BITMAP bmp;
+ DWORD dwLen;
+ BYTE *p;
+ int x, y;
+ BOOL fixIt;
+
+ GetObject(hBitmap, sizeof(bmp), &bmp);
+
+ if (bmp.bmBitsPixel != 32)
+ return;
+
+ dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8);
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ return;
+ memset(p, 0, dwLen);
+
+ GetBitmapBits(hBitmap, dwLen, p);
+
+ fixIt = TRUE;
+ for (y = 0; fixIt && y < bmp.bmHeight; ++y) {
+ BYTE *px = p + bmp.bmWidth * 4 * y;
+
+ for (x = 0; fixIt && x < bmp.bmWidth; ++x)
+ {
+ if (px[3] != 0 && !force)
+ {
+ fixIt = FALSE;
+ }
+ else
+ {
+ if (px[0] != 0 || px[1] != 0 || px[2] != 0)
+ px[3] = 255;
+ }
+
+ px += 4;
+ }
+ }
+
+ if (fixIt)
+ SetBitmapBits(hBitmap, dwLen, p);
+
+ free(p);
+}
+
+
+HBITMAP CopyBitmapTo32(HBITMAP hBitmap)
+{
+ BITMAPINFO RGB32BitsBITMAPINFO;
+ BYTE * ptPixels;
+ HBITMAP hDirectBitmap;
+
+ BITMAP bmp;
+ DWORD dwLen;
+ BYTE *p;
+
+ GetObject(hBitmap, sizeof(bmp), &bmp);
+
+ dwLen = bmp.bmWidth * bmp.bmHeight * 4;
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ return NULL;
+
+ // Create bitmap
+ ZeroMemory(&RGB32BitsBITMAPINFO, sizeof(BITMAPINFO));
+ RGB32BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ RGB32BitsBITMAPINFO.bmiHeader.biWidth = bmp.bmWidth;
+ RGB32BitsBITMAPINFO.bmiHeader.biHeight = bmp.bmHeight;
+ RGB32BitsBITMAPINFO.bmiHeader.biPlanes = 1;
+ RGB32BitsBITMAPINFO.bmiHeader.biBitCount = 32;
+
+ hDirectBitmap = CreateDIBSection(NULL,
+ (BITMAPINFO *)&RGB32BitsBITMAPINFO,
+ DIB_RGB_COLORS,
+ (void **)&ptPixels,
+ NULL, 0);
+
+ // Copy data
+ if (bmp.bmBitsPixel != 32)
+ {
+ HDC hdcOrig, hdcDest;
+ HBITMAP oldOrig, oldDest;
+
+ hdcOrig = CreateCompatibleDC(NULL);
+ oldOrig = (HBITMAP) SelectObject(hdcOrig, hBitmap);
+
+ hdcDest = CreateCompatibleDC(NULL);
+ oldDest = (HBITMAP) SelectObject(hdcDest, hDirectBitmap);
+
+ BitBlt(hdcDest, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcOrig, 0, 0, SRCCOPY);
+
+ SelectObject(hdcDest, oldDest);
+ DeleteObject(hdcDest);
+ SelectObject(hdcOrig, oldOrig);
+ DeleteObject(hdcOrig);
+
+ // Set alpha
+ CorrectBitmap32Alpha(hDirectBitmap, FALSE);
+ }
+ else
+ {
+ GetBitmapBits(hBitmap, dwLen, p);
+ SetBitmapBits(hDirectBitmap, dwLen, p);
+ }
+
+ free(p);
+
+ return hDirectBitmap;
+}
+
+
+HBITMAP CreateBitmap32(int cx, int cy)
+{
+ BITMAPINFO RGB32BitsBITMAPINFO;
+ UINT * ptPixels;
+ HBITMAP DirectBitmap;
+
+ ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO));
+ RGB32BitsBITMAPINFO.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+ RGB32BitsBITMAPINFO.bmiHeader.biWidth=cx;//bm.bmWidth;
+ RGB32BitsBITMAPINFO.bmiHeader.biHeight=cy;//bm.bmHeight;
+ RGB32BitsBITMAPINFO.bmiHeader.biPlanes=1;
+ RGB32BitsBITMAPINFO.bmiHeader.biBitCount=32;
+
+ DirectBitmap = CreateDIBSection(NULL,
+ (BITMAPINFO *)&RGB32BitsBITMAPINFO,
+ DIB_RGB_COLORS,
+ (void **)&ptPixels,
+ NULL, 0);
+ return DirectBitmap;
+}
+
+
+BOOL MakeBitmap32(HBITMAP *hBitmap)
+{
+ BITMAP bmp;
+
+ GetObject(*hBitmap, sizeof(bmp), &bmp);
+
+ if (bmp.bmBitsPixel != 32) {
+ // Convert to 32 bpp
+ HBITMAP hBmpTmp = CopyBitmapTo32(*hBitmap);
+ DeleteObject(*hBitmap);
+ *hBitmap = hBmpTmp;
+ }
+
+ return TRUE;
+}
+
+
+#define GET_PIXEL(__P__, __X__, __Y__) ( __P__ + width * 4 * (__Y__) + 4 * (__X__) )
+
+BOOL MakeGrayscale(HBITMAP *hBitmap)
+{
+ BYTE *p = NULL;
+ BYTE *p1;
+ DWORD dwLen;
+ int width, height, x, y;
+ BITMAP bmp;
+
+ GetObject(*hBitmap, sizeof(bmp), &bmp);
+ width = bmp.bmWidth;
+ height = bmp.bmHeight;
+
+ dwLen = width * height * 4;
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ {
+ return FALSE;
+ }
+
+ if (bmp.bmBitsPixel != 32)
+ {
+ // Convert to 32 bpp
+ HBITMAP hBmpTmp = CopyBitmapTo32(*hBitmap);
+ DeleteObject(*hBitmap);
+ *hBitmap = hBmpTmp;
+ }
+ GetBitmapBits(*hBitmap, dwLen, p);
+
+ // Make grayscale
+ for (y = 0 ; y < height ; y++)
+ {
+ for (x = 0 ; x < width ; x++)
+ {
+ p1 = GET_PIXEL(p, x, y);
+ p1[0] = p1[1] = p1[2] = ( p1[0] + p1[1] + p1[2] ) / 3;
+ }
+ }
+
+ dwLen = SetBitmapBits(*hBitmap, dwLen, p);
+ free(p);
+
+ return TRUE;
+}
+
+
+HICON MakeHalfAlphaIcon(HICON SourceIcon)
+{
+ ICONINFO TargetIconInfo;
+ BITMAP TargetBitmapInfo;
+ HICON TargetIcon, TempIcon;
+
+ TempIcon = CopyIcon(SourceIcon);
+ if ( !GetIconInfo(TempIcon, &TargetIconInfo))
+ return NULL;
+
+ if ( !GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo))
+ return NULL;
+
+ MakeBitmap32(&TargetIconInfo.hbmColor);
+ HalfBitmap32Alpha(TargetIconInfo.hbmColor);
+ TargetIcon = CreateIconIndirect(&TargetIconInfo);
+
+ DestroyIcon(TempIcon);
+ DeleteObject(TargetIconInfo.hbmColor);
+ DeleteObject(TargetIconInfo.hbmMask);
+ return TargetIcon;
+}
+
+
+HICON MakeGrayscaleIcon(HICON SourceIcon)
+{
+ ICONINFO TargetIconInfo;
+ BITMAP TargetBitmapInfo;
+ HICON TargetIcon, TempIcon;
+
+ TempIcon = CopyIcon(SourceIcon);
+ if (! GetIconInfo(TempIcon, &TargetIconInfo) || GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo)==0) return NULL;
+
+ MakeGrayscale(&TargetIconInfo.hbmColor);
+
+ TargetIcon = CreateIconIndirect(&TargetIconInfo);
+ DestroyIcon(TempIcon);
+
+ return TargetIcon;
+}
+
+
+HICON BindOverlayIcon(HICON SourceIcon,HICON OverlayIcon)
+{
+ ICONINFO OverlayIconInfo, TargetIconInfo;
+ BITMAP OverlayBitmapInfo, TargetBitmapInfo;
+ HBITMAP OldOverlayBitmap, OldTargetBitmap;
+ HICON TargetIcon, TempIcon;
+ HDC OverlayDC, TargetDC;
+ BLENDFUNCTION bf = {0,0,255,1};
+
+ TempIcon = CopyIcon(SourceIcon);
+ if ( !GetIconInfo( TempIcon, &TargetIconInfo ))
+ return NULL;
+
+ MakeBitmap32(&TargetIconInfo.hbmColor);
+ CorrectBitmap32Alpha(TargetIconInfo.hbmColor, FALSE);
+ GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo);
+
+ if ( !GetIconInfo(OverlayIcon, &OverlayIconInfo) || !GetObject(OverlayIconInfo.hbmColor, sizeof(BITMAP), &OverlayBitmapInfo))
+ return NULL;
+
+ TargetDC = CreateCompatibleDC(NULL);
+ OldTargetBitmap = (HBITMAP)SelectObject(TargetDC, TargetIconInfo.hbmColor);
+
+ OverlayDC = CreateCompatibleDC(NULL);
+ OldOverlayBitmap = (HBITMAP)SelectObject(OverlayDC, OverlayIconInfo.hbmColor);
+
+ AlphaBlend(TargetDC, 0, 0, TargetBitmapInfo.bmWidth, TargetBitmapInfo.bmHeight,
+ OverlayDC, 0, 0, OverlayBitmapInfo.bmWidth, OverlayBitmapInfo.bmHeight, bf);
+
+ SelectObject(TargetDC, TargetIconInfo.hbmMask);
+ SelectObject(OverlayDC, OverlayIconInfo.hbmMask);
+
+ BitBlt(TargetDC, 0, 0, TargetBitmapInfo.bmWidth, TargetBitmapInfo.bmHeight,
+ OverlayDC, 0, 0, SRCCOPY);
+
+ TargetIcon = CreateIconIndirect(&TargetIconInfo);
+ DestroyIcon(TempIcon);
+
+ SelectObject(TargetDC, OldTargetBitmap);
+ DeleteObject(TargetIconInfo.hbmColor);
+ DeleteObject(TargetIconInfo.hbmMask);
+ DeleteDC(TargetDC);
+
+ SelectObject(OverlayDC, OldOverlayBitmap);
+ DeleteObject(OverlayIconInfo.hbmColor);
+ DeleteObject(OverlayIconInfo.hbmMask);
+ DeleteDC(OverlayDC);
+
+ return TargetIcon;
+}
+
+
+// EOF
diff --git a/secureim/images.h b/secureim/images.h new file mode 100644 index 0000000..ea65b09 --- /dev/null +++ b/secureim/images.h @@ -0,0 +1,8 @@ +#ifndef __IMAGE_UTILS_H__
+#define __IMAGE_UTILS_H__
+
+HICON BindOverlayIcon(HICON,HICON);
+//HICON MakeGrayscaleIcon(HICON);
+HICON MakeHalfAlphaIcon(HICON);
+
+#endif // __IMAGE_UTILS_H__
diff --git a/secureim/language.cpp b/secureim/language.cpp new file mode 100644 index 0000000..9bdf620 --- /dev/null +++ b/secureim/language.cpp @@ -0,0 +1,104 @@ +#include "commonheaders.h"
+
+//Popup Messages
+LPCSTR sim001 = "SecureIM established...";
+LPCSTR sim002 = "Key exchange failed...";
+LPCSTR sim003 = "Key from disabled...";
+LPCSTR sim004 = "Sended back message received...";
+LPCSTR sim005 = "Sending back secure message...";
+LPCSTR sim006 = "SecureIM disabled...";
+LPCSTR sim007 = "Sending Key...";
+LPCSTR sim008 = "Key Received...";
+LPCSTR sim009 = "Sending Message...";
+LPCSTR sim010 = "Message Received...";
+LPCSTR sim011 = "Encrypting File:";
+LPCSTR sim012 = "Decrypting File:";
+LPCSTR sim013 = "Bad key received...";
+
+//Error Messages
+LPCSTR sim101 = "SecureIM: Error while decrypting the message.";
+LPCSTR sim102 = "SecureIM: Error while decrypting the message, bad message length.";
+LPCSTR sim103 = "SecureIM: Error while decrypting the message, bad message CRC.";
+LPCSTR sim104 = "User has not answered to key exchange !\nYour messages are still in SecureIM queue, do you want to send them Unencrypted now ?";
+LPCSTR sim105 = "SecureIM not enabled! You Must Enable SecureIM with this user...";
+LPCSTR sim106 = "Can't Send Encrypted Message !\nUser is offline now and his secure key has been expired, Do you want to send your message ?\nIt will be unencrypted !";
+LPCSTR sim107 = "SecureIM won't be loaded because cryptopp.dll is missing or wrong version !";
+LPCSTR sim108 = "SecureIM can't load PGP/GPG key! Check PGP/GPG settings!";
+LPCSTR sim109 = "SecureIM can't encrypt message! Check trust of PGP/GPG key!";
+LPCSTR sim110 = "Can't Send Encrypted Message !\nDo you want to send your message ?\nIt will be unencrypted !";
+LPCSTR sim111 = "Can't change mode! Secure connection established!";
+LPCSTR sim112 = "Can't export RSA private key!";
+LPCSTR sim113 = "Can't import RSA private key!";
+LPCSTR sim114 = "Can't export RSA public key!";
+LPCSTR sim115 = "Can't import RSA public key!";
+
+//Options
+LPCSTR sim201 = "General";
+LPCSTR sim202 = "Protocols";
+LPCSTR sim203 = "Nickname";
+LPCSTR sim204 = "UIN/Email/Jid/...";
+LPCSTR sim205 = "Status";
+LPCSTR sim206 = "PSK";
+LPCSTR sim210 = "Name";
+LPCSTR sim211 = "Password is too short!";
+LPCSTR sim212 = "ON";
+LPCSTR sim213 = "Off";
+LPCSTR sim214 = "PGP";
+LPCSTR sim215 = "Key ID";
+LPCSTR sim216 = "Keyrings loaded.";
+LPCSTR sim217 = "Keyrings not loaded!";
+LPCSTR sim218 = "PGP SDK v%i.%i.%i found.";
+LPCSTR sim219 = "PGP SDK not found!";
+LPCSTR sim220 = "This version not supported!";
+LPCSTR sim221 = "(none)";
+LPCSTR sim222 = "Private key loaded.";
+LPCSTR sim223 = "Private key not loaded!";
+LPCSTR sim224 = "The new settings will become valid when you restart MirandaIM!";
+LPCSTR sim225 = "Keyrings disabled!";
+LPCSTR sim226 = "GPG";
+LPCSTR sim227 = "CP";
+LPCSTR sim228 = "ANSI";
+LPCSTR sim229 = "UTF8";
+LPCSTR sim230 = "Mode";
+LPCSTR sim231[] = { "Native", "PGP", "GPG", "RSA/AES", "RSA" };
+LPCSTR sim232[] = { "Disabled", "Enabled", "Always try" };
+LPCSTR sim233 = "PUB";
+LPCSTR sim234 = "SHA1";
+
+//Context Menu
+LPCSTR sim301 = "Create SecureIM connection";
+LPCSTR sim302 = "Disable SecureIM connection";
+LPCSTR sim306 = "Load PGP Key";
+LPCSTR sim307 = "Unload PGP Key";
+LPCSTR sim308 = "Load GPG Key";
+LPCSTR sim309 = "Unload GPG Key";
+LPCSTR sim310 = "Delete RSA Key";
+LPCSTR sim311[] = { "SecureIM mode (Native)",
+ "SecureIM mode (PGP)",
+ "SecureIM mode (GPG)",
+ "SecureIM mode (RSA/AES)",
+ "SecureIM mode (RSA)" };
+LPCSTR sim312[] = { "SecureIM status (disabled)",
+ "SecureIM status (enabled)",
+ "SecureIM status (always try)" };
+
+//System messages
+LPCSTR sim401 = "SecureIM: Sorry, unable to decrypt this message due you have no PGP/GPG installed. Visit www.pgp.com or www.gnupg.org for more info.";
+LPCSTR sim402 = "SecureIM received unencryped message:\n";
+LPCSTR sim403 = "SecureIM received encryped message:\n";
+
+//RSA messages
+LPCSTR sim501 = "Session closed by receiving incorrect message type";
+LPCSTR sim502 = "Session closed by other side on error";
+LPCSTR sim505 = "Error while decoding AES message";
+LPCSTR sim506 = "Error while decoding RSA message";
+LPCSTR sim507 = "Session closed on timeout";
+LPCSTR sim508 = "Session closed by other side when status \"disabled\"";
+LPCSTR sim510 = "Session closed on error: %02x";
+LPCSTR sim520 = "SecureIM received RSA Public Key from \"%s\"\n\nSHA1: %s\n\nDo you Accept this Key ?";
+LPCSTR sim521 = "SecureIM auto accepted RSA Public key from: %s uin: %s SHA1: %s";
+LPCSTR sim522 = "SecureIM received NEW RSA Public Key from \"%s\"\n\nNew SHA1: %s\n\nOld SHA1: %s\n\nDo you Replace this Key ?";
+LPCSTR sim523 = "SecureIM auto accepted NEW RSA Public key from: %s uin: %s New SHA1: %s Old SHA1: %s";
+
+
+// EOF
diff --git a/secureim/language.h b/secureim/language.h new file mode 100644 index 0000000..154e306 --- /dev/null +++ b/secureim/language.h @@ -0,0 +1,100 @@ +#ifndef __LANGUAGE_H__
+#define __LANGUAGE_H__
+
+#include <windows.h>
+
+//Popup Messages
+extern LPCSTR sim001;
+extern LPCSTR sim002;
+extern LPCSTR sim003;
+extern LPCSTR sim004;
+extern LPCSTR sim005;
+extern LPCSTR sim006;
+extern LPCSTR sim007;
+extern LPCSTR sim008;
+extern LPCSTR sim009;
+extern LPCSTR sim010;
+extern LPCSTR sim011;
+extern LPCSTR sim012;
+extern LPCSTR sim013;
+
+//Error Messages
+extern LPCSTR sim101;
+extern LPCSTR sim102;
+extern LPCSTR sim103;
+extern LPCSTR sim104;
+extern LPCSTR sim105;
+extern LPCSTR sim106;
+extern LPCSTR sim107;
+extern LPCSTR sim108;
+extern LPCSTR sim109;
+extern LPCSTR sim110;
+extern LPCSTR sim111;
+extern LPCSTR sim112;
+extern LPCSTR sim113;
+extern LPCSTR sim114;
+extern LPCSTR sim115;
+
+//Options
+extern LPCSTR sim201;
+extern LPCSTR sim202;
+extern LPCSTR sim203;
+extern LPCSTR sim204;
+extern LPCSTR sim205;
+extern LPCSTR sim206;
+extern LPCSTR sim210;
+extern LPCSTR sim211;
+extern LPCSTR sim212;
+extern LPCSTR sim213;
+extern LPCSTR sim214;
+extern LPCSTR sim215;
+extern LPCSTR sim216;
+extern LPCSTR sim217;
+extern LPCSTR sim218;
+extern LPCSTR sim219;
+extern LPCSTR sim220;
+extern LPCSTR sim221;
+extern LPCSTR sim222;
+extern LPCSTR sim223;
+extern LPCSTR sim224;
+extern LPCSTR sim225;
+extern LPCSTR sim226;
+extern LPCSTR sim227;
+extern LPCSTR sim228;
+extern LPCSTR sim229;
+extern LPCSTR sim230;
+extern LPCSTR sim231[];
+extern LPCSTR sim232[];
+extern LPCSTR sim233;
+extern LPCSTR sim234;
+
+//Context Menu
+extern LPCSTR sim301;
+extern LPCSTR sim302;
+extern LPCSTR sim306;
+extern LPCSTR sim307;
+extern LPCSTR sim308;
+extern LPCSTR sim309;
+extern LPCSTR sim310;
+extern LPCSTR sim311[];
+extern LPCSTR sim312[];
+
+//System messages
+extern LPCSTR sim401;
+extern LPCSTR sim402;
+extern LPCSTR sim403;
+
+//RSA messages
+extern LPCSTR sim501;
+extern LPCSTR sim502;
+extern LPCSTR sim505;
+extern LPCSTR sim506;
+extern LPCSTR sim507;
+extern LPCSTR sim508;
+extern LPCSTR sim510;
+extern LPCSTR sim520;
+extern LPCSTR sim521;
+extern LPCSTR sim522;
+extern LPCSTR sim523;
+
+#endif
diff --git a/secureim/loadicons.cpp b/secureim/loadicons.cpp new file mode 100644 index 0000000..1b9d473 --- /dev/null +++ b/secureim/loadicons.cpp @@ -0,0 +1,104 @@ +#include "commonheaders.h"
+
+
+HINSTANCE LoadIconsPack(const char* szIconsPack)
+{
+ HINSTANCE hNewIconInst = NULL;
+ WORD i;
+
+ hNewIconInst = LoadLibrary(szIconsPack);
+
+ if (hNewIconInst != NULL)
+ {
+ for(i=ID_FIRSTICON; i<=ID_LASTICON; i++)
+ if (LoadIcon(hNewIconInst, MAKEINTRESOURCE(i)) == NULL)
+ {
+ FreeLibrary(hNewIconInst);
+ hNewIconInst = NULL;
+ break;
+ }
+ }
+ return hNewIconInst;
+}
+
+
+
+int ReloadIcons(WPARAM wParam, LPARAM lParam)
+{
+ HICON hIcon;
+ for (int i=0; icons[i].key; i++) {
+ hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)icons[i].name);
+ if(icons[i].tbl == TBL_IEC)
+ g_hIEC[icons[i].idx]=hIcon;
+ else
+ if(icons[i].tbl == TBL_ICO)
+ g_hICO[icons[i].idx]=hIcon;
+ else
+ if(icons[i].tbl == TBL_POP)
+ g_hPOP[icons[i].idx]=hIcon;
+ }
+
+ return 0;
+}
+
+
+void InitIcons(void)
+{
+ HINSTANCE hNewIconInst = NULL;
+
+ if( g_hFolders ) {
+ LPSTR pathname = (LPSTR) alloca(MAX_PATH);
+ FoldersGetCustomPathEx(g_hFolders, pathname, MAX_PATH, "icons\\", "secureim_icons.dll");
+ if (hNewIconInst == NULL)
+ hNewIconInst = LoadIconsPack(pathname);
+ }
+
+ if (hNewIconInst == NULL)
+ hNewIconInst = LoadIconsPack("icons\\secureim_icons.dll");
+
+ if (hNewIconInst == NULL)
+ hNewIconInst = LoadIconsPack("plugins\\secureim_icons.dll");
+
+ if (hNewIconInst == NULL)
+ g_hIconInst = g_hInst;
+ else
+ g_hIconInst = hNewIconInst;
+
+
+ SKINICONDESC sid;
+ memset(&sid,0,sizeof(sid));
+
+ sid.cbSize = sizeof(SKINICONDESC);
+ sid.pszSection = "SecureIM";
+
+ HICON hIcon;
+ for (int i=0; icons[i].key; i++) {
+ if(ServiceExists(MS_SKIN2_ADDICON)) {
+ sid.pszSection = icons[i].section;
+ sid.pszName = icons[i].name;
+ sid.pszDescription = icons[i].text;
+ sid.pszDefaultFile = "secureim_icons.dll";
+ sid.iDefaultIndex = icons[i].key;
+ sid.hDefaultIcon = (HICON)LoadImage(g_hIconInst, MAKEINTRESOURCE(icons[i].key), IMAGE_ICON, 16, 16, LR_SHARED);
+ CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid);
+ hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)icons[i].name);
+ }
+ else {
+ hIcon = (HICON)LoadImage(g_hIconInst, MAKEINTRESOURCE(icons[i].key), IMAGE_ICON, 16, 16, LR_SHARED);
+ }
+ if(icons[i].tbl == TBL_IEC)
+ g_hIEC[icons[i].idx]=hIcon;
+ else
+ if(icons[i].tbl == TBL_ICO)
+ g_hICO[icons[i].idx]=hIcon;
+ else
+ if(icons[i].tbl == TBL_POP)
+ g_hPOP[icons[i].idx]=hIcon;
+ }
+
+ if(ServiceExists(MS_SKIN2_ADDICON)) {
+ AddHookFunction(ME_SKIN2_ICONSCHANGED, ReloadIcons);
+ }
+}
+
+// EOF
diff --git a/secureim/loadicons.h b/secureim/loadicons.h new file mode 100644 index 0000000..f5258a4 --- /dev/null +++ b/secureim/loadicons.h @@ -0,0 +1,7 @@ +#ifndef __LOADICONS_H__
+#define __LOADICONS_H__
+
+HINSTANCE LoadIconsPack(const char*);
+void InitIcons();
+
+#endif
diff --git a/secureim/loadlib.cpp b/secureim/loadlib.cpp new file mode 100644 index 0000000..ac0d2f9 --- /dev/null +++ b/secureim/loadlib.cpp @@ -0,0 +1,76 @@ +#include "commonheaders.h"
+
+CRYPTOPP_INFO cpp;
+
+BOOL loadlib(void) {
+
+ HMODULE h = LoadLibraryA("plugins/cryptopp.dll");
+ if ( h == NULL ) {
+ h = LoadLibraryA("cryptopp.dll");
+ if ( h == NULL ) return 0;
+ }
+
+ cpp.cc = (_cpp_create_context) GetProcAddress(h, "cpp_create_context");
+ cpp.dc = (_cpp_delete_context) GetProcAddress(h, "cpp_delete_context");
+ cpp.rc = (_cpp_reset_context) GetProcAddress(h, "cpp_reset_context");
+ cpp.ika = (_cpp_init_keya) GetProcAddress(h, "cpp_init_keya");
+ cpp.ikb = (_cpp_init_keyb) GetProcAddress(h, "cpp_init_keyb");
+ cpp.ckx = (_cpp_calc_keyx) GetProcAddress(h, "cpp_calc_keyx");
+ cpp.ikp = (_cpp_init_keyp) GetProcAddress(h, "cpp_init_keyp");
+ cpp.ea = (_cpp_encodeA) GetProcAddress(h, "cpp_encodeA");
+ cpp.ew = (_cpp_encodeW) GetProcAddress(h, "cpp_encodeW");
+ cpp.eu = (_cpp_encodeU) GetProcAddress(h, "cpp_encodeU");
+ cpp.daw = (_cpp_decode) GetProcAddress(h, "cpp_decode");
+ cpp.du = (_cpp_decodeU) GetProcAddress(h, "cpp_decodeU");
+ cpp.ef = (_cpp_encrypt_file) GetProcAddress(h, "cpp_encrypt_file");
+ cpp.df = (_cpp_decrypt_file) GetProcAddress(h, "cpp_decrypt_file");
+ cpp.gf = (_cpp_get_features) GetProcAddress(h, "cpp_get_features");
+ cpp.ge = (_cpp_get_error) GetProcAddress(h, "cpp_get_error");
+ cpp.gv = (_cpp_get_version) GetProcAddress(h, "cpp_get_version");
+ cpp.kxs = (_cpp_size_keyx) GetProcAddress(h, "cpp_size_keyx");
+ cpp.gkx = (_cpp_get_keyx) GetProcAddress(h, "cpp_get_keyx");
+ cpp.skx = (_cpp_set_keyx) GetProcAddress(h, "cpp_set_keyx");
+ cpp.kps = (_cpp_size_keyp) GetProcAddress(h, "cpp_size_keyp");
+ cpp.gkp = (_cpp_get_keyp) GetProcAddress(h, "cpp_get_keyp");
+ cpp.skp = (_cpp_set_keyp) GetProcAddress(h, "cpp_set_keyp");
+ cpp.ka = (_cpp_keya) GetProcAddress(h, "cpp_keya");
+ cpp.kb = (_cpp_keyb) GetProcAddress(h, "cpp_keyb");
+ cpp.kx = (_cpp_keyx) GetProcAddress(h, "cpp_keyx");
+ cpp.kp = (_cpp_keyp) GetProcAddress(h, "cpp_keyp");
+
+ cpp.pgp_i = (_pgp_init ) GetProcAddress(h, "pgp_init");
+ cpp.pgp_d = (_pgp_done ) GetProcAddress(h, "pgp_done");
+ cpp.pgp_ok = (_pgp_open_keyrings ) GetProcAddress(h, "pgp_open_keyrings");
+ cpp.pgp_ck = (_pgp_close_keyrings ) GetProcAddress(h, "pgp_close_keyrings");
+ cpp.pgp_gv = (_pgp_get_version ) GetProcAddress(h, "pgp_get_version");
+ cpp.pgp_ge = (_pgp_get_error ) GetProcAddress(h, "pgp_get_error");
+ cpp.pgp_spk = (_pgp_set_priv_key ) GetProcAddress(h, "pgp_set_priv_key");
+ cpp.pgp_sk = (_pgp_set_key ) GetProcAddress(h, "pgp_set_key");
+ cpp.pgp_ski = (_pgp_set_keyid ) GetProcAddress(h, "pgp_set_keyid");
+ cpp.pgp_szki = (_pgp_size_keyid ) GetProcAddress(h, "pgp_size_keyid");
+ cpp.pgp_slki = (_pgp_select_keyid ) GetProcAddress(h, "pgp_select_keyid");
+ cpp.pgp_eu = (_pgp_encode ) GetProcAddress(h, "pgp_encode");
+ cpp.pgp_de = (_pgp_decode ) GetProcAddress(h, "pgp_decode");
+
+ cpp.gpg_i = (_gpg_init ) GetProcAddress(h, "gpg_init");
+ cpp.gpg_d = (_gpg_done ) GetProcAddress(h, "gpg_done");
+ cpp.gpg_ok = (_gpg_open_keyrings ) GetProcAddress(h, "gpg_open_keyrings");
+ cpp.gpg_ck = (_gpg_close_keyrings ) GetProcAddress(h, "gpg_close_keyrings");
+ cpp.gpg_sl = (_gpg_set_log ) GetProcAddress(h, "gpg_set_log");
+ cpp.gpg_st = (_gpg_set_tmp ) GetProcAddress(h, "gpg_set_tmp");
+ cpp.gpg_ge = (_gpg_get_error ) GetProcAddress(h, "gpg_get_error");
+ cpp.gpg_ski = (_gpg_set_keyid ) GetProcAddress(h, "gpg_set_keyid");
+ cpp.gpg_szki = (_gpg_size_keyid ) GetProcAddress(h, "gpg_size_keyid");
+ cpp.gpg_slki = (_gpg_select_keyid ) GetProcAddress(h, "gpg_select_keyid");
+ cpp.gpg_eu = (_gpg_encode ) GetProcAddress(h, "gpg_encode");
+ cpp.gpg_de = (_gpg_decode ) GetProcAddress(h, "gpg_decode");
+ cpp.gpg_gph = (_gpg_get_passphrases ) GetProcAddress(h, "gpg_get_passphrases");
+ cpp.gpg_sph = (_gpg_set_passphrases ) GetProcAddress(h, "gpg_set_passphrases");
+
+ cpp.rsa_i = (_rsa_init) GetProcAddress(h, "rsa_init");
+ cpp.rsa_d = (_rsa_done) GetProcAddress(h, "rsa_done");
+
+ return (cpp_get_version()>=0x01000403);
+}
+
+// EOF
diff --git a/secureim/loadlib.h b/secureim/loadlib.h new file mode 100644 index 0000000..105f441 --- /dev/null +++ b/secureim/loadlib.h @@ -0,0 +1,188 @@ +#ifndef __LOADLIB_H__
+#define __LOADLIB_H__
+
+#include <windows.h>
+#include "cryptopp.h"
+
+BOOL loadlib(void);
+
+typedef HANDLE (__cdecl * _cpp_create_context) (int);
+typedef void (__cdecl * _cpp_delete_context) (HANDLE);
+typedef void (__cdecl * _cpp_reset_context) (HANDLE);
+typedef LPSTR (__cdecl * _cpp_init_keya) (HANDLE,int);
+typedef int (__cdecl * _cpp_init_keyb) (HANDLE,LPCSTR);
+typedef int (__cdecl * _cpp_calc_keyx) (HANDLE);
+typedef int (__cdecl * _cpp_init_keyp) (HANDLE,LPCSTR);
+typedef LPSTR (__cdecl * _cpp_encodeA) (HANDLE,LPCSTR);
+typedef LPSTR (__cdecl * _cpp_encodeW) (HANDLE,LPWSTR);
+typedef LPSTR (__cdecl * _cpp_encodeU) (HANDLE,LPCSTR);
+typedef LPSTR (__cdecl * _cpp_decode) (HANDLE,LPCSTR);
+typedef LPSTR (__cdecl * _cpp_decodeU) (HANDLE,LPCSTR);
+typedef int (__cdecl * _cpp_encrypt_file) (HANDLE,LPCSTR,LPCSTR);
+typedef int (__cdecl * _cpp_decrypt_file) (HANDLE,LPCSTR,LPCSTR);
+typedef int (__cdecl * _cpp_get_features) (HANDLE);
+typedef int (__cdecl * _cpp_get_error) (HANDLE);
+typedef int (__cdecl * _cpp_get_version) (void);
+typedef int (__cdecl * _cpp_size_keyx) (void);
+typedef void (__cdecl * _cpp_get_keyx) (HANDLE,BYTE*);
+typedef void (__cdecl * _cpp_set_keyx) (HANDLE,BYTE*);
+typedef int (__cdecl * _cpp_size_keyp) (void);
+typedef void (__cdecl * _cpp_get_keyp) (HANDLE,BYTE*);
+typedef void (__cdecl * _cpp_set_keyp) (HANDLE,BYTE*);
+typedef int (__cdecl * _cpp_keya) (HANDLE);
+typedef int (__cdecl * _cpp_keyb) (HANDLE);
+typedef int (__cdecl * _cpp_keyx) (HANDLE);
+typedef int (__cdecl * _cpp_keyp) (HANDLE);
+
+typedef int (__cdecl * _pgp_init) (void);
+typedef int (__cdecl * _pgp_done) (void);
+typedef int (__cdecl * _pgp_open_keyrings) (LPSTR,LPSTR);
+typedef int (__cdecl * _pgp_close_keyrings) (void);
+typedef int (__cdecl * _pgp_get_version) (void);
+typedef LPSTR (__cdecl * _pgp_get_error) (void);
+typedef int (__cdecl * _pgp_set_priv_key) (LPCSTR);
+typedef int (__cdecl * _pgp_set_key) (HANDLE,LPCSTR);
+typedef int (__cdecl * _pgp_set_keyid) (HANDLE,PVOID);
+typedef int (__cdecl * _pgp_size_keyid) (void);
+typedef PVOID (__cdecl * _pgp_select_keyid) (HWND,LPSTR);
+typedef LPSTR (__cdecl * _pgp_encode) (HANDLE,LPCSTR);
+typedef LPSTR (__cdecl * _pgp_decode) (HANDLE,LPCSTR);
+
+typedef int (__cdecl * _gpg_init) (void);
+typedef int (__cdecl * _gpg_done) (void);
+typedef int (__cdecl * _gpg_open_keyrings) (LPSTR,LPSTR);
+typedef int (__cdecl * _gpg_close_keyrings) (void);
+typedef void (__cdecl * _gpg_set_log) (LPCSTR);
+typedef void (__cdecl * _gpg_set_tmp) (LPCSTR);
+typedef LPSTR (__cdecl * _gpg_get_error) (void);
+typedef int (__cdecl * _gpg_set_keyid) (HANDLE,LPCSTR);
+typedef int (__cdecl * _gpg_size_keyid) (void);
+typedef int (__cdecl * _gpg_select_keyid) (HWND,LPSTR);
+typedef LPSTR (__cdecl * _gpg_encode) (HANDLE,LPCSTR);
+typedef LPSTR (__cdecl * _gpg_decode) (HANDLE,LPCSTR);
+typedef LPSTR (__cdecl * _gpg_get_passphrases) (void);
+typedef void (__cdecl * _gpg_set_passphrases) (LPCSTR);
+
+typedef int (__cdecl * _rsa_init) (pRSA_EXPORT*,pRSA_IMPORT);
+typedef int (__cdecl * _rsa_done) (void);
+
+
+typedef struct {
+ _cpp_create_context cc;
+ _cpp_delete_context dc;
+ _cpp_reset_context rc;
+ _cpp_init_keya ika;
+ _cpp_init_keyb ikb;
+ _cpp_calc_keyx ckx;
+ _cpp_init_keyp ikp;
+ _cpp_encodeA ea;
+ _cpp_encodeW ew;
+ _cpp_encodeU eu;
+ _cpp_decode daw;
+ _cpp_decodeU du;
+ _cpp_encrypt_file ef;
+ _cpp_decrypt_file df;
+ _cpp_get_features gf;
+ _cpp_get_error ge;
+ _cpp_get_version gv;
+ _cpp_size_keyx kxs;
+ _cpp_get_keyx gkx;
+ _cpp_set_keyx skx;
+ _cpp_size_keyp kps;
+ _cpp_get_keyp gkp;
+ _cpp_set_keyp skp;
+ _cpp_keya ka;
+ _cpp_keyb kb;
+ _cpp_keyx kx;
+ _cpp_keyp kp;
+ _pgp_init pgp_i;
+ _pgp_done pgp_d;
+ _pgp_open_keyrings pgp_ok;
+ _pgp_close_keyrings pgp_ck;
+ _pgp_get_version pgp_gv;
+ _pgp_get_error pgp_ge;
+ _pgp_set_keyid pgp_ski;
+ _pgp_set_key pgp_sk;
+ _pgp_set_priv_key pgp_spk;
+ _pgp_size_keyid pgp_szki;
+ _pgp_select_keyid pgp_slki;
+ _pgp_encode pgp_eu;
+ _pgp_decode pgp_de;
+ _gpg_init gpg_i;
+ _gpg_done gpg_d;
+ _gpg_open_keyrings gpg_ok;
+ _gpg_close_keyrings gpg_ck;
+ _gpg_set_log gpg_sl;
+ _gpg_set_tmp gpg_st;
+ _gpg_get_error gpg_ge;
+ _gpg_set_keyid gpg_ski;
+ _gpg_size_keyid gpg_szki;
+ _gpg_select_keyid gpg_slki;
+ _gpg_encode gpg_eu;
+ _gpg_decode gpg_de;
+ _gpg_get_passphrases gpg_gph;
+ _gpg_set_passphrases gpg_sph;
+ _rsa_init rsa_i;
+ _rsa_done rsa_d;
+} CRYPTOPP_INFO;
+
+extern CRYPTOPP_INFO cpp;
+
+#define cpp_create_context cpp.cc
+#define cpp_delete_context cpp.dc
+#define cpp_reset_context cpp.rc
+#define cpp_init_keya cpp.ika
+#define cpp_init_keyb cpp.ikb
+#define cpp_calc_keyx cpp.ckx
+#define cpp_init_keyp cpp.ikp
+#define cpp_encodeA cpp.ea
+#define cpp_encodeW cpp.ew
+#define cpp_encodeU cpp.eu
+#define cpp_decode cpp.daw
+#define cpp_decodeU cpp.du
+#define cpp_encrypt_file cpp.ef
+#define cpp_decrypt_file cpp.df
+#define cpp_get_features cpp.gf
+#define cpp_get_error cpp.ge
+#define cpp_get_version cpp.gv
+#define cpp_size_keyx cpp.kxs
+#define cpp_get_keyx cpp.gkx
+#define cpp_set_keyx cpp.skx
+#define cpp_size_keyp cpp.kps
+#define cpp_get_keyp cpp.gkp
+#define cpp_set_keyp cpp.skp
+#define cpp_keya cpp.ka
+#define cpp_keyb cpp.kb
+#define cpp_keyx cpp.kx
+#define cpp_keyp cpp.kp
+#define pgp_init cpp.pgp_i
+#define pgp_done cpp.pgp_d
+#define pgp_open_keyrings cpp.pgp_ok
+#define pgp_close_keyrings cpp.pgp_ck
+#define pgp_get_version cpp.pgp_gv
+#define pgp_get_error cpp.pgp_ge
+#define pgp_set_priv_key cpp.pgp_spk
+#define pgp_set_key cpp.pgp_sk
+#define pgp_set_keyid cpp.pgp_ski
+#define pgp_size_keyid cpp.pgp_szki
+#define pgp_select_keyid cpp.pgp_slki
+#define pgp_encode cpp.pgp_eu
+#define pgp_decode cpp.pgp_de
+#define gpg_init cpp.gpg_i
+#define gpg_done cpp.gpg_d
+#define gpg_open_keyrings cpp.gpg_ok
+#define gpg_close_keyrings cpp.gpg_ck
+#define gpg_set_log cpp.gpg_sl
+#define gpg_set_tmp cpp.gpg_st
+#define gpg_get_error cpp.gpg_ge
+#define gpg_set_keyid cpp.gpg_ski
+#define gpg_size_keyid cpp.gpg_szki
+#define gpg_select_keyid cpp.gpg_slki
+#define gpg_encode cpp.gpg_eu
+#define gpg_decode cpp.gpg_de
+#define gpg_get_passphrases cpp.gpg_gph
+#define gpg_set_passphrases cpp.gpg_sph
+#define rsa_init cpp.rsa_i
+#define rsa_done cpp.rsa_d
+
+#endif
diff --git a/secureim/main.cpp b/secureim/main.cpp new file mode 100644 index 0000000..00844d8 --- /dev/null +++ b/secureim/main.cpp @@ -0,0 +1,547 @@ +#include "commonheaders.h"
+
+extern "C" BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID) {
+ g_hInst = hInst;
+ if (dwReason == DLL_PROCESS_ATTACH) {
+ INITCOMMONCONTROLSEX icce = {
+ sizeof(icce), ICC_LISTVIEW_CLASSES | ICC_TAB_CLASSES
+ };
+ InitCommonControlsEx(&icce);
+ }
+ return TRUE;
+}
+
+
+PLUGININFO *MirandaPluginInfo(DWORD mirandaVersion) {
+ return &pluginInfo;
+}
+
+
+PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) {
+ return &pluginInfoEx;
+}
+
+
+MUUID* MirandaPluginInterfaces(void) {
+ return interfaces;
+}
+
+
+void AddServiceFunction(LPCSTR serviceName, MIRANDASERVICE serviceFunction) {
+
+ g_hService = (HANDLE*) mir_realloc(g_hService,sizeof(HANDLE)*(iService+1));
+ g_hService[iService] = CreateServiceFunction(serviceName, serviceFunction);
+ iService++;
+}
+
+
+void AddProtoServiceFunction(LPCSTR serviceName, MIRANDASERVICE serviceFunction) {
+
+ g_hService = (HANDLE*) mir_realloc(g_hService,sizeof(HANDLE)*(iService+1));
+ g_hService[iService] = CreateProtoServiceFunction(szModuleName, serviceName, serviceFunction);
+ iService++;
+}
+
+
+void AddHookFunction(LPCSTR eventName, MIRANDAHOOK hookFunction) {
+
+ g_hHook = (HANDLE*) mir_realloc(g_hHook,sizeof(HANDLE)*(iHook+1));
+ g_hHook[iHook] = HookEvent(eventName, hookFunction);
+ iHook++;
+}
+
+
+HANDLE AddMenuItem(LPCSTR name,int pos,HICON hicon,LPCSTR service,int flags=0,WPARAM wParam=0) {
+
+ CLISTMENUITEM mi;
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.flags=flags | CMIF_HIDDEN;
+ mi.position=pos;
+ mi.hIcon=hicon;
+ mi.pszName=Translate(name);
+ mi.pszPopupName=(char*)-1;
+ mi.pszService=(char*)service;
+ return((HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,wParam,(LPARAM)&mi));
+}
+
+
+HANDLE AddSubItem(HANDLE rootid,LPCSTR name,int pos,int poppos,LPCSTR service,WPARAM wParam=0) {
+
+ CLISTMENUITEM mi;
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.flags=CMIF_CHILDPOPUP | CMIF_HIDDEN;
+ mi.position=pos;
+ mi.popupPosition=poppos;
+ mi.hIcon=NULL;
+ mi.pszName=Translate(name);
+ mi.pszPopupName=(char*)rootid;
+ mi.pszService=(char*)service;
+ return((HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,wParam,(LPARAM)&mi));
+}
+
+
+int __cdecl Load(PLUGINLINK *link) {
+
+ pluginLink = link;
+ DisableThreadLibraryCalls(g_hInst);
+ InitializeCriticalSection(&localQueueMutex);
+
+ {
+ char temp[MAX_PATH];
+ GetTempPath(sizeof(temp),temp);
+ GetLongPathName(temp,TEMP,sizeof(TEMP));
+ TEMP_SIZE = strlen(TEMP);
+ if(TEMP[TEMP_SIZE-1]=='\\') {
+ TEMP_SIZE--;
+ TEMP[TEMP_SIZE]='\0';
+ }
+ }
+
+ // get memoryManagerInterface address
+ mir_getMMI( &mmi );
+
+ // check for support TrueColor Icons
+ BOOL bIsComCtl6 = FALSE;
+ HMODULE hComCtlDll = LoadLibrary("comctl32.dll");
+ if ( hComCtlDll ) {
+ typedef HRESULT (CALLBACK *PFNDLLGETVERSION)(DLLVERSIONINFO*);
+ PFNDLLGETVERSION pfnDllGetVersion = (PFNDLLGETVERSION) GetProcAddress(hComCtlDll,"DllGetVersion");
+ if ( pfnDllGetVersion ) {
+ DLLVERSIONINFO dvi;
+ memset(&dvi,0,sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+ HRESULT hRes = (*pfnDllGetVersion)( &dvi );
+ if ( SUCCEEDED(hRes) && dvi.dwMajorVersion >= 6 ) {
+ bIsComCtl6 = TRUE;
+ }
+ }
+ FreeLibrary(hComCtlDll);
+ }
+ if (bIsComCtl6) iBmpDepth = ILC_COLOR32 | ILC_MASK; // 32-bit images are supported
+ else iBmpDepth = ILC_COLOR24 | ILC_MASK;
+
+// iBmpDepth = ILC_COLOR32 | ILC_MASK;
+
+ char version[512];
+ CallService(MS_SYSTEM_GETVERSIONTEXT, sizeof(version), (LPARAM)&version);
+ bCoreUnicode = strstr(version, "Unicode")!=0;
+ iCoreVersion = CallService(MS_SYSTEM_GETVERSION,0,0);
+
+ // load crypo++ dll
+ if( !loadlib() ) {
+ msgbox1(0,sim107,szModuleName,MB_OK|MB_ICONSTOP);
+ return 1;
+ }
+
+ load_rtfconv();
+
+ // register plugin module
+ PROTOCOLDESCRIPTOR pd;
+ memset(&pd,0,sizeof(pd));
+ pd.cbSize = sizeof(pd);
+ pd.szName = (char*)szModuleName;
+ pd.type = PROTOTYPE_ENCRYPTION;
+ CallService(MS_PROTO_REGISTERMODULE, 0, (LPARAM)&pd);
+
+ // hook events
+ AddHookFunction(ME_SYSTEM_MODULESLOADED, onModulesLoaded);
+ AddHookFunction(ME_SYSTEM_OKTOEXIT, onSystemOKToExit);
+
+ g_hEvent[0] = CreateHookableEvent(MODULENAME"/Disabled");
+ g_hEvent[1] = CreateHookableEvent(MODULENAME"/Established");
+
+ AddServiceFunction((LPCSTR)MODULENAME"/IsContactSecured",(MIRANDASERVICE)Service_IsContactSecured);
+ AddServiceFunction((LPCSTR)MODULENAME"/SIM_EST",(MIRANDASERVICE)Service_CreateIM);
+ AddServiceFunction((LPCSTR)MODULENAME"/SIM_DIS",(MIRANDASERVICE)Service_DisableIM);
+ AddServiceFunction((LPCSTR)MODULENAME"/SIM_ST_DIS",(MIRANDASERVICE)Service_StatusDis);
+ AddServiceFunction((LPCSTR)MODULENAME"/SIM_ST_ENA",(MIRANDASERVICE)Service_StatusEna);
+ AddServiceFunction((LPCSTR)MODULENAME"/SIM_ST_TRY",(MIRANDASERVICE)Service_StatusTry);
+ AddServiceFunction((LPCSTR)MODULENAME"/PGP_SET",(MIRANDASERVICE)Service_PGPsetKey);
+ AddServiceFunction((LPCSTR)MODULENAME"/PGP_DEL",(MIRANDASERVICE)Service_PGPdelKey);
+ AddServiceFunction((LPCSTR)MODULENAME"/GPG_SET",(MIRANDASERVICE)Service_GPGsetKey);
+ AddServiceFunction((LPCSTR)MODULENAME"/GPG_DEL",(MIRANDASERVICE)Service_GPGdelKey);
+ AddServiceFunction((LPCSTR)MODULENAME"/MODE_NAT",(MIRANDASERVICE)Service_ModeNative);
+ AddServiceFunction((LPCSTR)MODULENAME"/MODE_PGP",(MIRANDASERVICE)Service_ModePGP);
+ AddServiceFunction((LPCSTR)MODULENAME"/MODE_GPG",(MIRANDASERVICE)Service_ModeGPG);
+ AddServiceFunction((LPCSTR)MODULENAME"/MODE_RSA",(MIRANDASERVICE)Service_ModeRSAAES);
+
+ return 0;
+}
+
+
+int __cdecl Unload() {
+ DeleteCriticalSection(&localQueueMutex);
+ return 0;
+}
+
+
+int __cdecl onModulesLoaded(WPARAM wParam,LPARAM lParam) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ InitNetlib();
+ Sent_NetLog("onModuleLoaded begin");
+#endif
+
+ bMetaContacts = ServiceExists(MS_MC_GETMETACONTACT)!=0;
+ bPopupExists = ServiceExists(MS_POPUP_ADDPOPUPEX)!=0;
+ bPopupUnicode = ServiceExists(MS_POPUP_ADDPOPUPW)!=0;
+
+ g_hFolders = FoldersRegisterCustomPath(szModuleName, "Icons", MIRANDA_PATH"\\icons");
+ if( g_hFolders==(HANDLE)CALLSERVICE_NOTFOUND ) g_hFolders = 0;
+
+ InitIcons();
+ GetFlags();
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("rsa_init");
+#endif
+ { // RSA/AES
+ rsa_init(&exp,&imp);
+
+ DBVARIANT dbv;
+ dbv.type = DBVT_BLOB;
+
+ if( DBGetContactSetting(0,szModuleName,"rsa_priv",&dbv) == 0 ) {
+ exp->rsa_set_keypair(CPP_MODE_RSA_4096,dbv.pbVal,dbv.cpbVal);
+ DBFreeVariant(&dbv);
+ rsa_4096=1;
+ }
+ else
+ if( DBGetContactSetting(0,szModuleName,"rsa_priv_4096",&dbv) == 0 ) {
+ exp->rsa_set_keypair(CPP_MODE_RSA_4096|CPP_MODE_RSA_BER,dbv.pbVal,dbv.cpbVal);
+ DBFreeVariant(&dbv);
+
+ char priv_key[4096]; int priv_len;
+ char pub_key[4096]; int pub_len;
+
+ DBCONTACTWRITESETTING cws;
+ cws.szModule = szModuleName;
+ cws.value.type = DBVT_BLOB;
+
+ exp->rsa_get_keypair(CPP_MODE_RSA_4096,(PBYTE)&priv_key,&priv_len,(PBYTE)&pub_key,&pub_len);
+
+ cws.szSetting = "rsa_priv";
+ cws.value.pbVal = (PBYTE)&priv_key;
+ cws.value.cpbVal = priv_len;
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)0, (LPARAM)&cws);
+
+ cws.szSetting = "rsa_pub";
+ cws.value.pbVal = (PBYTE)&pub_key;
+ cws.value.cpbVal = pub_len;
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)0, (LPARAM)&cws);
+
+ DBDeleteContactSetting(0, szModuleName, "rsa_priv_2048");
+ DBDeleteContactSetting(0, szModuleName, "rsa_pub_2048");
+// DBDeleteContactSetting(0, szModuleName, "rsa_priv_4096");
+// DBDeleteContactSetting(0, szModuleName, "rsa_pub_4096");
+
+ rsa_4096=1;
+ }
+
+ if( !rsa_4096 ) {
+ unsigned int tID;
+ CloseHandle( (HANDLE) _beginthreadex(NULL, 0, sttGenerateRSA, NULL, 0, &tID) );
+ }
+
+ exp->rsa_set_timeout( DBGetContactSettingWord(0,szModuleName,"ket",10) );
+ }
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("pgp_init");
+#endif
+ bPGP = DBGetContactSettingByte(0, szModuleName, "pgp", 0);
+ if(bPGP) { //PGP
+ bPGPloaded = pgp_init();
+ bUseKeyrings = DBGetContactSettingByte(0,szModuleName,"ukr",1);
+ LPSTR priv = myDBGetStringDecode(0,szModuleName,"pgpPrivKey");
+ if(priv) {
+ bPGPprivkey = true;
+ if(bPGPloaded)
+ pgp_set_priv_key(priv);
+ mir_free(priv);
+ }// if(priv)
+ if(bPGPloaded && bUseKeyrings) {
+ char PubRingPath[MAX_PATH], SecRingPath[MAX_PATH];
+ PubRingPath[0]='\0'; SecRingPath[0]='\0';
+ if(pgp_get_version()<0x02000000) { // 6xx
+ bPGPkeyrings = pgp_open_keyrings(PubRingPath,SecRingPath);
+ }
+ else {
+ LPSTR tmp;
+ tmp = myDBGetString(0,szModuleName,"pgpPubRing");
+ if(tmp) {
+ strncpy(PubRingPath,tmp,sizeof(PubRingPath));
+ mir_free(tmp);
+ }
+ tmp = myDBGetString(0,szModuleName,"pgpSecRing");
+ if(tmp) {
+ strncpy(SecRingPath,tmp,sizeof(SecRingPath));
+ mir_free(tmp);
+ }
+ if(PubRingPath[0] && SecRingPath[0]) {
+ bPGPkeyrings = pgp_open_keyrings(PubRingPath,SecRingPath);
+ if(bPGPkeyrings) {
+ DBWriteContactSettingString(0,szModuleName,"pgpPubRing",PubRingPath);
+ DBWriteContactSettingString(0,szModuleName,"pgpSecRing",SecRingPath);
+ }
+ else {
+ DBDeleteContactSetting(0, szModuleName, "pgpPubRing");
+ DBDeleteContactSetting(0, szModuleName, "pgpSecRing");
+ }
+ }
+ }
+ }// if(bPGPloaded && bUseKeyrings)
+ }// if(bPGP)
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("gpg_init");
+#endif
+ bGPG = DBGetContactSettingByte(0, szModuleName, "gpg", 0);
+ if(bGPG) { //GPG
+
+ LPSTR tmp;
+
+ bGPGloaded = gpg_init();
+
+ char gpgexec[MAX_PATH], gpghome[MAX_PATH];
+ gpgexec[0]='\0'; gpghome[0]='\0';
+
+ tmp = myDBGetString(0,szModuleName,"gpgExec");
+ if(tmp) {
+ strncpy(gpgexec,tmp,sizeof(gpgexec));
+ mir_free(tmp);
+ }
+ tmp = myDBGetString(0,szModuleName,"gpgHome");
+ if(tmp) {
+ strncpy(gpghome,tmp,sizeof(gpghome));
+ mir_free(tmp);
+ }
+
+ if(DBGetContactSettingByte(0, szModuleName, "gpgLogFlag",0)) {
+ tmp = myDBGetString(0,szModuleName,"gpgLog");
+ if(tmp) {
+ gpg_set_log(tmp);
+ mir_free(tmp);
+ }
+ }
+
+ if(DBGetContactSettingByte(0, szModuleName, "gpgTmpFlag",0)) {
+ tmp = myDBGetString(0,szModuleName,"gpgTmp");
+ if(tmp) {
+ gpg_set_tmp(tmp);
+ mir_free(tmp);
+ }
+ }
+
+ bGPGkeyrings = gpg_open_keyrings(gpgexec,gpghome);
+ if(bGPGkeyrings) {
+ DBWriteContactSettingString(0,szModuleName,"gpgExec",gpgexec);
+ DBWriteContactSettingString(0,szModuleName,"gpgHome",gpghome);
+ }
+ else {
+ DBDeleteContactSetting(0, szModuleName, "gpgExec");
+ DBDeleteContactSetting(0, szModuleName, "gpgHome");
+ }
+
+ bSavePass = DBGetContactSettingByte(0,szModuleName,"gpgSaveFlag",0);
+ if(bSavePass) {
+ tmp = myDBGetString(0,szModuleName,"gpgSave");
+ if(tmp) {
+ gpg_set_passphrases(tmp);
+ mir_free(tmp);
+ }
+ }
+ }
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("loadContactList");
+#endif
+ loadContactList();
+
+ // add new skin sound
+ SkinAddNewSound("IncomingSecureMessage","Incoming Secure Message","Sounds\\iSecureMessage.wav");
+ SkinAddNewSound("OutgoingSecureMessage","Outgoing Secure Message","Sounds\\oSecureMessage.wav");
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("init extra icons");
+#endif
+ // init extra icons
+ for(int i=0;i<1+MODE_CNT*IEC_CNT;i++) {
+ g_IEC[i].cbSize = sizeof(g_IEC[i]);
+ g_IEC[i].ColumnType = bADV;
+ g_IEC[i].hImage = (HANDLE)-1;
+ }
+
+ // build extra imagelist
+ //onExtraImageListRebuilding(0,0);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("hook events");
+#endif
+ AddHookFunction(ME_CLIST_PREBUILDCONTACTMENU, onRebuildContactMenu);
+// g_hMC = HookEvent(ME_MC_SUBCONTACTSCHANGED, onMC);
+
+ if( ServiceExists(MS_EXTRAICON_REGISTER) ) {
+ g_hCLIcon = ExtraIcon_Register(szModuleName, Translate("SecureIM status"), "sim_cm_est",
+ (MIRANDAHOOK)onExtraImageListRebuilding,
+ (MIRANDAHOOK)onExtraImageApplying);
+ }
+ else {
+ AddHookFunction(ME_CLIST_EXTRA_LIST_REBUILD, onExtraImageListRebuilding);
+ AddHookFunction(ME_CLIST_EXTRA_IMAGE_APPLY, onExtraImageApplying);
+ }
+
+ // hook init options
+ AddHookFunction(ME_OPT_INITIALISE, onRegisterOptions);
+ if(bPopupExists)
+ AddHookFunction(ME_OPT_INITIALISE, onRegisterPopOptions);
+ AddHookFunction(ME_PROTO_ACK, onProtoAck);
+ AddHookFunction(ME_DB_CONTACT_SETTINGCHANGED, onContactSettingChanged);
+ AddHookFunction(ME_DB_CONTACT_ADDED, onContactAdded);
+ AddHookFunction(ME_DB_CONTACT_DELETED, onContactDeleted);
+
+ // hook message transport
+ AddProtoServiceFunction(PSR_MESSAGE, onRecvMsg);
+ AddProtoServiceFunction(PSS_MESSAGE, (MIRANDASERVICE)onSendMsg);
+ AddProtoServiceFunction(PSS_MESSAGE"W", (MIRANDASERVICE)onSendMsgW);
+ AddProtoServiceFunction(PSS_FILE, (MIRANDASERVICE)onSendFile);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("create Native/RSA menu");
+#endif
+ // create a menu item for creating a secure im connection to the user.
+ g_hMenu[0] = AddMenuItem(sim301,110000,g_hICO[ICO_CM_EST],MODULENAME"/SIM_EST",CMIF_NOTOFFLINE);
+ g_hMenu[1] = AddMenuItem(sim302,110001,g_hICO[ICO_CM_DIS],MODULENAME"/SIM_DIS",CMIF_NOTOFFLINE);
+
+ if(ServiceExists(MS_CLIST_ADDSUBGROUPMENUITEM)) {
+ g_hMenu[2] = AddMenuItem(sim312[0],110002,NULL,NULL,CMIF_ROOTPOPUP);
+ g_hMenu[3] = AddSubItem(g_hMenu[2],sim232[0],110003,110002,MODULENAME"/SIM_ST_DIS");
+ g_hMenu[4] = AddSubItem(g_hMenu[2],sim232[1],110004,110002,MODULENAME"/SIM_ST_ENA");
+ g_hMenu[5] = AddSubItem(g_hMenu[2],sim232[2],110005,110002,MODULENAME"/SIM_ST_TRY");
+ }
+ else {
+ g_hMenu[2] = 0;
+ g_hMenu[3] = AddMenuItem(sim232[0],110003,NULL,MODULENAME"/SIM_ST_DIS");
+ g_hMenu[4] = AddMenuItem(sim232[1],110004,NULL,MODULENAME"/SIM_ST_ENA");
+ g_hMenu[5] = AddMenuItem(sim232[2],110005,NULL,MODULENAME"/SIM_ST_TRY");
+ }
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("create PGP/GPG menu");
+#endif
+ HICON icon;
+ if( bPGPloaded ) {
+ icon=mode2icon(MODE_PGP|SECURED,2);
+ g_hMenu[6] = AddMenuItem(sim306,110006,icon,MODULENAME"/PGP_SET",0);
+ icon=mode2icon(MODE_PGP,2);
+ g_hMenu[7] = AddMenuItem(sim307,110007,icon,MODULENAME"/PGP_DEL",0);
+ }
+
+ if(bGPGloaded) {
+ icon=mode2icon(MODE_GPG|SECURED,2);
+ g_hMenu[8] = AddMenuItem(sim308,110008,icon,MODULENAME"/GPG_SET",0);
+ icon=mode2icon(MODE_GPG,2);
+ g_hMenu[9] = AddMenuItem(sim309,110009,icon,MODULENAME"/GPG_DEL",0);
+ }
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("create Mode menu");
+#endif
+ if(ServiceExists(MS_CLIST_ADDSUBGROUPMENUITEM)) {
+ g_hMenu[10] = AddMenuItem(sim311[0],110010,NULL,NULL,CMIF_ROOTPOPUP);
+ g_hMenu[11] = AddSubItem(g_hMenu[10],sim231[0],110011,110010,MODULENAME"/MODE_NAT");
+ g_hMenu[12] = AddSubItem(g_hMenu[10],sim231[1],110012,110010,MODULENAME"/MODE_PGP");
+ g_hMenu[13] = AddSubItem(g_hMenu[10],sim231[2],110013,110010,MODULENAME"/MODE_GPG");
+ g_hMenu[14] = AddSubItem(g_hMenu[10],sim231[3],110014,110010,MODULENAME"/MODE_RSA");
+ }
+ else {
+ g_hMenu[10] = 0;
+ g_hMenu[11] = AddMenuItem(sim231[0],110011,NULL,MODULENAME"/MODE_NAT");
+ g_hMenu[12] = AddMenuItem(sim231[1],110012,NULL,MODULENAME"/MODE_PGP");
+ g_hMenu[13] = AddMenuItem(sim231[2],110013,NULL,MODULENAME"/MODE_GPG");
+ g_hMenu[14] = AddMenuItem(sim231[3],110014,NULL,MODULENAME"/MODE_RSA");
+ }
+
+ // updater plugin support
+ if(ServiceExists(MS_UPDATE_REGISTERFL)) {
+ CallService(MS_UPDATE_REGISTERFL, (WPARAM)2445, (LPARAM)&pluginInfo);
+ }
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("create srmm icons");
+#endif
+ // add icon to srmm status icons
+ if(ServiceExists(MS_MSG_ADDICON)) {
+
+ StatusIconData sid;
+ memset(&sid,0,sizeof(sid));
+ sid.cbSize = sizeof(sid);
+ sid.szModule = (char*)szModuleName;
+ sid.flags = MBF_DISABLED|MBF_HIDDEN;
+ // Native
+ sid.dwId = MODE_NATIVE;
+ sid.hIcon = mode2icon(MODE_NATIVE|SECURED,3);
+ sid.hIconDisabled = mode2icon(MODE_NATIVE,3);
+ sid.szTooltip = Translate("SecureIM [Native]");
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+ // PGP
+ sid.dwId = MODE_PGP;
+ sid.hIcon = mode2icon(MODE_PGP|SECURED,3);
+ sid.hIconDisabled = mode2icon(MODE_PGP,3);
+ sid.szTooltip = Translate("SecureIM [PGP]");
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+ // GPG
+ sid.dwId = MODE_GPG;
+ sid.hIcon = mode2icon(MODE_GPG|SECURED,3);
+ sid.hIconDisabled = mode2icon(MODE_GPG,3);
+ sid.szTooltip = Translate("SecureIM [GPG]");
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+ // RSAAES
+ sid.dwId = MODE_RSAAES;
+ sid.hIcon = mode2icon(MODE_RSAAES|SECURED,3);
+ sid.hIconDisabled = mode2icon(MODE_RSAAES,3);
+ sid.szTooltip = Translate("SecureIM [RSA/AES]");
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+
+ // hook the window events so that we can can change the status of the icon
+ AddHookFunction(ME_MSG_WINDOWEVENT, onWindowEvent);
+ AddHookFunction(ME_MSG_ICONPRESSED, onIconPressed);
+ }
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onModuleLoaded end");
+#endif
+ return 0;
+}
+
+
+int __cdecl onSystemOKToExit(WPARAM wParam,LPARAM lParam) {
+
+ if(bSavePass) {
+ LPSTR tmp = gpg_get_passphrases();
+ DBWriteContactSettingString(0,szModuleName,"gpgSave",tmp);
+ LocalFree(tmp);
+ }
+ else {
+ DBDeleteContactSetting(0,szModuleName,"gpgSave");
+ }
+ if(bPGPloaded) pgp_done();
+ if(bGPGloaded) gpg_done();
+ rsa_done();
+ while(iHook--) UnhookEvent(g_hHook[iHook]);
+ mir_free(g_hHook);
+ while(iService--) DestroyServiceFunction(g_hService[iService]);
+ mir_free(g_hService);
+ DestroyHookableEvent(g_hEvent[0]);
+ DestroyHookableEvent(g_hEvent[1]);
+ freeContactList();
+ free_rtfconv();
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ DeinitNetlib();
+#endif
+ return 0;
+}
+
+// EOF
diff --git a/secureim/mmi.cpp b/secureim/mmi.cpp new file mode 100644 index 0000000..c84384e --- /dev/null +++ b/secureim/mmi.cpp @@ -0,0 +1,155 @@ +#include "commonheaders.h"
+
+
+void *operator new(size_t sz) {
+ return mir_alloc(sz);
+}
+
+
+void *operator new[](size_t size) {
+ return operator new(size);
+}
+
+
+void operator delete(void *p) {
+ mir_free(p);
+}
+
+
+void operator delete[](void * p) {
+ operator delete(p);
+}
+
+
+// ANSIzUCS2z + ANSIzUCS2z = ANSIzUCS2z
+char *m_wwstrcat(LPCSTR strA, LPCSTR strB) {
+ int lenA = strlen(strA);
+ int lenB = strlen(strB);
+ LPSTR str = (LPSTR)mir_alloc((lenA+lenB+1)*(sizeof(WCHAR)+1));
+ memcpy(str, strA, lenA);
+ memcpy(str+lenA, strB, lenB+1);
+ memcpy(str+lenA+lenB+1, strA+lenA+1, lenA*sizeof(WCHAR));
+ memcpy(str+lenA+lenB+1+lenA*sizeof(WCHAR), strB+lenB+1, (lenB+1)*sizeof(WCHAR));
+ return str;
+}
+
+
+// ANSIz + ANSIzUCS2z = ANSIzUCS2z
+char *m_awstrcat(LPCSTR strA, LPCSTR strB) {
+ int lenA = strlen(strA);
+ LPSTR tmpA = (LPSTR)mir_alloc((lenA+1)*(sizeof(WCHAR)+1));
+ strcpy(tmpA, strA);
+ MultiByteToWideChar(CP_ACP, 0, strA, -1, (LPWSTR)(tmpA+lenA+1), (lenA+1)*sizeof(WCHAR));
+ LPSTR str = m_wwstrcat(tmpA, strB);
+ mir_free(tmpA);
+ return str;
+}
+
+
+// ANSIz + ANSIz = ANSIzUCS2z
+char *m_aastrcat(LPCSTR strA, LPCSTR strB) {
+ int lenA = strlen(strA);
+ int lenB = strlen(strB);
+ LPSTR str = (LPSTR)mir_alloc((lenA+lenB+1)*(sizeof(WCHAR)+1));
+ strcpy(str,strA);
+ strcat(str,strB);
+ MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)(str+lenA+lenB+1), (lenA+lenB+1)*sizeof(WCHAR));
+ return str;
+}
+
+
+LPSTR m_string = NULL;
+
+// ANSIz + ANSIz = ANSIz
+char *m_ustrcat(LPCSTR strA, LPCSTR strB) {
+ SAFE_FREE(m_string);
+ m_string = (LPSTR) mir_alloc(strlen(strA)+strlen(strB)+1);
+ strcpy(m_string,strA); strcat(m_string,strB);
+ return m_string;
+}
+
+
+LPSTR m_hex = NULL;
+
+LPSTR to_hex(PBYTE bin, int len) {
+ SAFE_FREE(m_hex);
+ m_hex = (LPSTR) mir_alloc(len*3+1);
+ LPSTR m_ptr = m_hex;
+ for( int i=0; i<len; i++ ) {
+ if( i ) {
+ *m_ptr = ' '; m_ptr++;
+ }
+ mir_snprintf(m_ptr,4,"%02X",bin[i]);
+ m_ptr += 2;
+ }
+ *m_ptr = 0;
+ return m_hex;
+}
+
+
+void __fastcall safe_free(void** p)
+{
+ if (*p) {
+ mir_free(*p);
+ *p = NULL;
+ }
+}
+
+
+void __fastcall safe_delete(void** p)
+{
+ if (*p) {
+ delete(*p);
+ *p = NULL;
+ }
+}
+
+
+// ЇаҐ®Ўа §гҐ¬ ⥪бв Ё§ зЁбв®Ј® UTF8 ў д®а¬ в ¬Ёа ¤л
+LPSTR utf8_to_miranda(LPCSTR szUtfMsg, DWORD& flags) {
+ LPSTR szNewMsg;
+ if( iCoreVersion < 0x00060000 ) {
+ flags &= ~(PREF_UTF|PREF_UNICODE);
+ LPWSTR wszMsg = exp->utf8decode(szUtfMsg);
+ LPSTR szMsg = mir_u2a(wszMsg);
+ if( bCoreUnicode ) {
+ flags |= PREF_UNICODE;
+ int olen = wcslen((LPWSTR)wszMsg)+1;
+ int nlen = olen*(sizeof(WCHAR)+1);
+ szNewMsg = (LPSTR) mir_alloc(nlen);
+ memcpy(szNewMsg,szMsg,olen);
+ memcpy(szNewMsg+olen,wszMsg,olen*sizeof(WCHAR));
+ mir_free(szMsg);
+ }
+ else {
+ szNewMsg = szMsg;
+ }
+ }
+ else {
+ flags &= ~PREF_UNICODE; flags |= PREF_UTF;
+ szNewMsg = (LPSTR) mir_strdup(szUtfMsg);
+ }
+ return szNewMsg;
+}
+
+
+// ЇаҐ®Ўа §гҐ¬ ⥪бв Ё§ д®а¬ в ¬Ёа ¤л ў зЁбвл© UTF8
+LPSTR miranda_to_utf8(LPCSTR szMirMsg, DWORD flags) {
+ LPSTR szNewMsg;
+ if(flags & PREF_UTF) {
+ szNewMsg = (LPSTR) szMirMsg;
+ }
+ else
+ if(flags & PREF_UNICODE) {
+ szNewMsg = exp->utf8encode((LPCWSTR)(szMirMsg+strlen(szMirMsg)+1));
+ }
+ else {
+ LPWSTR wszMirMsg = mir_a2u(szMirMsg);
+ szNewMsg = exp->utf8encode((LPCWSTR)wszMirMsg);
+ mir_free(wszMirMsg);
+ }
+ return mir_strdup(szNewMsg);
+}
+
+
+// EOF
diff --git a/secureim/mmi.h b/secureim/mmi.h new file mode 100644 index 0000000..7b3027e --- /dev/null +++ b/secureim/mmi.h @@ -0,0 +1,27 @@ +#ifndef __MMI_H__
+#define __MMI_H__
+
+#include "commonheaders.h"
+
+char *m_wwstrcat(LPCSTR,LPCSTR);
+char *m_awstrcat(LPCSTR,LPCSTR);
+char *m_aastrcat(LPCSTR,LPCSTR);
+char *m_ustrcat(LPCSTR,LPCSTR);
+LPSTR to_hex(PBYTE,int);
+
+LPSTR utf8_to_miranda(LPCSTR,DWORD&);
+LPSTR miranda_to_utf8(LPCSTR,DWORD);
+
+void *operator new(size_t sz);
+void operator delete(void *p);
+void *operator new[](size_t size);
+void operator delete[](void * p);
+
+#define SAFE_INIT(t,p) t p=NULL;
+#define SAFE_FREE(p) safe_free((void **)&(p));
+#define SAFE_DELETE(p) safe_delete((void **)&(p));
+
+void __fastcall safe_free(void** p);
+void __fastcall safe_delete(void** p);
+
+#endif
diff --git a/secureim/options.cpp b/secureim/options.cpp new file mode 100644 index 0000000..e93057d --- /dev/null +++ b/secureim/options.cpp @@ -0,0 +1,1935 @@ +#include "commonheaders.h"
+
+#define PSKSIZE (4096+1)
+#define RSASIZE (4096+1)
+
+BOOL bChangeSortOrder = false;
+const char *szAdvancedIcons[] = {"None", "Email", "Protocol", "SMS", "Advanced 1", "Advanced 2", "Web", "Client", "VisMode", "Advanced 6", "Advanced 7", 0};
+
+
+BOOL hasKey(pUinKey ptr) {
+ BOOL ret = 0;
+ if( ptr->mode==MODE_NATIVE ) {
+ LPSTR str = myDBGetString(ptr->hContact,szModuleName,"PSK");
+ ret = (str!=NULL); SAFE_FREE(str);
+ }
+ else
+ if( ptr->mode==MODE_RSAAES ) {
+ DBVARIANT dbv;
+ dbv.type = DBVT_BLOB;
+ if( DBGetContactSetting(ptr->hContact,szModuleName,"rsa_pub",&dbv) == 0 ) {
+ ret = 1;
+ DBFreeVariant(&dbv);
+ }
+ }
+ return ret;
+}
+
+
+void TC_InsertItem(HWND hwnd, WPARAM wparam, TCITEM *tci) {
+ if( bCoreUnicode ) {
+ LPWSTR tmp = mir_a2u(tci->pszText);
+ tci->pszText = (LPSTR)TranslateW(tmp);
+ SNDMSG(hwnd, TCM_INSERTITEMW, wparam, (LPARAM)tci);
+ mir_free(tmp);
+ }
+ else {
+ tci->pszText = Translate(tci->pszText);
+ SNDMSG(hwnd, TCM_INSERTITEMA, wparam, (LPARAM)tci);
+ }
+}
+
+
+static void LV_InsertColumn(HWND hwnd, WPARAM wparam, LVCOLUMN *lvc) {
+ if( bCoreUnicode ) {
+ LPWSTR tmp = mir_a2u(lvc->pszText);
+ lvc->pszText = (LPSTR)TranslateW(tmp);
+ SNDMSG(hwnd, LVM_INSERTCOLUMNW, wparam, (LPARAM)lvc);
+ mir_free(tmp);
+ }
+ else {
+ lvc->pszText = Translate(lvc->pszText);
+ SNDMSG(hwnd, LVM_INSERTCOLUMNA, wparam, (LPARAM)lvc);
+ }
+}
+
+
+int LV_InsertItem(HWND hwnd, LVITEM *lvi) {
+ return SNDMSG(hwnd, bCoreUnicode ? LVM_INSERTITEMW : LVM_INSERTITEMA, 0, (LPARAM)lvi);
+}
+
+
+int LV_InsertItemA(HWND hwnd, LVITEM *lvi) {
+ if( bCoreUnicode ) lvi->pszText = (LPSTR) mir_a2u(lvi->pszText);
+ int ret = LV_InsertItem(hwnd, lvi);
+ if( bCoreUnicode ) mir_free(lvi->pszText);
+ return ret;
+}
+
+
+void LV_SetItemText(HWND hwnd, WPARAM wparam, int subitem, LPSTR text) {
+ LV_ITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.iSubItem = subitem;
+ lvi.pszText = text;
+ SNDMSG(hwnd, bCoreUnicode ? LVM_SETITEMTEXTW : LVM_SETITEMTEXTA, wparam, (LPARAM)&lvi);
+}
+
+
+void LV_SetItemTextA(HWND hwnd, WPARAM wparam, int subitem, LPSTR text) {
+ if( bCoreUnicode ) text = (LPSTR) mir_a2u(text);
+ LV_SetItemText(hwnd, wparam, subitem, text);
+ if( bCoreUnicode ) mir_free(text);
+}
+
+
+void LV_GetItemTextA(HWND hwnd, WPARAM wparam, int iSubItem, LPSTR text, int cchTextMax) {
+ LV_ITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.iSubItem = iSubItem;
+ lvi.cchTextMax = cchTextMax;
+ lvi.pszText = text;
+ SNDMSG(hwnd, bCoreUnicode ? LVM_GETITEMTEXTW : LVM_GETITEMTEXTA, wparam, (LPARAM)&lvi);
+ if( bCoreUnicode ) {
+ lvi.pszText = mir_u2a((LPWSTR)text);
+ strcpy(text, lvi.pszText);
+ mir_free(lvi.pszText);
+ }
+}
+
+/*
+ * tabbed options dialog
+ */
+
+BOOL CALLBACK OptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
+
+ static int iInit = TRUE;
+ TCITEM tci;
+
+ switch(msg) {
+ case WM_INITDIALOG: {
+ RECT rcClient;
+ GetClientRect(hwnd, &rcClient);
+
+ iInit = TRUE;
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+
+ tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_TAB_GENERAL),hwnd,DlgProcOptionsGeneral);
+ tci.pszText = (LPSTR)sim201;
+ TC_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 0, &tci);
+ MoveWindow((HWND)tci.lParam,5,26,rcClient.right-8,rcClient.bottom-29,1);
+
+ tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_TAB_PROTO),hwnd,DlgProcOptionsProto);
+ tci.pszText = (LPSTR)sim202;
+ TC_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 2, &tci);
+ MoveWindow((HWND)tci.lParam,5,26,rcClient.right-8,rcClient.bottom-29,1);
+ ShowWindow((HWND)tci.lParam, SW_HIDE);
+
+ if(bPGP && bPGPloaded) {
+ tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_TAB_PGP),hwnd,DlgProcOptionsPGP);
+ tci.pszText = (LPSTR)sim214;
+ TC_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 3, &tci);
+ MoveWindow((HWND)tci.lParam,5,26,rcClient.right-8,rcClient.bottom-29,1);
+ ShowWindow((HWND)tci.lParam, SW_HIDE);
+ }
+
+ if(bGPG && bGPGloaded) {
+ tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_TAB_GPG),hwnd,DlgProcOptionsGPG);
+ tci.pszText = (LPSTR)sim226;
+ TC_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 4, &tci);
+ MoveWindow((HWND)tci.lParam,5,26,rcClient.right-8,rcClient.bottom-29,1);
+ ShowWindow((HWND)tci.lParam, SW_HIDE);
+ }
+
+ // add more tabs here if needed
+ // activate the final tab
+ iInit = FALSE;
+ return TRUE;
+ }
+ break;
+
+ case PSM_CHANGED: // used so tabs dont have to call SendMessage(GetParent(GetParent(hwnd)), PSM_CHANGED, 0, 0);
+ if(!iInit)
+ SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_COMMAND: {
+ switch(LOWORD(wParam)) {
+ case ID_UPDATE_CLIST: {
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),0,&tci);
+ SendMessage((HWND)tci.lParam,WM_COMMAND,ID_UPDATE_CLIST,0);
+ }
+ break;
+/* case ID_UPDATE_PROTO: {
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),1,&tci);
+ SendMessage((HWND)tci.lParam,WM_COMMAND,ID_UPDATE_PROTO,0);
+ }
+ break;*/
+ case ID_UPDATE_PLIST: {
+ if( !bPGP ) break;
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),2,&tci);
+ SendMessage((HWND)tci.lParam,WM_COMMAND,ID_UPDATE_CLIST,0);
+ }
+ break;
+ case ID_UPDATE_GLIST: {
+ if( !bGPG ) break;
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),3,&tci);
+ SendMessage((HWND)tci.lParam,WM_COMMAND,ID_UPDATE_GLIST,0);
+ }
+ break;
+ }
+ }
+ break;
+
+ case WM_NOTIFY: {
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0: {
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_APPLY: {
+ tci.mask = TCIF_PARAM;
+ int cnt = TabCtrl_GetItemCount(GetDlgItem(hwnd,IDC_OPTIONSTAB));
+ for (int i=0;i<cnt;i++) {
+ TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),i,&tci);
+ SendMessage((HWND)tci.lParam,WM_NOTIFY,0,lParam);
+ }
+ }
+ break;
+ }
+ } // case 0
+ break;
+
+ case IDC_OPTIONSTAB: {
+ switch (((LPNMHDR)lParam)->code) {
+ case TCN_SELCHANGING: {
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_OPTIONSTAB)),&tci);
+ ShowWindow((HWND)tci.lParam,SW_HIDE);
+ }
+ break;
+ case TCN_SELCHANGE: {
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_OPTIONSTAB)),&tci);
+ ShowWindow((HWND)tci.lParam,SW_SHOW);
+ }
+ break;
+ }
+ } // case IDC_OPTIONSTAB
+ break;
+ }
+ } // case WM_NOTIFY
+ break;
+ }
+ return FALSE;
+}
+
+
+BOOL CALLBACK DlgProcOptionsGeneral(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) {
+
+ static int iInit = TRUE;
+ static HIMAGELIST hLarge, hSmall;
+ int i,idx; pUinKey ptr;
+
+ HWND hLV = GetDlgItem(hDlg,IDC_STD_USERLIST);
+
+ switch (wMsg) {
+ case WM_INITDIALOG: {
+
+ TranslateDialogDefault(hDlg);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("DlgProcOptionsGeneral(WN_INITDIALOG)");
+#endif
+ iInit = TRUE;
+// SendMessage(hLV, WM_SETREDRAW, FALSE, 0);
+ ListView_SetExtendedListViewStyle(hLV, ListView_GetExtendedListViewStyle(hLV) | LVS_EX_FULLROWSELECT);
+
+ hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), iBmpDepth, 1, 1);
+ hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), iBmpDepth, 1, 1);
+// COLORREF rgbTransparentColor;
+ for (i = 0; i < ICO_CNT; i++) {
+// ImageList_AddMasked(himgl, hbmp, rgbTransparentColor);
+ ImageList_AddIcon(hSmall, g_hICO[i]);
+ ImageList_AddIcon(hLarge, g_hICO[i]);
+ }
+
+ ListView_SetImageList(hLV, hSmall, LVSIL_SMALL);
+ ListView_SetImageList(hLV, hLarge, LVSIL_NORMAL);
+
+ static const char *szColHdr[] = { sim203, sim204, sim230, sim205, "", sim234, 0 };
+ static int iColWidth[] = { 150, 110, 60, 55, 35, 330 };
+ LVCOLUMN lvc;
+ lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ lvc.fmt = LVCFMT_LEFT;
+ for (i = 0; szColHdr[i]; i++) {
+ lvc.iSubItem = i;
+ lvc.pszText = (LPSTR)szColHdr[i];
+ lvc.cx = iColWidth[i];
+ LV_InsertColumn(hLV, i, &lvc);
+ }
+ for (i = 0; szAdvancedIcons[i]; i++) {
+ SendMessage(GetDlgItem(hDlg, IDC_ADVICON), CB_ADDSTRING, 0, (LPARAM) Translate(szAdvancedIcons[i]));
+ }
+
+ RefreshGeneralDlg(hDlg,TRUE);
+ EnableWindow(hLV, true);
+// SendMessage(hLV, WM_SETREDRAW, TRUE, 0);
+
+ iInit = FALSE;
+ return TRUE;
+ } // WM_INITDIALOG
+ break;
+
+ case WM_DESTROY: {
+ ImageList_Destroy(hSmall);
+ ImageList_Destroy(hLarge);
+ } // WM_DESTROY
+ break;
+
+ case WM_PAINT: {
+ if(!iInit)
+ InvalidateRect(hDlg,NULL,FALSE);
+ } // WM_PAINT
+ break;
+
+ case WM_COMMAND: {
+ switch(LOWORD(wParam)) {
+ case ID_ALWAYS:
+ case ID_ENABLED:
+ case ID_DISABLED: {
+ idx = ListView_GetSelectionMark(hLV);
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if (ptr) {
+ ptr->tstatus = LOWORD(wParam)-ID_DISABLED;
+ setListViewStatus(hLV,idx,ptr->tstatus);
+ setListViewIcon(hLV,idx,ptr);
+ }
+ }
+ break;
+
+ case ID_SIM_NATIVE:
+ case ID_SIM_PGP:
+ case ID_SIM_GPG:
+ case ID_SIM_RSAAES:
+ case ID_SIM_RSA: {
+ idx = ListView_GetSelectionMark(hLV);
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if (ptr) {
+ ptr->tmode = LOWORD(wParam)-ID_SIM_NATIVE;
+ setListViewMode(hLV,idx,ptr->tmode);
+ setListViewIcon(hLV,idx,ptr);
+ }
+ }
+ break;
+
+ case ID_SETPSK: {
+ idx = ListView_GetSelectionMark(hLV);
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if(ptr) {
+ LPSTR buffer = (LPSTR)alloca(PSKSIZE+1);
+ getContactName(ptr->hContact, buffer);
+ int res = DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_PSK),NULL,(DLGPROC)DlgProcSetPSK,(LPARAM)buffer);
+ if(res == IDOK) {
+ setListViewPSK(hLV,idx,1);
+ DBWriteContactSettingString(ptr->hContact,szModuleName,"tPSK",buffer);
+ }
+ }
+ }
+ break;
+
+ case ID_DELPSK: {
+ idx = ListView_GetSelectionMark(hLV);
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if(ptr) {
+ setListViewPSK(hLV,idx,0);
+ DBDeleteContactSetting(ptr->hContact, szModuleName, "tPSK");
+ }
+ }
+ break;
+
+ case ID_DELPUBL: {
+ idx = ListView_GetSelectionMark(hLV);
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if(ptr) {
+ setListViewPUB(hLV,idx,0);
+ }
+ }
+ break;
+
+ case ID_EXPPUBL: {
+ idx = ListView_GetSelectionMark(hLV);
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if(ptr) {
+ if( !ptr->keyLoaded ) {
+ createRSAcntx(ptr);
+ loadRSAkey(ptr);
+ }
+ if( ptr->keyLoaded ) {
+ LPSTR buffer = (LPSTR) alloca(RSASIZE);
+ exp->rsa_export_pubkey(ptr->cntx,buffer);
+ if( !SaveExportRSAKeyDlg(hDlg,buffer,0) )
+ msgbox(hDlg,sim114,szModuleName,MB_OK|MB_ICONEXCLAMATION);
+ }
+ }
+ return TRUE;
+ }
+ break;
+
+ case ID_IMPPUBL: {
+ idx = ListView_GetSelectionMark(hLV);
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if(ptr) {
+ createRSAcntx(ptr);
+ LPSTR pub = (LPSTR) alloca(RSASIZE);
+ if( !LoadImportRSAKeyDlg(hDlg,pub,0) ) return TRUE;
+ if( exp->rsa_import_pubkey(ptr->cntx,pub) ) {
+ int len;
+ exp->rsa_get_pubkey(ptr->cntx,(PBYTE)pub,&len);
+
+ DBCONTACTWRITESETTING cws;
+ cws.szModule = szModuleName;
+ cws.szSetting = "rsa_pub";
+ cws.value.type = DBVT_BLOB;
+ cws.value.pbVal = (PBYTE)pub;
+ cws.value.cpbVal = len;
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)ptr->hContact, (LPARAM)&cws);
+
+ setListViewPUB(hLV,idx,1);
+ }
+ else
+ msgbox(hDlg,sim115,szModuleName,MB_OK|MB_ICONEXCLAMATION);
+ }
+ return TRUE;
+ }
+ break;
+
+ case ID_UPDATE_CLIST: {
+// iInit = TRUE;
+// RefreshGeneralDlg(hDlg,FALSE);
+// iInit = FALSE;
+ return TRUE;
+ }
+ break;
+
+ case IDC_RESET: {
+ if(!iInit)
+ ResetGeneralDlg(hDlg);
+ }
+ break;
+
+ case IDC_ADV8:
+ case IDC_ADV7:
+ case IDC_ADV6:
+ case IDC_ADV5:
+ case IDC_ADV4:
+ case IDC_ADV3:
+ case IDC_ADV2:
+ case IDC_ADV1:
+ case IDC_ADV0:
+ case IDC_GPG:
+ case IDC_PGP:
+ case IDC_NO_PGP:
+ case IDC_NOL:
+ case IDC_AAK:
+ case IDC_MCM:
+ case IDC_AIP:
+ case IDC_SOM:
+ case IDC_SFT:
+ case IDC_ASI:
+ case IDC_MCD:
+ case IDC_KET:
+ case IDC_SCM:
+ case IDC_DGP:
+ case IDC_OKT:
+ case IDC_ADVICON:
+ break;
+
+ default:
+ return FALSE;
+ }
+ if(!iInit)
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ } // WM_COMMAND
+ break;
+
+ case WM_NOTIFY: {
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0: {
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) {
+ iInit = TRUE;
+ ApplyGeneralSettings(hDlg);
+ RefreshContactListIcons();
+// SendMessage(GetParent(hDlg),WM_COMMAND,ID_UPDATE_PLIST,0);
+// SendMessage(GetParent(hDlg),WM_COMMAND,ID_UPDATE_GLIST,0);
+ iInit = FALSE;
+ }
+ }
+ break;
+
+ case IDC_STD_USERLIST: {
+ switch(((LPNMHDR)lParam)->code) {
+ case NM_DBLCLK: {
+ if(LPNMLISTVIEW(lParam)->iSubItem == 2) {
+ idx = LPNMLISTVIEW(lParam)->iItem;
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if (ptr) {
+ ptr->tmode++;
+ if( !bPGP && ptr->tmode==MODE_PGP ) ptr->tmode++;
+ if( !bGPG && ptr->tmode==MODE_GPG ) ptr->tmode++;
+ if( ptr->tmode>=MODE_CNT ) ptr->tmode=MODE_NATIVE;
+ setListViewMode(hLV,idx,ptr->tmode);
+ setListViewIcon(hLV,idx,ptr);
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ if(LPNMLISTVIEW(lParam)->iSubItem == 3) {
+ idx = LPNMLISTVIEW(lParam)->iItem;
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if (ptr) {
+ ptr->tstatus++; if(ptr->tstatus>(ptr->tmode==MODE_RSAAES?1:2)) ptr->tstatus=0;
+ setListViewStatus(hLV,idx,ptr->tstatus);
+ setListViewIcon(hLV,idx,ptr);
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ } break;
+ case NM_RCLICK: {
+// idx = ListView_GetSelectionMark(hLV);
+ LPNMLISTVIEW lpLV = (LPNMLISTVIEW)lParam;
+ ptr = (pUinKey) getListViewParam(hLV,lpLV->iItem);
+ if (ptr) {
+ POINT p; GetCursorPos(&p);
+ HMENU hMenu = NULL;
+ if( ptr->tmode==MODE_NATIVE || ptr->tmode==MODE_RSAAES ) {
+ switch( lpLV->iSubItem ) {
+ case 2: // mode
+ hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDM_CLIST2));
+ break;
+ case 3: // status
+ hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE((ptr->tmode==MODE_NATIVE)?IDM_CLIST01:IDM_CLIST11));
+ break;
+ case 4: // PSK/PUB
+ case 5: // SHA1
+ hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE((ptr->tmode==MODE_NATIVE)?IDM_CLIST02:IDM_CLIST12));
+ break;
+ default: // full menu
+ hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE((ptr->tmode==MODE_NATIVE)?IDM_CLIST0:IDM_CLIST1));
+ break;
+ }
+ CheckMenuItem(hMenu, ID_DISABLED+ptr->tstatus, MF_CHECKED );
+ if( ptr->tmode==MODE_NATIVE ) {
+ if( !hasKey(ptr) ) EnableMenuItem(hMenu, ID_DELPSK, MF_GRAYED );
+ }
+ else
+ if( ptr->tmode==MODE_RSAAES ) {
+ if( !hasKey(ptr) ) {
+ EnableMenuItem(hMenu, ID_EXPPUBL, MF_GRAYED );
+ EnableMenuItem(hMenu, ID_DELPUBL, MF_GRAYED );
+ }
+ }
+ }
+ if( !hMenu )
+ hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDM_CLIST2));
+ CallService(MS_LANGPACK_TRANSLATEMENU, (WPARAM)hMenu, 0);
+ CheckMenuItem(hMenu, ID_SIM_NATIVE+ptr->tmode, MF_CHECKED );
+ if( !bPGP ) EnableMenuItem(hMenu, ID_SIM_PGP, MF_GRAYED );
+ if( !bGPG ) EnableMenuItem(hMenu, ID_SIM_GPG, MF_GRAYED );
+// CheckMenuItem(hMenu, ID_ENCRYPTION, MF_BYCOMMAND );
+ TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN | TPM_TOPALIGN, p.x, p.y, 0, hDlg, 0);
+ DestroyMenu(hMenu);
+ }
+ } break;
+ case LVN_COLUMNCLICK: {
+ bChangeSortOrder = true;
+ ListView_Sort(hLV,(LPARAM)(LPNMLISTVIEW(lParam)->iSubItem+0x01));
+ bChangeSortOrder = false;
+ }
+ }
+ }
+ break;
+ }
+ } // WM_NOTIFY
+ break;
+ }
+ return FALSE;
+}
+
+
+BOOL CALLBACK DlgProcOptionsProto(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) {
+
+ static int iInit = TRUE;
+ char buf[32];
+ int idx;
+
+ HWND hLV = GetDlgItem(hDlg,IDC_PROTO);
+
+ switch (wMsg) {
+ case WM_INITDIALOG: {
+
+ TranslateDialogDefault(hDlg);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("DlgProcOptionsProto(WN_INITDIALOG)");
+#endif
+ iInit = TRUE;
+ ListView_SetExtendedListViewStyle(hLV, ListView_GetExtendedListViewStyle(hLV) | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);
+
+ LVCOLUMN lvc;
+ lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ lvc.fmt = LVCFMT_LEFT;
+ lvc.pszText = (LPSTR)sim210;
+ lvc.cx = 150;
+ LV_InsertColumn(hLV, 0, &lvc);
+
+ RefreshProtoDlg(hDlg);
+ EnableWindow(hLV, true);
+
+ iInit = FALSE;
+ return TRUE;
+ } // WM_INITDIALOG
+ break;
+
+ case WM_PAINT: {
+ if(!iInit)
+ InvalidateRect(hDlg,NULL,FALSE);
+ } // WM_PAINT
+ break;
+
+ case WM_COMMAND: {
+ switch(LOWORD(wParam)) {
+ case IDC_RSA_COPY: {
+ char txt[128];
+ GetDlgItemText(hDlg, IDC_RSA_SHA, txt, sizeof(txt));
+ CopyToClipboard(hDlg,txt);
+ return TRUE;
+ } break;
+ case IDC_RSA_EXP: {
+ LPSTR pub = (LPSTR) alloca(RSASIZE);
+ exp->rsa_export_keypair(CPP_MODE_RSA,NULL,pub,NULL);
+ if( !SaveExportRSAKeyDlg(hDlg,pub,0) )
+ msgbox(hDlg,sim114,szModuleName,MB_OK|MB_ICONEXCLAMATION);
+ return TRUE;
+ } break;
+ case IDC_RSA_EXPPRIV: {
+ LPSTR passphrase = (LPSTR) alloca(RSASIZE);
+ int res = DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_PASSPHRASE),NULL,(DLGPROC)DlgProcSetPassphrase,(LPARAM)passphrase);
+ if( res==IDOK ) {
+ LPSTR priv = (LPSTR) alloca(RSASIZE);
+ exp->rsa_export_keypair(CPP_MODE_RSA,priv,NULL,passphrase);
+ if( !SaveExportRSAKeyDlg(hDlg,priv,1) )
+ msgbox(hDlg,sim112,szModuleName,MB_OK|MB_ICONEXCLAMATION);
+ }
+ return TRUE;
+ } break;
+ case IDC_RSA_IMPPRIV: {
+ LPSTR priv = (LPSTR) alloca(RSASIZE);
+ if( !LoadImportRSAKeyDlg(hDlg,priv,1) ) return TRUE;
+ //
+ LPSTR passphrase = (LPSTR) alloca(RSASIZE);
+ int res = DialogBoxParam(g_hInst,MAKEINTRESOURCE(IDD_PASSPHRASE),NULL,(DLGPROC)DlgProcSetPassphrase,(LPARAM)passphrase);
+ if( res==IDOK ) {
+ if( !exp->rsa_import_keypair(CPP_MODE_RSA,priv,passphrase) ) {
+ msgbox(hDlg,sim113,szModuleName,MB_OK|MB_ICONEXCLAMATION);
+ }
+ else {
+ // обновить SHA1 значение
+ RefreshProtoDlg(hDlg);
+ }
+ }
+ return TRUE;
+ } break;
+ case IDC_SPLITON:
+ case IDC_SPLITOFF: {
+ if( HIWORD(wParam) == EN_CHANGE ) {
+ idx = ListView_GetSelectionMark(hLV);
+ if( idx == -1 ) break;
+ idx = (int) getListViewParam(hLV,idx);
+ switch(LOWORD(wParam)) {
+ case IDC_SPLITON:
+ GetDlgItemText(hDlg,IDC_SPLITON,buf,5);
+ proto[idx].tsplit_on = atoi(buf);
+ break;
+ case IDC_SPLITOFF:
+ GetDlgItemText(hDlg,IDC_SPLITOFF,buf,5);
+ proto[idx].tsplit_off = atoi(buf);
+ break;
+ }
+ }
+ if(!iInit)
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ } break;
+ }
+ }
+ break;
+
+ case WM_NOTIFY: {
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0: {
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) {
+ iInit = TRUE;
+ ApplyProtoSettings(hDlg);
+ RefreshProtoDlg(hDlg);
+ RefreshContactListIcons();
+ SendMessage(GetParent(hDlg),WM_COMMAND,ID_UPDATE_CLIST,0);
+// SendMessage(GetParent(hDlg),WM_COMMAND,ID_UPDATE_PLIST,0);
+// SendMessage(GetParent(hDlg),WM_COMMAND,ID_UPDATE_GLIST,0);
+ iInit = FALSE;
+ }
+ }
+ break;
+
+ case IDC_PROTO: {
+ if (((LPNMHDR)lParam)->code == (UINT)NM_CLICK) {
+ idx = (int) getListViewParam(hLV,LPNMLISTVIEW(lParam)->iItem);
+ if( idx == -1 ) break;
+ EnableWindow(GetDlgItem(hDlg,IDC_SPLITON), true);
+ EnableWindow(GetDlgItem(hDlg,IDC_SPLITOFF), true);
+ mir_itoa(proto[idx].tsplit_on,buf,10); SetDlgItemText(hDlg,IDC_SPLITON,buf);
+ mir_itoa(proto[idx].tsplit_off,buf,10); SetDlgItemText(hDlg,IDC_SPLITOFF,buf);
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ break;
+ }
+ } // WM_NOTIFY
+ break;
+ }
+ return FALSE;
+}
+
+
+static BOOL bPGP9;
+
+BOOL CALLBACK DlgProcOptionsPGP(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) {
+
+ static int iInit = TRUE;
+ static HIMAGELIST hLarge, hSmall;
+ int i;
+
+ HWND hLV = GetDlgItem(hDlg,IDC_PGP_USERLIST);
+
+ switch (wMsg) {
+ case WM_INITDIALOG: {
+
+ TranslateDialogDefault(hDlg);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("DlgProcOptionsPGP(WN_INITDIALOG)");
+#endif
+ iInit = TRUE;
+ ListView_SetExtendedListViewStyle(hLV, ListView_GetExtendedListViewStyle(hLV) | LVS_EX_FULLROWSELECT);
+
+ hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), iBmpDepth, 1, 1);
+ hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), iBmpDepth, 1, 1);
+ for (i = ICO_ST_DIS; i <= ICO_ST_TRY; i++) {
+ ImageList_AddIcon(hSmall, g_hICO[i]);
+ ImageList_AddIcon(hLarge, g_hICO[i]);
+ }
+
+ ListView_SetImageList(hLV, hSmall, LVSIL_SMALL);
+ ListView_SetImageList(hLV, hLarge, LVSIL_NORMAL);
+
+ static const char *szColHdr[] = { sim203, sim204, sim215, 0 };
+ static int iColWidth[] = { 160, 150, 80 };
+ LVCOLUMN lvc;
+ lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ lvc.fmt = LVCFMT_LEFT;
+ for (i = 0; szColHdr[i]; i++) {
+ lvc.iSubItem = i;
+ lvc.pszText = (LPSTR)szColHdr[i];
+ lvc.cx = iColWidth[i];
+ LV_InsertColumn(hLV, i, &lvc);
+ }
+
+ RefreshPGPDlg(hDlg,TRUE);
+// EnableWindow(hLV, bPGPkeyrings);
+
+ iInit = FALSE;
+ return TRUE;
+ } // WM_INITDIALOG
+ break;
+
+ case WM_DESTROY: {
+ ImageList_Destroy(hSmall);
+ ImageList_Destroy(hLarge);
+ } // WM_DESTROY
+ break;
+
+ case WM_PAINT: {
+ if(!iInit)
+ InvalidateRect(hDlg,NULL,FALSE);
+ } // WM_PAINT
+ break;
+
+ case WM_COMMAND: {
+ switch(LOWORD(wParam)) {
+ case IDC_SET_KEYRINGS: {
+ char PubRingPath[MAX_PATH], SecRingPath[MAX_PATH];
+ PubRingPath[0]='\0'; SecRingPath[0]='\0';
+ bPGPkeyrings = pgp_open_keyrings(PubRingPath,SecRingPath);
+ if(bPGPkeyrings && PubRingPath[0] && SecRingPath[0]) {
+ DBWriteContactSettingString(0,szModuleName,"pgpPubRing",PubRingPath);
+ DBWriteContactSettingString(0,szModuleName,"pgpSecRing",SecRingPath);
+ }
+ SetDlgItemText(hDlg, IDC_KEYRING_STATUS, bPGPkeyrings?Translate(sim216):Translate(sim217));
+// EnableWindow(hLV, bPGPkeyrings);
+// RefreshPGPDlg(hDlg);
+ return FALSE;
+ }
+ break;
+ case IDC_NO_KEYRINGS: {
+ BOOL bNoKR = (SendMessage(GetDlgItem(hDlg, IDC_NO_KEYRINGS),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ EnableWindow(GetDlgItem(hDlg, IDC_SET_KEYRINGS), !bNoKR);
+ EnableWindow(GetDlgItem(hDlg, IDC_LOAD_PRIVKEY), bNoKR);
+ SetDlgItemText(hDlg, IDC_KEYRING_STATUS, bNoKR?Translate(sim225):((bPGP9)?Translate(sim220):(bPGPkeyrings?Translate(sim216):Translate(sim217))));
+ }
+ break;
+ case IDC_LOAD_PRIVKEY: {
+ char KeyPath[MAX_PATH]; KeyPath[0]='\0';
+ if(ShowSelectKeyDlg(hDlg,KeyPath)){
+ char *priv = LoadKeys(KeyPath,true);
+ if(priv) {
+ DBWriteContactSettingString(0,szModuleName,"tpgpPrivKey",priv);
+ mir_free(priv);
+ }
+ else {
+ DBDeleteContactSetting(0,szModuleName,"tpgpPrivKey");
+ }
+ }
+ }
+ break;
+ case ID_UPDATE_PLIST: {
+ iInit = TRUE;
+ RefreshPGPDlg(hDlg,FALSE);
+ iInit = FALSE;
+ return TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ if(!iInit)
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ }
+ break;
+
+ case WM_NOTIFY: {
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0: {
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) {
+ iInit = TRUE;
+ ApplyPGPSettings(hDlg);
+ RefreshPGPDlg(hDlg,FALSE);
+// SendMessage(GetParent(hDlg),WM_COMMAND,ID_UPDATE_CLIST,0);
+ iInit = FALSE;
+ }
+ }
+ break;
+ case IDC_PGP_USERLIST: {
+ switch(((LPNMHDR)lParam)->code) {
+/* case NM_RCLICK: {
+ POINT p;
+ GetCursorPos(&p);
+ HMENU hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDM_CLIST));
+ CheckMenuItem(hMenu, ID_ENCRYPTION, MF_BYCOMMAND );
+ CallService(MS_LANGPACK_TRANSLATEMENU, (WPARAM)hMenu, 0);
+ TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN | TPM_TOPALIGN, p.x, p.y, 0, hDlg, 0);
+ DestroyMenu(hMenu);
+ } break;*/
+ case LVN_COLUMNCLICK: {
+ bChangeSortOrder = true;
+ ListView_Sort(hLV,(LPARAM)(LPNMLISTVIEW(lParam)->iSubItem+0x11));
+ bChangeSortOrder = false;
+ }
+ }
+ }
+ break;
+ }
+ } // WM_NOTIFY
+ break;
+ }
+ return FALSE;
+}
+
+
+BOOL CALLBACK DlgProcOptionsGPG(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) {
+
+ static int iInit = TRUE;
+ static HIMAGELIST hLarge, hSmall;
+ int i, idx; pUinKey ptr;
+
+ HWND hLV = GetDlgItem(hDlg,IDC_GPG_USERLIST);
+
+ switch (wMsg) {
+ case WM_INITDIALOG: {
+
+ TranslateDialogDefault(hDlg);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("DlgProcOptionsGPG(WN_INITDIALOG)");
+#endif
+ iInit = TRUE;
+ ListView_SetExtendedListViewStyle(hLV, ListView_GetExtendedListViewStyle(hLV) | LVS_EX_FULLROWSELECT);
+
+ hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), iBmpDepth, 1, 1);
+ hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), iBmpDepth, 1, 1);
+ for (i = ICO_ST_DIS; i <= ICO_ST_TRY; i++) {
+ ImageList_AddIcon(hSmall, g_hICO[i]);
+ ImageList_AddIcon(hLarge, g_hICO[i]);
+ }
+
+ ListView_SetImageList(hLV, hSmall, LVSIL_SMALL);
+ ListView_SetImageList(hLV, hLarge, LVSIL_NORMAL);
+
+ static const char *szColHdr[] = { sim203, sim204, sim215, sim227, 0 };
+ static int iColWidth[] = { 140, 120, 120, 40 };
+ LVCOLUMN lvc;
+ lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ lvc.fmt = LVCFMT_LEFT;
+ for (i = 0; szColHdr[i]; i++) {
+ lvc.iSubItem = i;
+ lvc.pszText = (LPSTR)szColHdr[i];
+ lvc.cx = iColWidth[i];
+ LV_InsertColumn(hLV, i, &lvc);
+ }
+
+ RefreshGPGDlg(hDlg,TRUE);
+// EnableWindow(hLV, bPGPkeyrings);
+
+ iInit = FALSE;
+ return TRUE;
+ } // WM_INITDIALOG
+ break;
+
+ case WM_DESTROY: {
+ ImageList_Destroy(hSmall);
+ ImageList_Destroy(hLarge);
+ } // WM_DESTROY
+ break;
+
+ case WM_PAINT: {
+ if(!iInit)
+ InvalidateRect(hDlg,NULL,FALSE);
+ } // WM_PAINT
+ break;
+
+ case WM_COMMAND: {
+ switch(LOWORD(wParam)) {
+/* case IDC_LOAD_PRIVKEY: {
+ char KeyPath[MAX_PATH] = {0};
+ if(ShowSelectKeyDlg(hDlg,KeyPath)){
+ char *priv = LoadKeys(KeyPath,true);
+ if(priv) {
+ DBWriteContactSettingString(0,szModuleName,"tpgpPrivKey",priv);
+ mir_free(priv);
+ }
+ else {
+ DBDeleteContactSetting(0,szModuleName,"tpgpPrivKey");
+ }
+ }
+ }
+ break;*/
+ case IDC_BROWSEEXECUTABLE_BTN: {
+ char gpgexe[256];
+ char filter[128];
+ OPENFILENAME ofn;
+
+ GetDlgItemText(hDlg, IDC_GPGEXECUTABLE_EDIT, gpgexe, sizeof(gpgexe));
+
+ char *txtexecutablefiles="Executable Files"; /*lang*/
+ char *txtselectexecutable="Select GnuPG Executable"; /*lang*/
+
+ // filter zusammensetzen
+ memset(&filter,0,sizeof(filter));
+ strcpy(filter, Translate(txtexecutablefiles));
+ strcat(filter, " (*.exe)");
+ strcpy(filter+strlen(filter)+1, "*.exe");
+
+ // OPENFILENAME initialisieren
+ memset(&ofn,0,sizeof(ofn));
+ ofn.lStructSize=sizeof(ofn);
+ ofn.hwndOwner=hDlg;
+ ofn.lpstrFilter=filter;
+ ofn.lpstrFile=gpgexe;
+ ofn.nMaxFile=sizeof(gpgexe);
+ ofn.lpstrTitle=Translate(txtselectexecutable);
+ ofn.Flags=OFN_FILEMUSTEXIST|OFN_LONGNAMES|OFN_HIDEREADONLY;
+
+ if (GetOpenFileName(&ofn))
+ {
+ SetDlgItemText(hDlg, IDC_GPGEXECUTABLE_EDIT, ofn.lpstrFile);
+ }
+ }
+ break;
+ case ID_UPDATE_GLIST: {
+ iInit = TRUE;
+ RefreshGPGDlg(hDlg,FALSE);
+ iInit = FALSE;
+ return TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ if(!iInit)
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ }
+ break;
+
+ case WM_NOTIFY: {
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0: {
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) {
+ iInit = TRUE;
+ ApplyGPGSettings(hDlg);
+ RefreshGPGDlg(hDlg,FALSE);
+// SendMessage(GetParent(hDlg),WM_COMMAND,ID_UPDATE_CLIST,0);
+ iInit = FALSE;
+ }
+ }
+ break;
+ case IDC_GPG_USERLIST: {
+ switch(((LPNMHDR)lParam)->code) {
+ case NM_DBLCLK: {
+ if(LPNMLISTVIEW(lParam)->iSubItem == 3) {
+ idx = LPNMLISTVIEW(lParam)->iItem;
+ ptr = (pUinKey) getListViewParam(hLV,idx);
+ if( !ptr ) break;
+ ptr->tgpgMode++; ptr->tgpgMode&=1;
+ LV_SetItemTextA(hLV, LPNMLISTVIEW(lParam)->iItem, LPNMLISTVIEW(lParam)->iSubItem, (ptr->tgpgMode)?Translate(sim228):Translate(sim229));
+ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0);
+ }
+ } break;
+/* case NM_RCLICK: {
+ POINT p;
+ GetCursorPos(&p);
+ HMENU hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDM_CLIST));
+ CheckMenuItem(hMenu, ID_ENCRYPTION, MF_BYCOMMAND );
+ CallService(MS_LANGPACK_TRANSLATEMENU, (WPARAM)hMenu, 0);
+ TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN | TPM_TOPALIGN, p.x, p.y, 0, hDlg, 0);
+ DestroyMenu(hMenu);
+ } break;*/
+ case LVN_COLUMNCLICK: {
+ bChangeSortOrder = true;
+ ListView_Sort(hLV,(LPARAM)(LPNMLISTVIEW(lParam)->iSubItem+0x21));
+ bChangeSortOrder = false;
+ }
+ }
+ }
+ break;
+ }
+ } // WM_NOTIFY
+ break;
+ }
+ return FALSE;
+}
+
+
+BOOL CALLBACK DlgProcSetPSK(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
+ static char *buffer;
+ switch(uMsg) {
+ case WM_INITDIALOG: {
+ TranslateDialogDefault(hDlg);
+ SendDlgItemMessage(hDlg,IDC_EDIT1,EM_LIMITTEXT,PSKSIZE-1,0);
+ if( bCoreUnicode ) SetDlgItemTextW(hDlg,IDC_EDIT2,(LPWSTR)lParam);
+ else SetDlgItemTextA(hDlg,IDC_EDIT2,(LPCSTR)lParam);
+ buffer = (LPSTR)lParam;
+ return (TRUE);
+ }
+ case WM_COMMAND: {
+ switch(LOWORD(wParam)) {
+ case IDOK: {
+ int len = GetDlgItemTextA(hDlg,IDC_EDIT1,buffer,PSKSIZE);
+ if(len<8) {
+ msgbox1(hDlg,sim211,szModuleName,MB_OK|MB_ICONEXCLAMATION);
+ return TRUE;
+ }
+ else {
+ EndDialog(hDlg,IDOK);
+ }
+ }
+ break;
+ case IDCANCEL: {
+ EndDialog(hDlg,IDCANCEL);
+ }
+ break;
+ }
+ }
+ break;
+ default:
+ return (FALSE);
+ }
+ return (TRUE);
+}
+
+
+BOOL CALLBACK DlgProcSetPassphrase(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
+ static LPSTR buffer;
+ switch(uMsg) {
+ case WM_INITDIALOG: {
+ TranslateDialogDefault(hDlg);
+ SendDlgItemMessage(hDlg,IDC_PASSPHRASE,EM_LIMITTEXT,RSASIZE-1,0);
+ buffer = (LPSTR)lParam;
+ return (TRUE);
+ }
+ case WM_COMMAND: {
+ switch(LOWORD(wParam)) {
+ case IDOK: {
+// memset(buffer,0,RSASIZE);
+ GetDlgItemTextA(hDlg,IDC_PASSPHRASE,buffer,RSASIZE);
+ EndDialog(hDlg,IDOK);
+ }
+ break;
+ case IDCANCEL: {
+ EndDialog(hDlg,IDCANCEL);
+ }
+ break;
+ }
+ }
+ break;
+ default:
+ return (FALSE);
+ }
+ return (TRUE);
+}
+
+
+///////////////////
+// R E F R E S H //
+///////////////////
+
+
+void RefreshGeneralDlg(HWND hDlg, BOOL iInit) {
+
+ char timeout[10];
+ UINT data;
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("RefreshGeneralDlg");
+#endif
+ // Key Exchange Timeout
+ data = DBGetContactSettingWord(0, szModuleName, "ket", 10);
+ mir_itoa(data,timeout,10);
+ SetDlgItemText(hDlg,IDC_KET,timeout);
+
+ // Offline Key Timeout
+ data = DBGetContactSettingWord(0, szModuleName, "okt", 2);
+ mir_itoa(data,timeout,10);
+ SetDlgItemText(hDlg,IDC_OKT,timeout);
+
+ GetFlags();
+
+ SendMessage(GetDlgItem(hDlg,IDC_SFT),BM_SETCHECK,(bSFT)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_SOM),BM_SETCHECK,(bSOM)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_ASI),BM_SETCHECK,(bASI)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_MCD),BM_SETCHECK,(bMCD)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_SCM),BM_SETCHECK,(bSCM)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_DGP),BM_SETCHECK,(bDGP)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_AIP),BM_SETCHECK,(bAIP)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_NOL),BM_SETCHECK,(bNOL)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_AAK),BM_SETCHECK,(bAAK)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_MCM),BM_SETCHECK,(bMCM)?BST_CHECKED:BST_UNCHECKED,0L);
+
+/* // CList_classic
+ if(!ServiceExists(MS_CLIST_ADDSUBGROUPMENUITEM)) {
+ EnableWindow(GetDlgItem(hDlg,IDC_ASI),FALSE);
+ for(i=2;i<ADV_CNT;i++)
+ EnableWindow(GetDlgItem(hDlg,IDC_ADV1+i),FALSE);
+ }
+*/
+ // Advanced
+ SendMessage(GetDlgItem(hDlg, IDC_ADVICON), CB_SETCURSEL, bADV, 0);
+ if( g_hCLIcon ) {
+ EnableWindow(GetDlgItem(hDlg, IDC_ADVICON), false);
+ }
+
+ // Select {OFF,PGP,GPG}
+ SendMessage(GetDlgItem(hDlg,IDC_PGP),BM_SETCHECK,bPGP?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_GPG),BM_SETCHECK,bGPG?BST_CHECKED:BST_UNCHECKED,0L);
+
+ // rebuild list of contacts
+ HWND hLV = GetDlgItem(hDlg,IDC_STD_USERLIST);
+ ListView_DeleteAllItems(hLV);
+
+ LVITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ char tmp[NAMSIZE];
+
+ while (hContact) {
+
+ pUinKey ptr = getUinKey(hContact);
+ if ( ptr && isSecureProtocol(hContact) /*&& !getMetaContact(hContact)*/ && !isChatRoom(hContact)) {
+
+ if( iInit ) {
+ ptr->tmode = ptr->mode;
+ ptr->tstatus = ptr->status;
+ }
+
+ lvi.iItem++;
+ lvi.iImage = ptr->tstatus;
+ lvi.lParam = (LPARAM)ptr;
+
+ getContactName(hContact, tmp);
+ lvi.pszText = (LPSTR)&tmp;
+ int itemNum = LV_InsertItem(hLV, &lvi);
+
+ getContactUin(hContact, tmp);
+ LV_SetItemText(hLV, itemNum, 1, tmp);
+
+ setListViewMode(hLV, itemNum, ptr->tmode);
+ setListViewStatus(hLV, itemNum, ptr->tstatus);
+ if( ptr->mode==MODE_NATIVE ) setListViewPSK(hLV, itemNum, hasKey(ptr));
+ else setListViewPUB(hLV, itemNum, hasKey(ptr));
+ setListViewIcon(hLV, itemNum, ptr);
+ }
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+ ListView_Sort(hLV,(LPARAM)0);
+}
+
+
+void RefreshProtoDlg(HWND hDlg) {
+
+ int i;
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("RefreshProtoDlg");
+#endif
+ HWND hLV = GetDlgItem(hDlg,IDC_PROTO);
+ ListView_DeleteAllItems(hLV);
+
+ LVITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.mask = LVIF_TEXT | LVIF_PARAM;
+
+ for(i=0;i<proto_cnt;i++) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("LV_InsertItemA(%d,%s);",i,proto[i].name);
+#endif
+ lvi.iItem = i+1;
+ lvi.pszText = proto[i].name;
+ lvi.lParam = (LPARAM)i;
+ int itemNum = LV_InsertItemA(hLV, &lvi);
+ ListView_SetCheckState(hLV,itemNum,proto[i].inspecting);
+ }
+
+ SetDlgItemText(hDlg,IDC_SPLITON,"0");
+ SetDlgItemText(hDlg,IDC_SPLITOFF,"0");
+ EnableWindow(GetDlgItem(hDlg,IDC_SPLITON), false);
+ EnableWindow(GetDlgItem(hDlg,IDC_SPLITOFF), false);
+
+ BYTE sha[64]; int len; exp->rsa_get_keyhash(CPP_MODE_RSA,NULL,NULL,(PBYTE)&sha,&len);
+ LPSTR txt = mir_strdup(to_hex(sha,len));
+ SetDlgItemText(hDlg, IDC_RSA_SHA, txt);
+ mir_free(txt);
+}
+
+
+void RefreshPGPDlg(HWND hDlg, BOOL iInit) {
+
+ int ver = pgp_get_version();
+ bPGP9 = (ver>=0x03050000);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("RefreshPGPDlg");
+#endif
+ EnableWindow(GetDlgItem(hDlg, IDC_SET_KEYRINGS), bUseKeyrings && !bPGP9);
+ EnableWindow(GetDlgItem(hDlg, IDC_LOAD_PRIVKEY), !bUseKeyrings);
+ SetDlgItemText(hDlg, IDC_PGP_PRIVKEY, bPGPprivkey?Translate(sim222):Translate(sim223));
+
+ if(bPGPloaded && ver) {
+ char pgpVerStr[64];
+ sprintf(pgpVerStr, Translate(sim218), ver >> 24, (ver >> 16) & 255, (ver >> 8) & 255);
+ SetDlgItemText(hDlg, IDC_PGP_SDK, pgpVerStr);
+ }
+ else {
+ SetDlgItemText(hDlg, IDC_PGP_SDK, Translate(sim219));
+ }
+ SetDlgItemText(hDlg, IDC_KEYRING_STATUS, !bUseKeyrings?Translate(sim225):((bPGP9)?Translate(sim220):(bPGPkeyrings?Translate(sim216):Translate(sim217))));
+
+ // Disable keyrings use
+ SendMessage(GetDlgItem(hDlg,IDC_NO_KEYRINGS),BM_SETCHECK,(bUseKeyrings)?BST_UNCHECKED:BST_CHECKED,0L);
+
+ // rebuild list of contacts
+ HWND hLV = GetDlgItem(hDlg,IDC_PGP_USERLIST);
+ ListView_DeleteAllItems(hLV);
+
+ LVITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ char tmp[NAMSIZE];
+
+ while (hContact) {
+
+ pUinKey ptr = getUinKey(hContact);
+ if (ptr && ptr->mode==MODE_PGP && isSecureProtocol(hContact) /*&& !getMetaContact(hContact)*/ && !isChatRoom(hContact)) {
+
+ LPSTR szKeyID = myDBGetString(hContact,szModuleName,"pgp_abbr");
+
+ lvi.iItem++;
+ lvi.iImage = (szKeyID!=0);
+ lvi.lParam = (LPARAM)ptr;
+
+ getContactName(hContact, tmp);
+ lvi.pszText = (LPSTR)&tmp;
+ int itemNum = LV_InsertItem(hLV, &lvi);
+
+ getContactUin(hContact, tmp);
+ LV_SetItemText(hLV, itemNum, 1, tmp);
+
+ LV_SetItemTextA(hLV, itemNum, 2, (szKeyID)?szKeyID:Translate(sim221));
+ SAFE_FREE(szKeyID);
+ }
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+ ListView_Sort(hLV,(LPARAM)0x10);
+}
+
+
+void RefreshGPGDlg(HWND hDlg, BOOL iInit) {
+
+ LPSTR path;
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("RefreshGPGDlg");
+#endif
+ path = myDBGetString(0,szModuleName,"gpgExec");
+ if(path) {
+ SetDlgItemText(hDlg, IDC_GPGEXECUTABLE_EDIT, path);
+ mir_free(path);
+ }
+ path = myDBGetString(0,szModuleName,"gpgHome");
+ if(path) {
+ SetDlgItemText(hDlg, IDC_GPGHOME_EDIT, path);
+ mir_free(path);
+ }
+ BOOL bGPGLogFlag = DBGetContactSettingByte(0, szModuleName, "gpgLogFlag",0);
+ SendMessage(GetDlgItem(hDlg,IDC_LOGGINGON_CBOX),BM_SETCHECK,(bGPGLogFlag)?BST_CHECKED:BST_UNCHECKED,0L);
+ path = myDBGetString(0,szModuleName,"gpgLog");
+ if(path) {
+ SetDlgItemText(hDlg, IDC_GPGLOGFILE_EDIT, path);
+ mir_free(path);
+ }
+ SendMessage(GetDlgItem(hDlg,IDC_SAVEPASS_CBOX),BM_SETCHECK,(bSavePass)?BST_CHECKED:BST_UNCHECKED,0L);
+ BOOL bGPGTmpFlag = DBGetContactSettingByte(0, szModuleName, "gpgTmpFlag",0);
+ SendMessage(GetDlgItem(hDlg,IDC_TMPPATHON_CBOX),BM_SETCHECK,(bGPGTmpFlag)?BST_CHECKED:BST_UNCHECKED,0L);
+ path = myDBGetString(0,szModuleName,"gpgTmp");
+ if(path) {
+ SetDlgItemText(hDlg, IDC_GPGTMPPATH_EDIT, path);
+ mir_free(path);
+ }
+
+ // rebuild list of contacts
+ HWND hLV = GetDlgItem(hDlg,IDC_GPG_USERLIST);
+ ListView_DeleteAllItems(hLV);
+
+ LVITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ char tmp[NAMSIZE];
+
+ while (hContact) {
+
+ pUinKey ptr = getUinKey(hContact);
+ if (ptr && ptr->mode==MODE_GPG && isSecureProtocol(hContact) /*&& !getMetaContact(hContact)*/ && !isChatRoom(hContact)) {
+
+ if( iInit ) {
+ ptr->tgpgMode = ptr->gpgMode;
+ }
+
+ LPSTR szKeyID = myDBGetString(hContact,szModuleName,"gpg");
+
+ lvi.iItem++;
+ lvi.iImage = (szKeyID!=0);
+ lvi.lParam = (LPARAM)ptr;
+
+ getContactName(hContact, tmp);
+ lvi.pszText = (LPSTR)&tmp;
+ int itemNum = LV_InsertItem(hLV, &lvi);
+
+ getContactUin(hContact, tmp);
+ LV_SetItemText(hLV, itemNum, 1, tmp);
+
+ LV_SetItemTextA(hLV, itemNum, 2, (szKeyID)?szKeyID:Translate(sim221));
+ LV_SetItemTextA(hLV, itemNum, 3, (ptr->tgpgMode)?Translate(sim228):Translate(sim229));
+ SAFE_FREE(szKeyID);
+ }
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+ ListView_Sort(hLV,(LPARAM)0x20);
+}
+
+
+///////////////
+// R E S E T //
+///////////////
+
+
+void ResetGeneralDlg(HWND hDlg) {
+
+ SetDlgItemText(hDlg,IDC_KET,"10");
+ SetDlgItemText(hDlg,IDC_OKT,"2");
+
+ SendMessage(GetDlgItem(hDlg,IDC_SFT),BM_SETCHECK,BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_SOM),BM_SETCHECK,BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_ASI),BM_SETCHECK,BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_MCD),BM_SETCHECK,BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_SCM),BM_SETCHECK,BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_DGP),BM_SETCHECK,BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_AIP),BM_SETCHECK,BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg,IDC_MCM),BM_SETCHECK,BST_UNCHECKED,0L);
+
+// for(int i=0;i<ADV_CNT;i++)
+// SendMessage(GetDlgItem(hDlg,IDC_ADV1+i),BM_SETCHECK,(i==0)?BST_CHECKED:BST_UNCHECKED,0L);
+ SendMessage(GetDlgItem(hDlg, IDC_ADVICON), CB_SETCURSEL, 0, 0);
+
+ // rebuild list of contacts
+ HWND hLV = GetDlgItem(hDlg,IDC_STD_USERLIST);
+ ListView_DeleteAllItems(hLV);
+
+ LVITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ char tmp[NAMSIZE];
+
+ while (hContact) {
+
+ if (isSecureProtocol(hContact) /*&& !getMetaContact(hContact)*/ && !isChatRoom(hContact)) {
+
+ pUinKey ptr = getUinKey(hContact);
+ if(!ptr) continue;
+
+ ptr->tmode=MODE_NATIVE;
+ ptr->tstatus=STATUS_ENABLED;
+
+ lvi.iItem++;
+ lvi.iImage = ptr->tstatus;
+ lvi.lParam = (LPARAM)ptr;
+
+ getContactName(hContact, tmp);
+ lvi.pszText = (LPSTR)&tmp;
+ int itemNum = LV_InsertItem(hLV, &lvi);
+
+ getContactUin(hContact, tmp);
+ LV_SetItemText(hLV, itemNum, 1, tmp);
+
+ setListViewMode(hLV, itemNum, ptr->tmode);
+ setListViewStatus(hLV, itemNum, ptr->tstatus);
+ if( ptr->mode==MODE_NATIVE ) setListViewPSK(hLV, itemNum, 0);
+ else setListViewPUB(hLV, itemNum, 0);
+ setListViewIcon(hLV, itemNum, ptr);
+ }
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+}
+
+
+void ResetProtoDlg(HWND hDlg) {
+}
+
+
+///////////////
+// A P P L Y //
+///////////////
+
+
+void ApplyGeneralSettings(HWND hDlg) {
+
+ char timeout[5];
+ int tmp,i;
+
+ // Key Exchange Timeout
+ GetDlgItemText(hDlg,IDC_KET,timeout,5);
+ tmp = atoi(timeout); if(tmp > 65535) tmp = 65535;
+ DBWriteContactSettingWord(0,szModuleName,"ket",tmp);
+ exp->rsa_set_timeout( DBGetContactSettingWord(0,szModuleName,"ket",10) );
+ mir_itoa(tmp,timeout,10);
+ SetDlgItemText(hDlg,IDC_KET,timeout);
+
+ // Offline Key Timeout
+ GetDlgItemText(hDlg,IDC_OKT,timeout,5);
+ tmp = atoi(timeout); if(tmp > 65535) tmp = 65535;
+ DBWriteContactSettingWord(0,szModuleName,"okt",tmp);
+ mir_itoa(tmp,timeout,10);
+ SetDlgItemText(hDlg,IDC_OKT,timeout);
+
+ bSFT = (SendMessage(GetDlgItem(hDlg, IDC_SFT),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bSOM = (SendMessage(GetDlgItem(hDlg, IDC_SOM),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bASI = (SendMessage(GetDlgItem(hDlg, IDC_ASI),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bMCD = (SendMessage(GetDlgItem(hDlg, IDC_MCD),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bSCM = (SendMessage(GetDlgItem(hDlg, IDC_SCM),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bDGP = (SendMessage(GetDlgItem(hDlg, IDC_DGP),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bAIP = (SendMessage(GetDlgItem(hDlg, IDC_AIP),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bNOL = (SendMessage(GetDlgItem(hDlg, IDC_NOL),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bAAK = (SendMessage(GetDlgItem(hDlg, IDC_AAK),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bMCM = (SendMessage(GetDlgItem(hDlg, IDC_MCM),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ bADV = (BYTE)SendMessage(GetDlgItem(hDlg, IDC_ADVICON), CB_GETCURSEL, 0, 0);
+
+ SetFlags();
+
+ // PGP &| GPG flags
+ {
+ tmp = 0;
+ i = SendMessage(GetDlgItem(hDlg, IDC_PGP),BM_GETCHECK,0L,0L)==BST_CHECKED;
+ if(i!=bPGP) {
+ bPGP = i; tmp++;
+ DBWriteContactSettingByte(0, szModuleName, "pgp", bPGP);
+ }
+ i = SendMessage(GetDlgItem(hDlg, IDC_GPG),BM_GETCHECK,0L,0L)==BST_CHECKED;
+ if(i!=bGPG) {
+ bGPG = i; tmp++;
+ DBWriteContactSettingByte(0, szModuleName, "gpg", bGPG);
+ }
+ if(tmp) msgbox1(hDlg, sim224, szModuleName, MB_OK|MB_ICONINFORMATION);
+ }
+
+ HWND hLV = GetDlgItem(hDlg,IDC_STD_USERLIST);
+ i = ListView_GetNextItem(hLV,(UINT)-1,LVNI_ALL);
+ while(i!=-1) {
+ pUinKey ptr = (pUinKey)getListViewParam(hLV,i);
+ if( !ptr ) continue;
+ if( ptr->mode!=ptr->tmode ) {
+ ptr->mode = ptr->tmode;
+ DBWriteContactSettingByte(ptr->hContact, szModuleName, "mode", ptr->mode);
+ }
+ if( ptr->status!=ptr->tstatus ) {
+ ptr->status = ptr->tstatus;
+ if(ptr->status==STATUS_ENABLED) DBDeleteContactSetting(ptr->hContact, szModuleName, "StatusID");
+ else DBWriteContactSettingByte(ptr->hContact, szModuleName, "StatusID", ptr->status);
+ }
+ if( ptr->mode==MODE_NATIVE ) {
+ if( getListViewPSK(hLV,i) ) {
+ LPSTR tmp = myDBGetString(ptr->hContact,szModuleName,"tPSK");
+ DBWriteContactSettingString(ptr->hContact, szModuleName, "PSK", tmp);
+ mir_free(tmp);
+ }
+ else {
+ DBDeleteContactSetting(ptr->hContact, szModuleName, "PSK");
+ }
+ DBDeleteContactSetting(ptr->hContact, szModuleName, "tPSK");
+ }
+ else
+ if( ptr->mode==MODE_RSAAES ) {
+ if( !getListViewPUB(hLV,i) ) {
+ DBDeleteContactSetting(ptr->hContact, szModuleName, "rsa_pub");
+ }
+ }
+ i = ListView_GetNextItem(hLV,i,LVNI_ALL);
+ }
+}
+
+
+void ApplyProtoSettings(HWND hDlg) {
+
+ LPSTR szNames = (LPSTR) alloca(2048); *szNames = '\0';
+
+ HWND hLV = GetDlgItem(hDlg,IDC_PROTO);
+ int i = ListView_GetNextItem(hLV,(UINT)-1,LVNI_ALL);
+ while(i!=-1) {
+ int j = getListViewProto(hLV,i);
+ proto[j].inspecting = ListView_GetCheckState(hLV,i);
+ char tmp[128];
+ sprintf(tmp,"%s:%d:%d:%d;",proto[j].name,proto[j].inspecting,proto[j].tsplit_on,proto[j].tsplit_off);
+ strcat(szNames,tmp);
+ proto[j].split_on = proto[j].tsplit_on;
+ proto[j].split_off = proto[j].tsplit_off;
+ i = ListView_GetNextItem(hLV,i,LVNI_ALL);
+ }
+
+ DBWriteContactSettingString(0,szModuleName,"protos",szNames);
+}
+
+
+void ApplyPGPSettings(HWND hDlg) {
+
+ bUseKeyrings = !(SendMessage(GetDlgItem(hDlg, IDC_NO_KEYRINGS),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ DBWriteContactSettingByte(0,szModuleName,"ukr",bUseKeyrings);
+
+ char *priv = myDBGetString(0,szModuleName,"tpgpPrivKey");
+ if(priv) {
+ bPGPprivkey = true;
+ pgp_set_priv_key(priv);
+ myDBWriteStringEncode(0,szModuleName,"pgpPrivKey",priv);
+ mir_free(priv);
+ DBDeleteContactSetting(0,szModuleName,"tpgpPrivKey");
+ }
+}
+
+
+void ApplyGPGSettings(HWND hDlg) {
+
+ char tmp[256];
+
+ GetDlgItemText(hDlg, IDC_GPGEXECUTABLE_EDIT, tmp, sizeof(tmp));
+ DBWriteContactSettingString(0,szModuleName,"gpgExec",tmp);
+ GetDlgItemText(hDlg, IDC_GPGHOME_EDIT, tmp, sizeof(tmp));
+ DBWriteContactSettingString(0,szModuleName,"gpgHome",tmp);
+
+ bSavePass = (SendMessage(GetDlgItem(hDlg, IDC_SAVEPASS_CBOX),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ DBWriteContactSettingByte(0,szModuleName,"gpgSaveFlag",bSavePass);
+
+ BOOL bgpgLogFlag = (SendMessage(GetDlgItem(hDlg, IDC_LOGGINGON_CBOX),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ DBWriteContactSettingByte(0,szModuleName,"gpgLogFlag",bgpgLogFlag);
+ GetDlgItemText(hDlg, IDC_GPGLOGFILE_EDIT, tmp, sizeof(tmp));
+ DBWriteContactSettingString(0,szModuleName,"gpgLog",tmp);
+ if(bgpgLogFlag) gpg_set_log(tmp);
+ else gpg_set_log(0);
+
+ BOOL bgpgTmpFlag = (SendMessage(GetDlgItem(hDlg, IDC_TMPPATHON_CBOX),BM_GETCHECK,0L,0L)==BST_CHECKED);
+ DBWriteContactSettingByte(0,szModuleName,"gpgTmpFlag",bgpgTmpFlag);
+ GetDlgItemText(hDlg, IDC_GPGTMPPATH_EDIT, tmp, sizeof(tmp));
+ DBWriteContactSettingString(0,szModuleName,"gpgTmp",tmp);
+ if(bgpgTmpFlag) gpg_set_tmp(tmp);
+ else gpg_set_tmp(0);
+
+ HWND hLV = GetDlgItem(hDlg,IDC_GPG_USERLIST);
+ int i = ListView_GetNextItem(hLV,(UINT)-1,LVNI_ALL);
+ while(i!=-1) {
+ pUinKey ptr = (pUinKey)getListViewParam(hLV,i);
+ if( !ptr ) continue;
+ if( ptr->gpgMode != ptr->tgpgMode ) {
+ ptr->gpgMode = ptr->tgpgMode;
+ if( ptr->gpgMode ) DBWriteContactSettingByte(ptr->hContact,szModuleName,"gpgANSI",1);
+ else DBDeleteContactSetting(ptr->hContact,szModuleName,"gpgANSI");
+ }
+
+ i = ListView_GetNextItem(hLV,i,LVNI_ALL);
+ }
+}
+
+
+///////////////
+// O T H E R //
+///////////////
+
+
+LPARAM getListViewParam(HWND hLV, UINT iItem) {
+
+ LVITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.iItem = iItem;
+ lvi.mask = LVIF_PARAM;
+ ListView_GetItem(hLV, &lvi);
+ return lvi.lParam;
+}
+
+
+void setListViewIcon(HWND hLV, UINT iItem, pUinKey ptr) {
+
+ LVITEM lvi; memset(&lvi,0,sizeof(lvi));
+ lvi.iItem = iItem;
+ switch(ptr->tmode) {
+ case MODE_NATIVE:
+ case MODE_RSAAES:
+ lvi.iImage = ICO_ST_DIS+ptr->tstatus;
+ break;
+ case MODE_PGP:
+ lvi.iImage = ICO_OV_PGP;
+ break;
+ case MODE_GPG:
+ lvi.iImage = ICO_OV_GPG;
+ break;
+ }
+ lvi.mask = LVIF_IMAGE;
+ ListView_SetItem(hLV, &lvi);
+}
+
+
+void setListViewMode(HWND hLV, UINT iItem, UINT iMode) {
+
+ char tmp[256];
+ strncpy(tmp, Translate(sim231[iMode]), sizeof(tmp));
+ LV_SetItemTextA(hLV, iItem, 2, tmp);
+}
+
+
+void setListViewStatus(HWND hLV, UINT iItem, UINT iStatus) {
+
+ char tmp[128];
+ strncpy(tmp, Translate(sim232[iStatus]), sizeof(tmp));
+ LV_SetItemTextA(hLV, iItem, 3, tmp);
+}
+
+
+UINT getListViewPSK(HWND hLV, UINT iItem) {
+
+ char str[128];
+ LV_GetItemTextA(hLV, iItem, 4, str, sizeof(str));
+ return strncmp(str, Translate(sim206), sizeof(str))==0;
+}
+
+
+void setListViewPSK(HWND hLV, UINT iItem, UINT iStatus) {
+
+ char str[128];
+ strncpy(str, (iStatus)?Translate(sim206):"-", sizeof(str));
+ LV_SetItemTextA(hLV, iItem, 4, str);
+}
+
+
+UINT getListViewPUB(HWND hLV, UINT iItem) {
+
+ char str[128];
+ LV_GetItemTextA(hLV, iItem, 4, str, sizeof(str));
+ return strncmp(str, Translate(sim233), sizeof(str))==0;
+}
+
+
+void setListViewPUB(HWND hLV, UINT iItem, UINT iStatus) {
+
+ char str[128];
+ strncpy(str, (iStatus)?Translate(sim233):"-", sizeof(str));
+ LV_SetItemTextA(hLV, iItem, 4, str);
+
+ LPSTR sha = NULL;
+ if( iStatus ) {
+ DBVARIANT dbv;
+ dbv.type = DBVT_BLOB;
+ pUinKey ptr = (pUinKey) getListViewParam(hLV, iItem);
+ if( DBGetContactSetting(ptr->hContact,szModuleName,"rsa_pub",&dbv) == 0 ) {
+ int len;
+ exp->rsa_get_hash((PBYTE)dbv.pbVal,dbv.cpbVal,(PBYTE)str,&len);
+ sha = mir_strdup(to_hex((PBYTE)str,len));
+ DBFreeVariant(&dbv);
+ }
+ }
+ if( sha ) {
+ LV_SetItemTextA(hLV, iItem, 5, sha);
+ mir_free(sha);
+ }
+ else LV_SetItemTextA(hLV, iItem, 5, "");
+}
+
+
+int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {
+ char t1[NAMSIZE], t2[NAMSIZE];
+ int s,d,m=1;
+ DBVARIANT dbv1,dbv2;
+
+ if(lParamSort&0x100) {
+ lParamSort&=0xFF;
+ m=-1;
+ }
+
+ switch(lParamSort){
+ case 0x01:
+ case 0x11:
+ case 0x21: {
+ getContactNameA(pUinKey(lParam1)->hContact, t1);
+ getContactNameA(pUinKey(lParam2)->hContact, t2);
+ return strncmp(t1,t2,NAMSIZE)*m;
+ } break;
+ case 0x02:
+ case 0x12:
+ case 0x22: {
+ getContactUinA(pUinKey(lParam1)->hContact, t1);
+ getContactUinA(pUinKey(lParam2)->hContact, t2);
+ return strncmp(t1,t2,NAMSIZE)*m;
+ } break;
+ case 0x03: {
+ s = pUinKey(lParam1)->tmode;
+ d = pUinKey(lParam2)->tmode;
+ return (s-d)*m;
+ } break;
+ case 0x13: {
+ DBGetContactSetting(pUinKey(lParam1)->hContact,szModuleName,"pgp_abbr",&dbv1);
+ DBGetContactSetting(pUinKey(lParam2)->hContact,szModuleName,"pgp_abbr",&dbv2);
+ s=(dbv1.type==DBVT_ASCIIZ);
+ d=(dbv2.type==DBVT_ASCIIZ);
+ if(s && d) {
+ s=strcmp(dbv1.pszVal,dbv2.pszVal);
+ d=0;
+ }
+ DBFreeVariant(&dbv1);
+ DBFreeVariant(&dbv2);
+ return (s-d)*m;
+ } break;
+ case 0x23: {
+ DBGetContactSetting(pUinKey(lParam1)->hContact,szModuleName,"gpg",&dbv1);
+ DBGetContactSetting(pUinKey(lParam2)->hContact,szModuleName,"gpg",&dbv2);
+ s=(dbv1.type==DBVT_ASCIIZ);
+ d=(dbv2.type==DBVT_ASCIIZ);
+ if(s && d) {
+ s=strcmp(dbv1.pszVal,dbv2.pszVal);
+ d=0;
+ }
+ DBFreeVariant(&dbv1);
+ DBFreeVariant(&dbv2);
+ return (s-d)*m;
+ } break;
+ case 0x04: {
+ s = pUinKey(lParam1)->tstatus;
+ d = pUinKey(lParam2)->tstatus;
+ return (s-d)*m;
+ } break;
+ case 0x05: {
+ DBGetContactSetting(pUinKey(lParam1)->hContact,szModuleName,"PSK",&dbv1);
+ s=(dbv1.type==DBVT_ASCIIZ);
+ DBFreeVariant(&dbv1);
+ DBGetContactSetting(pUinKey(lParam2)->hContact,szModuleName,"PSK",&dbv2);
+ d=(dbv2.type==DBVT_ASCIIZ);
+ DBFreeVariant(&dbv2);
+ return (s-d)*m;
+ } break;
+ }
+ return 0;
+}
+
+
+void ListView_Sort(HWND hLV, LPARAM lParamSort) {
+ char t[32];
+
+ // restore sort column
+ sprintf(t,"os%02x",(UINT)lParamSort&0xF0);
+ if((lParamSort&0x0F)==0) {
+ lParamSort=(int)DBGetContactSettingByte(0, szModuleName, t, lParamSort+1);
+ }
+ DBWriteContactSettingByte(0, szModuleName, t, (BYTE)lParamSort);
+
+ // restore sort order
+ sprintf(t,"os%02x",(UINT)lParamSort);
+ int m=DBGetContactSettingByte(0, szModuleName, t, 0);
+ if(bChangeSortOrder){ m=!m; DBWriteContactSettingByte(0, szModuleName, t, m); }
+
+ ListView_SortItems(hLV,&CompareFunc,lParamSort|(m<<8));
+}
+
+
+BOOL ShowSelectKeyDlg(HWND hParent, LPSTR KeyPath)
+{
+ OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hwndOwner = hParent;
+ ofn.nMaxFile = MAX_PATH;
+ ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_NONETWORKBUTTON;
+
+ ofn.lpstrFile = KeyPath;
+ ofn.lpstrFilter = "ASC files\0*.asc\0All files (*.*)\0*.*\0";
+ ofn.lpstrTitle = "Open Key File";
+ if (!GetOpenFileName(&ofn)) return FALSE;
+
+ return TRUE;
+}
+
+
+LPCSTR priv_beg = "-----BEGIN PGP PRIVATE KEY BLOCK-----";
+LPCSTR priv_end = "-----END PGP PRIVATE KEY BLOCK-----";
+LPCSTR publ_beg = "-----BEGIN PGP PUBLIC KEY BLOCK-----";
+LPCSTR publ_end = "-----END PGP PUBLIC KEY BLOCK-----";
+
+LPSTR LoadKeys(LPCSTR file,BOOL priv) {
+ FILE *f=fopen(file,"r");
+ if(!f) return NULL;
+
+ fseek(f,0,SEEK_END);
+ int flen = ftell(f);
+ fseek(f,0,SEEK_SET);
+
+ LPCSTR beg,end;
+ if(priv) {
+ beg = priv_beg;
+ end = priv_end;
+ }
+ else {
+ beg = publ_beg;
+ end = publ_end;
+ }
+
+ LPSTR keys = (LPSTR)mir_alloc(flen+1);
+ int i=0; BOOL b=false;
+ while(fgets(keys+i,128,f)) {
+ if(!b && strncmp(keys+i,beg,strlen(beg))==0) {
+ b=true;
+ }
+ else
+ if(b && strncmp(keys+i,end,strlen(end))==0) {
+ i+=strlen(keys+i);
+ b=false;
+ }
+ if(b) {
+ i+=strlen(keys+i);
+ }
+ }
+ *(keys+i)='\0';
+/* while(flen) {
+ int block = (flen>32768)?32768:flen;
+ fread(keys+i,block,1,f);
+ i+=block;
+ flen-=block;
+ }*/
+ fclose(f);
+ return keys;
+}
+
+
+BOOL SaveExportRSAKeyDlg(HWND hParent, LPSTR key, BOOL priv)
+{
+ char szFile[MAX_PATH] = "rsa_pub.asc";
+ if( priv ) strcpy(szFile,"rsa_priv.asc");
+
+ OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hwndOwner = hParent;
+ ofn.nMaxFile = MAX_PATH;
+ ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_NONETWORKBUTTON;
+ ofn.lpstrFile = szFile;
+ ofn.lpstrFilter = "ASC files\0*.asc\0All files (*.*)\0*.*\0";
+ ofn.lpstrTitle = (priv)?"Save Private Key File":"Save Public Key File";
+ if (!GetSaveFileName(&ofn)) return FALSE;
+
+ FILE *f=fopen(szFile,"wb");
+ if( !f ) return FALSE;
+ fwrite(key,strlen(key),1,f);
+ fclose(f);
+
+ return TRUE;
+}
+
+
+BOOL LoadImportRSAKeyDlg(HWND hParent, LPSTR key, BOOL priv)
+{
+ char szFile[MAX_PATH] = "rsa_pub.asc";
+ if( priv ) strcpy(szFile,"rsa_priv.asc");
+
+ OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hwndOwner = hParent;
+ ofn.nMaxFile = MAX_PATH;
+ ofn.Flags = OFN_EXPLORER | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT | OFN_NOREADONLYRETURN;
+ ofn.lpstrFile = szFile;
+ ofn.lpstrFilter = "ASC files\0*.asc\0All files (*.*)\0*.*\0";
+ ofn.lpstrTitle = (priv)?"Load Private Key File":"Load Public Key File";
+ if (!GetOpenFileName(&ofn)) return FALSE;
+
+ FILE *f=fopen(szFile,"rb");
+ if( !f ) return FALSE;
+
+ fseek(f,0,SEEK_END);
+ int flen = ftell(f); if(flen>RSASIZE) { fclose(f); return FALSE; }
+ fseek(f,0,SEEK_SET);
+
+ fread(key,flen,1,f);
+ fclose(f);
+
+ return TRUE;
+}
+
+
+int onRegisterOptions(WPARAM wParam, LPARAM) {
+ OPTIONSDIALOGPAGE odp;
+ memset(&odp,0,sizeof(odp));
+ odp.cbSize = sizeof(odp);
+ odp.hInstance = g_hInst;
+ odp.pszTemplate = MAKEINTRESOURCE(IDD_OPTIONSTAB);
+ odp.pszTitle = (char*)szModuleName;
+ odp.pszGroup = Translate("Services");
+ odp.pfnDlgProc = OptionsDlgProc;
+ CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp);
+ return 0;
+}
+
+// EOF
diff --git a/secureim/options.h b/secureim/options.h new file mode 100644 index 0000000..4bcfcd8 --- /dev/null +++ b/secureim/options.h @@ -0,0 +1,40 @@ +#ifndef __OPTIONS_H__
+#define __OPTIONS_H__
+
+BOOL CALLBACK OptionsDlgProc(HWND,UINT,WPARAM,LPARAM);
+BOOL CALLBACK DlgProcOptionsGeneral(HWND,UINT,WPARAM,LPARAM);
+BOOL CALLBACK DlgProcOptionsProto(HWND,UINT,WPARAM,LPARAM);
+BOOL CALLBACK DlgProcOptionsPGP(HWND,UINT,WPARAM,LPARAM);
+BOOL CALLBACK DlgProcOptionsGPG(HWND,UINT,WPARAM,LPARAM);
+BOOL CALLBACK DlgProcSetPSK(HWND,UINT,WPARAM,LPARAM);
+BOOL CALLBACK DlgProcSetPassphrase(HWND,UINT,WPARAM,LPARAM);
+void ApplyGeneralSettings(HWND);
+void ApplyProtoSettings(HWND);
+void ApplyPGPSettings(HWND);
+void ApplyGPGSettings(HWND);
+void RefreshGeneralDlg(HWND,BOOL);
+void RefreshProtoDlg(HWND);
+void RefreshPGPDlg(HWND,BOOL);
+void RefreshGPGDlg(HWND,BOOL);
+void ResetGeneralDlg(HWND);
+void ResetProtoDlg(HWND);
+LPARAM getListViewParam(HWND,UINT);
+void setListViewIcon(HWND,UINT,pUinKey);
+void setListViewMode(HWND,UINT,UINT);
+void setListViewStatus(HWND,UINT,UINT);
+UINT getListViewPSK(HWND,UINT);
+void setListViewPSK(HWND,UINT,UINT);
+UINT getListViewPUB(HWND,UINT);
+void setListViewPUB(HWND,UINT,UINT);
+int onRegisterOptions(WPARAM,LPARAM);
+int CALLBACK CompareFunc(LPARAM,LPARAM,LPARAM);
+void ListView_Sort(HWND,LPARAM);
+BOOL ShowSelectKeyDlg(HWND,LPSTR);
+LPSTR LoadKeys(LPCSTR,BOOL);
+BOOL SaveExportRSAKeyDlg(HWND,LPSTR,BOOL);
+BOOL LoadImportRSAKeyDlg(HWND,LPSTR,BOOL);
+
+#define getListViewContact(h,i) (HANDLE)getListViewParam(h,i)
+#define getListViewProto(h,i) (int)getListViewParam(h,i)
+
+#endif
diff --git a/secureim/popupOptions.cpp b/secureim/popupOptions.cpp new file mode 100644 index 0000000..892d265 --- /dev/null +++ b/secureim/popupOptions.cpp @@ -0,0 +1,238 @@ +#include "commonheaders.h"
+
+
+BOOL CALLBACK PopOptionsDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) {
+
+ char getTimeout[5];
+
+ HWND hec = GetDlgItem(hDlg, IDC_EC);
+ HWND hdc = GetDlgItem(hDlg, IDC_DC);
+ HWND hks = GetDlgItem(hDlg, IDC_KS);
+ HWND hkr = GetDlgItem(hDlg, IDC_KR);
+ HWND hss = GetDlgItem(hDlg, IDC_SS);
+ HWND hsr = GetDlgItem(hDlg, IDC_SR);
+
+ switch (wMsg) {
+ case WM_COMMAND: {
+
+ if (HIWORD(wParam) == CPN_COLOURCHANGED) {
+ //It's a colour picker change. LOWORD(wParam) is the control id.
+ DWORD color = SendDlgItemMessage(hDlg,LOWORD(wParam),CPM_GETCOLOUR,0,0);
+
+ switch(LOWORD(wParam)) {
+ case IDC_BACKKEY:
+ DBWriteContactSettingDword(0, szModuleName, "colorKeyb", color);
+ break;
+ case IDC_TEXTKEY:
+ DBWriteContactSettingDword(0, szModuleName, "colorKeyt", color);
+ break;
+ case IDC_BACKSEC:
+ DBWriteContactSettingDword(0, szModuleName, "colorSecb", color);
+ break;
+ case IDC_TEXTSEC:
+ DBWriteContactSettingDword(0, szModuleName, "colorSect", color);
+ break;
+ case IDC_BACKSR:
+ DBWriteContactSettingDword(0, szModuleName, "colorSRb", color);
+ break;
+ case IDC_TEXTSR:
+ DBWriteContactSettingDword(0, szModuleName, "colorSRt", color);
+ break;
+ }
+ return TRUE;
+ }
+
+ switch (LOWORD(wParam)) {
+ case IDC_PREV: {
+ //preview popups...
+ showPopUp("Key Popup",NULL,g_hPOP[POP_PU_PRC],0);
+ showPopUp("Secure Popup",NULL,g_hPOP[POP_PU_EST],1);
+ showPopUp("Message Popup",NULL,g_hPOP[POP_PU_MSR],2);
+ }
+ break;
+ case IDC_EC: {
+ //set ec checkbox value
+ DBWriteContactSettingByte(0, szModuleName, "ec", (BYTE)(SendMessage(hec,BM_GETCHECK,0L,0L)==BST_CHECKED));
+ }
+ break;
+ case IDC_DC: {
+ //set dc checkbox value
+ DBWriteContactSettingByte(0, szModuleName, "dc", (BYTE)(SendMessage(hdc,BM_GETCHECK,0L,0L)==BST_CHECKED));
+ }
+ break;
+ case IDC_SS: {
+ //set ss checkbox value
+ DBWriteContactSettingByte(0, szModuleName, "ss", (BYTE)(SendMessage(hss,BM_GETCHECK,0L,0L)==BST_CHECKED));
+ }
+ break;
+ case IDC_SR: {
+ //set sr checkbox value
+ DBWriteContactSettingByte(0, szModuleName, "sr", (BYTE)(SendMessage(hsr,BM_GETCHECK,0L,0L)==BST_CHECKED));
+ }
+ break;
+ case IDC_KS: {
+ //set indicator checkbox value
+ DBWriteContactSettingByte(0, szModuleName, "ks", (BYTE)(SendMessage(hks,BM_GETCHECK,0L,0L)==BST_CHECKED));
+ }
+ break;
+ case IDC_KR: {
+ //set indicator checkbox value
+ DBWriteContactSettingByte(0, szModuleName, "kr", (BYTE)(SendMessage(hkr,BM_GETCHECK,0L,0L)==BST_CHECKED));
+ }
+ break;
+ case IDC_TIMEKEY: {
+ //set timeout value
+ GetDlgItemText(hDlg,IDC_TIMEKEY,getTimeout,sizeof(getTimeout));
+ mir_itoa(atoi(getTimeout),getTimeout,10);
+ DBWriteContactSettingString(0, szModuleName, "timeoutKey", getTimeout);
+ }
+ break;
+ case IDC_TIMESEC: {
+ //set timeout value
+ GetDlgItemText(hDlg,IDC_TIMESEC,getTimeout,sizeof(getTimeout));
+ mir_itoa(atoi(getTimeout),getTimeout,10);
+ DBWriteContactSettingString(0, szModuleName, "timeoutSec", getTimeout);
+ }
+ break;
+ case IDC_TIMESR: {
+ //set timeout value
+ GetDlgItemText(hDlg,IDC_TIMESR,getTimeout,sizeof(getTimeout));
+ mir_itoa(atoi(getTimeout),getTimeout,10);
+ DBWriteContactSettingString(0, szModuleName, "timeoutSR", getTimeout);
+ }
+ break;
+ } //switch
+
+ RefreshPopupOptionsDlg(hec,hdc,hss,hsr,hks,hkr);
+ break;
+ }
+
+ case WM_DESTROY:
+ break;
+
+ case WM_INITDIALOG: {
+ TranslateDialogDefault(hDlg);
+ RefreshPopupOptionsDlg(hec,hdc,hss,hsr,hks,hkr);
+
+ DBVARIANT dbv;
+ char *timeout;
+
+ //set timeout value for Key
+ if (DBGetContactSetting(0, szModuleName, "timeoutKey", &dbv) == 0) timeout=dbv.pszVal;
+ else timeout="0";
+ SetDlgItemText(hDlg, IDC_TIMEKEY, timeout);
+ DBFreeVariant(&dbv);
+
+ //set timeout value for SEC
+ if (DBGetContactSetting(0, szModuleName, "timeoutSec", &dbv) == 0) timeout=dbv.pszVal;
+ else timeout="0";
+ SetDlgItemText(hDlg, IDC_TIMESEC, timeout);
+ DBFreeVariant(&dbv);
+
+ //set timeout value for SR
+ if (DBGetContactSetting(0, szModuleName, "timeoutSR", &dbv) == 0) timeout=dbv.pszVal;
+ else timeout="0";
+ SetDlgItemText(hDlg, IDC_TIMESR, timeout);
+ DBFreeVariant(&dbv);
+
+ //key color
+ SendDlgItemMessage(hDlg,IDC_BACKKEY,CPM_SETCOLOUR,0,DBGetContactSettingDword(0, szModuleName, "colorKeyb", RGB(230,230,255)));
+ SendDlgItemMessage(hDlg,IDC_TEXTKEY,CPM_SETCOLOUR,0,DBGetContactSettingDword(0, szModuleName, "colorKeyt", RGB(0,0,0)));
+
+ //Session color
+ SendDlgItemMessage(hDlg,IDC_BACKSEC,CPM_SETCOLOUR,0,DBGetContactSettingDword(0, szModuleName, "colorSecb", RGB(255,255,200)));
+ SendDlgItemMessage(hDlg,IDC_TEXTSEC,CPM_SETCOLOUR,0,DBGetContactSettingDword(0, szModuleName, "colorSect", RGB(0,0,0)));
+
+ //SR color
+ SendDlgItemMessage(hDlg,IDC_BACKSR,CPM_SETCOLOUR,0,DBGetContactSettingDword(0, szModuleName, "colorSRb", RGB(200,255,200)));
+ SendDlgItemMessage(hDlg,IDC_TEXTSR,CPM_SETCOLOUR,0,DBGetContactSettingDword(0, szModuleName, "colorSRt", RGB(0,0,0)));
+
+ break;
+ }
+
+ case WM_NOTIFY: {
+ break;
+ }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+void RefreshPopupOptionsDlg(HWND hec,HWND hdc,HWND hss,HWND hsr,HWND hks,HWND hkr) {
+
+ DBVARIANT dbv;
+ int indic;
+
+ // ec checkbox
+ if (DBGetContactSetting(0, szModuleName, "ec", &dbv) == 0)
+ {indic=dbv.bVal;
+ }
+ else indic=1;
+
+ if(indic==1)SendMessage(hec,BM_SETCHECK,BST_CHECKED,0L);
+ else SendMessage(hec,BM_SETCHECK,BST_UNCHECKED,0L);
+
+ // dc checkbox
+ if (DBGetContactSetting(0, szModuleName, "dc", &dbv) == 0)
+ {indic=dbv.bVal;
+ }
+ else indic=1;
+
+ if(indic==1)SendMessage(hdc,BM_SETCHECK,BST_CHECKED,0L);
+ else SendMessage(hdc,BM_SETCHECK,BST_UNCHECKED,0L);
+
+ // ks checkbox
+ if (DBGetContactSetting(0, szModuleName, "ks", &dbv) == 0)
+ {indic=dbv.bVal;
+ }
+ else indic=1;
+
+ if(indic==1)SendMessage(hks,BM_SETCHECK,BST_CHECKED,0L);
+ else SendMessage(hks,BM_SETCHECK,BST_UNCHECKED,0L);
+
+ // kr checkbox
+ if (DBGetContactSetting(0, szModuleName, "kr", &dbv) == 0)
+ {indic=dbv.bVal;
+ }
+ else indic=1;
+
+ if(indic==1)SendMessage(hkr,BM_SETCHECK,BST_CHECKED,0L);
+ else SendMessage(hkr,BM_SETCHECK,BST_UNCHECKED,0L);
+
+ //ss checkbox
+ if (DBGetContactSetting(0, szModuleName, "ss", &dbv) == 0)
+ {indic=dbv.bVal;
+ }
+ else indic=0;
+
+ if(indic==1)SendMessage(hss,BM_SETCHECK,BST_CHECKED,0L);
+ else SendMessage(hss,BM_SETCHECK,BST_UNCHECKED,0L);
+
+ //sr checkbox
+ if (DBGetContactSetting(0, szModuleName, "sr", &dbv) == 0)
+ {indic=dbv.bVal;
+ }
+ else indic=0;
+
+ if(indic==1)SendMessage(hsr,BM_SETCHECK,BST_CHECKED,0L);
+ else SendMessage(hsr,BM_SETCHECK,BST_UNCHECKED,0L);
+
+ DBFreeVariant(&dbv);
+}
+
+
+int onRegisterPopOptions(WPARAM wParam, LPARAM) {
+ OPTIONSDIALOGPAGE odp = {0};
+ odp.cbSize = sizeof(odp);
+ odp.hInstance = g_hInst;
+ odp.pszTemplate = MAKEINTRESOURCE(IDD_POPUP);
+ odp.pszTitle = (char*)szModuleName;
+ odp.pszGroup = Translate("Popups");
+ odp.pfnDlgProc = PopOptionsDlgProc;
+ CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp);
+ return 0;
+}
+
+// EOF
diff --git a/secureim/popupOptions.h b/secureim/popupOptions.h new file mode 100644 index 0000000..c596136 --- /dev/null +++ b/secureim/popupOptions.h @@ -0,0 +1,8 @@ +#ifndef __POPUP_OPTIONS__
+#define __POPUP_OPTIONS__
+
+BOOL CALLBACK PopOptionsDlgProc(HWND,UINT,WPARAM,LPARAM);
+void RefreshPopupOptionsDlg(HWND,HWND,HWND,HWND,HWND,HWND);
+int onRegisterPopOptions(WPARAM,LPARAM);
+
+#endif
diff --git a/secureim/resource.h b/secureim/resource.h new file mode 100644 index 0000000..f8a7537 --- /dev/null +++ b/secureim/resource.h @@ -0,0 +1,160 @@ +//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by resource.rc
+//
+#define ID_FIRSTICON 1
+#define IDI_CL_DIS 1
+#define IDI_CL_EST 2
+#define IDI_CM_DIS 3
+#define IDI_CM_EST 4
+#define IDI_MW_DIS 5
+#define IDI_MW_EST 6
+#define IDI_PU_DIS 7
+#define IDI_PU_EST 8
+#define IDI_PU_PRC 9
+#define IDI_PU_MSG 10
+#define IDI_ST_DIS 11
+#define IDI_ST_ENA 12
+#define IDI_ST_TRY 13
+#define IDI_OV_NAT 14
+#define IDI_OV_PGP 15
+#define IDI_OV_GPG 16
+#define IDI_OV_RSA 17
+#define ID_LASTICON 17
+
+#define ID_DISABLED 111
+#define ID_ENABLED 112
+#define ID_ALWAYS 113
+#define ID_SETPSK 114
+#define ID_DELPSK 115
+#define ID_UPDATE_CLIST 116
+#define ID_UPDATE_PROTO 117
+#define ID_UPDATE_PLIST 118
+#define ID_UPDATE_GLIST 119
+#define ID_GETPUBL 120
+#define ID_DELPUBL 121
+#define ID_EXPPUBL 122
+#define ID_IMPPUBL 123
+
+#define ID_SIM_NATIVE 130
+#define ID_SIM_PGP 131
+#define ID_SIM_GPG 132
+#define ID_SIM_RSAAES 133
+#define ID_SIM_RSA 134
+
+#define IDM_CLIST0 150
+#define IDM_CLIST1 151
+#define IDM_CLIST2 152
+#define IDM_CLIST01 153
+#define IDM_CLIST02 154
+#define IDM_CLIST11 155
+#define IDM_CLIST12 156
+
+#define IDD_OPTIONSTAB 501
+#define IDD_TAB_GENERAL 502
+#define IDD_TAB_PROTO 503
+#define IDD_TAB_PGP 504
+#define IDD_TAB_GPG 505
+#define IDD_TAB_MESSAGES 506
+#define IDD_POPUP 507
+#define IDD_PSK 508
+#define IDD_PASSPHRASE 509
+
+#define IDC_STD_USERLIST 1001
+#define IDC_TIMEOUT 1002
+#define IDC_BACKKEY 1003
+#define IDC_TEXTKEY 1004
+#define IDC_PREV 1005
+#define IDC_BACKSEC 1006
+#define IDC_TEXTSEC 1007
+#define IDC_RESET 1008
+#define IDC_ALWAYSICON 1009
+#define IDC_EC 1010
+#define IDC_DC 1011
+#define IDC_KS 1012
+#define IDC_KR 1013
+#define IDC_SS 1014
+#define IDC_SR 1015
+#define IDC_BACKSR 1016
+#define IDC_BACKKEY6 1017
+#define IDC_TEXTSR 1018
+#define IDC_TIMEKEY 1019
+#define IDC_TIMESEC 1020
+#define IDC_TIMESR 1021
+#define IDC_PVALUES 1022
+#define IDC_ADD 1023
+#define IDC_DELETE 1024
+#define IDC_SFT 1025
+#define IDC_ASI 1026
+#define IDC_SOM 1027
+#define IDC_ADV0 1028
+#define IDC_ADV1 1029
+#define IDC_ADV2 1030
+#define IDC_ADV3 1031
+#define IDC_ADV4 1032
+#define IDC_ADV5 1033
+#define IDC_ADV6 1034
+#define IDC_ADV7 1035
+#define IDC_ADV8 1036
+#define IDC_MCD 1037
+#define IDC_KET 1038
+#define IDC_OPTIONSTAB 1039
+#define IDC_PROTO 1040
+#define IDC_EDIT1 1041
+#define IDC_EDIT2 1042
+#define IDC_SCM 1043
+#define IDC_DGP 1044
+#define IDC_OKT 1045
+#define IDC_AIP 1046
+#define IDC_ADVICON 1047
+#define IDC_SPLITON 1048
+#define IDC_SPLITOFF 1049
+#define IDC_RSA_SHA 1050
+#define IDC_NOL 1051
+#define IDC_AAK 1052
+#define IDC_MCM 1053
+#define IDC_RSA_COPY 1054
+#define IDC_RSA_EXP 1055
+#define IDC_RSA_EXPPRIV 1056
+#define IDC_RSA_IMPPRIV 1057
+#define IDC_PASSPHRASE 1058
+
+#define IDC_NO_PGP 1100
+#define IDC_PGP 1101
+#define IDC_GPG 1102
+
+#define IDC_PGP_SDK 1200
+#define IDC_PGP_USERLIST 1201
+#define IDC_SET_KEYRINGS 1202
+#define IDC_KEYRING_STATUS 1203
+#define IDC_PGP_PRIVKEY 1204
+#define IDC_LOAD_PRIVKEY 1205
+#define IDC_NO_KEYRINGS 1206
+
+#define IDC_GPGEXECUTABLE_EDIT 1300
+#define IDC_BROWSEEXECUTABLE_BTN 1301
+#define IDC_GPGHOME_EDIT 1302
+#define IDC_SECRETKEY_DDOWN 1303
+#define IDC_SECRETREFRESH_BTN 1304
+#define IDC_GPG_USERLIST 1305
+#define IDC_PUBLICKEY_DDOWN 1306
+#define IDC_PUBLICREFRESH_BTN 1307
+#define IDC_LOGGINGON_CBOX 1308
+#define IDC_GPGLOGFILE_EDIT 1309
+#define IDC_SAVEPASS_CBOX 1310
+#define IDC_TMPPATHON_CBOX 1311
+#define IDC_GPGTMPPATH_EDIT 1312
+
+#define IDC_STATIC -1
+#define ID_ENCRYPTION 40001
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 119
+#define _APS_NEXT_COMMAND_VALUE 40002
+#define _APS_NEXT_CONTROL_VALUE 1400
+#define _APS_NEXT_SYMED_VALUE 119
+#endif
+#endif
diff --git a/secureim/resource.rc b/secureim/resource.rc new file mode 100644 index 0000000..929f4a4 --- /dev/null +++ b/secureim/resource.rc @@ -0,0 +1,334 @@ +// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Russian resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
+#ifdef _WIN32
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+#pragma code_page(1251)
+#endif //_WIN32
+
+#include "version.rc"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_OPTIONSTAB DIALOGEX 0, 0, 312, 247
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ CONTROL "",IDC_OPTIONSTAB,"SysTabControl32",0x0,1,1,310,245,WS_EX_ACCEPTFILES
+END
+
+IDD_TAB_GENERAL DIALOGEX 0, 0, 303, 226
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "User List",IDC_STATIC,3,0,296,140
+ CONTROL "",IDC_STD_USERLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,9,288,126,WS_EX_STATICEDGE
+ CONTROL "Enable Secure Offline messages",IDC_SOM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,142,145,10
+ CONTROL "Enable Secure File Transfer",IDC_SFT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,152,145,10
+ CONTROL "Always show status icons in contact list",IDC_ASI,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,162,145,10
+ CONTROL "Context Menu only for ""Miranda"" clients",IDC_MCD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,172,145,10
+ CONTROL "Status in Context Menu",IDC_SCM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,182,145,10
+ CONTROL "Disable encryption for game plugins",IDC_DGP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,192,145,10
+ CONTROL "Always secured if possible",IDC_AIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,202,145,10
+ CONTROL "Not secured for NotOnList",IDC_NOL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,212,145,10
+ CONTROL "Auto accept RSA key (NOT SECURED)",IDC_AAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,156,142,145,10
+ CONTROL "Mode in Context Menu",IDC_MCM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,156,152,145,10
+ GROUPBOX "",IDC_STATIC,156,158,144,19
+ COMBOBOX IDC_ADVICON,160,163,135,81,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP,WS_EX_CLIENTEDGE
+ GROUPBOX "",IDC_STATIC,156,175,144,32
+ RTEXT "Key Exchange Timeout :",IDC_STATIC,160,182,80,8
+ EDITTEXT IDC_KET,241,180,30,12,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "sec",IDC_STATIC,275,182,18,8
+ RTEXT "Offline Key Timeout :",IDC_STATIC,160,194,80,8
+ EDITTEXT IDC_OKT,241,192,30,12,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "days",IDC_STATIC,275,194,18,8
+ GROUPBOX "",IDC_STATIC,156,204,93,19
+ CONTROL "PGP",IDC_PGP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,211,34,10
+ CONTROL "GPG",IDC_GPG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,210,211,34,10
+ PUSHBUTTON "Reset All",IDC_RESET,253,210,46,12
+END
+
+IDD_TAB_PROTO DIALOGEX 0, 0, 303, 226
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Protocols",IDC_STATIC,14,12,129,137
+ CONTROL "",IDC_PROTO,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,25,23,107,120,WS_EX_STATICEDGE
+ GROUPBOX "Split Messages",IDC_STATIC,154,12,136,28
+ EDITTEXT IDC_SPLITON,190,23,26,12,ES_AUTOHSCROLL
+ LTEXT "Online:",IDC_STATIC,160,24,23,10
+ EDITTEXT IDC_SPLITOFF,258,23,26,12,ES_AUTOHSCROLL
+ LTEXT "Offline:",IDC_STATIC,228,24,23,10
+ GROUPBOX "RSA Key",IDC_STATIC,14,157,274,56
+ LTEXT "SHA1:",IDC_STATIC,23,171,34,10
+ CTEXT "",IDC_RSA_SHA,58,169,220,12,SS_CENTERIMAGE | SS_SUNKEN
+ GROUPBOX "Public",IDC_STATIC,21,184,123,25
+ PUSHBUTTON "&Copy SHA1",IDC_RSA_COPY,27,193,54,12
+ PUSHBUTTON "E&xport",IDC_RSA_EXP,87,193,54,12
+ GROUPBOX "Private",IDC_STATIC,157,184,123,25
+ PUSHBUTTON "&Export",IDC_RSA_EXPPRIV,164,193,54,12
+ PUSHBUTTON "&Import",IDC_RSA_IMPPRIV,221,193,54,12
+END
+
+/*
+IDD_TAB_MESSAGES DIALOGEX 0, 0, 303, 226
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ GROUPBOX "Protocols",IDC_STATIC,82,25,129,168
+ EDITTEXT IDC_STATIC,221,71,69,77,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | ES_WANTRETURN
+END
+*/
+IDD_TAB_PGP DIALOGEX 0, 0, 303, 226
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ GROUPBOX "",IDC_STATIC,5,5,292,30
+ CTEXT "",IDC_PGP_SDK,13,15,101,15,SS_CENTERIMAGE | SS_SUNKEN
+ CTEXT "",IDC_KEYRING_STATUS,122,15,96,15,SS_CENTERIMAGE | SS_SUNKEN
+ PUSHBUTTON "Set &keyrings...",IDC_SET_KEYRINGS,225,15,65,15
+ CONTROL "",IDC_PGP_USERLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,5,40,292,150
+ GROUPBOX "",IDC_STATIC,5,190,292,30
+ CTEXT "",IDC_PGP_PRIVKEY,13,200,106,15,SS_CENTERIMAGE | SS_SUNKEN
+ CTEXT "",IDC_STATIC,126,200,92,15,SS_CENTERIMAGE | SS_SUNKEN
+ CONTROL "Disable keyrings use",IDC_NO_KEYRINGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,133,201,79,13
+ PUSHBUTTON "Load &Private key",IDC_LOAD_PRIVKEY,225,200,65,15
+END
+
+IDD_TAB_GPG DIALOG DISCARDABLE 0, 0, 303, 226
+STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Basic",IDC_STATIC,0,0,302,52
+ LTEXT "Executable:",IDC_STATIC,5,11,58,8
+ EDITTEXT IDC_GPGEXECUTABLE_EDIT,65,8,216,12,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_BROWSEEXECUTABLE_BTN,281,8,14,12
+ LTEXT "Home Directory:",IDC_STATIC,5,24,58,8
+ EDITTEXT IDC_GPGHOME_EDIT,65,22,232,12,ES_AUTOHSCROLL
+ CONTROL "Temp Dir:",IDC_TMPPATHON_CBOX,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,8,37,46,10
+ EDITTEXT IDC_GPGTMPPATH_EDIT,65,36,232,12,ES_AUTOHSCROLL
+ GROUPBOX "Key Assignment",IDC_STATIC,0,53,302,142
+ CONTROL "",IDC_GPG_USERLIST,"SysListView32",LVS_REPORT |
+ LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,4,63,294,128
+ GROUPBOX "Debug",IDC_STATIC,0,196,302,28
+ CONTROL "Log to File",IDC_LOGGINGON_CBOX,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,5,208,46,10
+ EDITTEXT IDC_GPGLOGFILE_EDIT,56,207,187,12,ES_AUTOHSCROLL
+ CONTROL "Save Pass",IDC_SAVEPASS_CBOX,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,249,208,48,10
+END
+
+
+IDD_POPUP DIALOGEX 0, 0, 303, 226
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ CONTROL "",IDC_BACKKEY,"ColourPicker",WS_TABSTOP,14,36,28,14
+ CONTROL "",IDC_TEXTKEY,"ColourPicker",WS_TABSTOP,50,36,28,14
+ CTEXT "Back",IDC_STATIC,14,23,28,8
+ CTEXT "Text",IDC_STATIC,50,23,28,8
+ LTEXT "Key agreement colors",IDC_STATIC,82,42,105,8
+ CONTROL "",IDC_BACKSEC,"ColourPicker",WS_TABSTOP,14,57,28,14
+ CONTROL "",IDC_TEXTSEC,"ColourPicker",WS_TABSTOP,50,57,28,14
+ LTEXT "Secure connection colors",IDC_STATIC,82,63,105,8
+ CONTROL "",IDC_BACKSR,"ColourPicker",WS_TABSTOP,14,79,28,14
+ CONTROL "",IDC_TEXTSR,"ColourPicker",WS_TABSTOP,50,79,28,14
+ LTEXT "Send/Receive encrypted colors",IDC_STATIC,82,84,104,8
+ GROUPBOX "SecureIM PopUp Colors",IDC_STATIC,7,7,181,122
+ PUSHBUTTON "Preview",IDC_PREV,15,107,57,16
+ GROUPBOX "Events",IDC_STATIC,7,132,248,88
+ GROUPBOX "PopUp Timeout",IDC_STATIC,196,7,59,122
+ EDITTEXT IDC_TIMEKEY,210,37,31,14,ES_AUTOHSCROLL
+ EDITTEXT IDC_TIMESEC,210,59,31,14,ES_AUTOHSCROLL
+ EDITTEXT IDC_TIMESR,210,81,31,14,ES_AUTOHSCROLL
+ CTEXT "Time in Seconds",IDC_STATIC,200,23,54,8
+ CTEXT "0 = Default PopUp Timeout Value",IDC_STATIC,200,101,49,24
+ CONTROL "Show a popup on established connection",IDC_EC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,144,168,10
+ CONTROL "Show a popup on disabled connection",IDC_DC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,156,168,10
+ CONTROL "Show a popup on key send",IDC_KS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,168,168,10
+ CONTROL "Show a popup on key received",IDC_KR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,180,168,10
+ CONTROL "Show a popup on each secure send",IDC_SS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,192,168,10
+ CONTROL "Show a popup on each secure receive",IDC_SR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,204,168,10
+END
+
+
+IDD_PSK DIALOGEX 0, 0, 166, 73
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Please type in your password"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ LTEXT "Username:",IDC_STATIC,7,16,36,8
+ EDITTEXT IDC_EDIT2,46,14,113,13,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED
+ LTEXT "Password:",IDC_STATIC,7,36,34,8
+ EDITTEXT IDC_EDIT1,46,33,113,13,ES_PASSWORD | ES_AUTOHSCROLL
+ DEFPUSHBUTTON "OK",IDOK,126,54,33,12
+ PUSHBUTTON "Cancel",IDCANCEL,92,54,33,12
+END
+
+
+IDD_PASSPHRASE DIALOGEX 0, 0, 238, 46
+STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "SecureIM plugin Passphrase of private key"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "Enter passphrase for the secret key:",IDC_STATIC,8,8,168,8
+ EDITTEXT IDC_PASSPHRASE,6,24,168,12,ES_PASSWORD | ES_AUTOHSCROLL
+ DEFPUSHBUTTON "Ok",IDOK,181,7,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,181,24,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_CLIST0 MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ POPUP "Mode"
+ BEGIN
+ MENUITEM "Native SecureIM", ID_SIM_NATIVE
+ MENUITEM "PGP SecureIM", ID_SIM_PGP
+ MENUITEM "GPG SecureIM", ID_SIM_GPG
+ MENUITEM "RSA/AES SecureIM", ID_SIM_RSAAES
+// MENUITEM "RSA SecureIM", ID_SIM_RSA
+ END
+ POPUP "Status"
+ BEGIN
+ MENUITEM "Always Try to Establish Secure IM", ID_ALWAYS
+ MENUITEM "Secure IM Enabled", ID_ENABLED
+ MENUITEM "Secure IM Disabled", ID_DISABLED
+ END
+ POPUP "Pre-shared key"
+ BEGIN
+ MENUITEM "Set key", ID_SETPSK
+ MENUITEM "Delete key", ID_DELPSK
+ END
+ END
+END
+
+
+IDM_CLIST01 MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Always Try to Establish Secure IM", ID_ALWAYS
+ MENUITEM "Secure IM Enabled", ID_ENABLED
+ MENUITEM "Secure IM Disabled", ID_DISABLED
+ END
+END
+
+
+IDM_CLIST02 MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Set pre-shared key", ID_SETPSK
+ MENUITEM "Delete pre-shared key", ID_DELPSK
+ END
+END
+
+
+IDM_CLIST1 MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ POPUP "Mode"
+ BEGIN
+ MENUITEM "Native SecureIM", ID_SIM_NATIVE
+ MENUITEM "PGP SecureIM", ID_SIM_PGP
+ MENUITEM "GPG SecureIM", ID_SIM_GPG
+ MENUITEM "RSA/AES SecureIM", ID_SIM_RSAAES
+// MENUITEM "RSA SecureIM", ID_SIM_RSA
+ END
+ POPUP "Status"
+ BEGIN
+ MENUITEM "Secure IM Enabled", ID_ENABLED
+ MENUITEM "Secure IM Disabled", ID_DISABLED
+ END
+ POPUP "Public key"
+ BEGIN
+ MENUITEM "Export key", ID_EXPPUBL
+ MENUITEM "Import key", ID_IMPPUBL
+ MENUITEM "Delete key", ID_DELPUBL
+ END
+ END
+END
+
+
+IDM_CLIST11 MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Secure IM Enabled", ID_ENABLED
+ MENUITEM "Secure IM Disabled", ID_DISABLED
+ END
+END
+
+
+IDM_CLIST12 MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Export public key", ID_EXPPUBL
+ MENUITEM "Import public key", ID_IMPPUBL
+ MENUITEM "Delete public key", ID_DELPUBL
+ END
+END
+
+
+IDM_CLIST2 MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Native SecureIM", ID_SIM_NATIVE
+ MENUITEM "PGP SecureIM", ID_SIM_PGP
+ MENUITEM "GPG SecureIM", ID_SIM_GPG
+ MENUITEM "RSA/AES SecureIM", ID_SIM_RSAAES
+// MENUITEM "RSA SecureIM", ID_SIM_RSA
+ END
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+ "afxres.h\0"
+ "version.rc\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // Russian resources
+/////////////////////////////////////////////////////////////////////////////
diff --git a/secureim/resource_icons.rc b/secureim/resource_icons.rc new file mode 100644 index 0000000..db48cec --- /dev/null +++ b/secureim/resource_icons.rc @@ -0,0 +1,66 @@ +// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Russian resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+#pragma code_page(1251)
+
+#include "version_icons.rc"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_CL_DIS ICON "icons\\cl_dis.ico"
+IDI_CL_EST ICON "icons\\cl_est.ico"
+IDI_CM_DIS ICON "icons\\cm_dis.ico"
+IDI_CM_EST ICON "icons\\cm_est.ico"
+IDI_MW_DIS ICON "icons\\mw_dis.ico"
+IDI_MW_EST ICON "icons\\mw_est.ico"
+IDI_PU_DIS ICON "icons\\pu_dis.ico"
+IDI_PU_EST ICON "icons\\pu_est.ico"
+IDI_PU_PRC ICON "icons\\pu_prc.ico"
+IDI_PU_MSG ICON "icons\\pu_msg.ico"
+IDI_ST_DIS ICON "icons\\st_dis.ico"
+IDI_ST_ENA ICON "icons\\st_ena.ico"
+IDI_ST_TRY ICON "icons\\st_try.ico"
+IDI_OV_NAT ICON "icons\\ov_nat.ico"
+IDI_OV_PGP ICON "icons\\ov_pgp.ico"
+IDI_OV_GPG ICON "icons\\ov_gpg.ico"
+IDI_OV_RSA ICON "icons\\ov_rsa.ico"
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+ "afxres.h\0"
+ "version.rc\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // Russian resources
+/////////////////////////////////////////////////////////////////////////////
diff --git a/secureim/rtfconv.cpp b/secureim/rtfconv.cpp new file mode 100644 index 0000000..271e62a --- /dev/null +++ b/secureim/rtfconv.cpp @@ -0,0 +1,46 @@ +#include "commonheaders.h"
+
+
+HINSTANCE hRtfconv = NULL;
+RTFCONVSTRING pRtfconvString = NULL;
+
+
+BOOL load_rtfconv () {
+
+ hRtfconv = LoadLibrary( "rtfconv.dll" ) ;
+ if ( hRtfconv == NULL ) {
+ hRtfconv = LoadLibrary( "plugins\\rtfconv.dll" ) ;
+ if ( hRtfconv == NULL )
+ return FALSE;
+ }
+
+ pRtfconvString = (RTFCONVSTRING) GetProcAddress( hRtfconv, "RtfconvString" ) ;
+ if ( pRtfconvString == NULL ) {
+ FreeLibrary( hRtfconv ) ;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void free_rtfconv () {
+
+ if ( hRtfconv )
+ FreeLibrary( hRtfconv ) ;
+ pRtfconvString = NULL;
+ hRtfconv = NULL;
+}
+
+
+void rtfconvA(LPCSTR rtf, LPWSTR plain) {
+
+ pRtfconvString( rtf, plain, 0, 1200, CONVMODE_USE_SYSTEM_TABLE, (strlen(rtf)+1)*sizeof(WCHAR) );
+}
+
+
+void rtfconvW(LPCWSTR rtf, LPWSTR plain) {
+
+ pRtfconvString( rtf, plain, 0, 1200, CONVMODE_USE_SYSTEM_TABLE, (wcslen(rtf)+1)*sizeof(WCHAR) );
+}
+
+// EOF
diff --git a/secureim/rtfconv.h b/secureim/rtfconv.h new file mode 100644 index 0000000..2a3e750 --- /dev/null +++ b/secureim/rtfconv.h @@ -0,0 +1,23 @@ +#ifndef __RTFCONV_H__
+#define __RTFCONV_H__
+
+#include <windows.h>
+
+#ifndef _INTPTR_T_DEFINED
+#define intptr_t int
+#endif
+
+#define CONVMODE_USE_SYSTEM_TABLE 0x800000 /* Use OS's table only */
+
+typedef intptr_t (WINAPI *RTFCONVSTRING) ( const void *pSrcBuffer, void *pDstBuffer,
+ int nSrcCodePage, int nDstCodePage, unsigned long dwFlags,
+ size_t nMaxLen );
+
+extern RTFCONVSTRING pRtfconvString;
+
+BOOL load_rtfconv ();
+void free_rtfconv ();
+void rtfconvA(LPCSTR rtf, LPWSTR plain);
+void rtfconvW(LPCWSTR rtf, LPWSTR plain);
+
+#endif
diff --git a/secureim/sdk/m_extraicons.h b/secureim/sdk/m_extraicons.h new file mode 100644 index 0000000..1e86cb1 --- /dev/null +++ b/secureim/sdk/m_extraicons.h @@ -0,0 +1,182 @@ +/*
+ Copyright (C) 2009 Ricardo Pescuma Domenecci
+
+ This is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this file; see the file license.txt. If
+ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __M_EXTRAICONS_H__
+#define __M_EXTRAICONS_H__
+
+
+/*
+
+There is 2 ways of registering with Extra Icons service:
+
+1. Using callbacks
+ This works similar to clist API. When you register you provide 2 callbacks, one to rebuild the icons
+and one to apply the icons for a contact.
+ In the RebuildIcons callback, all icons that will be used have to be registered calling
+MS_CLIST_EXTRA_ADD_ICON service. The value returned by this service has to be stored and used in the
+apply icons.
+ The ApplyIcons callback will be called for all the needed contacts. Inside it, you must call
+MS_EXTRAICON_SET_ICON to set the icon for the contact, sending the value returned by MS_CLIST_EXTRA_ADD_ICON
+as the hImage.
+
+2. Using icolib
+ In this case no callback is needed and the plugin just need to call MS_EXTRAICON_SET_ICON passing the
+icolib name in icoName when needed. If your plugin can have extra icons on startup, remember to do a loop
+over all contacts to set the initial icon.
+
+
+To register a new extra icon, you have to call MS_EXTRAICON_REGISTER passing the needed atributes.
+
+*/
+
+#define MIID_EXTRAICONSSERVICE { 0x62d80749, 0xf169, 0x4592, { 0xb4, 0x4d, 0x3d, 0xd6, 0xde, 0x9d, 0x50, 0xc5 } }
+
+
+#define EXTRAICON_TYPE_CALLBACK 0 // Similar to old clist callbacks, it fires 2 notifications
+#define EXTRAICON_TYPE_ICOLIB 1 // This extra icon will use only icons registered with icolib. No callbacks
+ // needed. Just call MS_EXTRAICON_SET_ICON passing the name of the extraicon to set one.
+
+
+typedef struct {
+ int cbSize;
+ int type; // One of EXTRAICON_TYPE_*
+ const char *name; // Internal name. More than one plugin can register extra icons with the same name
+ // if both have the same type. In this case, both will be handled as one.
+ // If the types are different the second one will be denied.
+ const char *description; // [Translated by plugin] Description to be used in GUI
+ const char *descIcon; // [Optional] Name of an icon registered with icolib to be used in GUI.
+
+ // If type == EXTRAICON_TYPE_CALLBACK this two must be set
+
+ // Callback to add icons to clist, calling MS_CLIST_EXTRA_ADD_ICON
+ // wParam=lParam=0
+ MIRANDAHOOK RebuildIcons;
+
+ // Callback to set the icon to clist, calling MS_CLIST_EXTRA_SET_ICON or MS_EXTRAICON_SET_ICON
+ // wParam = HANDLE hContact
+ // lParam = 0
+ MIRANDAHOOK ApplyIcon;
+
+ // Other optional callbacks
+
+ // [Optional] Callback called when extra icon was clicked
+ // wParam = HANDLE hContact
+ // lParam = int slot
+ // param = onClickParam
+ MIRANDAHOOKPARAM OnClick;
+
+ LPARAM onClickParam;
+
+} EXTRAICON_INFO;
+
+
+// Register an extra icon
+// wParam = (EXTRAICON_INFO *) Extra icon info
+// lParam = 0
+// Return: (HANDLE) id of extra icon on success, 0 on error
+#define MS_EXTRAICON_REGISTER "ExtraIcon/Register"
+
+
+typedef struct {
+ int cbSize;
+ HANDLE hExtraIcon; // Value returned by MS_EXTRAICON_REGISTER
+ HANDLE hContact; // Contact to set the extra icon
+ union { // The icon to be set. This depends on the type of the extra icon:
+ HANDLE hImage; // Value returned by MS_CLIST_EXTRA_ADD_ICON (if EXTRAICON_TYPE_CALLBACK)
+ const char *icoName; // Name of the icon registered with icolib (if EXTRAICON_TYPE_ICOLIB)
+ };
+} EXTRAICON;
+
+// Set an extra icon icon
+// wParam = (EXTRAICON *) Extra icon
+// Return: 0 on success
+#define MS_EXTRAICON_SET_ICON "ExtraIcon/SetIcon"
+
+
+
+#ifndef _NO_WRAPPERS
+#ifdef __cplusplus
+
+static HANDLE ExtraIcon_Register(const char *name, const char *description, const char *descIcon,
+ MIRANDAHOOK RebuildIcons,
+ MIRANDAHOOK ApplyIcon,
+ MIRANDAHOOKPARAM OnClick = NULL, LPARAM onClickParam = 0)
+{
+ if (!ServiceExists(MS_EXTRAICON_REGISTER))
+ return NULL;
+
+ EXTRAICON_INFO ei = {0};
+ ei.cbSize = sizeof(ei);
+ ei.type = EXTRAICON_TYPE_CALLBACK;
+ ei.name = name;
+ ei.description = description;
+ ei.descIcon = descIcon;
+ ei.RebuildIcons = RebuildIcons;
+ ei.ApplyIcon = ApplyIcon;
+ ei.OnClick = OnClick;
+ ei.onClickParam = onClickParam;
+
+ return (HANDLE) CallService(MS_EXTRAICON_REGISTER, (WPARAM) &ei, 0);
+}
+
+static HANDLE ExtraIcon_Register(const char *name, const char *description, const char *descIcon = NULL,
+ MIRANDAHOOKPARAM OnClick = NULL, LPARAM onClickParam = 0)
+{
+ if (!ServiceExists(MS_EXTRAICON_REGISTER))
+ return NULL;
+
+ EXTRAICON_INFO ei = {0};
+ ei.cbSize = sizeof(ei);
+ ei.type = EXTRAICON_TYPE_ICOLIB;
+ ei.name = name;
+ ei.description = description;
+ ei.descIcon = descIcon;
+ ei.OnClick = OnClick;
+ ei.onClickParam = onClickParam;
+
+ return (HANDLE) CallService(MS_EXTRAICON_REGISTER, (WPARAM) &ei, 0);
+}
+
+static int ExtraIcon_SetIcon(HANDLE hExtraIcon, HANDLE hContact, HANDLE hImage)
+{
+ EXTRAICON ei = {0};
+ ei.cbSize = sizeof(ei);
+ ei.hExtraIcon = hExtraIcon;
+ ei.hContact = hContact;
+ ei.hImage = hImage;
+
+ return CallService(MS_EXTRAICON_SET_ICON, (WPARAM) &ei, 0);
+}
+
+static int ExtraIcon_SetIcon(HANDLE hExtraIcon, HANDLE hContact, const char *icoName)
+{
+ EXTRAICON ei = {0};
+ ei.cbSize = sizeof(ei);
+ ei.hExtraIcon = hExtraIcon;
+ ei.hContact = hContact;
+ ei.icoName = icoName;
+
+ return CallService(MS_EXTRAICON_SET_ICON, (WPARAM) &ei, 0);
+}
+
+#endif
+#endif
+
+
+#endif // __M_EXTRAICONS_H__
diff --git a/secureim/sdk/m_folders.h b/secureim/sdk/m_folders.h new file mode 100644 index 0000000..5070c35 --- /dev/null +++ b/secureim/sdk/m_folders.h @@ -0,0 +1,282 @@ +/*
+Custom profile folders plugin for Miranda IM
+
+Copyright © 2005 Cristian Libotean
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef M_CUSTOM_FOLDERS_H
+#define M_CUSTOM_FOLDERS_H
+
+#define FOLDERS_API 501 //dunno why it's here but it is :)
+
+#define PROFILE_PATH "%profile_path%"
+#define CURRENT_PROFILE "%current_profile%"
+#define MIRANDA_PATH "%miranda_path%"
+#define PLUGINS_PATH "%miranda_path%" "\\plugins"
+
+#define TO_WIDE(x) L ## x
+
+#define PROFILE_PATHW L"%profile_path%"
+#define CURRENT_PROFILEW L"%current_profile%"
+#define MIRANDA_PATHW L"%miranda_path%"
+
+#define FOLDER_AVATARS PROFILE_PATH "\\" CURRENT_PROFILE "\\avatars"
+#define FOLDER_VCARDS PROFILE_PATH "\\" CURRENT_PROFILE "\\vcards"
+#define FOLDER_LOGS PROFILE_PATH "\\" CURRENT_PROFILE "\\logs"
+#define FOLDER_RECEIVED_FILES PROFILE_PATH "\\" CURRENT_PROFILE "\\received files"
+#define FOLDER_DOCS MIRANDA_PATH "\\" "docs"
+
+#define FOLDER_CONFIG PLUGINS_PATH "\\" "config"
+
+#define FOLDER_SCRIPTS MIRANDA_PATH "\\" "scripts"
+
+#define FOLDER_UPDATES MIRANDA_PATH "\\" "updates"
+
+#define FOLDER_CUSTOMIZE MIRANDA_PATH "\\" "customize"
+#define FOLDER_CUSTOMIZE_SOUNDS FOLDER_CUSTOMIZE "\\sounds"
+#define FOLDER_CUSTOMIZE_ICONS FOLDER_CUSTOMIZE "\\icons"
+#define FOLDER_CUSTOMIZE_SMILEYS FOLDER_CUSTOMIZE "\\smileys"
+#define FOLDER_CUSTOMIZE_SKINS FOLDER_CUSTOMIZE "\\skins"
+#define FOLDER_CUSTOMIZE_THEMES FOLDER_CUSTOMIZE "\\themes"
+
+
+#define FOLDERS_NAME_MAX_SIZE 64 //maximum name and section size
+
+#define FF_UNICODE 0x00000001
+
+#if defined (UNICODE)
+ #define FF_TCHAR FF_UNICODE
+#else
+ #define FF_TCHAR 0
+#endif
+
+typedef struct{
+ int cbSize; //size of struct
+ char szSection[FOLDERS_NAME_MAX_SIZE]; //section name, if it doesn't exist it will be created otherwise it will just add this entry to it
+ char szName[FOLDERS_NAME_MAX_SIZE]; //entry name - will be shown in options
+ union{
+ const char *szFormat; //default string format. Fallback string in case there's no entry in the database for this folder. This should be the initial value for the path, users will be able to change it later.
+ const wchar_t *szFormatW; //String is dup()'d so you can free it later. If you set the unicode string don't forget to set the flag accordingly.
+ const TCHAR *szFormatT;
+ };
+ DWORD flags; //FF_* flags
+} FOLDERSDATA;
+
+/*Folders/Register/Path service
+ wParam - not used, must be 0
+ lParam - (LPARAM) (const FOLDERDATA *) - Data structure filled with
+ the necessary information.
+ Returns a handle to the registered path or 0 on error.
+ You need to use this to call the other services.
+*/
+#define MS_FOLDERS_REGISTER_PATH "Folders/Register/Path"
+
+/*Folders/Get/PathSize service
+ wParam - (WPARAM) (int) - handle to registered path
+ lParam - (LPARAM) (int *) - pointer to the variable that receives the size of the path
+ string (not including the null character). Depending on the flags set when creating the path
+ it will either call strlen() or wcslen() to get the length of the string.
+ Returns the size of the buffer.
+*/
+#define MS_FOLDERS_GET_SIZE "Folders/Get/PathSize"
+
+typedef struct{
+ int cbSize;
+ int nMaxPathSize; //maximum size of buffer. This represents the number of characters that can be copied to it (so for unicode strings you don't send the number of bytes but the length of the string).
+ union{
+ char *szPath; //pointer to the buffer that receives the path without the last "\\"
+ wchar_t *szPathW; //unicode version of the buffer.
+ TCHAR *szPathT;
+ };
+} FOLDERSGETDATA;
+
+/*Folders/Get/Path service
+ wParam - (WPARAM) (int) - handle to registered path
+ lParam - (LPARAM) (FOLDERSGETDATA *) pointer to a FOLDERSGETDATA that has all the relevant fields filled.
+ Should return 0 on success, or nonzero otherwise.
+*/
+#define MS_FOLDERS_GET_PATH "Folders/Get/Path"
+
+typedef struct{
+ int cbSize;
+ union{
+ char **szPath; //address of a string variable (char *) or (wchar_t*) where the path should be stored (the last \ won't be copied).
+ wchar_t **szPathW; //unicode version of string.
+ TCHAR **szPathT;
+ };
+} FOLDERSGETALLOCDATA;
+
+/*Folders/GetRelativePath/Alloc service
+ wParam - (WPARAM) (int) - Handle to registered path
+ lParam - (LPARAM) (FOLDERSALLOCDATA *) data
+ This service is the same as MS_FOLDERS_GET_PATH with the difference that this service
+ allocates the needed space for the buffer. It uses miranda's memory functions for that and you need
+ to use those to free the resulting buffer.
+ Should return 0 on success, or nonzero otherwise. Currently it only returns 0.
+*/
+#define MS_FOLDERS_GET_PATH_ALLOC "Folders/Get/Path/Alloc"
+
+
+/*Folders/On/Path/Changed
+ wParam - (WPARAM) 0
+ lParam - (LPARAM) 0
+ Triggered when the folders change, you should reget the paths you registered.
+*/
+#define ME_FOLDERS_PATH_CHANGED "Folders/On/Path/Changed"
+
+#ifndef FOLDERS_NO_HELPER_FUNCTIONS
+
+#ifndef M_UTILS_H__
+#error The helper functions require that m_utils.h be included in the project. Please include that file if you want to use the helper functions. If you don't want to use the functions just define FOLDERS_NO_HELPER_FUNCTIONS.
+#endif
+//#include "../../../include/newpluginapi.h"
+
+__inline static HANDLE FoldersRegisterCustomPath(const char *section, const char *name, const char *defaultPath)
+{
+ FOLDERSDATA fd = {0};
+ if (!ServiceExists(MS_FOLDERS_REGISTER_PATH)) return 0;
+ fd.cbSize = sizeof(FOLDERSDATA);
+ strncpy(fd.szSection, section, FOLDERS_NAME_MAX_SIZE);
+ fd.szSection[FOLDERS_NAME_MAX_SIZE - 1] = '\0';
+ strncpy(fd.szName, name, FOLDERS_NAME_MAX_SIZE);
+ fd.szName[FOLDERS_NAME_MAX_SIZE - 1] = '\0';
+ fd.szFormat = defaultPath;
+ return (HANDLE) CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM) &fd);
+}
+
+__inline static HANDLE FoldersRegisterCustomPathW(const char *section, const char *name, const wchar_t *defaultPathW)
+{
+ FOLDERSDATA fd = {0};
+ if (!ServiceExists(MS_FOLDERS_REGISTER_PATH)) return 0;
+ fd.cbSize = sizeof(FOLDERSDATA);
+ strncpy(fd.szSection, section, FOLDERS_NAME_MAX_SIZE);
+ fd.szSection[FOLDERS_NAME_MAX_SIZE - 1] = '\0'; //make sure it's NULL terminated
+ strncpy(fd.szName, name, FOLDERS_NAME_MAX_SIZE);
+ fd.szName[FOLDERS_NAME_MAX_SIZE - 1] = '\0'; //make sure it's NULL terminated
+ fd.szFormatW = defaultPathW;
+ fd.flags = FF_UNICODE;
+ return (HANDLE) CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM) &fd);
+}
+
+__inline static int FoldersGetCustomPath(HANDLE hFolderEntry, char *path, const int size, char *notFound)
+{
+ FOLDERSGETDATA fgd = {0};
+ int res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = size;
+ fgd.szPath = path;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ char buffer[MAX_PATH];
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM) notFound, (LPARAM) buffer);
+ mir_snprintf(path, size, "%s", buffer);
+ }
+
+ return res;
+}
+
+__inline static int FoldersGetCustomPathW(HANDLE hFolderEntry, wchar_t *pathW, const int count, wchar_t *notFoundW)
+{
+ FOLDERSGETDATA fgd = {0};
+ int res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = count;
+ fgd.szPathW = pathW;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ wcsncpy(pathW, notFoundW, count);
+ pathW[count - 1] = '\0';
+ }
+
+ return res;
+}
+
+__inline static int FoldersGetCustomPathEx(HANDLE hFolderEntry, char *path, const int size, char *notFound, char *fileName)
+{
+ FOLDERSGETDATA fgd = {0};
+ int res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = size;
+ fgd.szPath = path;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ char buffer[MAX_PATH];
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM) notFound, (LPARAM) buffer);
+ mir_snprintf(path, size, "%s", buffer);
+ }
+ if (strlen(path) > 0)
+ {
+ strcat(path, "\\");
+ }
+ else{
+ path[0] = '\0';
+ }
+
+ if (fileName)
+ {
+ strcat(path, fileName);
+ }
+
+ return res;
+}
+
+__inline static int FoldersGetCustomPathExW(HANDLE hFolderEntry, wchar_t *pathW, const int count, wchar_t *notFoundW, wchar_t *fileNameW)
+{
+ FOLDERSGETDATA fgd = {0};
+ int res;
+ fgd.cbSize = sizeof(FOLDERSGETDATA);
+ fgd.nMaxPathSize = count;
+ fgd.szPathW = pathW;
+ res = CallService(MS_FOLDERS_GET_PATH, (WPARAM) hFolderEntry, (LPARAM) &fgd);
+ if (res)
+ {
+ wcsncpy(pathW, notFoundW, count);
+ pathW[count - 1] = '\0';
+ }
+
+ if (wcslen(pathW) > 0)
+ {
+ wcscat(pathW, L"\\");
+ }
+ else{
+ pathW[0] = L'\0';
+ }
+
+ if (fileNameW)
+ {
+ wcscat(pathW, fileNameW);
+ }
+
+ return res;
+}
+
+# ifdef _UNICODE
+# define FoldersGetCustomPathT FoldersGetCustomPathW
+# define FoldersGetCustomPathExT FoldersGetCustomPathExW
+# define FoldersRegisterCustomPathT FoldersRegisterCustomPathW
+#else
+# define FoldersGetCustomPathT FoldersGetCustomPath
+# define FoldersGetCustomPathExT FoldersGetCustomPath
+# define FoldersRegisterCustomPathT FoldersRegisterCustomPath
+#endif
+
+#endif
+
+#endif //M_CUSTOM_FOLDERS_H
diff --git a/secureim/sdk/m_metacontacts.h b/secureim/sdk/m_metacontacts.h new file mode 100644 index 0000000..9f348bd --- /dev/null +++ b/secureim/sdk/m_metacontacts.h @@ -0,0 +1,166 @@ +/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright © 2004 Universite Louis PASTEUR, STRASBOURG.
+Copyright © 2004 Scott Ellis (www.scottellis.com.au mail@scottellis.com.au)
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef M_METACONTACTS_H__
+#define M_METACONTACTS_H__ 1
+
+#ifndef MIID_METACONTACTS
+#define MIID_METACONTACTS {0xc0325019, 0xc1a7, 0x40f5, { 0x83, 0x65, 0x4f, 0x46, 0xbe, 0x21, 0x86, 0x3e}}
+#endif
+
+//get the handle for a contact's parent metacontact
+//wParam=(HANDLE)hSubContact
+//lParam=0
+//returns a handle to the parent metacontact, or null if this contact is not a subcontact
+#define MS_MC_GETMETACONTACT "MetaContacts/GetMeta"
+
+//gets the handle for the default contact
+//wParam=(HANDLE)hMetaContact
+//lParam=0
+//returns a handle to the default contact, or null on failure
+#define MS_MC_GETDEFAULTCONTACT "MetaContacts/GetDefault"
+
+//gets the contact number for the default contact
+//wParam=(HANDLE)hMetaContact
+//lParam=0
+//returns a DWORD contact number, or -1 on failure
+#define MS_MC_GETDEFAULTCONTACTNUM "MetaContacts/GetDefaultNum"
+
+//gets the handle for the 'most online' contact
+//wParam=(HANDLE)hMetaContact
+//lParam=0
+//returns a handle to the 'most online' contact
+#define MS_MC_GETMOSTONLINECONTACT "MetaContacts/GetMostOnline"
+
+//gets the number of subcontacts for a metacontact
+//wParam=(HANDLE)hMetaContact
+//lParam=0
+//returns a DWORD representing the number of subcontacts for the given metacontact
+#define MS_MC_GETNUMCONTACTS "MetaContacts/GetNumContacts"
+
+//gets the handle of a subcontact, using the subcontact's number
+//wParam=(HANDLE)hMetaContact
+//lParam=(DWORD)contact number
+//returns a handle to the specified subcontact
+#define MS_MC_GETSUBCONTACT "MetaContacts/GetSubContact"
+
+//sets the default contact, using the subcontact's contact number
+//wParam=(HANDLE)hMetaContact
+//lParam=(DWORD)contact number
+//returns 0 on success
+#define MS_MC_SETDEFAULTCONTACTNUM "MetaContacts/SetDefault"
+
+//sets the default contact, using the subcontact's handle
+//wParam=(HANDLE)hMetaContact
+//lParam=(HANDLE)hSubcontact
+//returns 0 on success
+#define MS_MC_SETDEFAULTCONTACT "MetaContacts/SetDefaultByHandle"
+
+//forces the metacontact to send using a specific subcontact, using the subcontact's contact number
+//wParam=(HANDLE)hMetaContact
+//lParam=(DWORD)contact number
+//returns 0 on success
+#define MS_MC_FORCESENDCONTACTNUM "MetaContacts/ForceSendContact"
+
+//forces the metacontact to send using a specific subcontact, using the subcontact's handle
+//wParam=(HANDLE)hMetaContact
+//lParam=(HANDLE)hSubcontact
+//returns 0 on success (will fail if 'force default' is in effect)
+#define MS_MC_FORCESENDCONTACT "MetaContacts/ForceSendContactByHandle"
+
+//'unforces' the metacontact to send using a specific subcontact
+//wParam=(HANDLE)hMetaContact
+//lParam=0
+//returns 0 on success (will fail if 'force default' is in effect)
+#define MS_MC_UNFORCESENDCONTACT "MetaContacts/UnforceSendContact"
+
+//'forces' or 'unforces' (i.e. toggles) the metacontact to send using it's default contact
+// overrides (and clears) 'force send' above, and will even force use of offline contacts
+// will send ME_MC_FORCESEND or ME_MC_UNFORCESEND event
+//wParam=(HANDLE)hMetaContact
+//lParam=0
+//returns 1(true) or 0(false) representing new state of 'force default'
+#define MS_MC_FORCEDEFAULT "MetaContacts/ForceSendDefault"
+
+// method to get state of 'force' for a metacontact
+// wParam=(HANDLE)hMetaContact
+// lParam= (DWORD)&contact_number or NULL
+//
+// if lparam supplied, the contact_number of the contatct 'in force' will be copied to the address it points to,
+// or if none is in force, the value (DWORD)-1 will be copied
+// (v0.8.0.8+ returns 1 if 'force default' is true with *lParam == default contact number, else returns 0 with *lParam as above)
+#define MS_MC_GETFORCESTATE "MetaContacts/GetForceState"
+
+// fired when a metacontact's default contact changes (fired upon creation of metacontact also, when default is initially set)
+// wParam=(HANDLE)hMetaContact
+// lParam=(HANDLE)hDefaultContact
+#define ME_MC_DEFAULTTCHANGED "MetaContacts/DefaultChanged"
+
+// fired when a metacontact's subcontacts change (fired upon creation of metacontact, when contacts are added or removed, and when
+// contacts are reordered) - a signal to re-read metacontact data
+// wParam=(HANDLE)hMetaContact
+// lParam=0
+#define ME_MC_SUBCONTACTSCHANGED "MetaContacts/SubcontactsChanged"
+
+// fired when a metacontact is forced to send using a specific subcontact
+// wParam=(HANDLE)hMetaContact
+// lParam=(HANDLE)hForceContact
+#define ME_MC_FORCESEND "MetaContacts/ForceSend"
+
+// fired when a metacontact is 'unforced' to send using a specific subcontact
+// wParam=(HANDLE)hMetaContact
+// lParam=0
+#define ME_MC_UNFORCESEND "MetaContacts/UnforceSend"
+
+// method to get protocol name - used to be sure you're dealing with a "real" metacontacts plugin :)
+// wParam=lParam=0
+#define MS_MC_GETPROTOCOLNAME "MetaContacts/GetProtoName"
+
+
+// added 0.9.5.0 (22/3/05)
+// wParam=(HANDLE)hContact
+// lParam=0
+// convert a given contact into a metacontact
+#define MS_MC_CONVERTTOMETA "MetaContacts/ConvertToMetacontact"
+
+// added 0.9.5.0 (22/3/05)
+// wParam=(HANDLE)hContact
+// lParam=(HANDLE)hMeta
+// add an existing contact to a metacontact
+#define MS_MC_ADDTOMETA "MetaContacts/AddToMetacontact"
+
+// added 0.9.5.0 (22/3/05)
+// wParam=0
+// lParam=(HANDLE)hContact
+// remove a contact from a metacontact
+#define MS_MC_REMOVEFROMMETA "MetaContacts/RemoveFromMetacontact"
+
+
+// added 0.9.13.2 (6/10/05)
+// wParam=(BOOL)disable
+// lParam=0
+// enable/disable the 'hidden group hack' - for clists that support subcontact hiding using 'IsSubcontact' setting
+// should be called once in the clist 'onmodulesloaded' event handler (which, since it's loaded after the db, will be called
+// before the metacontact onmodulesloaded handler where the subcontact hiding is usually done)
+#define MS_MC_DISABLEHIDDENGROUP "MetaContacts/DisableHiddenGroup"
+
+#endif
diff --git a/secureim/sdk/m_updater.h b/secureim/sdk/m_updater.h new file mode 100644 index 0000000..371b743 --- /dev/null +++ b/secureim/sdk/m_updater.h @@ -0,0 +1,146 @@ +#ifndef _M_UPDATER_H
+#define _M_UPDATER_H
+
+// NOTES:
+// - For langpack updates, include a string of the following format in the langpack text file:
+// ";FLID: <file listing name> <version>"
+// version must be four numbers seperated by '.', in the range 0-255 inclusive
+// - Updater will disable plugins that are downloaded but were not active prior to the update (this is so that, if an archive contains e.g. ansi and
+// unicode versions, the correct plugin will be the only one active after the new version is installed)...so if you add a support plugin, you may need
+// to install an ini file to make the plugin activate when miranda restarts after the update
+// - Updater will replace all dlls that have the same internal shortName as a downloaded update dll (this is so that msn1.dll and msn2.dll, for example,
+// will both be updated) - so if you have a unicode and a non-unicode version of a plugin in your archive, you should make the internal names different (which will break automatic
+// updates from the file listing if there is only one file listing entry for both versions, unless you use the 'MS_UPDATE_REGISTER' service below)
+// - Updater will install all files in the root of the archive into the plugins folder, except for langpack files that contain the FLID string which go into the root folder (same
+// folder as miranda32.exe)...all folders in the archive will also be copied to miranda's root folder, and their contents transferred into the new folders. The only exception is a
+// special folder called 'root_files' - if there is a folder by that name in the archive, it's contents will also be copied into miranda's root folder - this is intended to be used
+// to install additional dlls etc that a plugin may require)
+
+// if you set Update.szUpdateURL to the following value when registering, as well as setting your beta site and version data,
+// Updater will ignore szVersionURL and pbVersionPrefix, and attempt to find the file listing URL's from the backend XML data.
+// for this to work, the plugin name in pluginInfo.shortName must match the file listing exactly (except for case)
+#define UPDATER_AUTOREGISTER "UpdaterAUTOREGISTER"
+// Updater will also use the backend xml data if you provide URL's that reference the miranda file listing for updates (so you can use that method
+// if e.g. your plugin shortName does not match the file listing) - it will grab the file listing id from the end of these URLs
+
+typedef struct Update_tag {
+ int cbSize;
+ char *szComponentName; // component name as it will appear in the UI (will be translated before displaying)
+
+ char *szVersionURL; // URL where the current version can be found (NULL to disable)
+ BYTE *pbVersionPrefix; // bytes occuring in VersionURL before the version, used to locate the version information within the URL data
+ // (note that this URL could point at a binary file - dunno why, but it could :)
+ int cpbVersionPrefix; // number of bytes pointed to by pbVersionPrefix
+ char *szUpdateURL; // URL where dll/zip is located
+ // set to UPDATER_AUTOREGISTER if you want Updater to find the file listing URLs (ensure plugin shortName matches file listing!)
+
+ char *szBetaVersionURL; // URL where the beta version can be found (NULL to disable betas)
+ BYTE *pbBetaVersionPrefix; // bytes occuring in VersionURL before the version, used to locate the version information within the URL data
+ int cpbBetaVersionPrefix; // number of bytes pointed to by pbVersionPrefix
+ char *szBetaUpdateURL; // URL where dll/zip is located
+
+ BYTE *pbVersion; // bytes of current version, used for comparison with those in VersionURL
+ int cpbVersion; // number of bytes pointed to by pbVersion
+
+ char *szBetaChangelogURL; // url for displaying changelog for beta versions
+} Update;
+
+// register a comonent with Updater
+//
+// wparam = 0
+// lparam = (LPARAM)&Update
+#define MS_UPDATE_REGISTER "Update/Register"
+
+// utility functions to create a version string from a DWORD or from pluginInfo
+// point buf at a buffer at least 16 chars wide - but note the version string returned may be shorter
+//
+__inline static char *CreateVersionString(DWORD version, char *buf) {
+ mir_snprintf(buf, 16, "%d.%d.%d.%d", (version >> 24) & 0xFF, (version >> 16) & 0xFF, (version >> 8) & 0xFF, version & 0xFF);
+ return buf;
+}
+
+__inline static char *CreateVersionStringPlugin(PLUGININFO *pluginInfo, char *buf) {
+ return CreateVersionString(pluginInfo->version, buf);
+}
+
+
+// register the 'easy' way - use this method if you have no beta URL and the plugin is on the miranda file listing
+// NOTE: the plugin version string on the file listing must be the string version of the version in pluginInfo (i.e. 0.0.0.1,
+// four numbers between 0 and 255 inclusivem, so no letters, brackets, etc.)
+//
+// wParam = (int)fileID - this is the file ID from the file listing (i.e. the number at the end of the download link)
+// lParam = (PLUGININFO*)&pluginInfo
+#define MS_UPDATE_REGISTERFL "Update/RegisterFL"
+
+// this function can be used to 'unregister' components - useful for plugins that register non-plugin/langpack components and
+// may need to change those components on the fly
+// lParam = (char *)szComponentName
+#define MS_UPDATE_UNREGISTER "Update/Unregister"
+
+// this event is fired when the startup process is complete, but NOT if a restart is imminent
+// it is designed for status managment plugins to use as a trigger for beggining their own startup process
+// wParam = lParam = 0 (unused)
+// (added in version 0.1.6.0)
+#define ME_UPDATE_STARTUPDONE "Update/StartupDone"
+
+// this service can be used to enable/disable Updater's global status control
+// it can be called from the StartupDone event handler
+// wParam = (BOOL)enable
+// lParam = 0
+// (added in version 0.1.6.0)
+#define MS_UPDATE_ENABLESTATUSCONTROL "Update/EnableStatusControl"
+
+// An description of usage of the above service and event:
+// Say you are a status control plugin that normally sets protocol or global statuses in your ModulesLoaded event handler.
+// In order to make yourself 'Updater compatible', you would move the status control code from ModulesLoaded to another function,
+// say DoStartup. Then, in ModulesLoaded you would check for the existence of the MS_UPDATE_ENABLESTATUSCONTROL service.
+// If it does not exist, call DoStartup. If it does exist, hook the ME_UPDATE_STARTUPDONE event and call DoStartup from there. You may
+// also wish to call MS_UPDATE_ENABLESTATUSCONTROL with wParam == FALSE at this time, to disable Updater's own status control feature.
+
+// this service can be used to determine whether updates are possible for a component with the given name
+// wParam = 0
+// lParam = (char *)szComponentName
+// returns TRUE if updates are supported, FALSE otherwise
+#define MS_UPDATE_ISUPDATESUPPORTED "Update/IsUpdateSupported"
+
+#endif
+
+
+/////////////// Usage Example ///////////////
+
+#ifdef EXAMPLE_CODE
+
+// you need to #include "m_updater.h" and HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded) in your Load function...
+
+int OnModulesLoaded(WPARAM wParam, LPARAM lParam) {
+
+ Update update = {0}; // for c you'd use memset or ZeroMemory...
+ char szVersion[16];
+
+ update.cbSize = sizeof(Update);
+
+ update.szComponentName = pluginInfo.shortName;
+ update.pbVersion = (BYTE *)CreateVersionString(&pluginInfo, szVersion);
+ update.cpbVersion = strlen((char *)update.pbVersion);
+
+ // these are the three lines that matter - the archive, the page containing the version string, and the text (or data)
+ // before the version that we use to locate it on the page
+ // (note that if the update URL and the version URL point to standard file listing entries, the backend xml
+ // data will be used to check for updates rather than the actual web page - this is not true for beta urls)
+ update.szUpdateURL = "http://scottellis.com.au:81/test/updater.zip";
+ update.szVersionURL = "http://scottellis.com.au:81/test/updater_test.html";
+ update.pbVersionPrefix = (BYTE *)"Updater version ";
+
+ update.cpbVersionPrefix = strlen((char *)update.pbVersionPrefix);
+
+ // do the same for the beta versions of the above struct members if you wish to allow beta updates from another URL
+
+ CallService(MS_UPDATE_REGISTER, 0, (WPARAM)&update);
+
+ // Alternatively, to register a plugin with e.g. file ID 2254 on the file listing...
+ // CallService(MS_UPDATE_REGISTERFL, (WPARAM)2254, (LPARAM)&pluginInfo);
+
+ return 0;
+}
+
+#endif
diff --git a/secureim/secureim.dep b/secureim/secureim.dep new file mode 100644 index 0000000..d1b433b --- /dev/null +++ b/secureim/secureim.dep @@ -0,0 +1,56 @@ +# Microsoft Developer Studio Generated Dependency File, included by secureim.mak
+
+.\commonheaders.cpp : \
+ "..\..\include\m_clc.h"\
+ "..\..\include\m_clist.h"\
+ "..\..\include\m_clui.h"\
+ "..\..\include\m_cluiframes.h"\
+ "..\..\include\m_database.h"\
+ "..\..\include\m_genmenu.h"\
+ "..\..\include\m_icolib.h"\
+ "..\..\include\m_langpack.h"\
+ "..\..\include\m_message.h"\
+ "..\..\include\m_netlib.h"\
+ "..\..\include\m_options.h"\
+ "..\..\include\m_plugins.h"\
+ "..\..\include\m_popup.h"\
+ "..\..\include\m_protocols.h"\
+ "..\..\include\m_protomod.h"\
+ "..\..\include\m_protosvc.h"\
+ "..\..\include\m_skin.h"\
+ "..\..\include\m_stdhdr.h"\
+ "..\..\include\m_system.h"\
+ "..\..\include\m_utils.h"\
+ "..\..\include\newpluginapi.h"\
+ "..\..\include\statusmodes.h"\
+ ".\commonheaders.h"\
+ ".\crypt.h"\
+ ".\cryptopp.h"\
+ ".\dbevent.h"\
+ ".\gettime.h"\
+ ".\images.h"\
+ ".\language.h"\
+ ".\loadicons.h"\
+ ".\loadlib.h"\
+ ".\mmi.h"\
+ ".\options.h"\
+ ".\popupOptions.h"\
+ ".\rtfconv.h"\
+ ".\sdk\m_extraicons.h"\
+ ".\sdk\m_folders.h"\
+ ".\sdk\m_metacontacts.h"\
+ ".\sdk\m_updater.h"\
+ ".\secureim.h"\
+ ".\svcs_clist.h"\
+ ".\svcs_menu.h"\
+ ".\svcs_proto.h"\
+ ".\svcs_rsa.h"\
+ ".\svcs_srmm.h"\
+ ".\version.h"\
+ "d:\program files\microsoft visual studio\vc98\include\basetsd.h"\
+
+
+.\resource.rc : \
+ ".\version.h"\
+ ".\version.rc"\
+
diff --git a/secureim/secureim.h b/secureim/secureim.h new file mode 100644 index 0000000..a307d1e --- /dev/null +++ b/secureim/secureim.h @@ -0,0 +1,172 @@ +#ifndef __SECURE_IM__
+#define __SECURE_IM__
+
+#include "resource.h"
+
+// режимы шифрования SecureIM
+#define MODE_NATIVE 0
+#define MODE_PGP 1
+#define MODE_GPG 2
+#define MODE_RSAAES 3
+#define MODE_CNT (3+1)
+#define MODE_RSA 4
+
+#define SECURED 0x10
+
+// статусы для Native и RSA/AES режимов
+#define STATUS_DISABLED 0
+#define STATUS_ENABLED 1
+#define STATUS_ALWAYSTRY 2
+
+#define SiG_KEYR 0
+#define SiG_KEY3 SiG_KEYR
+#define SiG_KEY4 SiG_KEYR
+#define SiG_ENON 1
+#define SiG_ENOF 2
+#define SiG_RSND 3
+#define SiG_INIT 4
+#define SiG_DEIN 5
+#define SiG_DISA 6
+#define SiG_FAKE 7
+#define SiG_KEYA 8
+#define SiG_KEYB 9
+#define SiG_PART 10
+#define SiG_SECU 11
+#define SiG_SECP 12
+#define SiG_PGPM 13
+#define SiG_NONE -1
+#define SiG_GAME -2
+
+struct SIG {
+ char *sig;
+ BYTE len;
+ char key;
+};
+
+const SIG signs[] = {
+ {"----Key3@hell----", 17, SiG_KEYR},
+ {"----Key4@hell----", 17, SiG_KEYR},
+ {"----Secured@hell----", 20, SiG_ENON},
+ {"----Offline@hell----", 20, SiG_ENOF},
+ {"----Resend@hell----", 19, SiG_RSND},
+ {"----INIT@HELL----", 17, SiG_INIT},
+ {"----DEINIT@HELL----", 19, SiG_DEIN},
+ {"----DISABLED@HELL----", 21, SiG_DISA},
+ {"----FAKE@HELL----", 17, SiG_FAKE},
+ {"----KeyA@hell----", 17, SiG_KEYA},
+ {"----KeyB@hell----", 17, SiG_KEYB},
+ {"----Part@hell----", 17, SiG_PART},
+ {"[SECURE]", 8, SiG_SECU},
+ {"[$ECURE]", 8, SiG_SECP},
+ {"-----BEGIN PGP MESSAGE-----", 27, SiG_PGPM},
+ {"@@BattleShip", 12, SiG_GAME},
+ {"GoMoku 0.0.2.2:", 15, SiG_GAME},
+ {"@@GoMoku", 8, SiG_GAME},
+ {"pbiChess:", 9, SiG_GAME},
+ {"pbiReverse:", 11, SiG_GAME},
+ {"pbiCorners:", 11, SiG_GAME},
+ {"pbiCheckersInt:", 15, SiG_GAME},
+ {"pbiCheckersRus:", 15, SiG_GAME},
+ {"pbiCheckersPool:", 16, SiG_GAME},
+ {0}
+};
+
+#define SIG_KEY3 signs[ 0].sig
+#define SIG_KEY4 signs[ 1].sig
+#define SIG_ENON signs[ 2].sig
+#define SIG_ENOF signs[ 3].sig
+#define SIG_RSND signs[ 4].sig
+#define SIG_INIT signs[ 5].sig
+#define SIG_DEIN signs[ 6].sig
+#define SIG_DISA signs[ 7].sig
+#define SIG_FAKE signs[ 8].sig
+#define SIG_KEYA signs[ 9].sig
+#define SIG_KEYB signs[10].sig
+#define SIG_PART signs[11].sig
+#define SIG_SECU signs[12].sig
+#define SIG_SECP signs[13].sig
+
+#define LEN_KEY3 signs[ 0].len
+#define LEN_KEY4 signs[ 1].len
+#define LEN_ENON signs[ 2].len
+#define LEN_ENOF signs[ 3].len
+#define LEN_RSND signs[ 4].len
+#define LEN_INIT signs[ 5].len
+#define LEN_DEIN signs[ 6].len
+#define LEN_DISA signs[ 7].len
+#define LEN_FAKE signs[ 8].len
+#define LEN_KEYA signs[ 9].len
+#define LEN_KEYB signs[10].len
+#define LEN_PART signs[11].len
+#define LEN_SECU signs[12].len
+#define LEN_SECP signs[13].len
+
+#define TBL_IEC 0x01
+#define TBL_ICO 0x02
+#define TBL_POP 0x03
+
+#define IEC_CL_DIS 0x00
+#define IEC_CL_EST 0x01
+#define IEC_CNT (0x01+1)
+
+#define ICO_CM_DIS 0x00
+#define ICO_CM_EST 0x01
+#define ICO_MW_DIS 0x02
+#define ICO_MW_EST 0x03
+#define ICO_ST_DIS 0x04
+#define ICO_ST_ENA 0x05
+#define ICO_ST_TRY 0x06
+#define ICO_OV_NAT 0x07
+#define ICO_OV_PGP 0x08
+#define ICO_OV_GPG 0x09
+#define ICO_OV_RSA 0x0A
+#define ICO_CNT (0x0A+1)
+
+#define POP_PU_DIS 0x00
+#define POP_PU_EST 0x01
+#define POP_PU_PRC 0x02
+#define POP_PU_MSR 0x03
+#define POP_PU_MSS 0x04
+#define POP_CNT (0x04+1)
+
+#define ADV_CNT 8
+#define ALL_CNT (IEC_CNT+ICO_CNT+POP_CNT)
+
+struct ICONS {
+ UINT key; // Resource ID
+ BYTE tbl; // Table NUM
+ BYTE idx; // Table IDX
+ char *section;
+ char *name;
+ char *text;
+};
+
+const ICONS icons[] = {
+ // Contact List
+ {IDI_CL_DIS, TBL_IEC, IEC_CL_DIS, MODULENAME"/Contact List", "sim_cl_dis", "Connection Disabled"},
+ {IDI_CL_EST, TBL_IEC, IEC_CL_EST, MODULENAME"/Contact List", "sim_cl_est", "Connection Established"},
+ // Contact Menu
+ {IDI_CM_DIS, TBL_ICO, ICO_CM_DIS, MODULENAME"/Contact Menu", "sim_cm_dis", "Disable Secure Connection"},
+ {IDI_CM_EST, TBL_ICO, ICO_CM_EST, MODULENAME"/Contact Menu", "sim_cm_est", "Establishe Secure Connection"},
+ // Message Window
+ {IDI_MW_DIS, TBL_ICO, ICO_MW_DIS, MODULENAME"/Message Window", "sim_mw_dis", "Connection Disabled"},
+ {IDI_MW_EST, TBL_ICO, ICO_MW_EST, MODULENAME"/Message Window", "sim_mw_est", "Connection Established"},
+ // popup's
+ {IDI_PU_DIS, TBL_POP, POP_PU_DIS, MODULENAME"/Popups", "sim_pu_dis", "Secure Connection Disabled"},
+ {IDI_PU_EST, TBL_POP, POP_PU_EST, MODULENAME"/Popups", "sim_pu_est", "Secure Connection Established"},
+ {IDI_PU_PRC, TBL_POP, POP_PU_PRC, MODULENAME"/Popups", "sim_pu_prc", "Secure Connection In Process"},
+ {IDI_PU_MSG, TBL_POP, POP_PU_MSR, MODULENAME"/Popups", "sim_pu_msr", "Recv Secured Message"},
+ {IDI_PU_MSG, TBL_POP, POP_PU_MSS, MODULENAME"/Popups", "sim_pu_mss", "Sent Secured Message"},
+ // statuses
+ {IDI_ST_DIS, TBL_ICO, ICO_ST_DIS, MODULENAME"/Menu State", "sim_st_dis", "Disabled"},
+ {IDI_ST_ENA, TBL_ICO, ICO_ST_ENA, MODULENAME"/Menu State", "sim_st_ena", "Enabled"},
+ {IDI_ST_TRY, TBL_ICO, ICO_ST_TRY, MODULENAME"/Menu State", "sim_st_try", "Always Try"},
+ // overlay
+ {IDI_OV_NAT, TBL_ICO, ICO_OV_NAT, MODULENAME"/Overlays", "sim_ov_nat", "Native mode"},
+ {IDI_OV_PGP, TBL_ICO, ICO_OV_PGP, MODULENAME"/Overlays", "sim_ov_pgp", "PGP mode"},
+ {IDI_OV_GPG, TBL_ICO, ICO_OV_GPG, MODULENAME"/Overlays", "sim_ov_gpg", "GPG mode"},
+ {IDI_OV_RSA, TBL_ICO, ICO_OV_RSA, MODULENAME"/Overlays", "sim_ov_rsa", "RSA/AES mode"},
+ {0}
+};
+
+#endif
diff --git a/secureim/secureim.mak b/secureim/secureim.mak new file mode 100644 index 0000000..8167a62 --- /dev/null +++ b/secureim/secureim.mak @@ -0,0 +1,443 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on secureim.dsp
+!IF "$(CFG)" == ""
+CFG=secureim - Win32 Release
+!MESSAGE No configuration specified. Defaulting to secureim - Win32 Release.
+!ENDIF
+
+!IF "$(CFG)" != "secureim - Win32 Release" && "$(CFG)" != "secureim - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "secureim.mak" CFG="secureim - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "secureim - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "secureim - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "secureim - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\secureim.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\commonheaders.obj"
+ -@erase "$(INTDIR)\crypt_check.obj"
+ -@erase "$(INTDIR)\crypt_dll.obj"
+ -@erase "$(INTDIR)\crypt_icons.obj"
+ -@erase "$(INTDIR)\crypt_lists.obj"
+ -@erase "$(INTDIR)\crypt_metacontacts.obj"
+ -@erase "$(INTDIR)\crypt_misc.obj"
+ -@erase "$(INTDIR)\crypt_popups.obj"
+ -@erase "$(INTDIR)\dbevent.obj"
+ -@erase "$(INTDIR)\gettime.obj"
+ -@erase "$(INTDIR)\images.obj"
+ -@erase "$(INTDIR)\language.obj"
+ -@erase "$(INTDIR)\loadicons.obj"
+ -@erase "$(INTDIR)\loadlib.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\mmi.obj"
+ -@erase "$(INTDIR)\options.obj"
+ -@erase "$(INTDIR)\popupOptions.obj"
+ -@erase "$(INTDIR)\resource.res"
+ -@erase "$(INTDIR)\rtfconv.obj"
+ -@erase "$(INTDIR)\secureim.pch"
+ -@erase "$(INTDIR)\splitmsg.obj"
+ -@erase "$(INTDIR)\svcs_clist.obj"
+ -@erase "$(INTDIR)\svcs_menu.obj"
+ -@erase "$(INTDIR)\svcs_proto.obj"
+ -@erase "$(INTDIR)\svcs_rsa.obj"
+ -@erase "$(INTDIR)\svcs_srmm.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\secureim.dll"
+ -@erase "$(OUTDIR)\secureim.exp"
+ -@erase "$(OUTDIR)\secureim.lib"
+ -@erase "$(OUTDIR)\secureim.map"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MD /W3 /GX /O1 /I "\source\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /Fp"$(INTDIR)\secureim.pch" /Yu"commonheaders.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+RSC_PROJ=/l 0x419 /fo"$(INTDIR)\resource.res" /d "NDEBUG"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\secureim.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib msimg32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /base:"0x45000000" /dll /incremental:no /pdb:"$(OUTDIR)\secureim.pdb" /map:"$(INTDIR)\secureim.map" /machine:I386 /out:"$(OUTDIR)\secureim.dll" /implib:"$(OUTDIR)\secureim.lib"
+LINK32_OBJS= \
+ "$(INTDIR)\commonheaders.obj" \
+ "$(INTDIR)\crypt_check.obj" \
+ "$(INTDIR)\crypt_dll.obj" \
+ "$(INTDIR)\crypt_icons.obj" \
+ "$(INTDIR)\crypt_lists.obj" \
+ "$(INTDIR)\crypt_metacontacts.obj" \
+ "$(INTDIR)\crypt_misc.obj" \
+ "$(INTDIR)\crypt_popups.obj" \
+ "$(INTDIR)\dbevent.obj" \
+ "$(INTDIR)\gettime.obj" \
+ "$(INTDIR)\images.obj" \
+ "$(INTDIR)\language.obj" \
+ "$(INTDIR)\loadicons.obj" \
+ "$(INTDIR)\loadlib.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\mmi.obj" \
+ "$(INTDIR)\options.obj" \
+ "$(INTDIR)\popupOptions.obj" \
+ "$(INTDIR)\rtfconv.obj" \
+ "$(INTDIR)\splitmsg.obj" \
+ "$(INTDIR)\svcs_clist.obj" \
+ "$(INTDIR)\svcs_menu.obj" \
+ "$(INTDIR)\svcs_proto.obj" \
+ "$(INTDIR)\svcs_rsa.obj" \
+ "$(INTDIR)\svcs_srmm.obj" \
+ "$(INTDIR)\resource.res"
+
+"$(OUTDIR)\secureim.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "secureim - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+ALL : "$(OUTDIR)\secureim.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\commonheaders.obj"
+ -@erase "$(INTDIR)\crypt_check.obj"
+ -@erase "$(INTDIR)\crypt_dll.obj"
+ -@erase "$(INTDIR)\crypt_icons.obj"
+ -@erase "$(INTDIR)\crypt_lists.obj"
+ -@erase "$(INTDIR)\crypt_metacontacts.obj"
+ -@erase "$(INTDIR)\crypt_misc.obj"
+ -@erase "$(INTDIR)\crypt_popups.obj"
+ -@erase "$(INTDIR)\dbevent.obj"
+ -@erase "$(INTDIR)\gettime.obj"
+ -@erase "$(INTDIR)\images.obj"
+ -@erase "$(INTDIR)\language.obj"
+ -@erase "$(INTDIR)\loadicons.obj"
+ -@erase "$(INTDIR)\loadlib.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\mmi.obj"
+ -@erase "$(INTDIR)\options.obj"
+ -@erase "$(INTDIR)\popupOptions.obj"
+ -@erase "$(INTDIR)\resource.res"
+ -@erase "$(INTDIR)\rtfconv.obj"
+ -@erase "$(INTDIR)\secureim.pch"
+ -@erase "$(INTDIR)\splitmsg.obj"
+ -@erase "$(INTDIR)\svcs_clist.obj"
+ -@erase "$(INTDIR)\svcs_menu.obj"
+ -@erase "$(INTDIR)\svcs_proto.obj"
+ -@erase "$(INTDIR)\svcs_rsa.obj"
+ -@erase "$(INTDIR)\svcs_srmm.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\secureim.dll"
+ -@erase "$(OUTDIR)\secureim.exp"
+ -@erase "$(OUTDIR)\secureim.lib"
+ -@erase "$(OUTDIR)\secureim.map"
+ -@erase "$(OUTDIR)\secureim.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "\source\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /Fp"$(INTDIR)\secureim.pch" /Yu"commonheaders.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
+RSC=rc.exe
+RSC_PROJ=/l 0x419 /fo"$(INTDIR)\resource.res" /d "_DEBUG"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\secureim.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib msimg32.lib /nologo /base:"0x45000000" /dll /incremental:no /pdb:"$(OUTDIR)\secureim.pdb" /map:"$(INTDIR)\secureim.map" /debug /machine:I386 /out:"$(OUTDIR)\secureim.dll" /implib:"$(OUTDIR)\secureim.lib" /pdbtype:sept
+LINK32_OBJS= \
+ "$(INTDIR)\commonheaders.obj" \
+ "$(INTDIR)\crypt_check.obj" \
+ "$(INTDIR)\crypt_dll.obj" \
+ "$(INTDIR)\crypt_icons.obj" \
+ "$(INTDIR)\crypt_lists.obj" \
+ "$(INTDIR)\crypt_metacontacts.obj" \
+ "$(INTDIR)\crypt_misc.obj" \
+ "$(INTDIR)\crypt_popups.obj" \
+ "$(INTDIR)\dbevent.obj" \
+ "$(INTDIR)\gettime.obj" \
+ "$(INTDIR)\images.obj" \
+ "$(INTDIR)\language.obj" \
+ "$(INTDIR)\loadicons.obj" \
+ "$(INTDIR)\loadlib.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\mmi.obj" \
+ "$(INTDIR)\options.obj" \
+ "$(INTDIR)\popupOptions.obj" \
+ "$(INTDIR)\rtfconv.obj" \
+ "$(INTDIR)\splitmsg.obj" \
+ "$(INTDIR)\svcs_clist.obj" \
+ "$(INTDIR)\svcs_menu.obj" \
+ "$(INTDIR)\svcs_proto.obj" \
+ "$(INTDIR)\svcs_rsa.obj" \
+ "$(INTDIR)\svcs_srmm.obj" \
+ "$(INTDIR)\resource.res"
+
+"$(OUTDIR)\secureim.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("secureim.dep")
+!INCLUDE "secureim.dep"
+!ELSE
+!MESSAGE Warning: cannot find "secureim.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "secureim - Win32 Release" || "$(CFG)" == "secureim - Win32 Debug"
+SOURCE=.\commonheaders.cpp
+
+!IF "$(CFG)" == "secureim - Win32 Release"
+
+CPP_SWITCHES=/nologo /MD /W3 /GX /O1 /I "\source\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /Fp"$(INTDIR)\secureim.pch" /Yc"commonheaders.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+"$(INTDIR)\commonheaders.obj" "$(INTDIR)\secureim.pch" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ELSEIF "$(CFG)" == "secureim - Win32 Debug"
+
+CPP_SWITCHES=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "\source\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SECUREIM_EXPORTS" /Fp"$(INTDIR)\secureim.pch" /Yc"commonheaders.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+"$(INTDIR)\commonheaders.obj" "$(INTDIR)\secureim.pch" : $(SOURCE) "$(INTDIR)"
+ $(CPP) @<<
+ $(CPP_SWITCHES) $(SOURCE)
+<<
+
+
+!ENDIF
+
+SOURCE=.\crypt_check.cpp
+
+"$(INTDIR)\crypt_check.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\crypt_dll.cpp
+
+"$(INTDIR)\crypt_dll.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\crypt_icons.cpp
+
+"$(INTDIR)\crypt_icons.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\crypt_lists.cpp
+
+"$(INTDIR)\crypt_lists.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\crypt_metacontacts.cpp
+
+"$(INTDIR)\crypt_metacontacts.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\crypt_misc.cpp
+
+"$(INTDIR)\crypt_misc.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\crypt_popups.cpp
+
+"$(INTDIR)\crypt_popups.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\dbevent.cpp
+
+"$(INTDIR)\dbevent.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\gettime.cpp
+
+"$(INTDIR)\gettime.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\images.cpp
+
+"$(INTDIR)\images.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\language.cpp
+
+"$(INTDIR)\language.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\loadicons.cpp
+
+"$(INTDIR)\loadicons.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\loadlib.cpp
+
+"$(INTDIR)\loadlib.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\main.cpp
+
+"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\mmi.cpp
+
+"$(INTDIR)\mmi.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\options.cpp
+
+"$(INTDIR)\options.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\popupOptions.cpp
+
+"$(INTDIR)\popupOptions.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\rtfconv.cpp
+
+"$(INTDIR)\rtfconv.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\splitmsg.cpp
+
+"$(INTDIR)\splitmsg.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\svcs_clist.cpp
+
+"$(INTDIR)\svcs_clist.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\svcs_menu.cpp
+
+"$(INTDIR)\svcs_menu.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\svcs_proto.cpp
+
+"$(INTDIR)\svcs_proto.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\svcs_rsa.cpp
+
+"$(INTDIR)\svcs_rsa.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\svcs_srmm.cpp
+
+"$(INTDIR)\svcs_srmm.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\secureim.pch"
+
+
+SOURCE=.\resource.rc
+
+"$(INTDIR)\resource.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+
+!ENDIF
+
diff --git a/secureim/secureim.msp b/secureim/secureim.msp new file mode 100644 index 0000000..3d02d07 --- /dev/null +++ b/secureim/secureim.msp @@ -0,0 +1,136 @@ +[Project]
+name=secureim
+type=2
+defaultConfig=1
+
+
+[Debug]
+// compiler
+workingDirectory=
+arguments=
+intermediateFilesDirectory=Debug
+outputFilesDirectory=Debug
+compilerPreprocessor=BUILDING_DLL
+extraCompilerOptions=
+compilerIncludeDirectory=\mingw\local\include,\mingw\local\include\libotr,\source\include
+noWarning=0
+defaultWarning=0
+allWarning=1
+extraWarning=0
+isoWarning=0
+warningsAsErrors=0
+debugType=1
+debugLevel=3
+exceptionEnabled=0
+runtimeTypeEnabled=0
+optimizeLevel=0
+
+// linker
+libraryPath=
+outputFilename=Debug\secureim.dll
+libraries=comctl32,comdlg32,msimg32,gdi32
+extraLinkerOptions=-shared
+ignoreStartupFile=0
+ignoreDefaultLibs=0
+stripExecutableFile=0
+
+// archive
+extraArchiveOptions=
+
+//resource
+resourcePreprocessor=
+resourceIncludeDirectory=
+extraResourceOptions=
+
+[Release]
+// compiler
+workingDirectory=
+arguments=
+intermediateFilesDirectory=Release
+outputFilesDirectory=Release
+compilerPreprocessor=BUILDING_DLL
+extraCompilerOptions=
+compilerIncludeDirectory=\mingw\local\include,\mingw\local\include\libotr,\source\include
+noWarning=0
+defaultWarning=0
+allWarning=1
+extraWarning=0
+isoWarning=0
+warningAsErrors=0
+debugType=0
+debugLevel=1
+exceptionEnabled=0
+runtimeTypeEnabled=0
+optimizeLevel=4
+
+// linker
+libraryPath=
+outputFilename=Release\secureim.dll
+libraries=comctl32,comdlg32,msimg32,gdi32
+extraLinkerOptions=-shared
+ignoreStartupFile=0
+ignoreDefaultLibs=0
+stripExecutableFile=1
+
+// archive
+extraArchiveOptions=
+
+//resource
+resourcePreprocessor=
+resourceIncludeDirectory=
+extraResourceOptions=
+
+[Source]
+1=commonheaders.cpp
+2=crypt_check.cpp
+3=crypt_dll.cpp
+4=crypt_lists.cpp
+5=crypt_misc.cpp
+6=crypt_popups.cpp
+7=gettime.cpp
+8=language.cpp
+9=loadicons.cpp
+10=loadlib.cpp
+11=main.cpp
+12=mmi.cpp
+13=options.cpp
+14=popupOptions.cpp
+15=rtfconv.cpp
+16=crypt_metacontacts.cpp
+17=crypt_icons.cpp
+18=images.cpp
+19=dbevent.cpp
+20=svcs_clist.cpp
+21=svcs_menu.cpp
+22=svcs_srmm.cpp
+23=svcs_rsa.cpp
+24=svcs_proto.cpp
+25=splitmsg.cpp
+[Header]
+1=commonheaders.h
+2=crypt.h
+3=cryptopp.h
+4=forkthread.h
+5=gettime.h
+6=language.h
+7=loadicons.h
+8=loadlib.h
+9=mmi.h
+10=options.h
+11=popupOptions.h
+12=resource.h
+13=rtfconv.h
+14=secureim.h
+15=version.h
+16=dbevent.h
+17=images.h
+18=svcs_clist.h
+19=svcs_menu.h
+20=svcs_proto.h
+21=svcs_rsa.h
+22=svcs_srmm.h
+23=splitmsg.h
+[Resource]
+1=resource.rc
+[Other]
+[History]
diff --git a/secureim/splitmsg.cpp b/secureim/splitmsg.cpp new file mode 100644 index 0000000..6389e92 --- /dev/null +++ b/secureim/splitmsg.cpp @@ -0,0 +1,124 @@ +#include "commonheaders.h"
+
+
+// разбивает сообщение szMsg на части длиной iLen, возвращает строку вида PARTzPARTzz
+LPSTR splitMsg(LPSTR szMsg, int iLen) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("split: msg: -----\n%s\n-----\n",szMsg);
+#endif
+ int len = strlen(szMsg);
+ LPSTR out = (LPSTR) mir_alloc(len*2);
+ LPSTR buf = out;
+
+ WORD msg_id = DBGetContactSettingWord(0, szModuleName, "msgid", 0) + 1;
+ DBWriteContactSettingWord(0, szModuleName, "msgid", msg_id);
+
+ int part_all = (len+iLen-1)/iLen;
+ for(int part_num=0; part_num<part_all; part_num++) {
+ int sz = (len>iLen)?iLen:len;
+ mir_snprintf(buf,32,"%s%04X%02X%02X",SIG_SECP,msg_id,part_num,part_all);
+ memcpy(buf+LEN_SECP+8,szMsg,sz);
+ *(buf+LEN_SECP+8+sz) = '\0';
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("split: part: %s",buf);
+#endif
+ buf += LEN_SECP+8+sz+1;
+ szMsg += sz;
+ len -= sz;
+ }
+ *buf = '\0';
+ return out;
+}
+
+
+// собираем сообщение из частей, части храним в структуре у контакта
+LPSTR combineMessage(pUinKey ptr, LPSTR szMsg) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: part: %s",szMsg);
+#endif
+ int msg_id,part_num,part_all;
+ sscanf(szMsg,"%4X%2X%2X",&msg_id,&part_num,&part_all);
+ //
+ pPM ppm = NULL, pm = ptr->msgPart;
+ if( !ptr->msgPart ) {
+ pm = ptr->msgPart = new partitionMessage;
+ memset(pm,0,sizeof(partitionMessage));
+ pm->id = msg_id;
+ pm->message = new LPSTR[part_all];
+ memset(pm->message,0,sizeof(LPSTR)*part_all);
+ }
+ else
+ while(pm) {
+ if( pm->id == msg_id ) break;
+ ppm = pm; pm = pm->nextMessage;
+ }
+ if(!pm) { // nothing to found
+ pm = ppm->nextMessage = new partitionMessage;
+ memset(pm,0,sizeof(partitionMessage));
+ pm->id = msg_id;
+ pm->message = new LPSTR[part_all];
+ memset(pm->message,0,sizeof(LPSTR)*part_all);
+ }
+ pm->message[part_num] = new char[strlen(szMsg)];
+ strcpy(pm->message[part_num],szMsg+8);
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: save part: %s",pm->message[part_num]);
+#endif
+ int len=0,i;
+ for( i=0; i<part_all; i++ ){
+ if(pm->message[i]==NULL) break;
+ len+=strlen(pm->message[i]);
+ }
+ if( i==part_all ) { // combine message
+ SAFE_FREE(ptr->tmp);
+ ptr->tmp = (LPSTR) mir_alloc(len+1); *(ptr->tmp)='\0';
+ for( i=0; i<part_all; i++ ){
+ strcat(ptr->tmp,pm->message[i]);
+ delete pm->message[i];
+ }
+ delete pm->message;
+ if(ppm) ppm->nextMessage = pm->nextMessage;
+ else ptr->msgPart = pm->nextMessage;
+ delete pm;
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: all parts: -----\n%s\n-----\n", ptr->tmp);
+#endif
+ // собрали одно сообщение
+ return ptr->tmp;
+ }
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("combine: not all parts");
+#endif
+ // еще не собрали
+ return NULL;
+}
+
+
+// отправляет сообщение, если надо то разбивает на части
+int splitMessageSend(pUinKey ptr, LPSTR szMsg) {
+
+ int ret;
+ int len = strlen(szMsg);
+ int par = (getContactStatus(ptr->hContact)==ID_STATUS_OFFLINE)?ptr->proto->split_off:ptr->proto->split_on;
+ if( par && len>par ) {
+ LPSTR msg = splitMsg(szMsg,par);
+ LPSTR buf = msg;
+ while( *buf ) {
+ len = strlen(buf);
+ LPSTR tmp = mir_strdup(buf);
+ ret = CallContactService(ptr->hContact,PSS_MESSAGE,(WPARAM)PREF_METANODB,(LPARAM)tmp);
+ mir_free(tmp);
+ buf += len+1;
+ }
+ SAFE_FREE(msg);
+ }
+ else {
+ ret = CallContactService(ptr->hContact,PSS_MESSAGE,(WPARAM)PREF_METANODB,(LPARAM)szMsg);
+ }
+ return ret;
+}
+
+
+// EOF
diff --git a/secureim/splitmsg.h b/secureim/splitmsg.h new file mode 100644 index 0000000..9f55c27 --- /dev/null +++ b/secureim/splitmsg.h @@ -0,0 +1,9 @@ +#ifndef __SPLITMSG_H__
+#define __SPLITMSG_H__
+
+#include <windows.h>
+
+LPSTR combineMessage(pUinKey,LPSTR);
+int splitMessageSend(pUinKey,LPSTR);
+
+#endif
diff --git a/secureim/svcs_clist.cpp b/secureim/svcs_clist.cpp new file mode 100644 index 0000000..4d70edb --- /dev/null +++ b/secureim/svcs_clist.cpp @@ -0,0 +1,224 @@ +#include "commonheaders.h"
+
+
+int __cdecl onContactSettingChanged(WPARAM wParam,LPARAM lParam) {
+
+ HANDLE hContact = (HANDLE)wParam;
+ DBCONTACTWRITESETTING *cws=(DBCONTACTWRITESETTING*)lParam;
+ if(!hContact || strcmp(cws->szSetting,"Status")) return 0;
+
+ pUinKey ptr = getUinKey(hContact);
+ int stat = getContactStatus(hContact);
+ if(!ptr || stat==-1) return 0;
+
+// HANDLE hMetaContact = getMetaContact(hContact);
+// if(hMetaContact) {
+// ptr = getUinKey(hMetaContact);
+// if(!ptr) return 0;
+// }
+
+ if (stat==ID_STATUS_OFFLINE) { // go offline
+ if (ptr->mode==MODE_NATIVE && cpp_keyx(ptr->cntx)) { // have active context
+ cpp_delete_context(ptr->cntx); ptr->cntx=0; // reset context
+// if(hMetaContact) { // is subcontact of metacontact
+// showPopUpDC(hMetaContact);
+// ShowStatusIconNotify(hMetaContact);
+// if(getMostOnline(hMetaContact)) { // make handover
+// CallContactService(hMetaContact,PSS_MESSAGE,0,(LPARAM)SIG_INIT);
+// }
+// }
+// else { // is contact or metacontact (not subcontact)
+ showPopUpDC(hContact); // show popup "Disabled"
+ ShowStatusIconNotify(hContact); // change icon in CL
+// }
+ }
+ else
+ if (ptr->mode==MODE_RSAAES && exp->rsa_get_state(ptr->cntx)==7) {
+ deleteRSAcntx(ptr);
+// if(hMetaContact) { // is subcontact of metacontact
+// showPopUpDC(hMetaContact);
+// ShowStatusIconNotify(hMetaContact);
+// if(getMostOnline(hMetaContact)) { // make handover
+// CallContactService(hMetaContact,PSS_MESSAGE,0,(LPARAM)SIG_INIT);
+// }
+// }
+// else { // is contact or metacontact (not subcontact)
+ showPopUpDC(hContact); // show popup "Disabled"
+ ShowStatusIconNotify(hContact); // change icon in CL
+// }
+ }
+ }
+ else { // go not offline
+// if(!hMetaContact) { // is contact or metacontact (not subcontact)
+ if (ptr->offlineKey) {
+ cpp_reset_context(ptr->cntx);
+ ptr->offlineKey = false;
+ }
+ ShowStatusIconNotify(hContact); // change icon in CL
+// }
+ }
+ return 0;
+}
+
+
+// wParam=(WPARAM)(HANDLE)hContact
+// lParam=0
+int __cdecl onContactAdded(WPARAM wParam,LPARAM lParam) {
+ addContact((HANDLE)wParam);
+ return 0;
+}
+
+
+// wParam=(WPARAM)(HANDLE)hContact
+// lParam=0
+int __cdecl onContactDeleted(WPARAM wParam,LPARAM lParam) {
+ delContact((HANDLE)wParam);
+ return 0;
+}
+
+
+int __cdecl onExtraImageListRebuilding(WPARAM, LPARAM) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onExtraImageListRebuilding");
+#endif
+ if( (bADV || g_hCLIcon) && ServiceExists(MS_CLIST_EXTRA_ADD_ICON) ) {
+ RefreshContactListIcons();
+ }
+ return 0;
+}
+
+
+int __cdecl onExtraImageApplying(WPARAM wParam, LPARAM) {
+
+ if( (bADV || g_hCLIcon) && ServiceExists(MS_CLIST_EXTRA_SET_ICON) && isSecureProtocol((HANDLE)wParam) ) {
+ IconExtraColumn iec = mode2iec(isContactSecured((HANDLE)wParam));
+ if( g_hCLIcon ) {
+ ExtraIcon_SetIcon(g_hCLIcon, (HANDLE)wParam, iec.hImage);
+ }
+ else {
+ CallService(MS_CLIST_EXTRA_SET_ICON, wParam, (LPARAM)&iec);
+ }
+ }
+ return 0;
+}
+
+
+int __cdecl onRebuildContactMenu(WPARAM wParam,LPARAM lParam) {
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRebuildContactMenu");
+#endif
+ HANDLE hContact = (HANDLE)wParam;
+ BOOL bMC = isProtoMetaContacts(hContact);
+ if( bMC ) hContact = getMostOnline(hContact); // возьмем тот, через который пойдет сообщение
+ pUinKey ptr = getUinKey(hContact);
+ int i;
+
+ CLISTMENUITEM mi;
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize = sizeof(CLISTMENUITEM);
+
+ ShowStatusIconNotify(hContact);
+
+ // check offline/online
+ if(!ptr) {
+ // hide menu bars
+ mi.flags = CMIM_FLAGS | CMIF_NOTOFFLINE | CMIF_HIDDEN;
+ for(i=0;i<SIZEOF(g_hMenu);i++) {
+ if( g_hMenu[i] )
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[i],(LPARAM)&mi);
+ }
+ return 0;
+ }
+
+// char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+// if (szProto==NULL) // || DBGetContactSettingDword(hContact, szProto, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE)
+// return 0;
+
+ BOOL isSecureProto = isSecureProtocol(hContact);
+ BOOL isPGP = isContactPGP(hContact);
+ BOOL isGPG = isContactGPG(hContact);
+// BOOL isRSAAES = isContactRSAAES(hContact);
+ BOOL isSecured = isContactSecured(hContact)&SECURED;
+ BOOL isChat = isChatRoom(hContact);
+ BOOL isMiranda = isClientMiranda(hContact);
+
+ // hide all menu bars
+ mi.flags = CMIM_FLAGS | CMIF_NOTOFFLINE | CMIF_HIDDEN;
+ for(i=0;i<SIZEOF(g_hMenu);i++) {
+ if( g_hMenu[i] )
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[i],(LPARAM)&mi);
+ }
+
+ if ( isSecureProto && !isChat && isMiranda &&
+ (ptr->mode==MODE_NATIVE || ptr->mode==MODE_RSAAES) ) {
+ // Native/RSAAES
+ mi.flags = CMIM_FLAGS | CMIF_NOTOFFLINE | CMIM_ICON;
+ if( !isSecured ) {
+ // create secureim connection
+ mi.hIcon = mode2icon(ptr->mode|SECURED,2);
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[0],(LPARAM)&mi);
+ }
+ else {
+ // disable secureim connection
+ mi.hIcon = mode2icon(ptr->mode,2);
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[1],(LPARAM)&mi);
+ }
+ // set status menu
+ if( bSCM && !bMC &&
+ ( !isSecured || ptr->mode==MODE_PGP || ptr->mode==MODE_GPG ) ) {
+
+ mi.flags = CMIM_FLAGS | CMIM_NAME | CMIM_ICON;
+ mi.hIcon = g_hICO[ICO_ST_DIS+ptr->status];
+ mi.pszName = (LPSTR)sim312[ptr->status];
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[2],(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS | CMIM_ICON;
+ for(i=0;i<=(ptr->mode==MODE_RSAAES?1:2);i++) {
+ mi.hIcon = (i == ptr->status) ? g_hICO[ICO_ST_DIS+ptr->status] : NULL;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[3+i],(LPARAM)&mi);
+ }
+ }
+ }
+ else
+ if( isSecureProto && !isChat && (ptr->mode==MODE_PGP || ptr->mode==MODE_GPG) ) {
+ // PGP, GPG
+ if( ptr->mode==MODE_PGP && bPGPloaded ) {
+ if((bPGPkeyrings || bPGPprivkey) && !isGPG) {
+ mi.flags = CMIM_FLAGS;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[isPGP+6],(LPARAM)&mi);
+ }
+ }
+ if( ptr->mode==MODE_GPG && bGPGloaded ) {
+ if(bGPGkeyrings && !isPGP) {
+ mi.flags = CMIM_FLAGS;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[isGPG+8],(LPARAM)&mi);
+ }
+ }
+ }
+ if( isSecureProto && !isChat && isMiranda ) {
+ // set mode menu
+ if( bMCM && !bMC &&
+ ( !isSecured || ptr->mode==MODE_PGP || ptr->mode==MODE_GPG ) ) {
+
+ mi.flags = CMIM_FLAGS | CMIM_NAME | CMIM_ICON;
+ mi.hIcon = g_hICO[ICO_OV_NAT+ptr->mode];
+ mi.pszName = (LPSTR)sim311[ptr->mode];
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[10],(LPARAM)&mi);
+
+ mi.flags = CMIM_FLAGS | CMIM_ICON;
+ for(i=0;i<MODE_CNT;i++) {
+ if( i==MODE_PGP && ptr->mode!=MODE_PGP && !bPGP ) continue;
+ if( i==MODE_GPG && ptr->mode!=MODE_GPG && !bGPG ) continue;
+ mi.hIcon = (i == ptr->mode) ? g_hICO[ICO_ST_ENA] : NULL;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)g_hMenu[11+i],(LPARAM)&mi);
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+// EOF
diff --git a/secureim/svcs_clist.h b/secureim/svcs_clist.h new file mode 100644 index 0000000..8c2dd19 --- /dev/null +++ b/secureim/svcs_clist.h @@ -0,0 +1,13 @@ +#ifndef __SVCS_CLIST_H__
+#define __SVCS_CLIST_H__
+
+#include <windows.h>
+
+int __cdecl onContactSettingChanged(WPARAM,LPARAM);
+int __cdecl onContactAdded(WPARAM,LPARAM);
+int __cdecl onContactDeleted(WPARAM,LPARAM);
+int __cdecl onExtraImageListRebuilding(WPARAM,LPARAM);
+int __cdecl onExtraImageApplying(WPARAM,LPARAM);
+int __cdecl onRebuildContactMenu(WPARAM,LPARAM);
+
+#endif
diff --git a/secureim/svcs_menu.cpp b/secureim/svcs_menu.cpp new file mode 100644 index 0000000..95b08dd --- /dev/null +++ b/secureim/svcs_menu.cpp @@ -0,0 +1,232 @@ +#include "commonheaders.h"
+
+
+INT_PTR __cdecl Service_IsContactSecured(WPARAM wParam, LPARAM lParam) {
+
+ return (isContactSecured((HANDLE)wParam)&SECURED) || isContactPGP((HANDLE)wParam) || isContactGPG((HANDLE)wParam);
+}
+
+
+INT_PTR __cdecl Service_CreateIM(WPARAM wParam,LPARAM lParam){
+ if (!CallService(MS_PROTO_ISPROTOONCONTACT, (WPARAM)wParam, (LPARAM)szModuleName))
+ CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)wParam, (LPARAM)szModuleName);
+// WPARAM flags = 0;
+// HANDLE hMetaContact = getMetaContact((HANDLE)wParam);
+// if( hMetaContact ) {
+// wParam = (WPARAM)hMetaContact;
+// flags = PREF_METANODB;
+// }
+ CallContactService((HANDLE)wParam,PSS_MESSAGE,(WPARAM)PREF_METANODB,(LPARAM)SIG_INIT);
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_DisableIM(WPARAM wParam,LPARAM lParam) {
+// WPARAM flags = 0;
+// HANDLE hMetaContact = getMetaContact((HANDLE)wParam);
+// if( hMetaContact ) {
+// wParam = (WPARAM)hMetaContact;
+// flags = PREF_METANODB;
+// }
+ CallContactService((HANDLE)wParam,PSS_MESSAGE,(WPARAM)PREF_METANODB,(LPARAM)SIG_DEIN);
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_Status(WPARAM wParam, LPARAM lParam) {
+
+ switch(--lParam) {
+ case STATUS_DISABLED:
+ case STATUS_ENABLED:
+ case STATUS_ALWAYSTRY:
+ pUinKey ptr = getUinKey((HANDLE)wParam);
+ if(ptr) {
+ ptr->status=ptr->tstatus=(BYTE)lParam;
+ if(ptr->status==STATUS_ENABLED) DBDeleteContactSetting(ptr->hContact, szModuleName, "StatusID");
+ else DBWriteContactSettingByte(ptr->hContact, szModuleName, "StatusID", ptr->status);
+ }
+ break;
+ }
+
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_StatusDis(WPARAM wParam, LPARAM lParam) {
+
+ return Service_Status(wParam,STATUS_DISABLED+1);
+}
+
+
+INT_PTR __cdecl Service_StatusEna(WPARAM wParam, LPARAM lParam) {
+
+ return Service_Status(wParam,STATUS_ENABLED+1);
+}
+
+
+INT_PTR __cdecl Service_StatusTry(WPARAM wParam, LPARAM lParam) {
+
+ return Service_Status(wParam,STATUS_ALWAYSTRY+1);
+}
+
+
+INT_PTR __cdecl Service_PGPdelKey(WPARAM wParam, LPARAM lParam) {
+
+ if(bPGPloaded) {
+ DBDeleteContactSetting((HANDLE)wParam, szModuleName, "pgp");
+ DBDeleteContactSetting((HANDLE)wParam, szModuleName, "pgp_mode");
+ DBDeleteContactSetting((HANDLE)wParam, szModuleName, "pgp_abbr");
+ }
+ {
+ pUinKey ptr = getUinKey((HANDLE)wParam);
+ cpp_delete_context(ptr->cntx); ptr->cntx=0;
+ }
+ ShowStatusIconNotify((HANDLE)wParam);
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_PGPsetKey(WPARAM wParam, LPARAM lParam) {
+
+ BOOL del = true;
+ if(bPGPloaded) {
+ if(bPGPkeyrings) {
+ char szKeyID[128]; szKeyID[0]='\0';
+ PVOID KeyID = pgp_select_keyid(GetForegroundWindow(),szKeyID);
+ if(szKeyID[0]) {
+ DBDeleteContactSetting((HANDLE)wParam,szModuleName,"pgp");
+ DBCONTACTWRITESETTING cws;
+ memset(&cws,0,sizeof(cws));
+ cws.szModule = szModuleName;
+ cws.szSetting = "pgp";
+ cws.value.type = DBVT_BLOB;
+ cws.value.pbVal = (LPBYTE)KeyID;
+ cws.value.cpbVal = pgp_size_keyid();
+ CallService(MS_DB_CONTACT_WRITESETTING,wParam,(LPARAM)&cws);
+ DBWriteContactSettingByte((HANDLE)wParam,szModuleName,"pgp_mode",0);
+ DBWriteContactSettingString((HANDLE)wParam,szModuleName,"pgp_abbr",szKeyID);
+ del = false;
+ }
+ }
+ else
+ if(bPGPprivkey) {
+ char KeyPath[MAX_PATH]; KeyPath[0]='\0';
+ if(ShowSelectKeyDlg(0,KeyPath)){
+ char *publ = LoadKeys(KeyPath,false);
+ if(publ) {
+ DBDeleteContactSetting((HANDLE)wParam,szModuleName,"pgp");
+ myDBWriteStringEncode((HANDLE)wParam,szModuleName,"pgp",publ);
+ DBWriteContactSettingByte((HANDLE)wParam,szModuleName,"pgp_mode",1);
+ DBWriteContactSettingString((HANDLE)wParam,szModuleName,"pgp_abbr","(binary)");
+ mir_free(publ);
+ del = false;
+ }
+ }
+ }
+ }
+
+ if(del) Service_PGPdelKey(wParam,lParam);
+ else {
+ pUinKey ptr = getUinKey((HANDLE)wParam);
+ cpp_delete_context(ptr->cntx); ptr->cntx=0;
+ }
+ ShowStatusIconNotify((HANDLE)wParam);
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_GPGdelKey(WPARAM wParam, LPARAM lParam) {
+
+ if(bGPGloaded) {
+ DBDeleteContactSetting((HANDLE)wParam, szModuleName, "gpg");
+ }
+ {
+ pUinKey ptr = getUinKey((HANDLE)wParam);
+ cpp_delete_context(ptr->cntx); ptr->cntx=0;
+ }
+ ShowStatusIconNotify((HANDLE)wParam);
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_GPGsetKey(WPARAM wParam, LPARAM lParam) {
+
+ BOOL del = true;
+ if(bGPGloaded && bGPGkeyrings) {
+ char szKeyID[128]; szKeyID[0]='\0';
+ gpg_select_keyid(GetForegroundWindow(),szKeyID);
+ if(szKeyID[0]) {
+ DBWriteContactSettingString((HANDLE)wParam,szModuleName,"gpg",szKeyID);
+ del = false;
+ }
+ }
+
+ if(del) Service_GPGdelKey(wParam,lParam);
+ else {
+ pUinKey ptr = getUinKey((HANDLE)wParam);
+ cpp_delete_context(ptr->cntx); ptr->cntx=0;
+ }
+ ShowStatusIconNotify((HANDLE)wParam);
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_Mode(WPARAM wParam, LPARAM lParam) {
+
+ pUinKey ptr = getUinKey((HANDLE)wParam);
+
+ switch(--lParam) {
+ case MODE_NATIVE:
+ case MODE_RSAAES:
+ if( isContactSecured((HANDLE)wParam)&SECURED ) {
+ msgbox(NULL, sim111, szModuleName, MB_OK);
+ return 0;
+ }
+ if( lParam!=MODE_NATIVE && ptr->status>STATUS_ENABLED ) {
+ Service_Status(wParam,STATUS_ENABLED+1);
+ }
+ case MODE_PGP:
+ case MODE_GPG:
+ // нужно много проверок и отключение активного контекста если необходимо
+ if(ptr) {
+ if( ptr->cntx ) {
+ cpp_delete_context(ptr->cntx);
+ ptr->cntx = 0;
+ ptr->keyLoaded = 0;
+ }
+ ptr->mode=(BYTE)lParam;
+ DBWriteContactSettingByte((HANDLE)wParam, szModuleName, "mode", (BYTE)lParam);
+ }
+ ShowStatusIcon((HANDLE)wParam);
+ break;
+ }
+
+ return 1;
+}
+
+
+INT_PTR __cdecl Service_ModeNative(WPARAM wParam, LPARAM lParam) {
+
+ return Service_Mode(wParam,MODE_NATIVE+1);
+}
+
+
+INT_PTR __cdecl Service_ModePGP(WPARAM wParam, LPARAM lParam) {
+
+ return Service_Mode(wParam,MODE_PGP+1);
+}
+
+
+INT_PTR __cdecl Service_ModeGPG(WPARAM wParam, LPARAM lParam) {
+
+ return Service_Mode(wParam,MODE_GPG+1);
+}
+
+
+INT_PTR __cdecl Service_ModeRSAAES(WPARAM wParam, LPARAM lParam) {
+
+ return Service_Mode(wParam,MODE_RSAAES+1);
+}
+
+
+// EOF
diff --git a/secureim/svcs_menu.h b/secureim/svcs_menu.h new file mode 100644 index 0000000..69b079e --- /dev/null +++ b/secureim/svcs_menu.h @@ -0,0 +1,26 @@ +#ifndef __SVCS_MENU_H__
+#define __SVCS_MENU_H__
+
+#include <windows.h>
+
+INT_PTR __cdecl Service_IsContactSecured(WPARAM,LPARAM);
+
+INT_PTR __cdecl Service_CreateIM(WPARAM,LPARAM);
+INT_PTR __cdecl Service_DisableIM(WPARAM,LPARAM);
+
+INT_PTR __cdecl Service_StatusDis(WPARAM,LPARAM);
+INT_PTR __cdecl Service_StatusEna(WPARAM,LPARAM);
+INT_PTR __cdecl Service_StatusTry(WPARAM,LPARAM);
+
+INT_PTR __cdecl Service_PGPdelKey(WPARAM,LPARAM);
+INT_PTR __cdecl Service_PGPsetKey(WPARAM,LPARAM);
+
+INT_PTR __cdecl Service_GPGdelKey(WPARAM,LPARAM);
+INT_PTR __cdecl Service_GPGsetKey(WPARAM,LPARAM);
+
+INT_PTR __cdecl Service_ModeNative(WPARAM,LPARAM);
+INT_PTR __cdecl Service_ModePGP(WPARAM,LPARAM);
+INT_PTR __cdecl Service_ModeGPG(WPARAM,LPARAM);
+INT_PTR __cdecl Service_ModeRSAAES(WPARAM,LPARAM);
+
+#endif
diff --git a/secureim/svcs_popup.cpp b/secureim/svcs_popup.cpp new file mode 100644 index 0000000..6c0f97a --- /dev/null +++ b/secureim/svcs_popup.cpp @@ -0,0 +1,115 @@ +#include "commonheaders.h"
+
+/*
+static int CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ switch(message) {
+ case WM_COMMAND:
+ if (wParam == STN_CLICKED) { // It was a click on the Popup.
+ PUDeletePopUp(hWnd);
+ return TRUE;
+ }
+ break;
+ case UM_FREEPLUGINDATA: {
+ return TRUE; //TRUE or FALSE is the same, it gets ignored.
+ }
+ default:
+ break;
+ }
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+*/
+
+void showPopupMsg(HANDLE hContact, LPCSTR lpzText, HICON hIcon, int type) {
+
+ // type:
+ // 0 - error
+ // 1 - key sent
+ // 2 - key recv
+ // 3 - established
+ // 4 - disabled
+ // 5 - msg recv
+ // 6 - msg sent
+ //
+
+ if(!bPopupExists) return;
+
+ char nback[32]; mir_snprintf(nback,sizeof(nback),"popup%dback", $type);
+ char ntext[32]; mir_snprintf(ntext,sizeof(ntext),"popup%dtext", $type);
+ char ntime[32]; mir_snprintf(ntime,sizeof(ntime),"popup%dtime", $type);
+
+ COLORREF colorBack = (COLORREF)DBGetContactSettingDword(0,szModuleName,nback,(DWORD)RGB(230,230,255));
+ COLORREF colorText = (COLORREF)DBGetContactSettingDword(0,szModuleName,ntext,(DWORD)RGB(0,0,0));
+ int timeout = (int)DBGetContactSettingWord(0,szModuleName,ntime,0);
+
+ if( bCoreUnicode && bPopupUnicode ) {
+ POPUPDATAW ppd;
+ memset(&ppd,0,sizeof(POPUPDATAW));
+ ppd.lchContact = hContact;
+ ppd.lchIcon = hIcon;
+ LPWSTR lpwzContactName = (LPWSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,GCMDF_UNICODE);
+ wcscpy(ppd.lpwzContactName, lpwzContactName);
+ LPWSTR lpwzText = mir_a2u(lpzText);
+ wcscpy(ppd.lpwzText, TranslateW(lpwzText));
+ mir_free(lpwzText);
+ ppd.colorBack = colorBack;
+ ppd.colorText = colorText;
+ ppd.iSeconds = timeout;
+// ppd.PluginWindowProc = (WNDPROC)PopupDlgProc;
+// ppd.PluginData = NULL;
+ CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&ppd, 0);
+ }
+ else {
+ POPUPDATAEX ppd;
+ memset(&ppd,0,sizeof(POPUPDATAEX));
+ ppd.lchContact = hContact;
+ ppd.lchIcon = hIcon;
+ LPSTR lpzContactName = (LPSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,0);
+ strcpy(ppd.lpzContactName, lpzContactName);
+ strcpy(ppd.lpzText, Translate(lpzText));
+ ppd.colorBack = colorBack;
+ ppd.colorText = colorText;
+ ppd.iSeconds = timeout;
+// ppd.PluginWindowProc = (WNDPROC)PopupDlgProc;
+// ppd.PluginData = NULL;
+ CallService(MS_POPUP_ADDPOPUPEX, (WPARAM)&ppd, 0);
+ }
+}
+
+
+void showPopUpDCmsg(HANDLE hContact,LPCSTR msg) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "dc",1);
+ if (indic==1) showPopUp(msg,hContact,g_hPOP[POP_PU_DIS],1);
+}
+void showPopUpDC(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "dc",1);
+ if (indic==1) showPopUp(sim006,hContact,g_hPOP[POP_PU_DIS],1);
+}
+void showPopUpEC(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "ec",1);
+ if (indic==1) showPopUp(sim001,hContact,g_hPOP[POP_PU_EST],1);
+}
+void showPopUpKS(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "ks",1);
+ if (indic==1) showPopUp(sim007,hContact,g_hPOP[POP_PU_PRC],0);
+}
+void showPopUpKRmsg(HANDLE hContact,LPCSTR msg) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "kr",1);
+ if (indic==1) showPopUp(msg,hContact,g_hPOP[POP_PU_PRC],0);
+}
+void showPopUpKR(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "kr",1);
+ if (indic==1) showPopUp(sim008,hContact,g_hPOP[POP_PU_PRC],0);
+}
+void showPopUpSM(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "ss",0);
+ if (indic==1) showPopUp(sim009,hContact,g_hPOP[POP_PU_MSS],2);
+ SkinPlaySound("OutgoingSecureMessage");
+}
+void showPopUpRM(HANDLE hContact) {
+ int indic=DBGetContactSettingByte(0, szModuleName, "sr",0);
+ if (indic==1) showPopUp(sim010,hContact,g_hPOP[POP_PU_MSR],2);
+ SkinPlaySound("IncomingSecureMessage");
+}
+
+
+// EOF
diff --git a/secureim/svcs_proto.cpp b/secureim/svcs_proto.cpp new file mode 100644 index 0000000..9b49423 --- /dev/null +++ b/secureim/svcs_proto.cpp @@ -0,0 +1,1130 @@ +#include "commonheaders.h"
+
+
+// return SignID
+int getSecureSig(LPCSTR szMsg, LPSTR *szPlainMsg=NULL) {
+ if(szPlainMsg) *szPlainMsg=(LPSTR)szMsg;
+ for(int i=0;signs[i].len;i++) {
+ if (memcmp(szMsg,signs[i].sig,signs[i].len)==0) {
+/* for(int i=strlen(szMsg)-1;i;i--) {
+ if( szMsg[i] == '\x0D' || szMsg[i] == '\x0A' )
+ ((LPSTR)szMsg)[i] = '\0';
+ else
+ break;
+ }*/
+ if(szPlainMsg) *szPlainMsg = (LPSTR)(szMsg+signs[i].len);
+ if(signs[i].key==SiG_GAME && !bDGP)
+ return SiG_NONE;
+ return signs[i].key;
+ }
+ }
+ return SiG_NONE;
+}
+
+
+int returnNoError(HANDLE hContact) {
+ HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
+ unsigned int tID;
+ CloseHandle( (HANDLE) _beginthreadex(NULL, 0, sttFakeAck, new TFakeAckParams(hEvent,hContact,777,0), 0, &tID) );
+ SetEvent( hEvent );
+ return 777;
+}
+
+
+int returnError(HANDLE hContact, LPCSTR err) {
+ HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
+ unsigned int tID;
+ CloseHandle( (HANDLE) _beginthreadex(NULL, 0, sttFakeAck, new TFakeAckParams(hEvent,hContact,666,err), 0, &tID) );
+ SetEvent( hEvent );
+ return 666;
+}
+
+
+LPSTR szUnrtfMsg = NULL;
+
+
+// RecvMsg handler
+INT_PTR __cdecl onRecvMsg(WPARAM wParam, LPARAM lParam) {
+
+ CCSDATA *pccsd = (CCSDATA *)lParam;
+ PROTORECVEVENT *ppre = (PROTORECVEVENT *)pccsd->lParam;
+ pUinKey ptr = getUinKey(pccsd->hContact);
+ LPSTR szEncMsg = ppre->szMessage, szPlainMsg = NULL;
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: %s", szEncMsg);
+#endif
+
+ // cut rtf tags
+ if( pRtfconvString && memcmp(szEncMsg,"{\\rtf1",6)==0 ) {
+ SAFE_FREE(szUnrtfMsg);
+ int len = strlen(szEncMsg)+1;
+ LPWSTR szTemp = (LPWSTR)mir_alloc(len*sizeof(WCHAR));
+ if(ppre->flags & PREF_UNICODE)
+ rtfconvW((LPWSTR)(szEncMsg+len),szTemp);
+ else
+ rtfconvA(szEncMsg,szTemp);
+ len = wcslen(szTemp)-1;
+ while(len) {
+ if( szTemp[len] == 0x0D || szTemp[len] == 0x0A )
+ szTemp[len] = 0;
+ else
+ break;
+ len--;
+ }
+ len = wcslen(&szTemp[1])+1;
+ szUnrtfMsg = (LPSTR)mir_alloc(len*(sizeof(WCHAR)+1));
+ WideCharToMultiByte(CP_ACP, 0, &szTemp[1], -1, szUnrtfMsg, len*(sizeof(WCHAR)+1), NULL, NULL);
+ memcpy(szUnrtfMsg+len,&szTemp[1],len*sizeof(WCHAR));
+ ppre->szMessage = szEncMsg = szUnrtfMsg;
+ ppre->flags |= PREF_UNICODE;
+ mir_free(szTemp);
+ }
+
+ int ssig = getSecureSig(ppre->szMessage,&szEncMsg);
+ BOOL bSecured = isContactSecured(pccsd->hContact)&SECURED;
+ BOOL bPGP = isContactPGP(pccsd->hContact);
+ BOOL bGPG = isContactGPG(pccsd->hContact);
+
+// HANDLE hMetaContact = getMetaContact(pccsd->hContact);
+// if( hMetaContact ) {
+// ptr = getUinKey(hMetaContact);
+// }
+
+ // pass any unchanged message
+ if( !ptr ||
+ ssig==SiG_GAME ||
+ !isSecureProtocol(pccsd->hContact) ||
+ (isProtoMetaContacts(pccsd->hContact) && (pccsd->wParam & PREF_SIMNOMETA)) ||
+ isChatRoom(pccsd->hContact) ||
+ (ssig==SiG_NONE && !ptr->msgSplitted && !bSecured && !bPGP && !bGPG)
+ ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: pass unhandled");
+#endif
+ return CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+ }
+
+ // drop message: fake, unsigned or from invisible contacts
+ if( isContactInvisible(pccsd->hContact) || ssig==SiG_FAKE ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: drop unhandled (contact invisible or hidden)");
+#endif
+ return 1;
+ }
+
+ // receive non-secure message in secure mode
+ if( ssig==SiG_NONE && !ptr->msgSplitted ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: non-secure message");
+#endif
+ if(ppre->flags & PREF_UNICODE) {
+ szPlainMsg = m_awstrcat(Translate(sim402),szEncMsg);
+ }
+ else {
+ szPlainMsg = m_aastrcat(Translate(sim402),szEncMsg);
+ }
+ ppre->szMessage = szPlainMsg;
+ pccsd->wParam |= PREF_SIMNOMETA;
+ int ret = CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+ mir_free(szPlainMsg);
+ return ret;
+ }
+
+ // received non-pgp secure message from disabled contact
+ if( ssig!=SiG_PGPM && !bPGP && !bGPG && ptr->status==STATUS_DISABLED ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: message from disabled");
+#endif
+ if( ptr->mode==MODE_NATIVE ) {
+ // tell to the other side that we have the plugin disabled with him
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM) SIG_DISA;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+
+ showPopUp(sim003,pccsd->hContact,g_hPOP[POP_PU_DIS],0);
+ }
+ else {
+ createRSAcntx(ptr);
+ exp->rsa_disabled(ptr->cntx);
+ deleteRSAcntx(ptr);
+ }
+ SAFE_FREE(ptr->msgSplitted);
+ return 1;
+ }
+
+ // combine message splitted by protocol (no tags)
+ if( ssig==SiG_NONE && ptr->msgSplitted ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: combine untagged splitted message");
+#endif
+ LPSTR tmp = (LPSTR) mir_alloc(strlen(ptr->msgSplitted)+strlen(szEncMsg)+1);
+ strcpy(tmp,ptr->msgSplitted);
+ strcat(tmp,szEncMsg);
+ mir_free(ptr->msgSplitted);
+ ptr->msgSplitted = szEncMsg = ppre->szMessage = tmp;
+ ssig = getSecureSig(tmp,&szEncMsg);
+ }
+ else {
+ SAFE_FREE(ptr->msgSplitted);
+ }
+
+ // combine message splitted by secureim (with tags)
+ if( ssig==SiG_SECP || ssig==SiG_PART ) {
+ LPSTR msg = combineMessage(ptr,szEncMsg);
+ if( !msg ) return 1;
+ szEncMsg = ppre->szMessage = msg;
+ ssig = getSecureSig(msg,&szEncMsg);
+ }
+
+ // decrypt PGP/GPG message
+ if( ssig==SiG_PGPM &&
+ ((bPGPloaded && (bPGPkeyrings || bPGPprivkey))||
+ (bGPGloaded && bGPGkeyrings))
+ ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: PGP/GPG message");
+#endif
+ szEncMsg = ppre->szMessage;
+ if( !ptr->cntx ) {
+ ptr->cntx = cpp_create_context(((bGPGloaded && bGPGkeyrings)?CPP_MODE_GPG:CPP_MODE_PGP) | ((DBGetContactSettingByte(pccsd->hContact,szModuleName,"gpgANSI",0))?CPP_MODE_GPG_ANSI:0));
+ ptr->keyLoaded = 0;
+ }
+
+ if(!strstr(szEncMsg,"-----END PGP MESSAGE-----"))
+ return 1; // no end tag, don't display it ...
+
+ LPSTR szNewMsg = NULL;
+ LPSTR szOldMsg = NULL;
+
+ if(!ptr->keyLoaded && bPGPloaded) ptr->keyLoaded = LoadKeyPGP(ptr);
+ if(!ptr->keyLoaded && bGPGloaded) ptr->keyLoaded = LoadKeyGPG(ptr);
+
+ if(ptr->keyLoaded==1) szOldMsg = pgp_decode(ptr->cntx, szEncMsg);
+ else
+ if(ptr->keyLoaded==2) szOldMsg = gpg_decode(ptr->cntx, szEncMsg);
+
+ if(!szOldMsg) { // error while decrypting message, send error
+ SAFE_FREE(ptr->msgSplitted);
+ ppre->flags &= ~(PREF_UNICODE|PREF_UTF);
+ pccsd->wParam &= ~(PREF_UNICODE|PREF_UTF);
+ ppre->szMessage = Translate(sim401);
+ return CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+ }
+
+ // receive encrypted message in non-encrypted mode
+ if(!isContactPGP(pccsd->hContact) && !isContactGPG(pccsd->hContact)) {
+ szNewMsg = m_ustrcat(TranslateU(sim403),szOldMsg);
+ szOldMsg = szNewMsg;
+ }
+ szNewMsg = utf8_to_miranda(szOldMsg,ppre->flags); pccsd->wParam = ppre->flags;
+ ppre->szMessage = szNewMsg;
+
+ // show decoded message
+ showPopUpRM(ptr->hContact);
+ SAFE_FREE(ptr->msgSplitted);
+ pccsd->wParam |= PREF_SIMNOMETA;
+ int ret = CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+ mir_free(szNewMsg);
+ return ret;
+ }
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: switch(ssig)=%d",ssig);
+#endif
+ switch(ssig) {
+
+ case SiG_PGPM:
+ return CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+
+ case SiG_SECU: { // new secured msg, pass to rsa_recv
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: RSA/AES message");
+#endif
+ if( ptr->mode==MODE_NATIVE ) {
+ ptr->mode = MODE_RSAAES;
+ deleteRSAcntx(ptr);
+ DBWriteContactSettingByte(ptr->hContact, szModuleName, "mode", ptr->mode);
+ }
+ createRSAcntx(ptr);
+ loadRSAkey(ptr);
+ if( exp->rsa_get_state(ptr->cntx)==0 )
+ showPopUpKR(ptr->hContact);
+
+ LPSTR szOldMsg = exp->rsa_recv(ptr->cntx,szEncMsg);
+ if( !szOldMsg ) return 1; // don't display it ...
+
+ LPSTR szNewMsg = utf8_to_miranda(szOldMsg,ppre->flags); pccsd->wParam = ppre->flags;
+ ppre->szMessage = szNewMsg;
+
+ // show decoded message
+ showPopUpRM(ptr->hContact);
+ SAFE_FREE(ptr->msgSplitted);
+ pccsd->wParam |= PREF_SIMNOMETA;
+ int ret = CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+ mir_free(szNewMsg);
+ return ret;
+ } break;
+
+ case SiG_ENON: { // online message
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Native SiG_ENON message");
+#endif
+ if( cpp_keyx(ptr->cntx) ) {
+ // decrypting message
+ szPlainMsg = decodeMsg(ptr,lParam,szEncMsg);
+ if(!ptr->decoded) {
+ mir_free(szPlainMsg);
+ SAFE_FREE(ptr->msgSplitted);
+ ptr->msgSplitted=mir_strdup(szEncMsg);
+ return 1; // don't display it ...
+ }
+// showPopUpRM(ptr->hContact);
+ }
+ else {
+ // reinit key exchange user has send an encrypted message and i have no key
+ cpp_reset_context(ptr->cntx);
+
+ LPSTR reSend = (LPSTR) mir_alloc(strlen(szEncMsg)+LEN_RSND);
+ strcpy(reSend,SIG_RSND); // copy resend sig
+ strcat(reSend,szEncMsg); // add mess
+
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM) reSend; // reSend Message to reemit
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam); // send back cipher message
+ mir_free(reSend);
+
+ LPSTR keyToSend = InitKeyA(ptr,0); // calculate public and private key
+
+ pccsd->lParam = (LPARAM) keyToSend;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam); // send new key
+ mir_free(keyToSend);
+
+ showPopUp(sim005,NULL,g_hPOP[POP_PU_DIS],0);
+ showPopUpKS(ptr->hContact);
+
+ return 1;
+ }
+ } break;
+
+ case SiG_ENOF: { // offline message
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Native SiG_ENOF message");
+#endif
+ // if offline key is set and we have not an offline message unset key
+ if (ptr->offlineKey && cpp_keyx(ptr->cntx)) {
+ cpp_reset_context(ptr->cntx);
+ ptr->offlineKey = false;
+ }
+ // decrypting message with last offline key
+ DBVARIANT dbv;
+ dbv.type = DBVT_BLOB;
+
+ if( DBGetContactSetting(ptr->hContact,szModuleName,"offlineKey",&dbv) == 0 ) {
+ // if valid key is succefully retrieved
+ ptr->offlineKey = true;
+ InitKeyX(ptr,dbv.pbVal);
+ DBFreeVariant(&dbv);
+
+ // decrypting message
+ szPlainMsg = decodeMsg(ptr,lParam,szEncMsg);
+
+// showPopUpRM(ptr->hContact);
+ ShowStatusIconNotify(ptr->hContact);
+ }
+ else {
+ // exit and show messsage
+ return CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+ }
+ } break;
+
+ case SiG_RSND: { // resend message
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Native SiG_RSND message");
+#endif
+ if (cpp_keyx(ptr->cntx)) {
+ // decrypt sended back message and save message for future sending with a new secret key
+ szPlainMsg = decodeMsg(ptr,(LPARAM)pccsd,szEncMsg);
+ addMsg2Queue(ptr,pccsd->wParam,szPlainMsg);
+ mir_free(szPlainMsg);
+
+ showPopUpRM(ptr->hContact);
+ showPopUp(sim004,NULL,g_hPOP[POP_PU_DIS],0);
+ }
+ return 1; // don't display it ...
+ } break;
+
+ case SiG_DISA: { // disabled message
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Native SiG_DISA message");
+#endif
+// ptr->status=ptr->tstatus=STATUS_DISABLED;
+// DBWriteContactSettingByte(ptr->hContact, szModuleName, "StatusID", ptr->status);
+ }
+ case SiG_DEIN: { // deinit message
+ // other user has disabled SecureIM with you
+ cpp_delete_context(ptr->cntx); ptr->cntx=0;
+
+ showPopUpDC(ptr->hContact);
+ ShowStatusIconNotify(ptr->hContact);
+
+ waitForExchange(ptr,3); // дослать нешифрованно
+ return 1;
+ } break;
+
+ case SiG_KEYR: // key3 message
+ case SiG_KEYA: // keyA message
+ case SiG_KEYB: { // keyB message
+ if( ptr->mode==MODE_RSAAES ) {
+ ptr->mode = MODE_NATIVE;
+ cpp_delete_context(ptr->cntx);
+ ptr->cntx = 0;
+ ptr->keyLoaded = 0;
+ DBWriteContactSettingByte(ptr->hContact, szModuleName, "mode", ptr->mode);
+ }
+ switch(ssig) {
+ case SiG_KEYR: { // key3 message
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: SiG_KEYR received");
+#endif
+ // receive KeyB from user;
+ showPopUpKR(ptr->hContact);
+
+ if( ptr->cntx && cpp_keyb(ptr->cntx) ) {
+ // reinit key exchange if an old key from user is found
+ cpp_reset_context(ptr->cntx);
+ }
+
+ if( InitKeyB(ptr,szEncMsg)!=CPP_ERROR_NONE ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: SiG_KEYR InitKeyB error");
+#endif
+ // tell to the other side that we have the plugin disabled with him
+/*
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM) SIG_DISA;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+*/
+ showPopUp(sim013,ptr->hContact,g_hPOP[POP_PU_DIS],0);
+ ShowStatusIconNotify(ptr->hContact);
+
+ waitForExchange(ptr,3); // дослать нешифрованно
+ return 1;
+ }
+
+ // other side support RSA mode ?
+ if( ptr->features & CPP_FEATURES_RSA ) {
+ // switch to RSAAES mode
+ ptr->mode = MODE_RSAAES;
+ DBWriteContactSettingByte(ptr->hContact, szModuleName, "mode", ptr->mode);
+
+ resetRSAcntx(ptr);
+ loadRSAkey(ptr);
+ exp->rsa_connect(ptr->cntx);
+
+ showPopUpKS(pccsd->hContact);
+ ShowStatusIconNotify(pccsd->hContact);
+ return 1;
+ }
+
+ // other side support new key format ?
+ if( ptr->features & CPP_FEATURES_NEWPG ) {
+ cpp_reset_context(ptr->cntx);
+
+ LPSTR keyToSend = InitKeyA(ptr,CPP_FEATURES_NEWPG|KEY_A_SIG); // calculate NEW public and private key
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Sending KEYA %s", keyToSend);
+#endif
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM)keyToSend;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ mir_free(keyToSend);
+
+ showPopUpKS(ptr->hContact);
+ waitForExchange(ptr); // запустим ожидание
+ return 1;
+ }
+
+ // auto send my public key to keyB user if not done before
+ if( !cpp_keya(ptr->cntx) ) {
+ LPSTR keyToSend = InitKeyA(ptr,0); // calculate public and private key
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Sending KEYA %s", keyToSend);
+#endif
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM)keyToSend;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ mir_free(keyToSend);
+
+ showPopUpKS(ptr->hContact);
+ }
+ } break;
+
+ case SiG_KEYA: { // keyA message
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: SiG_KEYA received");
+#endif
+ // receive KeyA from user;
+ showPopUpKR(ptr->hContact);
+
+ cpp_reset_context(ptr->cntx);
+ if(InitKeyB(ptr,szEncMsg)!=CPP_ERROR_NONE) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: SiG_KEYA InitKeyB error");
+#endif
+ // tell to the other side that we have the plugin disabled with him
+/*
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM) SIG_DISA;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+*/
+ showPopUp(sim013,ptr->hContact,g_hPOP[POP_PU_DIS],0);
+ ShowStatusIconNotify(ptr->hContact);
+
+ waitForExchange(ptr,3); // дослать нешифрованно
+ return 1;
+ }
+
+ LPSTR keyToSend = InitKeyA(ptr,CPP_FEATURES_NEWPG|KEY_B_SIG); // calculate NEW public and private key
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Sending KEYB %s", keyToSend);
+#endif
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM)keyToSend;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ mir_free(keyToSend);
+ } break;
+
+ case SiG_KEYB: { // keyB message
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: SiG_KEYB received");
+#endif
+ // receive KeyB from user;
+ showPopUpKR(ptr->hContact);
+
+ // clear all and send DISA if received KeyB, and not exist KeyA or error on InitKeyB
+ if(!cpp_keya(ptr->cntx) || InitKeyB(ptr,szEncMsg)!=CPP_ERROR_NONE) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: SiG_KEYB InitKeyB error");
+#endif
+ // tell to the other side that we have the plugin disabled with him
+/*
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM) SIG_DISA;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+*/
+ showPopUp(sim013,ptr->hContact,g_hPOP[POP_PU_DIS],0);
+ ShowStatusIconNotify(ptr->hContact);
+
+ cpp_reset_context(ptr->cntx);
+ waitForExchange(ptr,3); // дослать нешифрованно
+ return 1;
+ }
+ } break;
+
+ } // switch
+
+ /* common part (CalcKeyX & SendQueue) */
+ // calculate KeyX
+ if( cpp_keya(ptr->cntx) && cpp_keyb(ptr->cntx) && !cpp_keyx(ptr->cntx) )
+ CalculateKeyX(ptr,ptr->hContact);
+
+ ShowStatusIconNotify(ptr->hContact);
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: Session established");
+#endif
+
+ waitForExchange(ptr,2); // дошлем через шифрованное соединение
+ return 1;
+ /* common part (CalcKeyX & SendQueue) */
+ } break;
+
+ } //switch
+
+ // receive message
+ if( cpp_keyx(ptr->cntx) && (ssig==SiG_ENON||ssig==SiG_ENOF) ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: message received");
+#endif
+ showPopUpRM(ptr->hContact);
+ }
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onRecvMsg: exit");
+#endif
+ pccsd->wParam |= PREF_SIMNOMETA;
+ int ret = CallService(MS_PROTO_CHAINRECV, wParam, lParam);
+ SAFE_FREE(szPlainMsg);
+ return ret;
+}
+
+
+// SendMsgW handler
+INT_PTR __cdecl onSendMsgW(WPARAM wParam, LPARAM lParam) {
+ if(!lParam) return 0;
+
+ CCSDATA *ccs = (CCSDATA *) lParam;
+ if( !(ccs->wParam & PREF_UTF) )
+ ccs->wParam |= PREF_UNICODE;
+
+ return onSendMsg(wParam, lParam);
+}
+
+
+// SendMsg handler
+INT_PTR __cdecl onSendMsg(WPARAM wParam, LPARAM lParam) {
+
+ CCSDATA *pccsd = (CCSDATA *)lParam;
+ pUinKey ptr = getUinKey(pccsd->hContact);
+ int ssig = getSecureSig((LPCSTR)pccsd->lParam);
+ int stat = getContactStatus(pccsd->hContact);
+
+// HANDLE hMetaContact = getMetaContact(pccsd->hContact);
+// if( hMetaContact ) {
+// ptr = getUinKey(hMetaContact);
+// }
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSend: %s",(LPSTR)pccsd->lParam);
+#endif
+ // pass unhandled messages
+ if ( !ptr ||
+ ssig==SiG_GAME || ssig==SiG_PGPM || ssig==SiG_SECU || ssig==SiG_SECP ||
+ isChatRoom(pccsd->hContact) ||
+/* (ssig!=SiG_NONE && hMetaContact && (pccsd->wParam & PREF_METANODB)) || */
+ stat==-1 ||
+ (ssig==SiG_NONE && ptr->sendQueue) ||
+ (ssig==SiG_NONE && ptr->status==STATUS_DISABLED) // Disabled - pass unhandled
+ ) {
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: pass unhandled");
+#endif
+ }
+
+ //
+ // PGP/GPG mode
+ //
+ if( ptr->mode==MODE_PGP || ptr->mode==MODE_GPG ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: PGP|GPG mode");
+#endif
+ // если можно зашифровать - шифруем
+ if( isContactPGP(ptr->hContact) || isContactGPG(ptr->hContact) ) {
+/*
+ if(stat==ID_STATUS_OFFLINE) {
+ if (msgbox1(0,sim110,szModuleName,MB_YESNO|MB_ICONQUESTION)==IDNO) {
+ return returnNoError(pccsd->hContact);
+ }
+ // exit and send unencrypted message
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+*/
+ if( !ptr->cntx ) {
+ ptr->cntx = cpp_create_context((isContactGPG(ptr->hContact)?CPP_MODE_GPG:CPP_MODE_PGP) | ((DBGetContactSettingByte(ptr->hContact,szModuleName,"gpgANSI",0))?CPP_MODE_GPG_ANSI:0));
+ ptr->keyLoaded = 0;
+ }
+ if( !ptr->keyLoaded && bPGPloaded ) ptr->keyLoaded = LoadKeyPGP(ptr);
+ if( !ptr->keyLoaded && bGPGloaded ) ptr->keyLoaded = LoadKeyGPG(ptr);
+ if( !ptr->keyLoaded ) return returnError(pccsd->hContact,Translate(sim108));
+
+ LPSTR szNewMsg = NULL;
+ LPSTR szUtfMsg = miranda_to_utf8((LPCSTR)pccsd->lParam,pccsd->wParam);
+ if( ptr->keyLoaded == 1 ) { // PGP
+ szNewMsg = pgp_encode(ptr->cntx,szUtfMsg);
+ }
+ else
+ if( ptr->keyLoaded == 2 ) { // GPG
+ szNewMsg = gpg_encode(ptr->cntx,szUtfMsg);
+ }
+ mir_free(szUtfMsg);
+ if( !szNewMsg ) {
+ return returnError(pccsd->hContact,Translate(sim109));
+ }
+
+ // отправляем зашифрованное сообщение
+ splitMessageSend(ptr,szNewMsg);
+
+ showPopUpSM(ptr->hContact);
+
+ return returnNoError(pccsd->hContact);
+ }
+ else {
+ // отправляем незашифрованное
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+ }
+
+ // get contact SecureIM status
+ int stid = ptr->status;
+
+ //
+ // RSA/AES mode
+ //
+ if( ptr->mode==MODE_RSAAES ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: RSA/AES mode");
+#endif
+ // contact is offline
+ if ( stat==ID_STATUS_OFFLINE ) {
+ if( ptr->cntx ) {
+ if( exp->rsa_get_state(ptr->cntx)!=0 ) {
+ resetRSAcntx(ptr);
+ }
+ }
+ else {
+ createRSAcntx(ptr);
+ }
+ if( !bSOM || (!isClientMiranda(ptr,1) && !isSecureIM(ptr,1)) || !loadRSAkey(ptr) ) {
+ if( ssig==SiG_NONE ) {
+ // просто шлем незашифрованное в оффлайн
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+ else {
+ // ничего не шлем дальше - это служебное сообщение
+ return returnNoError(pccsd->hContact);
+ }
+ }
+ // шлем шифрованное в оффлайн
+ LPSTR szUtfMsg = miranda_to_utf8((LPCSTR)pccsd->lParam,pccsd->wParam);
+ exp->rsa_send(ptr->cntx,szUtfMsg);
+ mir_free(szUtfMsg);
+ showPopUpSM(ptr->hContact);
+ return returnNoError(pccsd->hContact);
+ }
+ // SecureIM connection with this contact is disabled
+ if( stid==STATUS_DISABLED ) {
+ if( ptr->cntx ) {
+ exp->rsa_disabled(ptr->cntx);
+ deleteRSAcntx(ptr);
+ }
+ if( ssig==SiG_NONE ) {
+ // просто шлем незашифрованное
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+ // ничего не шлем дальше - это служебное сообщение
+ return returnNoError(pccsd->hContact);
+ }
+ // разорвать соединение
+ if( ssig==SiG_DEIN ) {
+ if( ptr->cntx ) {
+ exp->rsa_disconnect(ptr->cntx);
+ deleteRSAcntx(ptr);
+ }
+ waitForExchange(ptr,3); // дошлем нешифрованно
+ return returnNoError(pccsd->hContact);
+ }
+ // соединение установлено
+ if( ptr->cntx && exp->rsa_get_state(ptr->cntx)==7 ) {
+ LPSTR szUtfMsg = miranda_to_utf8((LPCSTR)pccsd->lParam,pccsd->wParam);
+ exp->rsa_send(ptr->cntx,szUtfMsg);
+ mir_free(szUtfMsg);
+ showPopUpSM(ptr->hContact);
+ return returnNoError(pccsd->hContact);
+ }
+ // просто сообщение (без тэгов, нет контекста и работают AIP & NOL)
+ if( ssig==SiG_NONE && isSecureIM(ptr->hContact) ) {
+ // добавим его в очередь
+ addMsg2Queue(ptr, pccsd->wParam, (LPSTR)pccsd->lParam);
+ // запускаем процесс установки соединения
+ ssig=SiG_INIT;
+ // запускаем трэд ожидания и досылки
+ waitForExchange(ptr);
+ }
+ // установить соединение
+ if( ssig==SiG_INIT ) {
+ createRSAcntx(ptr);
+ loadRSAkey(ptr);
+ exp->rsa_connect(ptr->cntx);
+ showPopUpKS(pccsd->hContact);
+ ShowStatusIconNotify(pccsd->hContact);
+ return returnNoError(pccsd->hContact);
+ }
+ // просто шлем незашифрованное (не знаю даже когда такое случится)
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+
+ //
+ // Native mode
+ //
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: Native mode");
+#endif
+
+ // SecureIM connection with this contact is disabled
+ if( stid==STATUS_DISABLED ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: message for Disabled");
+#endif
+ // if user try initialize connection
+ if( ssig==SiG_INIT ) {
+ // secure IM is disabled ...
+ return returnError(pccsd->hContact,Translate(sim105));
+ }
+ if (ptr->cntx) { // if exist secure context
+ cpp_delete_context(ptr->cntx); ptr->cntx=0;
+
+ CCSDATA ccsd;
+ memcpy(&ccsd, (HLOCAL)lParam, sizeof(CCSDATA));
+
+ pccsd->wParam |= PREF_METANODB;
+ ccsd.lParam = (LPARAM) SIG_DEIN;
+ ccsd.szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, (LPARAM)&ccsd);
+
+ showPopUpDC(pccsd->hContact);
+ ShowStatusIconNotify(pccsd->hContact);
+ }
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+
+ // contact is offline
+ if( stat==ID_STATUS_OFFLINE ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: message for offline");
+#endif
+ if( ssig==SiG_INIT && cpp_keyx(ptr->cntx) ) {
+ // reinit key exchange
+ cpp_reset_context(ptr->cntx);
+ }
+
+ if( !bSOM ) {
+ if( ssig!=SiG_NONE ) {
+ return returnNoError(pccsd->hContact);
+ }
+ // exit and send unencrypted message
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+ BOOL isMiranda = isClientMiranda(ptr->hContact);
+
+ if( stid==STATUS_ALWAYSTRY && isMiranda ) { // always try && Miranda
+ // set key for offline user
+ DBVARIANT dbv; dbv.type = DBVT_BLOB;
+ if( DBGetContactSettingDword(ptr->hContact, szModuleName, "offlineKeyTimeout", 0) > gettime() &&
+ DBGetContactSetting(ptr->hContact, szModuleName, "offlineKey", &dbv) == 0
+ ) {
+ // if valid key is succefully retrieved
+ ptr->offlineKey = true;
+ InitKeyX(ptr,dbv.pbVal);
+ DBFreeVariant(&dbv);
+ }
+ else {
+ DBDeleteContactSetting(ptr->hContact,szModuleName,"offlineKey");
+ DBDeleteContactSetting(ptr->hContact,szModuleName,"offlineKeyTimeout");
+ if (msgbox1(0,sim106,szModuleName,MB_YESNO|MB_ICONQUESTION)==IDNO) {
+ return returnNoError(pccsd->hContact);
+ }
+ // exit and send unencrypted message
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+ }
+ else {
+/* if (stid==STATUS_ALWAYSTRY && !isMiranda || stid!=STATUS_ALWAYSTRY && isMiranda) {
+ int res=msgbox1(0,"User is offline now, Do you want to send your message ?\nIt will be unencrypted !","Can't Send Encrypted Message !",MB_YESNO);
+ if (res==IDNO) return 1;
+ }*/
+ if( ssig!=SiG_NONE ) {
+ return returnNoError(pccsd->hContact);
+ }
+ // exit and send unencrypted message
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+
+ }
+ else {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: message for online");
+#endif
+ // contact is online and we use an offline key -> reset offline key
+ if( ptr->offlineKey ) {
+ cpp_reset_context(ptr->cntx);
+ ptr->offlineKey = false;
+ ShowStatusIconNotify(ptr->hContact);
+ }
+ }
+
+ // if init is called from contact menu list reinit secure im connection
+ if( ssig==SiG_INIT ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: SiG_INIT");
+#endif
+ cpp_reset_context(ptr->cntx);
+ }
+
+ // if deinit is called from contact menu list deinit secure im connection
+ if( ssig==SiG_DEIN ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: SiG_DEIN");
+#endif
+ // disable SecureIM only if it was enabled
+ if (ptr->cntx) {
+ cpp_delete_context(ptr->cntx); ptr->cntx=0;
+
+ pccsd->wParam |= PREF_METANODB;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+
+ showPopUpDC(pccsd->hContact);
+ ShowStatusIconNotify(pccsd->hContact);
+ }
+ return returnNoError(pccsd->hContact);
+ }
+
+ if( cpp_keya(ptr->cntx) && cpp_keyb(ptr->cntx) && !cpp_keyx(ptr->cntx) )
+ CalculateKeyX(ptr,ptr->hContact);
+
+ ShowStatusIconNotify(pccsd->hContact);
+
+ // if cryptokey exist
+ if( cpp_keyx(ptr->cntx) ) {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: cryptokey exist");
+#endif
+/* if( !hMetaContact && isProtoMetaContacts(pccsd->hContact) && (DBGetContactSettingByte(NULL, "MetaContacts", "SubcontactHistory", 1) == 1)) {
+ // add sent event to subcontact
+ DBEVENTINFO dbei; HANDLE hC = getMostOnline(pccsd->hContact);
+ ZeroMemory(&dbei, sizeof(dbei));
+ dbei.cbSize = sizeof(dbei);
+ dbei.szModule = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hC, 0);
+ dbei.flags = DBEF_SENT;
+ dbei.timestamp = time(NULL);
+ dbei.eventType = EVENTTYPE_MESSAGE;
+ if(pccsd->wParam & PREF_RTL) dbei.flags |= DBEF_RTL;
+ if(pccsd->wParam & PREF_UTF) dbei.flags |= DBEF_UTF;
+ dbei.cbBlob = strlen((char *)pccsd->lParam) + 1;
+ if ( pccsd->wParam & PREF_UNICODE )
+ dbei.cbBlob *= ( sizeof( wchar_t )+1 );
+ dbei.pBlob = (PBYTE)pccsd->lParam;
+
+ CallService(MS_DB_EVENT_ADD, (WPARAM)hC, (LPARAM)&dbei);
+ } */
+
+ LPSTR szNewMsg = encodeMsg(ptr,(LPARAM)pccsd);
+
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSend: encrypted msg '%s'",szNewMsg);
+#endif
+
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM) szNewMsg;
+ pccsd->szProtoService = PSS_MESSAGE;
+ int ret = CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+
+ mir_free(szNewMsg);
+
+ showPopUpSM(ptr->hContact);
+
+ return ret;
+ }
+ else {
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: cryptokey not exist, try establishe connection");
+#endif
+ // send KeyA if init || always_try || waitkey || always_if_possible
+ if( ssig==SiG_INIT || (stid==STATUS_ALWAYSTRY && isClientMiranda(ptr->hContact)) || isSecureIM(ptr->hContact) || ptr->waitForExchange ) {
+ if (ssig==SiG_NONE) {
+ addMsg2Queue(ptr, pccsd->wParam, (LPSTR)pccsd->lParam);
+ }
+ if( !ptr->waitForExchange ) {
+ // init || always_try || always_if_possible
+ LPSTR keyToSend = InitKeyA(ptr,0); // calculate public and private key & fill KeyA
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("Sending KEY3: %s", keyToSend);
+#endif
+ pccsd->wParam &= ~PREF_UNICODE;
+ pccsd->wParam |= PREF_METANODB;
+ pccsd->lParam = (LPARAM) keyToSend;
+ pccsd->szProtoService = PSS_MESSAGE;
+ CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ mir_free(keyToSend);
+
+ showPopUpKS(pccsd->hContact);
+ ShowStatusIconNotify(pccsd->hContact);
+
+ waitForExchange(ptr); // запускаем ожидание
+ }
+ return returnNoError(pccsd->hContact);
+ }
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("onSendMsg: pass unchanged to chain");
+#endif
+ return CallService(MS_PROTO_CHAINSEND, wParam, lParam);
+ }
+}
+
+
+int file_idx = 0;
+
+INT_PTR __cdecl onSendFile(WPARAM wParam, LPARAM lParam) {
+
+ CCSDATA *pccsd=(CCSDATA*)lParam;
+
+ pUinKey ptr = getUinKey(pccsd->hContact);
+ if (!ptr || !bSFT) return CallService(PSS_FILE, wParam, lParam);
+
+ if( isContactSecured(pccsd->hContact)&SECURED ) {
+
+ char **file=(char **)pccsd->lParam;
+ if(file_idx==100) file_idx=0;
+ int i;
+ for(i=0;file[i];i++) {
+
+ if (strstr(file[i],".AESHELL")) continue;
+
+ char *name = strrchr(file[i],'\\');
+ if( !name ) name = file[i];
+ else name++;
+
+ char *file_out = (char*) mir_alloc(TEMP_SIZE+strlen(name)+20);
+ sprintf(file_out,"%s\\%s.AESHELL(%d)",TEMP,name,file_idx++);
+
+ char buf[MAX_PATH];
+ sprintf(buf,"%s\n%s",Translate(sim011),file[i]);
+ showPopUp(buf,NULL,g_hPOP[POP_PU_MSS],2);
+
+ if( ptr->mode==MODE_RSAAES ) {
+ exp->rsa_encrypt_file(ptr->cntx,file[i],file_out);
+ }
+ else {
+ cpp_encrypt_file(ptr->cntx,file[i],file_out);
+ }
+
+ mir_free(file[i]);
+ file[i]=file_out;
+ }
+ if( ptr->fileSend ) { // очистим сохраненный список
+ for(int j=0;ptr->fileSend[j];j++) {
+ mir_free(ptr->fileSend[j]);
+ }
+ SAFE_FREE(ptr->fileSend);
+ }
+ if( i ) { // скопируем новый список
+ ptr->fileSend = (char **) mir_alloc(sizeof(char*)*(i+1));
+ for(i=0;file[i];i++) {
+ ptr->fileSend[i] = mir_strdup(file[i]);
+ }
+ ptr->fileSend[i] = NULL;
+ }
+ }
+ return CallService(PSS_FILE, wParam, lParam);
+}
+
+
+/*
+typedef struct {
+ size_t cbSize;
+ HANDLE hContact;
+ int sending; //true if sending, false if receiving
+ char **files;
+ int totalFiles;
+ int currentFileNumber;
+ unsigned long totalBytes;
+ unsigned long totalProgress;
+ char *workingDir;
+ char *currentFile;
+ unsigned long currentFileSize;
+ unsigned long currentFileProgress;
+ unsigned long currentFileTime; //as seconds since 1970
+} PROTOFILETRANSFERSTATUS;
+*/
+
+int __cdecl onProtoAck(WPARAM wParam,LPARAM lParam) {
+
+ ACKDATA *ack=(ACKDATA*)lParam;
+ if (ack->type!=ACKTYPE_FILE) return 0; //quit if not file transfer event
+ PROTOFILETRANSFERSTATUS *f = (PROTOFILETRANSFERSTATUS*) ack->lParam;
+
+ pUinKey ptr = getUinKey(ack->hContact);
+ if (!ptr || (f && f->sending && !bSFT)) return 0;
+
+ if( isContactSecured(ack->hContact)&SECURED ) {
+ switch(ack->result) {
+// case ACKRESULT_FILERESUME:
+ case ACKRESULT_DATA: {
+ if( !f->sending ) {
+ ptr->finFileRecv = (f->currentFileSize == f->currentFileProgress);
+ if( !ptr->lastFileRecv ) ptr->lastFileRecv = mir_strdup(f->currentFile);
+ }
+ else
+ if( f->sending ) {
+ ptr->finFileSend = (f->currentFileSize == f->currentFileProgress);
+ if( !ptr->lastFileSend ) ptr->lastFileSend = mir_strdup(f->currentFile);
+ }
+ } break;
+// case ACKRESULT_INITIALISING:
+ case ACKRESULT_DENIED:
+ case ACKRESULT_FAILED: {
+ if( ptr->lastFileRecv ) {
+ if (strstr(ptr->lastFileRecv,".AESHELL")) mir_unlink(ptr->lastFileRecv);
+ SAFE_FREE(ptr->lastFileRecv);
+ }
+ if( ptr->lastFileSend ) {
+ if (strstr(ptr->lastFileSend,".AESHELL")) mir_unlink(ptr->lastFileSend);
+ SAFE_FREE(ptr->lastFileSend);
+ }
+ if( ptr->fileSend ) {
+ char **file=ptr->fileSend;
+ for(int j=0;file[j];j++) {
+ if( strstr(file[j],".AESHELL") ) mir_unlink(file[j]);
+ mir_free(file[j]);
+ }
+ SAFE_FREE(ptr->fileSend);
+ }
+ return 0;
+ } break;
+ case ACKRESULT_NEXTFILE:
+ case ACKRESULT_SUCCESS: {
+ if( ptr->finFileRecv && ptr->lastFileRecv ) {
+ if( strstr(ptr->lastFileRecv,".AESHELL") ) {
+ char buf[MAX_PATH];
+ LPSTR file_out=mir_strdup(ptr->lastFileRecv);
+ LPSTR pos=strrchr(file_out,'.'); //find last .
+ if (pos) *pos='\0'; //remove AESHELL from name
+
+ if( isFileExist(file_out) ) {
+ buf[0]='\0';
+ LPSTR p=strrchr(file_out,'.');
+ LPSTR x=strrchr(file_out,'\\');
+ if(p>x) {
+ strcpy(buf,p);
+ pos=p;
+ }
+ for(int i=1;i<10000;i++) {
+ sprintf(pos," (%d)%s",i,buf);
+ if( !isFileExist(file_out) ) break;
+ }
+ }
+
+ sprintf(buf,"%s\n%s",Translate(sim012),file_out);
+ showPopUp(buf,NULL,g_hPOP[POP_PU_MSR],2);
+
+ if( ptr->mode==MODE_RSAAES ) {
+ exp->rsa_decrypt_file(ptr->cntx,ptr->lastFileRecv,file_out);
+ }
+ else {
+ cpp_decrypt_file(ptr->cntx,ptr->lastFileRecv,file_out);
+ }
+ mir_free(file_out);
+ mir_unlink(ptr->lastFileRecv);
+ }
+ SAFE_FREE(ptr->lastFileRecv);
+ ptr->finFileRecv = false;
+ }
+ if( ptr->finFileSend && ptr->lastFileSend ) {
+ if( strstr(ptr->lastFileSend,".AESHELL") ) mir_unlink(ptr->lastFileSend);
+ SAFE_FREE(ptr->lastFileSend);
+ ptr->finFileSend = false;
+ }
+ } break;
+ } // switch
+ }
+ return 0;
+}
+
+
+// EOF
diff --git a/secureim/svcs_proto.h b/secureim/svcs_proto.h new file mode 100644 index 0000000..64ce1c4 --- /dev/null +++ b/secureim/svcs_proto.h @@ -0,0 +1,14 @@ +#ifndef __SVCS_PROTO_H__
+#define __SVCS_PROTO_H__
+
+#include <windows.h>
+
+INT_PTR __cdecl onRecvMsg(WPARAM,LPARAM);
+INT_PTR __cdecl onSendMsgW(WPARAM,LPARAM);
+INT_PTR __cdecl onSendMsg(WPARAM,LPARAM);
+INT_PTR __cdecl onSendFile(WPARAM,LPARAM);
+
+int __cdecl onProtoAck(WPARAM,LPARAM);
+int __cdecl onContactSettingChanged(WPARAM,LPARAM);
+
+#endif
diff --git a/secureim/svcs_rsa.cpp b/secureim/svcs_rsa.cpp new file mode 100644 index 0000000..73fbb38 --- /dev/null +++ b/secureim/svcs_rsa.cpp @@ -0,0 +1,226 @@ +#include "commonheaders.h"
+
+
+pRSA_EXPORT exp = NULL;
+RSA_IMPORT imp = {
+ rsa_inject,
+ rsa_check_pub,
+ rsa_notify
+};
+
+BOOL rsa_4096=0;
+
+
+int __cdecl rsa_inject(HANDLE context, LPCSTR msg) {
+ pUinKey ptr = getUinCtx(context); if(!ptr) return 0;
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("rsa_inject: '%s'", msg);
+#endif
+ int len = strlen(msg)+1;
+ LPSTR buf = (LPSTR) mir_alloc(LEN_SECU+len);
+ memcpy(buf,SIG_SECU,LEN_SECU);
+ memcpy(buf+LEN_SECU,msg,len);
+ // отправляем сообщение
+ splitMessageSend(ptr,buf);
+ mir_free(buf);
+ return 1;
+}
+
+
+#define MSGSIZE 1024
+
+int __cdecl rsa_check_pub(HANDLE context, PBYTE pub, int pubLen, PBYTE sig, int sigLen) {
+ int v=0, k=0;
+ pUinKey ptr = getUinCtx(context); if(!ptr) return 0;
+ LPSTR cnm = (LPSTR) mir_alloc(NAMSIZE); getContactNameA(ptr->hContact,cnm);
+ LPSTR uin = (LPSTR) mir_alloc(KEYSIZE); getContactUinA(ptr->hContact,uin);
+ LPSTR msg = (LPSTR) mir_alloc(MSGSIZE);
+ LPSTR sha = mir_strdup(to_hex(sig,sigLen));
+ LPSTR sha_old = NULL;
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("rsa_check_pub: %s %s %s", cnm, uin, sha);
+#endif
+ DBVARIANT dbv;
+ dbv.type = DBVT_BLOB;
+ if( DBGetContactSetting(ptr->hContact,szModuleName,"rsa_pub",&dbv) == 0 ) {
+ k = 1;
+ PBYTE buf = (PBYTE) alloca(sigLen); int len;
+ exp->rsa_get_hash((PBYTE)dbv.pbVal,dbv.cpbVal,(PBYTE)buf,&len);
+ sha_old = mir_strdup(to_hex(buf,len));
+ DBFreeVariant(&dbv);
+ }
+ if( bAAK ) {
+ if( k ) mir_snprintf(msg,MSGSIZE,Translate(sim523),cnm,uin,sha,sha_old);
+ else mir_snprintf(msg,MSGSIZE,Translate(sim521),cnm,uin,sha);
+ showPopUpKRmsg(ptr->hContact,msg);
+ HistoryLog(ptr->hContact,msg);
+ v = 1;
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("rsa_check_pub: auto accepted");
+#endif
+ }
+ else {
+ if( k ) mir_snprintf(msg,MSGSIZE,Translate(sim522),cnm,sha,sha_old);
+ else mir_snprintf(msg,MSGSIZE,Translate(sim520),cnm,sha);
+ v = (msgbox(0,msg,szModuleName,MB_YESNO|MB_ICONQUESTION)==IDYES);
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("rsa_check_pub: manual accepted %d",v);
+#endif
+ }
+ if(v) {
+ DBCONTACTWRITESETTING cws;
+ cws.szModule = szModuleName;
+ cws.szSetting = "rsa_pub";
+ cws.value.type = DBVT_BLOB;
+ cws.value.pbVal = pub;
+ cws.value.cpbVal = pubLen;
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)ptr->hContact, (LPARAM)&cws);
+ ptr->keyLoaded = true;
+ }
+ mir_free(cnm);
+ mir_free(uin);
+ mir_free(msg);
+ mir_free(sha);
+ SAFE_FREE(sha_old);
+ return v;
+}
+
+
+void __cdecl rsa_notify(HANDLE context, int state) {
+ pUinKey ptr = getUinCtx(context); if(!ptr) return;
+ LPCSTR msg=NULL;
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("rsa_notify: 0x%x", state);
+#endif
+ switch( state ) {
+ case 1: {
+ showPopUpEC(ptr->hContact);
+ ShowStatusIconNotify(ptr->hContact);
+ waitForExchange(ptr,2); // досылаем сообщения из очереди
+ return;
+ }
+ case -1: // сессия разорвана по ошибке, неверный тип сообщения
+ msg=sim501; break;
+ case -2: // сессия разорвана по ошибке другой стороной
+ msg=sim502; break;
+ case -5: // ошибка декодирования AES сообщения
+ msg=sim505; break;
+ case -6: // ошибка декодирования RSA сообщения
+ msg=sim506; break;
+ case -7: // таймаут установки соединения (10 секунд)
+ msg=sim507; break;
+ case -8: { // сессия разорвана по причине "disabled"
+ msg=sim508;
+// ptr->status=ptr->tstatus=STATUS_DISABLED;
+// DBWriteContactSettingByte(ptr->hContact, szModuleName, "StatusID", ptr->status);
+ } break;
+ case -0x10: // сессия разорвана по ошибке
+ case -0x21:
+ case -0x22:
+ case -0x23:
+ case -0x24:
+ case -0x32:
+ case -0x33:
+ case -0x34:
+ case -0x40:
+ case -0x50:
+ case -0x60: {
+ char buf[1024];
+ sprintf(buf,sim510,-state);
+ showPopUpDCmsg(ptr->hContact,buf);
+ ShowStatusIconNotify(ptr->hContact);
+ if(ptr->cntx) deleteRSAcntx(ptr);
+ waitForExchange(ptr,3); // досылаем нешифровано
+ return;
+ }
+ case -3: // соединение разорвано вручную
+ case -4: { // соединение разорвано вручную другой стороной
+ showPopUpDC(ptr->hContact);
+ ShowStatusIconNotify(ptr->hContact);
+ if(ptr->cntx) deleteRSAcntx(ptr);
+ waitForExchange(ptr,3); // досылаем нешифровано
+ return;
+ }
+ default:
+ return;
+ }
+ showPopUpDCmsg(ptr->hContact,msg);
+ ShowStatusIconNotify(ptr->hContact);
+ if(ptr->cntx) deleteRSAcntx(ptr);
+ waitForExchange(ptr,3); // досылаем нешифровано
+}
+
+
+unsigned __stdcall sttGenerateRSA( LPVOID param ) {
+
+ char priv_key[4096]; int priv_len;
+ char pub_key[4096]; int pub_len;
+
+ exp->rsa_gen_keypair(CPP_MODE_RSA_4096);
+
+ DBCONTACTWRITESETTING cws;
+ cws.szModule = szModuleName;
+ cws.value.type = DBVT_BLOB;
+
+ exp->rsa_get_keypair(CPP_MODE_RSA_4096,(PBYTE)&priv_key,&priv_len,(PBYTE)&pub_key,&pub_len);
+
+ cws.szSetting = "rsa_priv";
+ cws.value.pbVal = (PBYTE)&priv_key;
+ cws.value.cpbVal = priv_len;
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)0, (LPARAM)&cws);
+
+ cws.szSetting = "rsa_pub";
+ cws.value.pbVal = (PBYTE)&pub_key;
+ cws.value.cpbVal = pub_len;
+ CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)0, (LPARAM)&cws);
+
+ rsa_4096=1;
+
+ return 0;
+}
+
+
+// загружает паблик-ключ в RSA контекст
+BYTE loadRSAkey(pUinKey ptr) {
+ if( !ptr->keyLoaded ) {
+ DBVARIANT dbv;
+ dbv.type = DBVT_BLOB;
+ if( DBGetContactSetting(ptr->hContact,szModuleName,"rsa_pub",&dbv) == 0 ) {
+ ptr->keyLoaded = exp->rsa_set_pubkey(ptr->cntx,dbv.pbVal,dbv.cpbVal);
+#if defined(_DEBUG) || defined(NETLIB_LOG)
+ Sent_NetLog("loadRSAkey %d", ptr->keyLoaded);
+#endif
+ DBFreeVariant(&dbv);
+ }
+ }
+ return ptr->keyLoaded;
+}
+
+// создает RSA контекст
+void createRSAcntx(pUinKey ptr) {
+ if( !ptr->cntx ) {
+ ptr->cntx = cpp_create_context(CPP_MODE_RSA);
+ ptr->keyLoaded = 0;
+ }
+}
+
+
+// пересоздает RSA контекст
+void resetRSAcntx(pUinKey ptr) {
+ if( ptr->cntx ) {
+ cpp_delete_context(ptr->cntx);
+ ptr->cntx = cpp_create_context(CPP_MODE_RSA);
+ ptr->keyLoaded = 0;
+ }
+}
+
+
+// удаляет RSA контекст
+void deleteRSAcntx(pUinKey ptr) {
+ cpp_delete_context(ptr->cntx);
+ ptr->cntx = 0;
+ ptr->keyLoaded = 0;
+}
+
+
+// EOF
diff --git a/secureim/svcs_rsa.h b/secureim/svcs_rsa.h new file mode 100644 index 0000000..3f43e71 --- /dev/null +++ b/secureim/svcs_rsa.h @@ -0,0 +1,20 @@ +#ifndef __SVCS_RSA_H__
+#define __SVCS_RSA_H__
+
+#include <windows.h>
+
+extern pRSA_EXPORT exp;
+extern RSA_IMPORT imp;
+extern BOOL rsa_4096;
+
+int __cdecl rsa_inject(HANDLE,LPCSTR);
+int __cdecl rsa_check_pub(HANDLE,PBYTE,int,PBYTE,int);
+void __cdecl rsa_notify(HANDLE,int);
+
+unsigned __stdcall sttGenerateRSA(LPVOID);
+BYTE loadRSAkey(pUinKey);
+void createRSAcntx(pUinKey);
+void resetRSAcntx(pUinKey);
+void deleteRSAcntx(pUinKey);
+
+#endif
diff --git a/secureim/svcs_srmm.cpp b/secureim/svcs_srmm.cpp new file mode 100644 index 0000000..c187ff7 --- /dev/null +++ b/secureim/svcs_srmm.cpp @@ -0,0 +1,37 @@ +#include "commonheaders.h"
+
+
+int __cdecl onWindowEvent(WPARAM wParam, LPARAM lParam) {
+
+ MessageWindowEventData *mwd = (MessageWindowEventData *)lParam;
+ if(mwd->uType == MSG_WINDOW_EVT_OPEN || mwd->uType == MSG_WINDOW_EVT_OPENING) {
+ ShowStatusIcon(mwd->hContact);
+ }
+ return 0;
+}
+
+
+int __cdecl onIconPressed(WPARAM wParam, LPARAM lParam) {
+ HANDLE hContact = (HANDLE)wParam;
+ if( isProtoMetaContacts(hContact) )
+ hContact = getMostOnline(hContact); // возьмем тот, через который пойдет сообщение
+
+ StatusIconClickData *sicd = (StatusIconClickData *)lParam;
+ if( strcmp(sicd->szModule, szModuleName) != 0 ||
+ !isSecureProtocol(hContact) ) return 0; // not our event
+
+ BOOL isPGP = isContactPGP(hContact);
+ BOOL isGPG = isContactGPG(hContact);
+ BOOL isSecured = isContactSecured(hContact)&SECURED;
+ BOOL isChat = isChatRoom(hContact);
+
+ if( !isPGP && !isGPG && !isChat ) {
+ if(isSecured) Service_DisableIM(wParam,0);
+ else Service_CreateIM(wParam,0);
+ }
+
+ return 0;
+}
+
+
+// EOF
diff --git a/secureim/svcs_srmm.h b/secureim/svcs_srmm.h new file mode 100644 index 0000000..d64c89a --- /dev/null +++ b/secureim/svcs_srmm.h @@ -0,0 +1,9 @@ +#ifndef __SVCS_SRMM_H__
+#define __SVCS_SRMM_H__
+
+#include <windows.h>
+
+int __cdecl onWindowEvent(WPARAM,LPARAM);
+int __cdecl onIconPressed(WPARAM,LPARAM);
+
+#endif
diff --git a/secureim/version.h b/secureim/version.h new file mode 100644 index 0000000..22b458e --- /dev/null +++ b/secureim/version.h @@ -0,0 +1,16 @@ +#ifndef __VERSION_H_INCLUDED
+#define __VERSION_H_INCLUDED
+
+#define __MAJOR_VERSION 1
+#define __MINOR_VERSION 0
+#define __RELEASE_NUM 12
+#define __BUILD_NUM 4
+
+#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM
+#define __FILEVERSION_STRING_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM
+#define __STRINGIFY(x) #x
+#define __TOSTRING(x) __STRINGIFY(x)
+#define __VERSION_STRING __TOSTRING(__FILEVERSION_STRING_DOTS)
+#define __VERSION_DWORD ((__MAJOR_VERSION<<24) | (__MINOR_VERSION<<16) | (__RELEASE_NUM<<8) | __BUILD_NUM)
+
+#endif //__VERSION_H_INCLUDED
diff --git a/secureim/version.rc b/secureim/version.rc new file mode 100644 index 0000000..80561a7 --- /dev/null +++ b/secureim/version.rc @@ -0,0 +1,41 @@ +#include "version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION __FILEVERSION_STRING
+ PRODUCTVERSION __FILEVERSION_STRING
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "Comments", "Licensed under the terms of the GNU General Public License"
+ VALUE "FileDescription", "SecureIM plugin for Miranda IM"
+ VALUE "FileVersion", __VERSION_STRING
+ VALUE "InternalName", "SecureIM"
+ VALUE "LegalCopyright", "Copyright й 2003 Johell, й 2005-09 Baloo"
+ VALUE "OriginalFilename", "secureim.dll"
+ VALUE "ProductName", "SecureIM plugin"
+ VALUE "ProductVersion", __VERSION_STRING
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END
+
+
diff --git a/secureim/version_icons.rc b/secureim/version_icons.rc new file mode 100644 index 0000000..cac02c0 --- /dev/null +++ b/secureim/version_icons.rc @@ -0,0 +1,40 @@ +#include "version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION __FILEVERSION_STRING
+ PRODUCTVERSION __FILEVERSION_STRING
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "FileDescription", "Iconpack for SecureIM plugin of Miranda IM"
+ VALUE "FileVersion", __VERSION_STRING
+ VALUE "InternalName", "SecureIM_icons"
+ VALUE "LegalCopyright", "Copyright й 2006-09 Baloo"
+ VALUE "OriginalFilename", "SecureIM_icons.dll"
+ VALUE "ProductName", "Iconpack for SecureIM plugin"
+ VALUE "ProductVersion", __VERSION_STRING
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END
+
+
|