summaryrefslogtreecommitdiff
path: root/gcsdk/gcwgjobmgr.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /gcsdk/gcwgjobmgr.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'gcsdk/gcwgjobmgr.cpp')
-rw-r--r--gcsdk/gcwgjobmgr.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/gcsdk/gcwgjobmgr.cpp b/gcsdk/gcwgjobmgr.cpp
new file mode 100644
index 0000000..c4b44ba
--- /dev/null
+++ b/gcsdk/gcwgjobmgr.cpp
@@ -0,0 +1,210 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+#include "stdafx.h"
+#include "enumutils.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+namespace GCSDK
+{
+
+ENUMSTRINGS_START( EGCWebApiPrivilege )
+{ k_EGCWebApiPriv_None, "None" },
+{ k_EGCWebApiPriv_Account, "Account" },
+{ k_EGCWebApiPriv_Approved, "Approved" },
+{ k_EGCWebApiPriv_Session, "Session" },
+{ k_EGCWebApiPriv_Support, "Support" },
+{ k_EGCWebApiPriv_Admin, "Admin" },
+{ k_EGCWebApiPriv_EditApp, "EditApp" },
+{ k_EGCWebApiPriv_MemberPublisher, "MemberPublisher" },
+{ k_EGCWebApiPriv_EditPublisher, "EditPublisher" },
+{ k_EGCWebApiPriv_AccountOptional, "AccountOptional" },
+ENUMSTRINGS_END( EGCWebApiPrivilege );
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Singleton accessor to registered WG jobs
+//-----------------------------------------------------------------------------
+CUtlDict< const JobCreationFunc_t* > &GMapGCWGJobCreationFuncs()
+{
+ static CUtlDict< const JobCreationFunc_t* > s_MapWGJobCreationFuncs;
+ return s_MapWGJobCreationFuncs;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Singleton accessor to registered WG jobs
+//-----------------------------------------------------------------------------
+CUtlDict< const WebApiFunc_t* > &GMapGCWGRequestInfo()
+{
+ static CUtlDict< const WebApiFunc_t* > s_MapWGRequestInfo;
+ return s_MapWGRequestInfo;
+}
+
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CGCWGJobMgr::CGCWGJobMgr( )
+{
+
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CGCWGJobMgr::~CGCWGJobMgr()
+{
+
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Hub has receieved a k_EMsgWGRequest message, find & dispatch WG Job
+//-----------------------------------------------------------------------------
+bool CGCWGJobMgr::BHandleMsg( IMsgNetPacket *pNetPacket )
+{
+ CGCMsg<MsgGCWGRequest_t> msg( pNetPacket );
+ AssertMsg( msg.GetEMsg() == k_EGCMsgWGRequest, "GCWGJobMgr asked to route a message, but it is not a MsgWGRequest" );
+
+ CUtlString strRequestName;
+ msg.BReadStr( &strRequestName );
+
+ int iJobType = GMapGCWGRequestInfo().Find( strRequestName.Get() );
+
+ if ( !GMapGCWGRequestInfo().IsValidIndex( iJobType ) )
+ {
+ EmitError( SPEW_GC, "Unable to find GC WG handler %s", strRequestName.Get() );
+ SendErrorMessage( msg, "Unknown method", k_EResultInvalidParam );
+ return false;
+ }
+
+ const WebApiFunc_t * pFunc = GMapGCWGRequestInfo()[iJobType];
+ if( !BVerifyPrivileges( msg, pFunc ) )
+ return false;
+
+ CGCWGJob *job = (CGCWGJob *)(*((GMapGCWGJobCreationFuncs())[iJobType]))( GGCBase(), NULL );
+ Assert( job );
+
+ job->SetWebApiFunc( pFunc );
+
+ job->StartJobFromNetworkMsg( pNetPacket, msg.Hdr().m_JobIDSource );
+ return true;
+}
+
+
+bool CGCWGJobMgr::BVerifyPrivileges( const CGCMsg<MsgGCWGRequest_t> & msg, const WebApiFunc_t * pFunc )
+{
+ if(msg.Body().m_unPrivilege != (uint32)pFunc->m_eRequiredPrivilege )
+ {
+ SendErrorMessage( msg,
+ CFmtStr( "Privilege mismatch in %s gc call. Expected: %s, actual: %s", pFunc->m_pchRequestName, PchNameFromEGCWebApiPrivilege( pFunc->m_eRequiredPrivilege ), PchNameFromEGCWebApiPrivilege( (EGCWebApiPrivilege)msg.Body().m_unPrivilege ) ),
+ k_EResultAccessDenied );
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Sends an error message in response to a WG request
+// Inputs: msg - The message we're responding to. This causes the error to
+// be routed to the right place and eventually back to the right
+// browser.
+// pchErrorMsg - The message to display
+// nResult - The error code to return
+//-----------------------------------------------------------------------------
+void CGCWGJobMgr::SendErrorMessage( const CGCMsg<MsgGCWGRequest_t> & msg, const char *pchErrorMsg, int32 nResult )
+{
+ KeyValuesAD pkvErr( "error" );
+ pkvErr->SetString( "error", pchErrorMsg );
+ pkvErr->SetInt( "success", nResult );
+
+ SendResponse( msg, pkvErr, false );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Sets an error message in a response to a WG request
+// Inputs: pkvResponse - The response KV block to set the error in
+// pchErrorMsg - The message to display
+// nResult - The error code to return
+//-----------------------------------------------------------------------------
+void CGCWGJobMgr::SetErrorMessage( KeyValues *pkvErr, const char *pchErrorMsg, int32 nResult )
+{
+ pkvErr->SetString( "error", pchErrorMsg );
+ pkvErr->SetInt( "success", nResult );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Sends a message in response to a WG request
+// Inputs: msg - The message we're responding to. This causes the error to
+// be routed to the right place and eventually back to the right
+// browser.
+// pkvResponse - The KeyValues containing the response data
+//-----------------------------------------------------------------------------
+void CGCWGJobMgr::SendResponse( const CGCMsg<MsgGCWGRequest_t> & msg, KeyValues *pkvResponse, bool bResult )
+{
+ //prepare response msg
+ CGCMsg<MsgGCWGResponse_t> msgResponse( k_EGCMsgWGResponse, msg );
+ CUtlBuffer bufResponse;
+ KVPacker packer;
+ if ( packer.WriteAsBinary( pkvResponse, bufResponse ) )
+ {
+ msgResponse.AddVariableLenData( bufResponse.Base(), bufResponse.TellPut() );
+ msgResponse.Body().m_cubKeyValues = bufResponse.TellPut();
+ msgResponse.Body().m_bResult = bResult;
+ }
+ else
+ {
+ msgResponse.Body().m_cubKeyValues = 0;
+ AssertMsg( false, "Failed to serialize WG response" );
+ }
+ msgResponse.Hdr().m_JobIDTarget = msg.Hdr().m_JobIDSource;
+
+ GGCBase()->BSendSystemMessage( msgResponse );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Adds a WG job handler to the global list
+//-----------------------------------------------------------------------------
+void CGCWGJobMgr::RegisterWGJob( const WebApiFunc_t *pWGJobType, const JobType_t *pJobCreationFunc )
+{
+ const char *pchRequestName = pWGJobType->m_pchRequestName;
+ GMapGCWGJobCreationFuncs().Insert( pchRequestName, &(pJobCreationFunc->m_pJobFactory) );
+ GMapGCWGRequestInfo().Insert( pchRequestName, pWGJobType );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Get the list of registered WG jobs
+//-----------------------------------------------------------------------------
+CUtlDict< const WebApiFunc_t* > &CGCWGJobMgr::GetWGRequestMap()
+{
+ return GMapGCWGRequestInfo();
+}
+
+
+#ifdef DBGFLAG_VALIDATE
+void CGCWGJobMgr::Validate( CValidator &validator, const char *pchName )
+{
+}
+
+void CGCWGJobMgr::ValidateStatics( CValidator &validator )
+{
+ ValidateObj( GMapGCWGJobCreationFuncs() );
+ ValidateObj( GMapGCWGRequestInfo() );
+}
+
+#endif // DBGFLAG_VALIDATE
+
+
+
+} // namespace GCSDK