Beispiel #1
0
// mmf added member function for use for things like circumventing rank restrictions
//TheBored 25-JUN-07: Edited function to be case insensitive (@HQ == @hq)
bool UTL::PrivilegedUser(const char* szName, DWORD dwCookie) {

    //Imago 6/10 #2
    ZString zName = szName;
    if (m_PrivilegedUsersMap.Count() > 0) {
        ZVersionInfo vi;
        ZString zInfo = (LPCSTR)vi.GetCompanyName();
        zInfo += (LPCSTR)vi.GetLegalCopyright();
        ZString zPrivilegedUsers = GetPrivilegedUsers(dwCookie);
        zPrivilegedUsers = zPrivilegedUsers.Unscramble(zInfo);
        ZString zPrivilegedUser = zPrivilegedUsers.GetToken();
        int iChop = 0;
        iChop = zName.Find('@');
        if (iChop == -1) {
            iChop = zName.Find('(') + 1;
        }
        while (!zPrivilegedUser.IsEmpty()) {
            if (zPrivilegedUser.ToUpper() == zName.ToUpper()
                    || zPrivilegedUser.ToUpper() == zName.Left(iChop).ToUpper()
                    || zPrivilegedUser.ToUpper() == zName.Left(iChop).ToUpper()) {
                return true;
            }
            zPrivilegedUser = zPrivilegedUsers.GetToken();
        }
    }
    // /#2

    size_t nameLen;
    nameLen=strlen(szName);

    if ( (nameLen>2) && ( ((strncmp(szName,"?",1))==0) || ((strncmp(szName,"+",1))==0)
                          || ((strncmp(szName,"$",1))==0) ) ) return true;
    if ( (nameLen>3) && ( (_stricmp(szName+(nameLen-3),"@HQ"))==0 ) ) return true;
    if ( (nameLen>4) && ( (_stricmp(szName+(nameLen-4),"@Dev"))==0 ) ) return true;
    if ( (nameLen>6) && ( (_stricmp(szName+(nameLen-6),"@Alleg"))==0 ) ) return true;
    //TheBored 25-JUN-07: Added @Zone
    if ( (nameLen>5) && ( (_stricmp(szName+(nameLen-5),"@Zone"))==0 ) ) return true;
    return false;
}
VOID CServiceModule::RunAsExecutable()
{
	//Imago: we parents needs to keep track of our children
#if defined(SRV_PARENT)
	InitPIDs();
#endif

	HRESULT hr;
#if defined(SRV_PARENT)
	if (g.bRestarting == false) {
		ZVersionInfo vi;
		printf("%s\n%s\n\n", (LPCSTR)vi.GetFileDescription(), (LPCSTR)vi.GetLegalCopyright());
	}
#else
#if !defined(SRV_CHILD)
	ZVersionInfo vi;
	printf("%s\n%s\n\n",
		(LPCSTR)vi.GetFileDescription(), (LPCSTR)vi.GetLegalCopyright());
#endif
#endif

	if (IsWinNT())
		printf("Running as an executable.\n");

	printf("Initializing...\n");

	hr = FedSrv_Init();

#if !defined(_CONSOLE)
	if (SUCCEEDED(hr))
	{
		RunAsWindow();
		return;
	}
#endif


	if (SUCCEEDED(hr))
	{
		HANDLE hConsole;

		printf("\rType 'Q' to Quit.\n");
		printf("\rType 'P' to Pause.\n");
		printf("\rType 'C' to Continue.\n");

		hConsole = GetStdHandle(STD_INPUT_HANDLE);
		SetConsoleMode(hConsole, 0);

		SetConsoleCtrlHandler(HandlerRoutine, true);

		assert(g.hKillReceiveEvent);
		//Imago - parents restart everything after tricking the lobby into sending the client to our child
#if defined(SRV_PARENT)
		g.bRestarting = false;
#endif

		HANDLE hEventArray[] = { g.hKillReceiveEvent, hConsole };

		DWORD dwAwaker;

		//
		// Wait until Receive Thread dies; if Q is pressed, kill Receive Thread
		//
		do
		{
			dwAwaker = MsgWaitForMultipleObjects(2, hEventArray, FALSE, INFINITE, 0);

			if (dwAwaker == WAIT_OBJECT_0 + 1)
			{
				INPUT_RECORD Key;
				DWORD dwRead;

				ReadConsoleInput(hConsole, &Key, 1, &dwRead);

				if (Key.EventType == KEY_EVENT &&
					Key.Event.KeyEvent.wVirtualKeyCode == 'Q')
				{
					debugf("Q pressed\n");
					SetEvent(g.hKillReceiveEvent);
				}
				if (Key.EventType == KEY_EVENT &&
					Key.Event.KeyEvent.wVirtualKeyCode == 'P')
				{
					debugf("P pressed\n");
					FedSrv_Pause();
				}
				if (Key.EventType == KEY_EVENT &&
					Key.Event.KeyEvent.wVirtualKeyCode == 'C')
				{
					debugf("C pressed\n");
					FedSrv_Continue();
				}
			}

		} while (dwAwaker != WAIT_OBJECT_0);

		FedSrv_Terminate();

		// here is a good spot to restart -Imago
#if defined(SRV_PARENT)
		if (g.bRestarting)
			RunAsExecutable();
#endif

	}
	else
	{
		printf("\rInitialization failed. (%x)\n", hr);
	}
}