/* * Copyright (C) Epic Games, Inc. All Rights Reserved. */ package com.epicgames.replayserver; import java.io.IOException; import java.util.Timer; import java.util.logging.Level; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.security.ConstraintMapping; import org.eclipse.jetty.security.ConstraintSecurityHandler; import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.authentication.FormAuthenticator; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.*; import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.security.Password; public class ReplayServer { static Timer timer = null; public static void main( String[] args ) throws Exception { ReplayProps.Init(); ReplayDB.init(); ReplayLogger.log( Level.INFO, "Log opened..." ); org.eclipse.jetty.util.log.Log.setLog( ReplayLogger.replayLogger ); final int quickTaskFrequencyInSeconds = ReplayProps.getInt( "quickTaskFrequencyInSeconds", "10" ); final int longTaskFrequencyInHours = ReplayProps.getInt( "longTaskFrequencyInHours", "1" ); timer = new Timer(); if ( quickTaskFrequencyInSeconds != 0 ) { timer.schedule( new CleanupTask.QuickTask(), quickTaskFrequencyInSeconds * 1000, quickTaskFrequencyInSeconds * 1000 ); } if ( quickTaskFrequencyInSeconds != 0 ) { timer.schedule( new CleanupTask.LongTask(), 60 * 60 * 1000 * longTaskFrequencyInHours, 60 * 60 * 1000 * longTaskFrequencyInHours ); } final int httpPort = ReplayProps.getInt( "httpPort", "80" ); final Server server = new Server( httpPort ); ServletContextHandler context = new ServletContextHandler( ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY ); context.setContextPath( "/" ); server.setHandler( context ); // Change default timeout to 45 seconds (from 30) /* ServerConnector http = new ServerConnector( server ); //http.setHost( "localhost" ); http.setPort( httpPort ); http.setIdleTimeout( 45000 ); server.addConnector( http ); */ final boolean bTestAuthorize = false; if ( bTestAuthorize ) { context.addServlet(new ServletHolder(new HttpServlet() { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final ServletInputStream inputStream = request.getInputStream(); FileUtils.ReplayOutputStream outputStream = FileUtils.getReplayOutputStream( "authorize.txt", false ); byte[] buffer = new byte[1024]; int readBytes = 0; while ( ( readBytes = inputStream.read( buffer ) ) != -1 ) { outputStream.write( buffer, 0, readBytes ); } inputStream.close(); outputStream.close(); response.setContentType( "text/html" ); response.getWriter().println( "

Worked: " + request.getContentType() + "


" ); } }), "/j_security_check" ); } context.addServlet( new ServletHolder( new Download() ), "/download/*" ); context.addServlet( new ServletHolder( new DownloadEvent() ), "/downloadevent/*" ); context.addServlet( new ServletHolder( new Upload() ), "/upload/*" ); context.addServlet( new ServletHolder( new UploadEvent() ), "/uploadevent/*" ); context.addServlet( new ServletHolder( new StartUploading() ), "/startuploading/*" ); context.addServlet( new ServletHolder( new StopUploading() ), "/stopuploading/*" ); context.addServlet( new ServletHolder( new StartDownloading() ), "/startdownloading/*" ); context.addServlet( new ServletHolder( new DeleteSession() ), "/deletesession/*" ); context.addServlet( new ServletHolder( new EnumerateSessions() ), "/enumsessions/*" ); context.addServlet( new ServletHolder( new EnumEvents() ), "/enumevents/*" ); context.addServlet( new ServletHolder( new RefreshViewer() ), "/refreshviewer/*" ); context.addServlet( new ServletHolder( new ViewFile() ), "/viewfile/*" ); if ( ReplayProps.getInt( "enableBuiltInWebServer", "1" ) == 1 ) { context.addServlet( new ServletHolder( new Index() ), "/*" ); } // Password protect the delete session page context.addServlet(new ServletHolder(new HttpServlet() { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html" ); response.getWriter().append( "
" + "" + "" + "
"); } }), "/login" ); final Constraint constraint = new Constraint(); constraint.setName( Constraint.__FORM_AUTH ); constraint.setRoles( new String[]{ "user", "admin", "moderator" } ); constraint.setAuthenticate( true ); final ConstraintMapping constraintMapping = new ConstraintMapping(); constraintMapping.setConstraint( constraint ); constraintMapping.setPathSpec( "/deletesession/*" ); final ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler(); securityHandler.addConstraintMapping( constraintMapping ); HashLoginService loginService = new HashLoginService(); loginService.putUser( "usern", new Password( "pass" ), new String[] { "user" } ); loginService.putUser( "admin", new Password( "pass" ), new String[] { "admin" } ); securityHandler.setLoginService( loginService ); final FormAuthenticator authenticator = new FormAuthenticator( "/login", "/login", false ); securityHandler.setAuthenticator( authenticator ); if ( !bTestAuthorize ) { context.setSecurityHandler( securityHandler ); } server.start(); server.join(); ReplayDB.shutdown(); } }