int CMsnProto::MSN_HandleErrors(ThreadData* info, char* cmdString) { int errorCode, packetID = -1; sscanf(cmdString, "%d %d", &errorCode, &packetID); char* params = ""; int trid = -1; if (cmdString[3]) { if (isdigit((BYTE)cmdString[4])) { trid = strtol(cmdString + 4, ¶ms, 10); switch (*params) { case ' ': case '\0': case '\t': case '\n': while (*params == ' ' || *params == '\t') params++; break; default: params = cmdString + 4; } } else params = cmdString + 4; } union { char* tWords[2]; struct { char *typeId, *strMsgBytes; } data; }; if (sttDivideWords(params, _countof(tWords), tWords) < 2) { debugLogA("Invalid %.3s command, ignoring", cmdString); return 0; } HReadBuffer buf(info, 0); debugLogA("Server error:%s", cmdString); switch (errorCode) { case ERR_INTERNAL_SERVER: MSN_ShowError("MSN Services are temporarily unavailable, please try to connect later"); ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_NOSERVER); return 1; case ERR_SERVER_BUSY: case ERR_SERVER_UNAVAILABLE: case ERR_TIMEDOUT: MSN_ShowError("MSN Services are too busy, please try to connect later"); ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_NOSERVER); return 1; case ERR_NOT_ALLOWED_WHEN_OFFLINE: MSN_ShowError("MSN protocol does not allow you to communicate with others when you are invisible"); return 0; case ERR_LIST_FULL: MSN_ShowError("MSN plugin cannot add a new contact because the contact list is full"); return 0; case ERR_ALREADY_THERE: MSN_ShowError("User is already in your contact list"); return 0; case ERR_DETAILED_ERR_IN_PAYLOAD: case ERR_LIST_UNAVAILABLE: char* tErrWords[4]; if (sttDivideWords(cmdString, _countof(tErrWords), tErrWords) == _countof(tErrWords)) HReadBuffer(info, 0).surelyRead(atol(tErrWords[3])); return 0; case ERR_NOT_ONLINE: if (info->mInitialContactWLID) ProtoBroadcastAck(MSN_HContactFromEmail(info->mInitialContactWLID), ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)999999, (LPARAM)Translate("User not online")); else MSN_ShowError("User not online"); return 1; case ERR_NOT_EXPECTED: MSN_ShowError("Your MSN account e-mail is unverified. Goto http://www.passport.com and verify the primary e-mail first"); return 0; case ERR_AUTHENTICATION_FAILED: if (info->mType != SERVER_SWITCHBOARD) { MSN_ShowError("Your username or password is incorrect"); ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD); } return 1; default: debugLogA("Unprocessed error: %s", cmdString); if (errorCode >= 500) //all these errors look fatal-ish MSN_ShowError("Unrecognised error %d. The server has closed our connection", errorCode); break; } return 0; }
int CMsnProto::MSN_SetMyAvatar(const TCHAR* sztFname, void* pData, size_t cbLen) { mir_sha1_ctx sha1ctx; BYTE sha1c[MIR_SHA1_HASH_SIZE], sha1d[MIR_SHA1_HASH_SIZE]; char *szFname = mir_utf8encodeT(sztFname); mir_sha1_init(&sha1ctx); mir_sha1_append(&sha1ctx, (BYTE*)pData, (int)cbLen); mir_sha1_finish(&sha1ctx, sha1d); ptrA szSha1d( mir_base64_encode((PBYTE)sha1d, sizeof(sha1d))); mir_sha1_init(&sha1ctx); ezxml_t xmlp = ezxml_new("msnobj"); mir_sha1_append(&sha1ctx, (PBYTE)"Creator", 7); mir_sha1_append(&sha1ctx, (PBYTE)MyOptions.szEmail, (int)strlen(MyOptions.szEmail)); ezxml_set_attr(xmlp, "Creator", MyOptions.szEmail); char szFileSize[20]; _ultoa((unsigned)cbLen, szFileSize, 10); mir_sha1_append(&sha1ctx, (PBYTE)"Size", 4); mir_sha1_append(&sha1ctx, (PBYTE)szFileSize, (int)strlen(szFileSize)); ezxml_set_attr(xmlp, "Size", szFileSize); mir_sha1_append(&sha1ctx, (PBYTE)"Type", 4); mir_sha1_append(&sha1ctx, (PBYTE)"3", 1); // MSN_TYPEID_DISPLAYPICT ezxml_set_attr(xmlp, "Type", "3"); mir_sha1_append(&sha1ctx, (PBYTE)"Location", 8); mir_sha1_append(&sha1ctx, (PBYTE)szFname, (int)strlen(szFname)); ezxml_set_attr(xmlp, "Location", szFname); mir_sha1_append(&sha1ctx, (PBYTE)"Friendly", 8); mir_sha1_append(&sha1ctx, (PBYTE)"AAA=", 4); ezxml_set_attr(xmlp, "Friendly", "AAA="); mir_sha1_append(&sha1ctx, (PBYTE)"SHA1D", 5); mir_sha1_append(&sha1ctx, (PBYTE)(char*)szSha1d, (int)strlen(szSha1d)); ezxml_set_attr(xmlp, "SHA1D", szSha1d); mir_sha1_finish(&sha1ctx, sha1c); ptrA szSha1c( mir_base64_encode((PBYTE)sha1c, sizeof(sha1c))); // ezxml_set_attr(xmlp, "SHA1C", szSha1c); char* szBuffer = ezxml_toxml(xmlp, false); ezxml_free(xmlp); mir_free(szFname); ptrA szEncodedBuffer(mir_urlEncode(szBuffer)); free(szBuffer); const TCHAR *szExt; int fmt = ProtoGetBufferFormat(pData, &szExt); if (fmt == PA_FORMAT_UNKNOWN) return fmt; TCHAR szFileName[MAX_PATH]; MSN_GetAvatarFileName(NULL, szFileName, SIZEOF(szFileName), NULL); _tremove(szFileName); MSN_GetAvatarFileName(NULL, szFileName, SIZEOF(szFileName), szExt); int fileId = _topen(szFileName, _O_CREAT | _O_TRUNC | _O_WRONLY | O_BINARY, _S_IREAD | _S_IWRITE); if (fileId >= 0) { _write(fileId, pData, (unsigned)cbLen); _close(fileId); char szAvatarHashdOld[41] = ""; db_get_static(NULL, m_szModuleName, "AvatarHash", szAvatarHashdOld, sizeof(szAvatarHashdOld)); char *szAvatarHash = arrayToHex(sha1d, sizeof(sha1d)); if (strcmp(szAvatarHashdOld, szAvatarHash)) { setString("PictObject", szEncodedBuffer); setString("AvatarHash", szAvatarHash); } mir_free(szAvatarHash); } else MSN_ShowError("Cannot set avatar. File '%s' could not be created/overwritten", szFileName); return fmt; }