libmsn 4.2
|
00001 #ifndef __msn_util_h__ 00002 #define __msn_util_h__ 00003 00004 /* 00005 * util.h 00006 * libmsn 00007 * 00008 * Created by Mark Rowe on Mon Mar 22 2004. 00009 * Refactored by Tiago Salem Herrmann on 08/2007. 00010 * Copyright (c) 2004 Mark Rowe. All rights reserved. 00011 * Copyright (c) 2007 Tiago Salem Herrmann. All rights reserved 00012 * 00013 * This program is free software; you can redistribute it and/or modify 00014 * it under the terms of the GNU General Public License as published by 00015 * the Free Software Foundation; either version 2 of the License, or 00016 * (at your option) any later version. 00017 * 00018 * This program is distributed in the hope that it will be useful, 00019 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00020 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00021 * GNU General Public License for more details. 00022 * 00023 * You should have received a copy of the GNU General Public License 00024 * along with this program; if not, write to the Free Software 00025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00026 */ 00027 #include <openssl/bio.h> 00028 #include <openssl/evp.h> 00029 #include <openssl/sha.h> 00030 #include <openssl/hmac.h> 00031 #include <openssl/des.h> 00032 00033 #include <string> 00034 #include <sstream> 00035 #include <map> 00036 #include <vector> 00037 #include <stdexcept> 00038 #include <string> 00039 00040 #ifdef _MSC_VER 00041 #pragma warning( disable : 4290 ) 00042 #endif 00043 00044 // this is for CHL command 00045 #define szClientID "PROD0114ES4Z%Q5W" 00046 #define szClientCode "PK}_A_0N_K%O?A9S" 00047 00048 #ifndef U8 00049 #define U8 unsigned char 00050 #endif 00051 #ifndef U16 00052 #define U16 unsigned short 00053 #endif 00054 #ifndef U32 00055 #define U32 unsigned int 00056 #endif 00057 #define FB_UNI 0xFFFd 00058 00059 // for libsiren 00060 #define RIFF_ID 0x46464952 00061 #define WAVE_ID 0x45564157 00062 #define FMT_ID 0x20746d66 00063 #define DATA_ID 0x61746164 00064 #define FACT_ID 0x74636166 00065 00066 typedef struct 00067 { 00068 unsigned int chunk_id; 00069 unsigned int chunk_size; 00070 } wav_data; 00071 00072 typedef struct 00073 { 00074 unsigned int chunk_id; 00075 unsigned int chunk_size; 00076 unsigned int type_id; 00077 } riff_data; 00078 00079 typedef struct 00080 { 00081 unsigned short format; 00082 unsigned short channels; 00083 unsigned int sample_rate; 00084 unsigned int byte_rate; 00085 unsigned short block_align; 00086 unsigned short bits_per_sample; 00087 } fmt_chunk; 00088 00089 typedef struct 00090 { 00091 fmt_chunk fmt; 00092 unsigned short extra_size; 00093 unsigned char *extra_content; 00094 } fmt_chunk_ex; 00095 00096 #define IDX(val, i) ((unsigned int) ((unsigned char *) &val)[i]) 00097 00098 #define GUINT16_FROM_LE(val) ((unsigned short) (IDX (val, 0) + (unsigned short) IDX (val, 1) * 256)) 00099 #define GUINT32_FROM_LE(val) ((unsigned int) (IDX (val, 0) + IDX (val, 1) * 256 + \ 00100 IDX (val, 2) * 65536 + IDX (val, 3) * 16777216)) 00101 00102 namespace MSN 00103 { 00110 std::string encodeURL(const std::string & s); 00111 00118 std::string decodeURL(const std::string & s); 00119 00126 std::pair<std::string, int> splitServerAddress(const std::string & address, int default_port=1863); 00127 00130 int nocase_cmp(const std::string & s1, const std::string & s2); 00131 00134 std::vector<std::string> splitString(const std::string & string, const std::string & separator, bool suppressBlanks=true); 00135 00136 std::string toStr(int var); 00137 std::string unsignedToStr(unsigned int var); 00140 unsigned int decimalFromString(const std::string & s) throw (std::logic_error); 00141 00142 U32 _ucs2_utf8(U8 *dst, U8 *src, U32 nchar); 00143 U32 _utf8_ucs2(U8 *dst, U8 *src); 00144 00146 struct personalInfo 00147 { 00148 std::string PSM; 00149 std::string mediaApp; 00150 std::string mediaType; 00151 bool mediaIsEnabled; 00152 std::string mediaFormat; 00153 std::vector<std::string> mediaLines; 00155 personalInfo() { 00156 mediaIsEnabled = false; 00157 } 00158 }; 00159 00160 struct hotmailInfo 00161 { 00162 std::string rru; 00163 std::string url; 00164 std::string id; 00165 std::string sl; 00166 std::string kv; 00167 std::string sid; 00168 std::string MSPAuth; 00169 std::string creds; 00170 }; 00171 00173 typedef enum 00174 { 00175 LST_AB = 1, 00176 LST_AL = 2, 00177 LST_BL = 4, 00178 LST_RL = 8, 00179 LST_PL = 16 00180 }ContactList; 00181 00182 struct tagMSGRUSRKEY 00183 { 00184 unsigned int uStructHeaderSize; // 28. Does not count data 00185 unsigned int uCryptMode; // CRYPT_MODE_CBC (1) 00186 unsigned int uCipherType; // TripleDES (0x6603) 00187 unsigned int uHashType; // SHA1 (0x8004) 00188 unsigned int uIVLen; // 8 00189 unsigned int uHashLen; // 20 00190 unsigned int uCipherLen; // 72 00191 // Data 00192 unsigned char aIVBytes[8]; 00193 unsigned char aHashBytes[20]; 00194 unsigned char aCipherBytes[72]; 00195 }; 00196 00198 typedef struct 00199 { 00200 std::string from; 00201 std::string fromFN; 00202 std::string id; 00203 } eachOIM; 00204 00205 std::string new_branch(); 00206 std::string generate_soap_auth(std::string user, std::string pass, std::string ticket); 00207 std::string mdi_encrypt(std::string key, std::string nonce); 00208 std::string b64_decode(const char *input); 00209 std::string b64_encode(const char *input, int size); 00210 00211 unsigned int little2big_endian(unsigned int i); 00212 int FileSize(const char* sFileName); 00213 void DoMSNP11Challenge(const char *szChallenge, char *szOutput); 00214 00215 // stolen from kopete 00217 typedef enum 00218 { 00219 WindowsMobile = 0x1, 00220 InkGifSupport = 0x4, 00221 InkIsfSupport = 0x8, 00222 SupportWebcam = 0x10, 00223 SupportMultiPacketMessaging = 0x20, 00224 MSNMobileDevice = 0x40, 00225 MSNDirectDevice = 0x80, 00226 WebMessenger = 0x100, 00227 OtherSideWebMessenger = 0x200, 00228 InternalMicrosoftClient = 0x800, //Internal Microsoft client and/or Microsoft Office Live client. 00229 MSNSpace = 0x1000, 00230 WinXPMediaCenter = 0x2000, // This means you are using Windows XP Media Center Edition. 00231 SupportDirectIM = 0x4000, 00232 SupportWinks = 0x8000, 00233 MSNSearch = 0x10000, 00234 VoiceClips = 0x40000, 00235 SecureChannel = 0x80000, 00236 SIPInvitations = 0x100000, 00237 SharingFolders = 0x400000, 00238 MSNC1 = 0x10000000, 00239 MSNC2 = 0x20000000, 00240 MSNC3 = 0x30000000, 00241 MSNC4 = 0x40000000, 00242 MSNC5 = 0x50000000, 00243 MSNC6 = 0x60000000, 00244 MSNC7 = 0x70000000 00245 } MSNClientInformationFields; 00246 00248 enum fileTransferType 00249 { 00250 FILE_TRANSFER_WITH_PREVIEW = 0x0, 00251 FILE_TRANSFER_WITHOUT_PREVIEW = 0x1, 00252 FILE_TRANSFER_BACKGROUND_SHARING = 0x4, 00253 // it is not a simple jpg file, there is a cab file inside it 00254 FILE_TRANSFER_BACKGROUND_SHARING_CUSTOM = 0xC 00255 }; 00256 00258 enum fileTransferError 00259 { 00260 FILE_TRANSFER_ERROR_USER_CANCELED, 00261 FILE_TRANSFER_ERROR_UNKNOWN 00262 }; 00263 00265 typedef struct 00266 { 00267 int type; 00268 unsigned int sessionId; 00269 std::string userPassport; 00270 std::string filename; 00271 std::string friendlyname; 00272 std::string preview; 00273 unsigned long long filesize; 00274 } fileTransferInvite; 00275 00276 void libmsn_Siren7_DecodeVoiceClip(std::string input_file); 00277 void libmsn_Siren7_EncodeVoiceClip(std::string input_file); 00278 } 00279 #endif