| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 | using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Reflection;using System.Runtime.InteropServices.ComTypes;using Emby.Server.Core;using Emby.Server.Implementations;using Emby.Server.Implementations.EntryPoints;using Emby.Server.Implementations.FFMpeg;using MediaBrowser.Model.IO;using MediaBrowser.Model.Logging;using MediaBrowser.Model.System;using MediaBrowser.ServerApplication.Native;namespace MediaBrowser.ServerApplication{    public class WindowsAppHost : ApplicationHost    {        public WindowsAppHost(ServerApplicationPaths applicationPaths, ILogManager logManager, StartupOptions options, IFileSystem fileSystem, IPowerManagement powerManagement, string releaseAssetFilename, IEnvironmentInfo environmentInfo, MediaBrowser.Controller.Drawing.IImageEncoder imageEncoder, ISystemEvents systemEvents, IMemoryStreamFactory memoryStreamFactory, MediaBrowser.Common.Net.INetworkManager networkManager, Action<string, string> certificateGenerator, Func<string> defaultUsernameFactory)            : base(applicationPaths, logManager, options, fileSystem, powerManagement, releaseAssetFilename, environmentInfo, imageEncoder, systemEvents, memoryStreamFactory, networkManager, certificateGenerator, defaultUsernameFactory)        {        }        public override bool IsRunningAsService        {            get { return MainStartup.IsRunningAsService; }        }        protected override FFMpegInstallInfo GetFfmpegInstallInfo()        {            var info = new FFMpegInstallInfo();            info.FFMpegFilename = "ffmpeg.exe";            info.FFProbeFilename = "ffprobe.exe";            info.Version = "20160410";            info.ArchiveType = "7z";            info.DownloadUrls = GetDownloadUrls();            return info;        }        private string[] GetDownloadUrls()        {            switch (EnvironmentInfo.SystemArchitecture)            {                case Architecture.X64:                    return new[]                    {                                "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win64.7z"                    };                case Architecture.X86:                    return new[]                    {                                "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win32.7z"                    };            }            return new string[] { };        }        protected override void RestartInternal()        {            MainStartup.Restart();        }        protected override List<Assembly> GetAssembliesWithPartsInternal()        {            var list = new List<Assembly>();            if (!Environment.Is64BitProcess)            {                //list.Add(typeof(PismoIsoManager).Assembly);            }            list.Add(GetType().Assembly);            return list;        }        protected override void ShutdownInternal()        {            MainStartup.Shutdown();        }        protected override void AuthorizeServer()        {            ServerAuthorization.AuthorizeServer(UdpServerEntryPoint.PortNumber,                    ServerConfigurationManager.Configuration.HttpServerPortNumber,                    ServerConfigurationManager.Configuration.HttpsPortNumber,                    MainStartup.ApplicationPath,                    ConfigurationManager.CommonApplicationPaths.TempDirectory);        }        protected override void ConfigureAutoRunInternal(bool autorun)        {            var startupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Startup);            if (autorun && !MainStartup.IsRunningAsService)            {                //Copy our shortut into the startup folder for this user                var targetPath = Path.Combine(startupPath, "Emby Server.lnk");                IShellLinkW link = (IShellLinkW)new ShellLink();                var appPath = Process.GetCurrentProcess().MainModule.FileName;                // setup shortcut information                link.SetDescription(Name);                link.SetPath(appPath);                link.SetWorkingDirectory(Path.GetDirectoryName(appPath));                // save it                IPersistFile file = (IPersistFile)link;                file.Save(targetPath, true);            }            else            {                //Remove our shortcut from the startup folder for this user                FileSystemManager.DeleteFile(Path.Combine(startupPath, "Emby Server.lnk"));            }        }        protected override bool SupportsDualModeSockets        {            get            {                return true;            }        }        protected override void EnableLoopbackInternal(string appName)        {            LoopUtil.Run(appName);        }        public override bool SupportsRunningAsService        {            get            {                return true;            }        }        public override bool CanSelfRestart        {            get            {                return MainStartup.CanSelfRestart;            }        }        public override bool SupportsAutoRunAtStartup        {            get            {                return true;            }        }        public override bool CanSelfUpdate        {            get            {                return MainStartup.CanSelfUpdate;            }        }        public bool PortsRequireAuthorization(string applicationPath)        {            var appNameSrch = Path.GetFileName(applicationPath);            var startInfo = new ProcessStartInfo            {                FileName = "netsh",                Arguments = "advfirewall firewall show rule \"" + appNameSrch + "\"",                CreateNoWindow = true,                UseShellExecute = false,                WindowStyle = ProcessWindowStyle.Hidden,                ErrorDialog = false,                RedirectStandardOutput = true            };            using (var process = Process.Start(startInfo))            {                process.Start();                try                {                    var data = process.StandardOutput.ReadToEnd() ?? string.Empty;                    if (data.IndexOf("Block", StringComparison.OrdinalIgnoreCase) != -1)                    {                        Logger.Info("Found potential windows firewall rule blocking Emby Server: " + data);                    }                    //var parts = data.Split('\n');                    //return parts.Length > 4;                    //return Confirm();                    return false;                }                catch (Exception ex)                {                    Logger.ErrorException("Error querying windows firewall", ex);                    // Hate having to do this                    try                    {                        process.Kill();                    }                    catch (Exception ex1)                    {                        Logger.ErrorException("Error killing process", ex1);                    }                    throw;                }            }        }    }}
 |