vncServer::AcceptQueryReject vncServer::AdjustVerification(vncServer::AcceptQueryReject host) { vncServer::AcceptQueryReject verifiedHost = host; // Based on the server's QuerySetting, adjust the verification result switch (host) { case vncServer::aqrAccept: if (QuerySetting() >= 3) verifiedHost = vncServer::aqrQuery; break; case vncServer::aqrQuery: if (QuerySetting() <= 1) verifiedHost = vncServer::aqrAccept; else if (QuerySetting() == 4) verifiedHost = vncServer::aqrReject; break; case vncServer::aqrReject: if (QuerySetting() == 0) verifiedHost = vncServer::aqrQuery; break; }; return verifiedHost; }
vncServer::AcceptQueryReject vncServer::VerifyHost(const char *hostname) { omni_mutex_lock l(m_clientsLock); // -=- Is the specified host blacklisted? vncServer::BlacklistEntry *current = m_blacklist; vncServer::BlacklistEntry *previous = 0; SYSTEMTIME systime; FILETIME ftime; LARGE_INTEGER now; // Get the current time as a 64-bit value GetSystemTime(&systime); SystemTimeToFileTime(&systime, &ftime); now.LowPart=ftime.dwLowDateTime;now.HighPart=ftime.dwHighDateTime; now.QuadPart /= 10000000; // Convert it into seconds while (current) { // Has the blacklist entry timed out? if ((now.QuadPart - current->_lastRefTime.QuadPart) > 0) { // Yes. Is it a "blocked" entry? if (current->_blocked) { // Yes, so unblock it & re-set the reference time current->_blocked = FALSE; current->_lastRefTime.QuadPart = now.QuadPart + 10; } else { // No, so remove it if (previous) previous->_next = current->_next; else m_blacklist = current->_next; vncServer::BlacklistEntry *next = current->_next; free(current->_machineName); delete current; current = next; continue; } } // Is this the entry we're interested in? if ((strcmp(current->_machineName, hostname) == 0) && (current->_blocked)) { // Machine is blocked, so just reject it return vncServer::aqrReject; } previous = current; current = current->_next; } // Has a hostname been specified? if (hostname == 0) { vnclog.Print(LL_INTWARN, VNCLOG("verify failed - null hostname\n")); return vncServer::aqrReject; } // Set the state machine into the correct mode & process the filter enum vh_Mode {vh_ExpectDelimiter, vh_ExpectIncludeExclude, vh_ExpectPattern}; vh_Mode machineMode = vh_ExpectIncludeExclude; vncServer::AcceptQueryReject verifiedHost = vncServer::aqrAccept; vncServer::AcceptQueryReject patternType = vncServer::aqrReject; UINT authHostsPos = 0; UINT patternStart = 0; UINT hostNameLen = strlen(hostname); // Run through the auth hosts string until we hit the end if (m_auth_hosts) { while (1) { // Which mode are we in? switch (machineMode) { // ExpectIncludeExclude - we should see a + or -. case vh_ExpectIncludeExclude: if (m_auth_hosts[authHostsPos] == '+') { patternType = vncServer::aqrAccept; patternStart = authHostsPos+1; machineMode = vh_ExpectPattern; } else if (m_auth_hosts[authHostsPos] == '-') { patternType = vncServer::aqrReject; patternStart = authHostsPos+1; machineMode = vh_ExpectPattern; } else if (m_auth_hosts[authHostsPos] == '?') { patternType = vncServer::aqrQuery; patternStart = authHostsPos+1; machineMode = vh_ExpectPattern; } else if (m_auth_hosts[authHostsPos] != '\0') { vnclog.Print(LL_INTWARN, VNCLOG("verify host - malformed AuthHosts string\n")); machineMode = vh_ExpectDelimiter; } break; // ExpectPattern - we expect to see a valid pattern case vh_ExpectPattern: // ExpectDelimiter - we're scanning for the next ':', skipping a pattern case vh_ExpectDelimiter: if ((m_auth_hosts[authHostsPos] == ':') || (m_auth_hosts[authHostsPos] == '\0')) { if (machineMode == vh_ExpectPattern) { if (patternStart == 0) { vnclog.Print(LL_INTWARN, VNCLOG("verify host - pattern processing failed!\n")); } else { // Process the match if (MatchStringToTemplate(hostname, hostNameLen, &(m_auth_hosts[patternStart]), authHostsPos-patternStart)) { // The hostname matched - apply the include/exclude rule verifiedHost = patternType; } } } // We now expect another + or - machineMode = vh_ExpectIncludeExclude; } break; } // Have we hit the end of the pattern string? if (m_auth_hosts[authHostsPos] == '\0') break; authHostsPos++; } } // Based on the server's QuerySetting, adjust the verification result switch (verifiedHost) { case vncServer::aqrAccept: if (QuerySetting() >= 3) verifiedHost = vncServer::aqrQuery; break; case vncServer::aqrQuery: if (QuerySetting() <= 1) verifiedHost = vncServer::aqrAccept; else if (QuerySetting() == 4) verifiedHost = vncServer::aqrReject; break; case vncServer::aqrReject: if (QuerySetting() == 0) verifiedHost = vncServer::aqrQuery; break; }; return verifiedHost; }