remote proctoring
This commit is contained in:
		
							parent
							
								
									3fd064055a
								
							
						
					
					
						commit
						e9393068df
					
				
					 5 changed files with 52 additions and 19 deletions
				
			
		|  | @ -33,6 +33,8 @@ public class GuiWebsecurityConfig extends WebSecurityConfigurerAdapter { | |||
| 
 | ||||
|     @Value("${sebserver.gui.entrypoint:/gui}") | ||||
|     private String guiEntryPoint; | ||||
|     @Value("${sebserver.gui.remote.proctoring.entrypoint:/remote-proctoring}") | ||||
|     private String remoteProctoringEndpoint; | ||||
| 
 | ||||
|     /** Gui-service related public URLS from spring web security perspective */ | ||||
|     public static final RequestMatcher PUBLIC_URLS = new OrRequestMatcher( | ||||
|  | @ -51,9 +53,7 @@ public class GuiWebsecurityConfig extends WebSecurityConfigurerAdapter { | |||
|                 .ignoring() | ||||
|                 .requestMatchers(PUBLIC_URLS) | ||||
|                 .antMatchers(this.guiEntryPoint) | ||||
|                 .antMatchers("/proc*") | ||||
|                 .antMatchers("/proc/*") | ||||
|                 .antMatchers("/proctoring/*"); | ||||
|                 .antMatchers(this.remoteProctoringEndpoint + "/*"); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  |  | |||
|  | @ -58,18 +58,22 @@ public final class InstitutionalAuthenticationEntryPoint implements Authenticati | |||
|     private static final Logger log = LoggerFactory.getLogger(InstitutionalAuthenticationEntryPoint.class); | ||||
| 
 | ||||
|     private final String guiEntryPoint; | ||||
| 
 | ||||
|     private final String remoteProctoringEndpoint; | ||||
|     private final String defaultLogo; | ||||
|     private final WebserviceURIService webserviceURIService; | ||||
|     private final ClientHttpRequestFactoryService clientHttpRequestFactoryService; | ||||
| 
 | ||||
|     protected InstitutionalAuthenticationEntryPoint( | ||||
|             @Value("${sebserver.gui.entrypoint}") final String guiEntryPoint, | ||||
|             @Value("${sebserver.gui.remote.proctoring.entrypoint:/remote-proctoring}") final String remoteProctoringEndpoint, | ||||
|             @Value("${sebserver.gui.defaultLogo:" + Constants.NO_NAME + "}") final String defaultLogoFileName, | ||||
|             final WebserviceURIService webserviceURIService, | ||||
|             final ClientHttpRequestFactoryService clientHttpRequestFactoryService, | ||||
|             final ResourceLoader resourceLoader) { | ||||
| 
 | ||||
|         this.guiEntryPoint = guiEntryPoint; | ||||
|         this.remoteProctoringEndpoint = remoteProctoringEndpoint; | ||||
|         this.webserviceURIService = webserviceURIService; | ||||
|         this.clientHttpRequestFactoryService = clientHttpRequestFactoryService; | ||||
| 
 | ||||
|  | @ -149,7 +153,7 @@ public final class InstitutionalAuthenticationEntryPoint implements Authenticati | |||
|                     request.getSession().setAttribute(API.PARAM_LOGO_IMAGE, logoImageBase64); | ||||
| 
 | ||||
|                 } | ||||
|                 forwardToEntryPoint(request, response, this.guiEntryPoint); | ||||
|                 forwardToEntryPoint(request, response, this.guiEntryPoint, false); | ||||
|                 return; | ||||
|             } | ||||
|         } catch (final Exception e) { | ||||
|  | @ -160,21 +164,36 @@ public final class InstitutionalAuthenticationEntryPoint implements Authenticati | |||
|         request.getSession().setAttribute(INST_SUFFIX_ATTRIBUTE, null); | ||||
|         request.getSession().removeAttribute(API.PARAM_LOGO_IMAGE); | ||||
|         response.setStatus(HttpStatus.UNAUTHORIZED.value()); | ||||
|         forwardToEntryPoint(request, response, this.guiEntryPoint); | ||||
|         forwardToEntryPoint(request, response, this.guiEntryPoint, true); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private void forwardToEntryPoint( | ||||
|             final HttpServletRequest request, | ||||
|             final HttpServletResponse response, | ||||
|             final String entryPoint) throws ServletException, IOException { | ||||
|             final String entryPoint, | ||||
|             final boolean redirect) throws ServletException, IOException { | ||||
| 
 | ||||
|         final String requestURI = request.getRequestURI(); | ||||
|         if (requestURI.startsWith(this.remoteProctoringEndpoint)) { | ||||
|             final RequestDispatcher dispatcher = request | ||||
|                     .getServletContext() | ||||
|                     .getRequestDispatcher(requestURI); | ||||
| 
 | ||||
|             dispatcher.forward(request, response); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (redirect) { | ||||
|             response.sendRedirect(entryPoint); | ||||
|         } else { | ||||
|             final RequestDispatcher dispatcher = request | ||||
|                     .getServletContext() | ||||
|                     .getRequestDispatcher(entryPoint); | ||||
| 
 | ||||
|             dispatcher.forward(request, response); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static String extractInstitutionalEndpoint(final HttpServletRequest request) { | ||||
|         final String requestURI = request.getRequestURI(); | ||||
|  |  | |||
|  | @ -39,6 +39,12 @@ public class RAPSpringConfig { | |||
|     @Value("${sebserver.gui.external.messages:messages}") | ||||
|     private String externalMessagesPath; | ||||
| 
 | ||||
|     @Value("${sebserver.gui.remote.proctoring.entrypoint:/remote-proctoring}") | ||||
|     private String remoteProctoringEndpoint; | ||||
| 
 | ||||
|     @Value("${sebserver.gui.remote.proctoring.api-servler.endpoint:/remote-view-servlet}") | ||||
|     private String remoteProctoringViewServletEndpoint; | ||||
| 
 | ||||
|     @Bean | ||||
|     public ServletContextInitializer initializer() { | ||||
|         return new RAPServletContextInitializer(); | ||||
|  | @ -54,12 +60,10 @@ public class RAPSpringConfig { | |||
| 
 | ||||
|     @Bean | ||||
|     public ServletRegistrationBean<RWTServlet> servletRegistrationBean() { | ||||
|         return new ServletRegistrationBean<>(new RWTServlet(), this.entrypoint + "/*"); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|     public ServletRegistrationBean<RWTServlet> servletRegistrationBeanProc() { | ||||
|         return new ServletRegistrationBean<>(new RWTServlet(), "/proc/*"); | ||||
|         return new ServletRegistrationBean<>( | ||||
|                 new RWTServlet(), | ||||
|                 this.entrypoint + "/*", | ||||
|                 this.remoteProctoringEndpoint + "/*"); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|  | @ -68,7 +72,9 @@ public class RAPSpringConfig { | |||
| 
 | ||||
|         final ProctoringServlet proctoringServlet = applicationContext | ||||
|                 .getBean(ProctoringServlet.class); | ||||
|         return new ServletRegistrationBean<>(proctoringServlet, "/proctoring/*"); | ||||
|         return new ServletRegistrationBean<>( | ||||
|                 proctoringServlet, | ||||
|                 this.remoteProctoringEndpoint + this.remoteProctoringViewServletEndpoint + "/*"); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|  |  | |||
|  | @ -99,6 +99,7 @@ public class MonitoringClientConnection implements TemplateComposer { | |||
|     private final GuiServiceInfo guiServiceInfo; | ||||
|     private final long pollInterval; | ||||
|     private final int pageSize; | ||||
|     private final String remoteProctoringEndpoint; | ||||
| 
 | ||||
|     private final TableFilterAttribute typeFilter; | ||||
|     private final TableFilterAttribute textFilter = | ||||
|  | @ -111,7 +112,8 @@ public class MonitoringClientConnection implements TemplateComposer { | |||
|             final SEBClientEventDetailsPopup sebClientLogDetailsPopup, | ||||
|             final GuiServiceInfo guiServiceInfo, | ||||
|             @Value("${sebserver.gui.webservice.poll-interval:500}") final long pollInterval, | ||||
|             @Value("${sebserver.gui.list.page.size:20}") final Integer pageSize) { | ||||
|             @Value("${sebserver.gui.list.page.size:20}") final Integer pageSize, | ||||
|             @Value("${sebserver.gui.remote.proctoring.entrypoint:/remote-proctoring}") final String remoteProctoringEndpoint) { | ||||
| 
 | ||||
|         this.serverPushService = serverPushService; | ||||
|         this.pageService = pageService; | ||||
|  | @ -122,6 +124,7 @@ public class MonitoringClientConnection implements TemplateComposer { | |||
|         this.pollInterval = pollInterval; | ||||
|         this.sebClientLogDetailsPopup = sebClientLogDetailsPopup; | ||||
|         this.pageSize = pageSize; | ||||
|         this.remoteProctoringEndpoint = remoteProctoringEndpoint; | ||||
| 
 | ||||
|         this.typeFilter = new TableFilterAttribute( | ||||
|                 CriteriaType.SINGLE_SELECTION, | ||||
|  | @ -284,7 +287,7 @@ public class MonitoringClientConnection implements TemplateComposer { | |||
|     private static final String OPEN_SINGEL_ROOM_SCRIPT = | ||||
|             "var existingWin = window.open('', '%s', 'height=420,width=620,location=no,scrollbars=yes,status=no,menubar=yes,toolbar=yes,titlebar=yes,dialog=yes');\n" + | ||||
|             "if(existingWin.location.href === 'about:blank'){\n" + | ||||
|             "    existingWin.location.href = '%s/proc/%s';\n" + | ||||
|             "    existingWin.location.href = '%s%s/%s';\n" + | ||||
|             "    existingWin.focus();\n" + | ||||
|             "} else {\n" + | ||||
|             "    existingWin.focus();\n" + | ||||
|  | @ -315,6 +318,7 @@ public class MonitoringClientConnection implements TemplateComposer { | |||
|                 OPEN_SINGEL_ROOM_SCRIPT, | ||||
|                 roomName, | ||||
|                 this.guiServiceInfo.getExternalServerURIBuilder().toUriString(), | ||||
|                 this.remoteProctoringEndpoint, | ||||
|                 roomName); | ||||
|         javaScriptExecutor.execute(script); | ||||
|         this.pageService.getCurrentUser() | ||||
|  |  | |||
|  | @ -27,6 +27,10 @@ sebserver.gui.webservice.mock-lms-enabled=true | |||
| sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb | ||||
| sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb | ||||
| 
 | ||||
| # remote proctoring | ||||
| sebserver.gui.remote.proctoring.entrypoint=/remote-proctoring | ||||
| sebserver.gui.remote.proctoring.api-servler.endpoint=/remote-view-servlet | ||||
| 
 | ||||
| # Webservice connection details | ||||
| sebserver.webservice.api.exam.endpoint=/exam-api | ||||
| sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 anhefti
						anhefti