Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Security.Server-3.2/3.2/SecurityServerApplication.cs @ 1713

Last change on this file since 1713 was 1713, checked in by asimon, 15 years ago

Server for Security (ticket #537)

File size: 4.8 KB
Line 
1using System;
2using System.Collections.Generic;
3using HeuristicLab.PluginInfrastructure;
4using System.Text;
5using System.ServiceModel;
6using System.ServiceModel.Description;
7using System.Net;
8using HeuristicLab.Security.Contracts.Interfaces;
9using System.Windows.Forms;
10
11namespace HeuristicLab.Security.Server {
12
13  [ClassInfo(Name = "Security Server",
14  Description = "Server application for the security.",
15  AutoRestart = true)]
16  public class SecurityServerApplication : ApplicationBase {
17    public const string STR_PermissionManager = "PermissionManager";
18    public const string STR_SecurityManager = "SecurityManager";   
19
20    int DEFAULT_PORT_SM = 9111;
21    int DEFAULT_PORT_PM = 9112;
22
23    private DiscoveryService discService = new DiscoveryService();
24    private Dictionary<string, ServiceHost> runningServices = new Dictionary<string, ServiceHost>();
25    private NetTcpBinding binding = new NetTcpBinding(SecurityMode.None, true);
26
27    private enum Services {
28      SecurityManager,
29      PermissionManager,
30      All
31    }
32   
33    private bool AddMexEndpoint(ServiceHost serviceHost) {
34      if (serviceHost != null) {
35        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
36        serviceHost.Description.Behaviors.Add(behavior);
37
38        return serviceHost.AddServiceEndpoint(
39          typeof(IMetadataExchange),
40          MetadataExchangeBindings.CreateMexTcpBinding(),
41          "mex") != null;
42      } else
43        return false;
44    }
45
46    private Uri StartService(Services svc, IPAddress ipAddress, int port) {
47      string curServiceHost = "";
48      Uri uriTcp;
49      ISecurityManager[] securityManagerInstances = discService.GetInstances<ISecurityManager>();
50      IPermissionManager[] permissionManagerInstances = discService.GetInstances<IPermissionManager>();
51      ServiceHost serviceHost = null;
52      switch (svc) {
53        case Services.PermissionManager:
54          if (securityManagerInstances.Length > 0) {
55            uriTcp = new Uri("net.tcp://" + ipAddress + ":" + port + "/PermissionManager/");
56            serviceHost = new ServiceHost(permissionManagerInstances[0].GetType(), uriTcp);
57            serviceHost.AddServiceEndpoint(typeof(IPermissionManager), binding, STR_PermissionManager);
58            curServiceHost = STR_PermissionManager;
59          }
60          break;
61        case Services.SecurityManager:
62          if (securityManagerInstances.Length > 0) {
63            uriTcp = new Uri("net.tcp://" + ipAddress + ":" + port + "/SecurityManager/");
64            serviceHost = new ServiceHost(securityManagerInstances[0].GetType(), uriTcp);
65            serviceHost.AddServiceEndpoint(typeof(ISecurityManager), binding, STR_SecurityManager);
66            curServiceHost = STR_SecurityManager;
67          }
68          break;
69        case Services.All:
70          throw new InvalidOperationException("Not supported!");
71        default:
72          return null;
73      }
74      if ((serviceHost != null) && (!String.IsNullOrEmpty(curServiceHost))) {
75        AddMexEndpoint(serviceHost);
76    //    WcfSettings.SetServiceCertificate(serviceHost);
77        serviceHost.Open();
78        runningServices.Add(curServiceHost, serviceHost);
79        return serviceHost.BaseAddresses[0];
80      } else
81        return null;
82    }
83
84    private void StopService(Services svc) {
85      ServiceHost svcHost = null;
86      switch (svc) {
87        case Services.PermissionManager:
88          runningServices.TryGetValue(STR_PermissionManager, out svcHost);
89          break;
90        case Services.SecurityManager:
91          runningServices.TryGetValue(STR_SecurityManager, out svcHost);
92          break;
93        case Services.All:
94          foreach (KeyValuePair<string, ServiceHost> item in runningServices)
95            item.Value.Close();
96          return;
97        default:
98          throw new InvalidOperationException("Not supported!");
99      }
100      svcHost.Close();
101    }
102
103    public override void Run() {
104      IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName());
105      int index = 0;
106      if (System.Environment.OSVersion.Version.Major >= 6) {
107        for (index = addresses.Length - 1; index >= 0; index--)
108          if (addresses[index].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
109            break;
110      }
111     
112      //Start services and record their base address
113      Dictionary<string, Uri> baseAddrDict = new Dictionary<string, Uri>();
114      baseAddrDict.Add(STR_PermissionManager,
115        StartService(Services.PermissionManager, addresses[index], DEFAULT_PORT_PM));
116      baseAddrDict.Add(STR_SecurityManager,
117        StartService(Services.SecurityManager, addresses[index], DEFAULT_PORT_SM));
118
119      SecurityServer securityServer = new SecurityServer(baseAddrDict);
120
121      Application.Run(securityServer);
122
123      StopService(Services.All);
124    }
125  }
126}
Note: See TracBrowser for help on using the repository browser.