Exemple #1
0
        void IWcfService.RemoveVoipProvider(string username, string hostname)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            configuration.VoipProviders.Remove(username, hostname);
            configuration.Save();
        }
Exemple #2
0
        private void LoadConfiguration()
        {
            var errors = SipServerConfigurationSection.LoadSection();

            if (errors.Count > 0)
            {
                // log errors!

                try
                {
                    var name    = SipServerConfigurationSection.GetSection().FilePath;
                    var oldName = name + ".old";
                    File.Delete(oldName);
                    File.Move(name, oldName);
                    File.Delete(name);

                    var errors2 = SipServerConfigurationSection.LoadSection();
                    if (errors2.Count > 0)
                    {
                        throw errors2[0];
                    }
                }
                catch (Exception ex)
                {
                    throw new InvalidProgramException(@"Can not restore .config file", ex);
                }
            }
        }
Exemple #3
0
        void IWcfService.AddVoipProvider(WcfVoipProvider provider)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            configuration.VoipProviders.Add(provider.ToVoipProviderConfigurationElement());
            configuration.Save();
        }
Exemple #4
0
        void IWcfService.SetAdministratorPassword(string newPassword)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            configuration.AdministratorPassword = newPassword;

            configuration.Save();
        }
        private RestResult ValidateServerOptions(ArraySegment <byte> content)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            return(new RestResult(
                       Convert(
                           configuration.Validate(
                               Json.DeserializeObject <string>(GetContentString(content))))));
        }
Exemple #6
0
        IEnumerable <WcfVoipProvider> IWcfService.GetVoipProviders()
        {
            var configuration = SipServerConfigurationSection.GetSection();
            var list          = new List <WcfVoipProvider>();

            foreach (var provider in configuration.VoipProviders)
            {
                list.Add(new WcfVoipProvider(provider, trunkManager.GetTrunk(provider.Username, provider.ServerHostname)));
            }
            return(list);
        }
Exemple #7
0
        string[] IWcfService.SetXmlConfiguration(string xml)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            var errors = configuration.Validate(xml);

            if (errors.Count == 0)
            {
                configuration.WriteXml(xml);
            }

            return(ConvertErrors(errors));
        }
Exemple #8
0
        void IWcfService.SetTurnConfigurations(WcfTurnConfiguration wcf)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            configuration.TurnServers.Key1 = wcf.Key1;
            configuration.TurnServers.Key2 = wcf.Key2;

            configuration.TurnServers.Clear();
            configuration.TurnServers.Add(wcf.FQDN, wcf.TCPPort, wcf.UDPPort, true);
            configuration.TurnServers.Add(wcf.FQDN, wcf.TCPPort, wcf.UDPPort, false);

            ////m_MRAS.SetTURN( configurations.FQDN, configurations.TCPPort, configurations.UDPPort, configurations.Key1, configurations.Key2 );

            configuration.Save();
        }
        private RestResult PutServerOptions(ArraySegment <byte> content)
        {
            var xml = Json.DeserializeObject <string>(GetContentString(content));

            var configuration = SipServerConfigurationSection.GetSection();

            var errors = Convert(configuration.Validate(xml));

            if (errors.Length == 0)
            {
                configuration.WriteXml(xml);
            }

            return(new RestResult(errors));
        }
Exemple #10
0
 public static void ConfigureMras(Mras.Mras1 mras, SipServerConfigurationSection configuration)
 {
     mras.SetKeys(configuration.TurnServers.Key1, configuration.TurnServers.Key2);
     mras.ClearServers();
     foreach (TurnServerConfigurationElement server in configuration.TurnServers)
     {
         if (string.Compare(server.Location, "internet", true) == 0)
         {
             mras.AddInternetServer(server.Fqdn, server.TcpPort, server.UdpPort);
         }
         else
         {
             mras.AddIntranetServer(server.Fqdn, server.TcpPort, server.UdpPort);
         }
     }
 }
Exemple #11
0
        void IWcfService.SetConfigurations(WcfConfiguration configurations)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            accounts.SetAccount(
                new Account(accounts.GetDefaultAccount())
            {
                DomainName = configurations.DomainName,
            });

            configuration.IsAuthorizationEnabled   = configurations.IsAuthorizationEnabled;
            configuration.IsActiveDirectoryEnabled = configurations.IsActiveDirectoryUsersEnabled;
            configuration.ActiveDirectoryGroup     = configurations.ActiveDirectoryUsersGroup;
            configuration.IsTracingEnabled         = configurations.IsTracingEnabled;

            configuration.Save();
        }
Exemple #12
0
        public WCFService(SipServerConfigurationSection configuration, EnhancedPresence1 enhancedPresence, TrunkManager trunkManager, Accountx accounts, IUserz userz)
        {
            this.accounts = accounts;

            this.userz          = userz;
            this.userz.Reset   += IUsers_Reloaded;
            this.userz.Added   += IUsers_Added;
            this.userz.Updated += IUsers_Updated;
            this.userz.Removed += IUsers_Removed;

            this.enhancedPresence = enhancedPresence;
            this.enhancedPresence.AvailabilityChanged += AvailabilityChanged;

            this.trunkManager = trunkManager;
            this.trunkManager.TrunkUpdated += TrunkUpdated;

            this.serviceAddress = configuration.WcfServiceAddress;
            //this.domainName = configuration.DomainName;
            this.validator = new CustomUserNamePasswordValidator(@"administrator", configuration.AdministratorPassword);
        }
Exemple #13
0
        public static void ConfigureVoipProviders(TrunkManager trunkManager, SipServerConfigurationSection configuration)
        {
            foreach (var provider in configuration.VoipProviders)
            {
                trunkManager.Clear();

                trunkManager.Add(
                    new Trunk(
                        provider.DisplayName,
                        provider.ServerHostname,
                        provider.Username,
                        provider.Protocol.ToTransport(),
                        provider.LocalEndpoint,
                        provider.OutboundProxyHostname,
                        provider.AuthenticationId,
                        provider.Password,
                        provider.ForwardIncomingCallTo,
                        provider.RestoreAfterErrorTimeout));

                break;                 // one voip provider only!
            }
        }
Exemple #14
0
        WcfTurnConfiguration IWcfService.GetTurnConfigurations()
        {
            var configuration = SipServerConfigurationSection.GetSection();

            var result = new WcfTurnConfiguration()
            {
                Key1 = configuration.TurnServers.Key1,
                Key2 = configuration.TurnServers.Key2,
            };

            if (configuration.TurnServers.Count > 0)
            {
                foreach (TurnServerConfigurationElement item in configuration.TurnServers)
                {
                    result.FQDN    = item.Fqdn;
                    result.TCPPort = item.TcpPort;
                    result.UDPPort = item.UdpPort;
                    break;
                }
            }

            return(result);
        }
Exemple #15
0
        WcfConfiguration IWcfService.GetConfigurations()
        {
            UpdateCallback();

            var configuration = SipServerConfigurationSection.GetSection();

            var sources = new WcfUsers[userz.Count];

            for (int i = 0; i < userz.Count; i++)
            {
                sources[i] = new WcfUsers(userz[i]);
            }

            return(new WcfConfiguration()
            {
                DomainName = accounts.GetDefaultAccount().DomainName,
                IsAuthorizationEnabled = configuration.IsAuthorizationEnabled,
                IsActiveDirectoryUsersEnabled = configuration.IsActiveDirectoryEnabled,
                ActiveDirectoryUsersGroup = configuration.ActiveDirectoryGroup,
                IsTracingEnabled = configuration.IsTracingEnabled,
                TracingFileName = configuration.TracingPath,
                Users = sources,
            });
        }
Exemple #16
0
        private void ConfigurationMonitor_Changed(object sender, EventArgs e)
        {
            var errors = SipServerConfigurationSection.LoadSection();

            if (errors.Count > 0)
            {
                // log errors!
            }
            else
            {
                var configuration = SipServerConfigurationSection.GetSection();

                Tracer.Configure(configuration.TracingPath, configuration.IsTracingEnabled);

                wcfService.AdministratorPassword = configuration.AdministratorPassword;
                restapi.AdministratorPassword    = configuration.AdministratorPassword;

                if (adUsers != null)
                {
                    adUsers.Group = configuration.ActiveDirectoryGroup;
                }

                authorization.IsEnabled = configuration.IsAuthorizationEnabled;

                trunkManager.Clear();
                Initializer.ConfigureVoipProviders(trunkManager, configuration);

                Initializer.ConfigureMras(mras, configuration);

                httpServer.WwwPath = configuration.WwwPath;

                transportLayer.ChangeSettings(configuration.WebSocketResponseFrame);

                proxyServerTU.IsOfficeSIPFiletransferEnabled = configuration.IsOfficeSIPFiletransferEnabled;
            }
        }
Exemple #17
0
        string[] IWcfService.ValidateXmlConfiguration(string xml)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            return(ConvertErrors(configuration.Validate(xml)));
        }
Exemple #18
0
        string IWcfService.GetXmlConfiguration()
        {
            var configuration = SipServerConfigurationSection.GetSection();

            return(configuration.ReadXml());
        }
Exemple #19
0
 string IWcfService.GetDefaultXmlConfiguration()
 {
     return(SipServerConfigurationSection.GetSection().DefaultXml);
 }
Exemple #20
0
        public Server()
        {
#if !DEBUG
            crashHandler = new CrashHandler();
#endif
            HttpMessage.BufferManager = SipMessage.BufferManager = new BufferManagerProxy();

            LoadConfiguration();

            var configuration = SipServerConfigurationSection.GetSection();

            if (configuration.AddToWindowsFirewall)
            {
                AddFirewallException();
            }

            if (BufferManager.IsInitialized() == false)
            {
                BufferManager.Initialize(Math.Min((int)(GetTotalMemoryInBytes() / (1024 * 1024) / 2), 2048));
            }

            if (Directory.Exists(configuration.AccountsPath) == false)
            {
                Directory.CreateDirectory(configuration.AccountsPath);
            }

            var initializer = new Initializer(ConfigurationMonitor_Changed);

            initializer.GetResults(
                out transportLayer,
                out transactionLayer,
                out locationService,
                out wcfService,
                out configurationMonitor,
                out trunkManager,
                out authorization,
                out userz,
                out adUsers,
                out mras,
                out httpServer,
                out accounts,
                out restapi,
                out proxyServerTU);

            if (configuration.IsActiveDirectoryEnabled)
            {
                accounts.ForEach((account) =>
                {
                    SetSpn(@"sip/" + account.DomainName);
                });
            }

            RestapiUriParser.LoadTables(configuration.ExePath);
            XcapUriParser.LoadTables(configuration.ExePath);

            Http.Message.HttpMessageReader.InitializeAsync(
                (ms1) =>
            {
                Sip.Message.SipMessageReader.InitializeAsync(
                    (ms2) =>
                {
                    Tracer.WriteImportant(@"JIT-compilation Http.Message.dll " + (ms1 / 1000).ToString() + ", Sip.Message.dll: " + (ms2 / 1000).ToString() + " seconds.");

                    try
                    {
                        transportLayer.Start();
                        Tracer.WriteImportant(@"Server started.");
                    }
                    catch (Exception ex)
                    {
                        Tracer.WriteException(@"Failed to start Servers Manager.", ex);
                    }

                    Initializer.ConfigureVoipProviders(trunkManager, configuration);
                });
            });
        }
Exemple #21
0
        public Initializer(EventHandler <EventArgs> configChangedHandler)
        {
            var configuration = SipServerConfigurationSection.GetSection();

            var adUsers = (configuration.IsActiveDirectoryEnabled == false) ? null : new AdUsers(configuration.ActiveDirectoryGroup);

            Func <Userz> CreateUserz = () =>
            {
                var result = new Userz(configuration.CustomUsersPath);

                result.Add(new CsvUsers(configuration.UsersCsvFilePathName));
                if (adUsers != null)
                {
                    result.Add(adUsers);
                }

                result.LoadCustomUsers();

                return(result);
            };


            var serversManager    = new ServersManager <Connection>(new ServersManagerConfig());
            var transportLayer    = new TransportLayer(serversManager, configuration.WebSocketResponseFrame);
            var authorization     = new SipAuthorizationManager();
            var transactionLayer  = new TransactionLayer(authorization);
            var userz             = CreateUserz();
            var locationService   = new LocationService();
            var mras              = new Mras.Mras1();
            var trunkManager      = new TrunkManager();
            var accounts          = new Accountx(configuration.AccountConfigFilePathName);
            var msPresTu          = new MsPresTU(accounts, userz, locationService);
            var wcfService        = new WCFService(configuration, msPresTu.EnhancedPresence, trunkManager, accounts, userz);
            var httpAuthorization = new HttpAuthorizationManager();
            var httpServer        = new HttpServer(httpAuthorization, configuration.AdminUri);
            //var httpServerAgentRegistrar = new Func<IHttpServerAgent, IHttpServer>((agent) => { return httpServer.Register(agent); });
            var restapi = new RestapiService(accounts, userz)
            {
                AdministratorPassword = configuration.AdministratorPassword,
            };
            var httpFileServer       = new HttpFileServer(configuration.WwwPath, string.Empty);
            var xcapServer           = new XcapServer();
            var configurationMonitor = new ConfigurationMonitor();
            var simpleModule         = new SimpleModule(EqualityComparer <string> .Default);
            var proxyServerTU        = new ProxyServerTU(locationService, trunkManager, accounts);

            GetResults = (
                out TransportLayer transportLayer1,
                out TransactionLayer transactionLayer1,
                out LocationService locationService1,
                out WCFService wcfService1,
                out ConfigurationMonitor configurationMonitor1,
                out TrunkManager trunkManager1,
                out SipAuthorizationManager authorization1,
                out Userz userz1,
                out AdUsers adUsers1,
                out Mras.Mras1 mras1,
                out HttpFileServer httpFileServer1,
                out Accountx accounts1,
                out RestapiService restapi1,
                out ProxyServerTU proxyServerTU1
                ) =>
            {
                transportLayer1       = transportLayer;
                transactionLayer1     = transactionLayer;
                locationService1      = locationService;
                wcfService1           = wcfService;
                configurationMonitor1 = configurationMonitor;
                trunkManager1         = trunkManager;
                authorization1        = authorization;
                userz1          = userz;
                adUsers1        = adUsers;
                mras1           = mras;
                httpFileServer1 = httpFileServer;
                accounts1       = accounts;
                restapi1        = restapi;
                proxyServerTU1  = proxyServerTU;
            };


            Action InitializeTracer = () =>
            {
                Tracer.Initialize(serversManager.Logger);
                Tracer.Configure(configuration.TracingPath, configuration.IsTracingEnabled);
            };


            Action InitializeConfigurationMonitor = () =>
            {
                configurationMonitor.Changed += configChangedHandler;
                configurationMonitor.StartMonitoring(configuration);
            };

            Action InitializeHttpModules = () =>
            {
                httpServer.SendAsync = transportLayer.SendAsyncHttp;
                transportLayer.IncomingHttpRequest = httpServer.ProcessIncomingRequest;

                httpServer.Register(restapi, 0, true);
                httpServer.Register(xcapServer, 0, true);
                httpServer.Register(new HttpFileServer(configuration.WwwAdminPath, configuration.AdminUri), 254, true);
                httpServer.Register(httpFileServer, 255, true);

                xcapServer.AddHandler(new ResourceListsHandler(accounts, userz));
                xcapServer.AddHandler(new PidfManipulationHandler(simpleModule));
            };

            Action InitializeWcfService = () =>
            {
                wcfService.Start();
            };


            Action InitializeProxyServerTU = () =>
            {
                proxyServerTU.IsOfficeSIPFiletransferEnabled = configuration.IsOfficeSIPFiletransferEnabled;
            };


            Action InitializeTransactionLayer = () =>
            {
                InitializeProxyServerTU();

                transportLayer.IncomingMessage += transactionLayer.IncomingMessage;
                transportLayer.SendErrorSip    += transactionLayer.TransportError;
                transactionLayer.SendAsync      = transportLayer.SendAsyncSip;
                transactionLayer.IsLocalAddress = transportLayer.IsLocalAddress;

                serversManager.EndConnection += (s, c) => { locationService.RemoveBindingsWhenConnectionEnd(c.Id); };
                transactionLayer.RegisterTransactionUser(new RegistrarTU(locationService, accounts));

                transactionLayer.RegisterTransactionUser(msPresTu);

                transactionLayer.RegisterTransactionUser(new SimpleTU(simpleModule));
                transactionLayer.RegisterTransactionUser(new OptionsTU());
                transactionLayer.RegisterTransactionUser(new MessageSummaryTU());

                transactionLayer.RegisterTransactionUser(new MrasTU(mras));

                transactionLayer.RegisterTransactionUser(new DirectorySearchTU(accounts, new ServiceSoap.ServiceSoap1(), userz));

                transactionLayer.RegisterTransactionUser(proxyServerTU);

                transactionLayer.RegisterTransactionUser(new TrunkTU(trunkManager));
                transactionLayer.RegisterTransactionUser(new ErrorTU());
            };


            Action InitializeAuthorization = () =>
            {
                authorization.IsEnabled = configuration.IsAuthorizationEnabled;

                if (configuration.IsActiveDirectoryEnabled)
                {
                    var kerberosAuth = new SipMicrosoftAuthentication(SipAuthSchemes.Kerberos, accounts, userz);
                    var ntlmAuth     = new SipMicrosoftAuthentication(SipAuthSchemes.Ntlm, accounts, userz);

                    authorization.RegisterAgent(kerberosAuth, SipAuthSchemes.Kerberos);
                    authorization.RegisterAgent(ntlmAuth, SipAuthSchemes.Ntlm);
                }

                var digestAuth = new SipDigestAuthentication(accounts, userz, configuration.IsAuthIntEnabled);
                authorization.RegisterAgent(digestAuth, SipAuthSchemes.Digest);



                httpAuthorization.IsEnabled = configuration.IsAuthorizationEnabled;
                httpAuthorization.RegisterAgent(new HttpDigestAuthentication(accounts, userz, false), HttpAuthSchemes.Digest);
            };


            Action InitializeServersManager = () =>
            {
                serversManager.FakeAddressAction = (ServerEndPoint localEndpoint) =>
                {
                    foreach (var portForwarding in configuration.PortForwardings)
                    {
                        if (localEndpoint.Equals(portForwarding.Protocol, portForwarding.LocalEndpoint))
                        {
                            return(portForwarding.ExternalEndpoint);
                        }
                    }

                    return(null);
                };

                Action <ServerProtocol, int> bind = (protocol, port) =>
                {
                    if (port > 0)
                    {
                        var error = serversManager.Bind(new ProtocolPort()
                        {
                            Protocol = protocol,
                            Port     = port,
                        });

                        if (error != SocketError.Success)
                        {
                            Tracer.WriteError("Can't open " + protocol + " port " + port + ".\r\n" + error.ToString());
                        }
                    }
                };

                if (configuration.UdpPort > 0)
                {
                    bind(ServerProtocol.Udp, configuration.UdpPort);
                }
                if (configuration.TcpPort > 0)
                {
                    bind(ServerProtocol.Tcp, configuration.TcpPort);
                }
                if (configuration.TcpPort2 > 0)
                {
                    bind(ServerProtocol.Tcp, configuration.TcpPort2);
                }
            };

            ConfigureMras(mras, configuration);
            InitializeConfigurationMonitor();
            InitializeTracer();
            InitializeTransactionLayer();
            InitializeAuthorization();
            InitializeWcfService();
            InitializeHttpModules();
            InitializeServersManager();
        }
Exemple #22
0
        private RestResult GetServerOptions()
        {
            var configuration = SipServerConfigurationSection.GetSection();

            return(new RestResult(configuration.ReadXml() as object));
        }