83
83
import org .osgi .service .event .Event ;
84
84
import org .osgi .service .event .EventAdmin ;
85
85
import org .osgi .service .event .EventProperties ;
86
- import org .osgi .service .http .NamespaceException ;
87
86
import org .osgi .service .servlet .context .ServletContextHelper ;
88
87
import org .osgi .service .servlet .whiteboard .HttpWhiteboardConstants ;
89
88
import org .slf4j .Logger ;
96
95
97
96
public class Console implements SelfConfiguringComponent {
98
97
99
- private static final String SESSION_CONTEXT_NAME = "sessionContext" ;
100
-
101
- private static final String RESOURCE_CONTEXT_NAME = "resourceContext" ;
98
+ private static final String SESSION_CONTEXT_NAME_PREFIX = "sessionContext-" ;
99
+ private static final String RESOURCE_CONTEXT_NAME_PREFIX = "resourceContext-" ;
102
100
103
101
private static final String SESSION = "/session" ;
104
102
@@ -117,6 +115,8 @@ public class Console implements SelfConfiguringComponent {
117
115
private static final String PASSWORD_AUTH_PATH = LOGIN_MODULE_PATH + "/password" ;
118
116
private static final String CERT_AUTH_PATH = LOGIN_MODULE_PATH + "/cert" ;
119
117
118
+ private static final String XSRF_PATH = "/xsrf" ;
119
+
120
120
private static final Logger logger = LoggerFactory .getLogger (Console .class );
121
121
122
122
private String appRoot ;
@@ -138,6 +138,9 @@ public class Console implements SelfConfiguringComponent {
138
138
private final Set <ServiceRegistration <ResourcesService >> resources = new CopyOnWriteArraySet <>();
139
139
private final Set <ServiceRegistration <Servlet >> servlets = new CopyOnWriteArraySet <>();
140
140
141
+ private final Set <String > authenticationPaths = new HashSet <>(
142
+ Arrays .asList (AUTH_PATH , PASSWORD_AUTH_PATH , CERT_AUTH_PATH ));
143
+
141
144
private BundleContext bundleContext ;
142
145
143
146
private static Console instance ;
@@ -268,14 +271,11 @@ private void doUpdate(ConsoleOptions options) {
268
271
setAppRoot (options .getAppRoot ());
269
272
setSessionMaxInactiveInterval (options .getSessionMaxInactivityInterval ());
270
273
271
- try {
272
- initHTTPService ();
273
- } catch (NamespaceException e ) {
274
- logger .warn ("Error Registering Web Resources" , e );
275
- }
274
+ initResourcesAndServlets ();
275
+
276
276
}
277
277
278
- protected void deactivate (BundleContext context ) {
278
+ protected void deactivate () {
279
279
logger .info ("deactivate..." );
280
280
281
281
unregisterAll ();
@@ -289,13 +289,16 @@ protected void deactivate(BundleContext context) {
289
289
290
290
private synchronized void unregisterAll () {
291
291
292
- this .contexts .forEach (ServiceRegistration ::unregister );
292
+ this .wiresBlinkService .stop ();
293
+ this .eventService .stop ();
294
+
293
295
this .resources .forEach (ServiceRegistration ::unregister );
294
296
this .servlets .forEach (ServiceRegistration ::unregister );
297
+ this .contexts .forEach (ServiceRegistration ::unregister );
295
298
296
- this .wiresBlinkService . stop ();
297
-
298
- this .eventService . stop ();
299
+ this .contexts . clear ();
300
+ this . resources . clear ();
301
+ this .servlets . clear ();
299
302
300
303
}
301
304
@@ -409,8 +412,6 @@ private void updateAuditContext(final HttpSession session) {
409
412
410
413
}
411
414
412
- final Set <String > authenticationPaths = new HashSet <>(Arrays .asList (AUTH_PATH , PASSWORD_AUTH_PATH , CERT_AUTH_PATH ));
413
-
414
415
private SecurityHandler createSessionHandlerChain () {
415
416
416
417
final Set <String > eventPaths = new HashSet <>(Arrays .asList (DENALI_MODULE_PATH + EVENT_PATH , "/sse" ));
@@ -429,7 +430,7 @@ private SecurityHandler createSessionHandlerChain() {
429
430
final RoutingSecurityHandler routingHandler = new RoutingSecurityHandler (
430
431
defaultHandler .sendErrorOnFailure (401 ));
431
432
432
- // exception on authentication paths, allow access without authenticaton but
433
+ // exception on authentication paths, allow access without authentication but
433
434
// create a session
434
435
routingHandler .addRouteHandler (this .authenticationPaths ::contains ,
435
436
chain (baseHandler , new CreateSessionSecurityHandler ()));
@@ -446,92 +447,94 @@ private SecurityHandler createSessionHandlerChain() {
446
447
// exception on login session and xsrf path, like default but without locked
447
448
// session checking
448
449
routingHandler .addRouteHandler (
449
- Arrays .asList (LOGIN_MODULE_PATH + SESSION , LOGIN_MODULE_PATH + "/xsrf" )::contains ,
450
+ Arrays .asList (LOGIN_MODULE_PATH + SESSION , LOGIN_MODULE_PATH + XSRF_PATH )::contains ,
450
451
chain (baseHandler , sessionAuthHandler , sessionExpirationHandler ));
451
452
452
453
return routingHandler ;
453
454
}
454
455
455
- private synchronized void initHTTPService () throws NamespaceException {
456
+ private synchronized void initResourcesAndServlets () {
456
457
457
458
this .eventService = new GwtEventServiceImpl ();
458
459
this .wiresBlinkService = new WiresBlinkServlet ();
459
460
460
461
ServletContextHelper resourceContextHelper = new HttpServletContextHelper (new BaseSecurityHandler ());
461
462
ServletContextHelper sessionContextHelper = new HttpServletContextHelper (createSessionHandlerChain ());
462
463
463
- registerContextHelper (RESOURCE_CONTEXT_NAME , "/" , resourceContextHelper , 5 );
464
- registerContextHelper (SESSION_CONTEXT_NAME , "/" , sessionContextHelper , 10 );
464
+ String resourceContextName = RESOURCE_CONTEXT_NAME_PREFIX + System .nanoTime ();
465
+ String sessionContextName = SESSION_CONTEXT_NAME_PREFIX + System .nanoTime ();
466
+
467
+ registerContextHelper (resourceContextName , "/" , resourceContextHelper , 5 );
468
+ registerContextHelper (sessionContextName , "/" , sessionContextHelper , 10 );
465
469
466
- registerResources (ADMIN_ROOT + "/*" , "www" , new AdminResources (), RESOURCE_CONTEXT_NAME );
467
- registerResources (AUTH_PATH , "www/auth.html" , new AuthorizationResources (), SESSION_CONTEXT_NAME );
468
- registerResources (CONSOLE_PATH , "www/denali.html" , new ConsoleResources (), SESSION_CONTEXT_NAME );
470
+ registerResources (ADMIN_ROOT + "/*" , "www" , new AdminResources (), resourceContextName );
471
+ registerResources (AUTH_PATH , "www/auth.html" , new AuthorizationResources (), sessionContextName );
472
+ registerResources (CONSOLE_PATH , "www/denali.html" , new ConsoleResources (), sessionContextName );
469
473
470
474
registerServlet ("gwtLoginInfoService" , LOGIN_MODULE_PATH + "/loginInfo" , new GwtLoginInfoServiceImpl (),
471
- RESOURCE_CONTEXT_NAME );
472
- registerServlet ("redirectServlet" , "/" , new RedirectServlet ("/" ::equals , this .appRoot ), RESOURCE_CONTEXT_NAME );
475
+ resourceContextName );
476
+ registerServlet ("redirectServlet" , "/" , new RedirectServlet ("/" ::equals , this .appRoot ), resourceContextName );
473
477
474
478
registerServlet ("notFoundAuthResourceServlet" , AUTH_RESOURCE_PATH , new SendStatusServlet (404 ),
475
- RESOURCE_CONTEXT_NAME );
479
+ resourceContextName );
476
480
registerServlet ("notFoundConsoleResourceServlet" , CONSOLE_RESOURCE_PATH , new SendStatusServlet (404 ),
477
- RESOURCE_CONTEXT_NAME );
481
+ resourceContextName );
478
482
479
483
registerServlet ("gwtPasswordAuthenticationService" , PASSWORD_AUTH_PATH ,
480
- new GwtPasswordAuthenticationServiceImpl (this .userManager , CONSOLE_PATH ), SESSION_CONTEXT_NAME );
484
+ new GwtPasswordAuthenticationServiceImpl (this .userManager , CONSOLE_PATH ), sessionContextName );
481
485
registerServlet ("sslAuthenticationServlet" , CERT_AUTH_PATH ,
482
- new SslAuthenticationServlet (CONSOLE_PATH , this .userManager ), SESSION_CONTEXT_NAME );
486
+ new SslAuthenticationServlet (CONSOLE_PATH , this .userManager ), sessionContextName );
483
487
484
488
registerServlet ("gwtKeystoreServiceImpl" , DENALI_MODULE_PATH + "/keystore" , new GwtKeystoreServiceImpl (),
485
- SESSION_CONTEXT_NAME );
489
+ sessionContextName );
486
490
registerServlet ("gwtSslManagerServiceImpl" , DENALI_MODULE_PATH + "/ssl" , new GwtSslManagerServiceImpl (),
487
- SESSION_CONTEXT_NAME );
491
+ sessionContextName );
488
492
489
493
registerServlet ("denaliSessionService" , DENALI_MODULE_PATH + SESSION ,
490
- new GwtSessionServiceImpl (this .userManager ), SESSION_CONTEXT_NAME );
494
+ new GwtSessionServiceImpl (this .userManager ), sessionContextName );
491
495
492
496
registerServlet ("loginSessionService" , LOGIN_MODULE_PATH + SESSION , new GwtSessionServiceImpl (this .userManager ),
493
- SESSION_CONTEXT_NAME );
494
- registerServlet ("xsrfLoginServlet" , LOGIN_MODULE_PATH + "/xsrf" , new GwtSecurityTokenServiceImpl (),
495
- SESSION_CONTEXT_NAME );
496
- registerServlet ("xsrfDenaliServlet" , DENALI_MODULE_PATH + "/xsrf" , new GwtSecurityTokenServiceImpl (),
497
- SESSION_CONTEXT_NAME );
497
+ sessionContextName );
498
+ registerServlet ("xsrfLoginServlet" , LOGIN_MODULE_PATH + XSRF_PATH , new GwtSecurityTokenServiceImpl (),
499
+ sessionContextName );
500
+ registerServlet ("xsrfDenaliServlet" , DENALI_MODULE_PATH + XSRF_PATH , new GwtSecurityTokenServiceImpl (),
501
+ sessionContextName );
498
502
registerServlet ("statusService" , DENALI_MODULE_PATH + "/status" , new GwtStatusServiceImpl (),
499
- SESSION_CONTEXT_NAME );
503
+ sessionContextName );
500
504
registerServlet ("deviceService" , DENALI_MODULE_PATH + "/device" , new GwtDeviceServiceImpl (),
501
- SESSION_CONTEXT_NAME );
502
- registerServlet ("logService" , DENALI_MODULE_PATH + "/logservice" , new GwtLogServiceImpl (),
503
- SESSION_CONTEXT_NAME );
505
+ sessionContextName );
506
+ registerServlet ("logService" , DENALI_MODULE_PATH + "/logservice" , new GwtLogServiceImpl (), sessionContextName );
504
507
registerServlet ("networkService" , DENALI_MODULE_PATH + "/network" , new GwtNetworkServiceImpl (),
505
- SESSION_CONTEXT_NAME );
508
+ sessionContextName );
506
509
registerServlet ("componentService" , DENALI_MODULE_PATH + "/component" , new GwtComponentServiceImpl (),
507
- SESSION_CONTEXT_NAME );
510
+ sessionContextName );
508
511
registerServlet ("packageService" , DENALI_MODULE_PATH + "/package" ,
509
- new GwtPackageServiceImpl (this .sslManagerService ::get ), SESSION_CONTEXT_NAME );
512
+ new GwtPackageServiceImpl (this .sslManagerService ::get ), sessionContextName );
510
513
registerServlet ("snapshotServiceImpl" , DENALI_MODULE_PATH + "/snapshot" , new GwtSnapshotServiceImpl (),
511
- SESSION_CONTEXT_NAME );
514
+ sessionContextName );
512
515
registerServlet ("certificateService" , DENALI_MODULE_PATH + "/certificate" , new GwtCertificatesServiceImpl (),
513
- SESSION_CONTEXT_NAME );
516
+ sessionContextName );
514
517
registerServlet ("securityService" , DENALI_MODULE_PATH + "/security" , new GwtSecurityServiceImpl (),
515
- SESSION_CONTEXT_NAME );
518
+ sessionContextName );
516
519
registerServlet ("usersService" , DENALI_MODULE_PATH + "/users" , new GwtUserServiceImpl (this .userManager ),
517
- SESSION_CONTEXT_NAME );
518
- registerServlet ("fileServlet" , DENALI_MODULE_PATH + "/file/*" , new FileServlet (), SESSION_CONTEXT_NAME );
520
+ sessionContextName );
521
+ registerServlet ("fileServlet" , DENALI_MODULE_PATH + "/file/*" , new FileServlet (), sessionContextName );
519
522
registerServlet ("deviceSnapshotsServlet" , DENALI_MODULE_PATH + "/device_snapshots" ,
520
- new DeviceSnapshotsServlet (), SESSION_CONTEXT_NAME );
523
+ new DeviceSnapshotsServlet (), sessionContextName );
521
524
registerServlet ("channelServlet" , DENALI_MODULE_PATH + "/assetsUpDownload" , new ChannelServlet (),
522
- SESSION_CONTEXT_NAME );
523
- registerServlet ("logServlet" , DENALI_MODULE_PATH + "/log" , new LogServlet (), SESSION_CONTEXT_NAME );
524
- registerServlet ("skinServlet" , DENALI_MODULE_PATH + "/skin/*" , new SkinServlet (), RESOURCE_CONTEXT_NAME );
525
+ sessionContextName );
526
+ registerServlet ("logServlet" , DENALI_MODULE_PATH + "/log" , new LogServlet (), sessionContextName );
527
+ registerServlet ("skinServlet" , DENALI_MODULE_PATH + "/skin/*" , new SkinServlet (), resourceContextName );
525
528
registerServlet ("cloudServices" , DENALI_MODULE_PATH + "/cloudservices" , new GwtCloudConnectionServiceImpl (),
526
- SESSION_CONTEXT_NAME );
529
+ sessionContextName );
527
530
registerServlet ("wireGraphService" , DENALI_MODULE_PATH + "/wires" , new GwtWireGraphServiceImpl (),
528
- SESSION_CONTEXT_NAME );
531
+ sessionContextName );
529
532
registerServlet ("wiresSnapshotServlet" , DENALI_MODULE_PATH + "/wiresSnapshot" , new WiresSnapshotServlet (),
530
- SESSION_CONTEXT_NAME );
533
+ sessionContextName );
531
534
registerServlet ("driverAndAssetService" , DENALI_MODULE_PATH + "/assetservices" ,
532
- new GwtDriverAndAssetServiceImpl (), SESSION_CONTEXT_NAME );
533
- registerServlet ("wiresBlinkService" , ADMIN_ROOT + "/sse" , this .wiresBlinkService , SESSION_CONTEXT_NAME );
534
- registerServlet ("eventService" , DENALI_MODULE_PATH + EVENT_PATH , this .eventService , SESSION_CONTEXT_NAME );
535
+ new GwtDriverAndAssetServiceImpl (), sessionContextName );
536
+ registerServlet ("wiresBlinkService" , ADMIN_ROOT + "/sse" , this .wiresBlinkService , sessionContextName );
537
+ registerServlet ("eventService" , DENALI_MODULE_PATH + EVENT_PATH , this .eventService , sessionContextName );
535
538
536
539
this .eventService .start ();
537
540
}
@@ -548,37 +551,51 @@ private void registerContextHelper(String contextName, String contextPath, Servl
548
551
.registerService (ServletContextHelper .class , contextHelper , new Hashtable <>(props ));
549
552
550
553
this .contexts .add (contextService );
554
+
555
+ logger .debug ("registered context helper with id: {} , name: {} , path {}" , //
556
+ contextService .getReference ().getProperty (Constants .SERVICE_ID ), contextName , contextPath );
551
557
}
552
558
553
559
private void registerResources (String pattern , String prefix , ResourcesService resourcesService ,
554
560
String contextHelperName ) {
555
561
Map <String , Object > props = new HashMap <>();
556
562
563
+ String contextHelperSelector = "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "="
564
+ + contextHelperName + ")" ;
565
+
557
566
props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_RESOURCE_PATTERN , pattern );
558
567
props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_RESOURCE_PREFIX , prefix );
559
- props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT ,
560
- "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "=" + contextHelperName + ")" );
568
+ props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT , contextHelperSelector );
561
569
562
570
ServiceRegistration <ResourcesService > resourcesS = this .bundleContext .registerService (ResourcesService .class ,
563
571
resourcesService , new Hashtable <>(props ));
564
572
565
573
this .resources .add (resourcesS );
574
+
575
+ logger .debug ("registered resource with id: {} , pattern: {} , prefix {} , contextHelper {}" , //
576
+ resourcesS .getReference ().getProperty (Constants .SERVICE_ID ), pattern , prefix , contextHelperSelector );
566
577
}
567
578
568
579
private void registerServlet (String servletName , String servletPattern , HttpServlet servlet ,
569
580
String contextHelperName ) {
570
581
571
582
Map <String , String > props = new HashMap <>();
572
583
584
+ String contextHelperSelector = "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "="
585
+ + contextHelperName + ")" ;
586
+
573
587
props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_SERVLET_NAME , servletName );
574
588
props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_SERVLET_PATTERN , servletPattern );
575
- props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT ,
576
- "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "=" + contextHelperName + ")" );
589
+ props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT , contextHelperSelector );
577
590
578
591
ServiceRegistration <Servlet > servletService = this .bundleContext .registerService (Servlet .class , servlet ,
579
592
new Hashtable <>(props ));
580
593
581
594
this .servlets .add (servletService );
595
+
596
+ logger .debug ("registered servlet with id: {} , name: {} , pattern {} , contextHelper {}" , //
597
+ servletService .getReference ().getProperty (Constants .SERVICE_ID ), servletName , servletPattern ,
598
+ contextHelperSelector );
582
599
}
583
600
584
601
public interface ResourcesService {
@@ -609,4 +626,5 @@ public UserManager getUserManager() {
609
626
public ComponentConfiguration getConfiguration () throws KuraException {
610
627
return consoleOptions .getConfiguration ();
611
628
}
629
+
612
630
}
0 commit comments