bool Plugin::LoadFromCache(const os::FAR_FIND_DATA &FindData) { const auto& PlCache = *ConfigProvider().PlCacheCfg(); if (const auto id = PlCache.GetCacheID(m_strCacheName)) { if (PlCache.IsPreload(id)) //PF_PRELOAD plugin, skip cache { WorkFlags.Set(PIWF_PRELOADED); return false; } { string strCurPluginID = str_printf( L"%I64x%x%x", FindData.nFileSize, FindData.ftCreationTime.dwLowDateTime, FindData.ftLastWriteTime.dwLowDateTime ); string strPluginID = PlCache.GetSignature(id); if (strPluginID != strCurPluginID) //одинаковые ли бинарники? return false; } if (!PlCache.GetMinFarVersion(id, &MinFarVersion)) { MinFarVersion = FAR_VERSION; } if (!PlCache.GetVersion(id, &PluginVersion)) { ClearStruct(PluginVersion); } VersionString = VersionToString(PluginVersion); m_strGuid = PlCache.GetGuid(id); SetGuid(StrToGuid(m_strGuid,m_Guid)?m_Guid:FarGuid); strTitle = PlCache.GetTitle(id); strDescription = PlCache.GetDescription(id); strAuthor = PlCache.GetAuthor(id); m_model->LoadExportsFromCache(PlCache, id, Exports); WorkFlags.Set(PIWF_CACHED); //too much "cached" flags return true; } return false; }
bool Plugin::LoadData() { if (WorkFlags.Check(PIWF_DONTLOADAGAIN)) return false; if (WorkFlags.Check(PIWF_DATALOADED)) return true; if (m_Instance) return true; if (!m_Instance) { string strCurPlugDiskPath; wchar_t Drive[]={0,L' ',L':',0}; //ставим 0, как признак того, что вертать обратно ненадо! const auto strCurPath = os::GetCurrentDirectory(); if (ParsePath(m_strModuleName) == PATH_DRIVELETTER) // если указан локальный путь, то... { Drive[0] = L'='; Drive[1] = m_strModuleName.front(); os::env::get_variable(Drive, strCurPlugDiskPath); } PrepareModulePath(m_strModuleName); m_Instance = m_model->Create(m_strModuleName); FarChDir(strCurPath); if (Drive[0]) // вернем ее (переменную окружения) обратно os::env::set_variable(Drive, strCurPlugDiskPath); } if (!m_Instance) { //чтоб не пытаться загрузить опять а то ошибка будет постоянно показываться. WorkFlags.Set(PIWF_DONTLOADAGAIN); if (!Global->Opt->LoadPlug.SilentLoadPlugin) //убрать в PluginSet { Message(MSG_WARNING|MSG_ERRORTYPE|MSG_NOPLUGINS, MSG(MError), make_vector<string>(MSG(MPlgLoadPluginError), m_strModuleName), make_vector<string>(MSG(MOk)), L"ErrLoadPlugin"); } return false; } WorkFlags.Clear(PIWF_CACHED); if(bPendingRemove) { bPendingRemove = false; m_model->GetOwner()->UndoRemove(this); } InitExports(); GlobalInfo Info={sizeof(Info)}; if(GetGlobalInfo(&Info) && Info.StructSize && Info.Title && *Info.Title && Info.Description && *Info.Description && Info.Author && *Info.Author) { MinFarVersion = Info.MinFarVersion; PluginVersion = Info.Version; VersionString = VersionToString(PluginVersion); strTitle = Info.Title; strDescription = Info.Description; strAuthor = Info.Author; bool ok=true; if(m_Guid != FarGuid && m_Guid != Info.Guid) { ok = m_model->GetOwner()->UpdateId(this, Info.Guid); } else { SetGuid(Info.Guid); } if (ok) { WorkFlags.Set(PIWF_DATALOADED); return true; } } Unload(); //чтоб не пытаться загрузить опять а то ошибка будет постоянно показываться. WorkFlags.Set(PIWF_DONTLOADAGAIN); return false; }
int ns__getClientUpdate(struct soap *soap, struct clientUpdateInfoRequest sClientUpdateInfo, struct clientUpdateResponse* lpsResponse) { unsigned int er = erSuccess; ClientVersion sCurrentVersion = {0}; ClientVersion sLatestVersion; unsigned int ulLicenseResponse = 0; unsigned char *lpLicenseResponse = NULL; ECLicenseClient *lpLicenseClient = NULL; std::string strClientMSIName; std::string strPath; FILE *fd = NULL; int res; unsigned int ulUserID = 0; ECSession *lpecSession = NULL; ECDatabase *lpDatabase = NULL; std::string strCurVersion; std::string strLatestVersion; std::string strQuery; time_t tNow = 0; char *lpszClientUpdatePath = g_lpConfig->GetSetting("client_update_path"); unsigned int ulLogLevel = atoui(g_lpConfig->GetSetting("client_update_log_level")); if (!parseBool(g_lpConfig->GetSetting("client_update_enabled"))) { // do not set on high loglevel, since by default the client updater is installed, and this will be quite often in your log g_lpLogger->Log(EC_LOGLEVEL_NOTICE, "Client update: trackid: 0x%08X, Config option 'client_update_enabled' has disabled this feature.", sClientUpdateInfo.ulTrackId); er = ZARAFA_E_NO_SUPPORT; goto exit; } // setup soap soap_set_imode(soap, SOAP_IO_KEEPALIVE | SOAP_C_UTFSTRING | SOAP_ENC_ZLIB | SOAP_ENC_MTOM); soap_set_omode(soap, SOAP_IO_KEEPALIVE | SOAP_C_UTFSTRING | SOAP_ENC_ZLIB | SOAP_ENC_MTOM | SOAP_IO_CHUNK); if (!lpszClientUpdatePath || lpszClientUpdatePath[0] == 0) { g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, The configuration field 'client_update_path' is empty.", sClientUpdateInfo.ulTrackId); er = ZARAFA_E_NO_ACCESS; goto exit; } er = g_lpSessionManager->CreateSessionInternal(&lpecSession); if(er != erSuccess) goto exit; // Lock the session lpecSession->Lock(); er = lpecSession->GetDatabase(&lpDatabase); if (er != erSuccess) goto exit; //@TODO change loglevel? g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, computername: %s, username: %s, clientversion: %s, windowsversion: %s, iplist: %s, soapip: %s", sClientUpdateInfo.ulTrackId, (sClientUpdateInfo.szComputerName) ? sClientUpdateInfo.szComputerName : "-", (sClientUpdateInfo.szUsername) ? sClientUpdateInfo.szUsername : "******", (sClientUpdateInfo.szClientVersion) ? sClientUpdateInfo.szClientVersion : "-", (sClientUpdateInfo.szWindowsVersion) ? sClientUpdateInfo.szWindowsVersion : "-", (sClientUpdateInfo.szClientIPList) ? sClientUpdateInfo.szClientIPList : "-", PrettyIP(soap->ip).c_str() ); if (!sClientUpdateInfo.szComputerName) sClientUpdateInfo.szComputerName = ""; //Client has no name? if(!sClientUpdateInfo.szUsername) { er = ZARAFA_E_NO_ACCESS; g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, Client did not send a username", sClientUpdateInfo.ulTrackId); } // validate user name er = lpecSession->GetUserManagement()->SearchObjectAndSync(sClientUpdateInfo.szUsername, 0x01/*EMS_AB_ADDRESS_LOOKUP*/, &ulUserID); if (er != erSuccess) { er = ZARAFA_E_NO_ACCESS; g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, unknown username '%s'", sClientUpdateInfo.ulTrackId, sClientUpdateInfo.szUsername); } if(lpecSession->GetUserManagement()->IsInternalObject(ulUserID)) { er = ZARAFA_E_NO_ACCESS; g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, Wrong user data. User name '%s' is a reserved user", sClientUpdateInfo.ulTrackId, sClientUpdateInfo.szUsername); goto exit; } // Check if the user connect to the right server, else redirect if (lpecSession->GetSessionManager()->IsDistributedSupported() ) { objectdetails_t sUserDetails; er = lpecSession->GetUserManagement()->GetObjectDetails(ulUserID, &sUserDetails); if (er != erSuccess) goto exit; /* Check if this is the correct server */ string strServerName = sUserDetails.GetPropString(OB_PROP_S_SERVERNAME); if (strServerName.empty()) { g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, User '%s' has no default server", sClientUpdateInfo.ulTrackId, sClientUpdateInfo.szUsername); er = ZARAFA_E_NO_ACCESS; goto exit; } if (stricmp(strServerName.c_str(), g_lpSessionManager->GetConfig()->GetSetting("server_name")) != 0) { string strServerPath; er = GetBestServerPath(soap, lpecSession, strServerName, &strServerPath); if (er != erSuccess) goto exit; lpsResponse->lpszServerPath = s_strcpy(soap, strServerPath.c_str());// Server Path must always utf8 (also in 6.40.x) g_lpSessionManager->GetLogger()->Log(EC_LOGLEVEL_INFO, "Client update: trackid: 0x%08X, User '%s' is redirected to '%s'", sClientUpdateInfo.ulTrackId, sClientUpdateInfo.szUsername, lpsResponse->lpszServerPath); g_lpStatsCollector->Increment(SCN_REDIRECT_COUNT, 1); er = ZARAFA_E_UNABLE_TO_COMPLETE; goto exit; } } lpLicenseClient = new ECLicenseClient(g_lpConfig->GetSetting("license_socket"), atoui(g_lpConfig->GetSetting("license_timeout"))); er = lpLicenseClient->Auth(sClientUpdateInfo.sLicenseReq.__ptr, sClientUpdateInfo.sLicenseReq.__size, &lpLicenseResponse, &ulLicenseResponse); if (er != erSuccess) { g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, Invalid license request, error: 0x%08X.", sClientUpdateInfo.ulTrackId, er); goto exit; } if (sClientUpdateInfo.szClientVersion == NULL || sClientUpdateInfo.szClientVersion[0] == '\0') { g_lpLogger->Log(EC_LOGLEVEL_INFO, "Client update: trackid: 0x%08X, The client did not sent the current version number.", sClientUpdateInfo.ulTrackId); } else if (!GetVersionFromString(sClientUpdateInfo.szClientVersion, &sCurrentVersion)) { g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, Failed in getting version from input data.", sClientUpdateInfo.ulTrackId); goto exit; //@fixme can we give the latest? } if (!GetLatestVersionAtServer(lpszClientUpdatePath, sClientUpdateInfo.ulTrackId, &sLatestVersion)) { g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, No updates found on server.", sClientUpdateInfo.ulTrackId); er = ZARAFA_E_NO_ACCESS; goto exit; } res = CompareVersions(sCurrentVersion, sLatestVersion); if (res == 0) { g_lpLogger->Log(EC_LOGLEVEL_INFO, "Client update: trackid: 0x%08X, Client already has the latest version.", sClientUpdateInfo.ulTrackId); goto ok; } else if (res > 0) { g_lpLogger->Log(EC_LOGLEVEL_INFO, "Client update: trackid: 0x%08X, Client has newer version than server.", sClientUpdateInfo.ulTrackId); goto ok; } if (!GetClientMSINameFromVersion(sLatestVersion, &strClientMSIName)) { g_lpLogger->Log(EC_LOGLEVEL_INFO, "Client update: trackid: 0x%08X, No suitable version available.", sClientUpdateInfo.ulTrackId); er = ZARAFA_E_NO_ACCESS; goto exit; } if (ConvertAndValidatePath(lpszClientUpdatePath, strClientMSIName, &strPath) != true) { g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, Error in path conversion and validation.", sClientUpdateInfo.ulTrackId); er = ZARAFA_E_NO_ACCESS; goto exit; } fd = fopen(strPath.c_str(), "rb"); if (!fd) { g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, Path not found %s.", sClientUpdateInfo.ulTrackId, strPath.c_str()); er = ZARAFA_E_NO_ACCESS; goto exit; } // Update auto update client status VersionToString(sCurrentVersion, &strCurVersion); VersionToString(sLatestVersion, &strLatestVersion); tNow = time(NULL); // Get current time strQuery = "REPLACE INTO clientupdatestatus(userid, trackid, updatetime, currentversion, latestversion, computername, status) VALUES ("+ stringify(ulUserID)+", "+stringify(sClientUpdateInfo.ulTrackId)+", FROM_UNIXTIME("+ stringify(tNow) + "), \"" + strCurVersion + "\", \"" + strLatestVersion + "\", \"" + lpDatabase->Escape(sClientUpdateInfo.szComputerName).c_str()+"\", "+ stringify(UPDATE_STATUS_PENDING) + ")"; // ignore error in database tracking, SQL error logged in server, still send new client lpDatabase->DoUpdate(strQuery); soap->fmimereadopen = &mime_file_read_open; soap->fmimeread = &mime_file_read; soap->fmimereadclose = &mime_file_read_close; // Setup the MTOM Attachments lpsResponse->sStreamData.xop__Include.__ptr = (unsigned char*)fd; lpsResponse->sStreamData.xop__Include.__size = 0; lpsResponse->sStreamData.xop__Include.type = s_strcpy(soap, "application/binary"); lpsResponse->sStreamData.xop__Include.id = s_strcpy(soap, "zarafaclient"); g_lpLogger->Log(EC_LOGLEVEL_ERROR, "Client update: trackid: 0x%08X, Sending new installer %s", sClientUpdateInfo.ulTrackId, strClientMSIName.c_str()); ok: // Client is already up to date lpsResponse->sLicenseResponse.__size = ulLicenseResponse; lpsResponse->sLicenseResponse.__ptr = (unsigned char *)s_memcpy(soap, (const char *)lpLicenseResponse, ulLicenseResponse); lpsResponse->ulLogLevel = ulLogLevel; // 0 = none, 1 = on errors, 2 = always exit: if(lpecSession) { lpecSession->Unlock(); g_lpSessionManager->RemoveSessionInternal(lpecSession); } lpsResponse->er = er; if (lpLicenseResponse) delete [] lpLicenseResponse; if (lpLicenseClient) delete lpLicenseClient; if (er && fd) fclose(fd); return SOAP_OK; }
//////////////////////////////////////////////////////////////// // Constructor for class ExExeUtilTcb /////////////////////////////////////////////////////////////// ExExeUtilTcb::ExExeUtilTcb(const ComTdbExeUtil & exe_util_tdb, const ex_tcb * child_tcb, // for child queue ex_globals * glob) : ex_tcb( exe_util_tdb, 1, glob), workAtp_(NULL), query_(NULL), infoList_(NULL), infoListIsOutputInfo_(TRUE), explQuery_(NULL), childQueryId_(NULL), childQueryIdLen_(0), outputBuf_(NULL) { Space * space = (glob ? glob->getSpace() : 0); CollHeap * heap = (glob ? glob->getDefaultHeap() : 0); // Allocate the buffer pool #pragma nowarn(1506) // warning elimination pool_ = new(space) sql_buffer_pool(exe_util_tdb.numBuffers_, exe_util_tdb.bufferSize_, space); #pragma warn(1506) // warning elimination childTcb_ = child_tcb; if (childTcb_) { qchild_ = childTcb_->getParentQueue(); } // Allocate the queue to communicate with parent qparent_.down = new(space) ex_queue(ex_queue::DOWN_QUEUE, exe_util_tdb.queueSizeDown_, exe_util_tdb.criDescDown_, space); qparent_.up = new(space) ex_queue(ex_queue::UP_QUEUE, exe_util_tdb.queueSizeUp_, exe_util_tdb.criDescUp_, space); if (exe_util_tdb.workCriDesc_) { workAtp_ = allocateAtp(exe_util_tdb.workCriDesc_, glob->getSpace()); pool_->get_free_tuple(workAtp_->getTupp(((ComTdbExeUtil&)exe_util_tdb).workAtpIndex()), 0); } tcbFlags_ = 0; if (exe_util_tdb.inputExpr_) (void)exe_util_tdb.inputExpr_->fixup(0, getExpressionMode(), this, space, heap, FALSE, glob); if (exe_util_tdb.outputExpr_) (void)exe_util_tdb.outputExpr_->fixup(0, getExpressionMode(), this, space, heap, FALSE, glob); if (exe_util_tdb.scanExpr_) (void)exe_util_tdb.scanExpr_->fixup(0, getExpressionMode(), this, space, heap, FALSE, glob); ContextCli * currContext = (glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals() ? glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals()->getStatement()->getContext() : NULL); // internal queries are already in isoMapping and do not need to be // translated before sending to mxcmp. // Set the ISO_MAPPING charset code to indicate that. char *parentQid; if (glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals()) parentQid = glob->castToExExeStmtGlobals()->castToExMasterStmtGlobals()->getStatement()->getUniqueStmtId(); else if (glob->castToExExeStmtGlobals()->castToExEspStmtGlobals() && glob->castToExExeStmtGlobals()->castToExEspStmtGlobals()->getStmtStats()) parentQid = glob->castToExExeStmtGlobals()->castToExEspStmtGlobals()->getStmtStats()->getQueryId(); else parentQid = NULL; cliInterface_ = new(heap) ExeCliInterface(heap, SQLCHARSETCODE_ISO88591, // ISO_MAPPING=ISO88591 currContext, parentQid); cliInterface2_ = new(heap) ExeCliInterface(heap, SQLCHARSETCODE_ISO88591, // ISO_MAPPING=ISO88591 currContext, parentQid); //diagsArea_ = NULL; setDiagsArea(ComDiagsArea::allocate(getHeap())); pqStep_ = PROLOGUE_; VersionToString(COM_VERS_MXV, versionStr_); versionStrLen_ = DIGITS_IN_VERSION_NUMBER; VersionToString(COM_VERS_MXV, sysVersionStr_); sysVersionStrLen_ = DIGITS_IN_VERSION_NUMBER; extractedPartsObj_ = NULL; };
CString CVersion::ToString( void ) const {GUCEF_TRACE; return VersionToString( m_version ); }