move loopback util
This commit is contained in:
parent
8931b949f8
commit
fc2a5acfca
|
@ -107,7 +107,7 @@ using Emby.Server.Implementations.Playlists;
|
||||||
using Emby.Server.Implementations;
|
using Emby.Server.Implementations;
|
||||||
using Emby.Server.Implementations.ServerManager;
|
using Emby.Server.Implementations.ServerManager;
|
||||||
using Emby.Server.Implementations.Session;
|
using Emby.Server.Implementations.Session;
|
||||||
using Emby.Server.Implementations.Social;
|
using Emby.Server.Implementations.Windows;
|
||||||
using Emby.Server.Implementations.TV;
|
using Emby.Server.Implementations.TV;
|
||||||
using Emby.Server.Implementations.Updates;
|
using Emby.Server.Implementations.Updates;
|
||||||
using MediaBrowser.Model.Activity;
|
using MediaBrowser.Model.Activity;
|
||||||
|
@ -796,17 +796,25 @@ namespace Emby.Server.Core
|
||||||
info.FFMpegFilename = "ffmpeg";
|
info.FFMpegFilename = "ffmpeg";
|
||||||
info.FFProbeFilename = "ffprobe";
|
info.FFProbeFilename = "ffprobe";
|
||||||
info.ArchiveType = "7z";
|
info.ArchiveType = "7z";
|
||||||
info.Version = "20160215";
|
info.Version = "20170308";
|
||||||
info.DownloadUrls = GetLinuxDownloadUrls();
|
info.DownloadUrls = GetLinuxDownloadUrls();
|
||||||
}
|
}
|
||||||
else if (EnvironmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
|
else if (EnvironmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
|
||||||
{
|
{
|
||||||
info.FFMpegFilename = "ffmpeg.exe";
|
info.FFMpegFilename = "ffmpeg.exe";
|
||||||
info.FFProbeFilename = "ffprobe.exe";
|
info.FFProbeFilename = "ffprobe.exe";
|
||||||
info.Version = "20160410";
|
info.Version = "20170308";
|
||||||
info.ArchiveType = "7z";
|
info.ArchiveType = "7z";
|
||||||
info.DownloadUrls = GetWindowsDownloadUrls();
|
info.DownloadUrls = GetWindowsDownloadUrls();
|
||||||
}
|
}
|
||||||
|
else if (EnvironmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.OSX)
|
||||||
|
{
|
||||||
|
info.FFMpegFilename = "ffmpeg";
|
||||||
|
info.FFProbeFilename = "ffprobe";
|
||||||
|
info.ArchiveType = "7z";
|
||||||
|
info.Version = "20170308";
|
||||||
|
info.DownloadUrls = GetMacDownloadUrls();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// No version available - user requirement
|
// No version available - user requirement
|
||||||
|
@ -816,6 +824,20 @@ namespace Emby.Server.Core
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string[] GetMacDownloadUrls()
|
||||||
|
{
|
||||||
|
switch (EnvironmentInfo.SystemArchitecture)
|
||||||
|
{
|
||||||
|
case Architecture.X64:
|
||||||
|
return new[]
|
||||||
|
{
|
||||||
|
"https://embydata.com/downloads/ffmpeg/osx/ffmpeg-x64-20170308.7z"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return new string[] { };
|
||||||
|
}
|
||||||
|
|
||||||
private string[] GetWindowsDownloadUrls()
|
private string[] GetWindowsDownloadUrls()
|
||||||
{
|
{
|
||||||
switch (EnvironmentInfo.SystemArchitecture)
|
switch (EnvironmentInfo.SystemArchitecture)
|
||||||
|
@ -823,12 +845,12 @@ namespace Emby.Server.Core
|
||||||
case Architecture.X64:
|
case Architecture.X64:
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
"https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win64.7z"
|
"https://embydata.com/downloads/ffmpeg/windows/ffmpeg-20170308-win64.7z"
|
||||||
};
|
};
|
||||||
case Architecture.X86:
|
case Architecture.X86:
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
"https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win32.7z"
|
"https://embydata.com/downloads/ffmpeg/windows/ffmpeg-20170308-win32.7z"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -842,12 +864,12 @@ namespace Emby.Server.Core
|
||||||
case Architecture.X64:
|
case Architecture.X64:
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
"https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/linux/ffmpeg-git-20160215-64bit-static.7z"
|
"https://embydata.com/downloads/ffmpeg/linux/ffmpeg-git-20170301-64bit-static.7z"
|
||||||
};
|
};
|
||||||
case Architecture.X86:
|
case Architecture.X86:
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
"https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/linux/ffmpeg-git-20160215-32bit-static.7z"
|
"https://embydata.com/downloads/ffmpeg/linux/ffmpeg-git-20170301-32bit-static.7z"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1716,12 +1738,10 @@ namespace Emby.Server.Core
|
||||||
|
|
||||||
public void EnableLoopback(string appName)
|
public void EnableLoopback(string appName)
|
||||||
{
|
{
|
||||||
EnableLoopbackInternal(appName);
|
if (EnvironmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void EnableLoopbackInternal(string appName)
|
|
||||||
{
|
{
|
||||||
|
LoopUtil.Run(appName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RegisterModules()
|
private void RegisterModules()
|
||||||
|
|
|
@ -269,6 +269,7 @@
|
||||||
<Compile Include="Updates\InstallationManager.cs" />
|
<Compile Include="Updates\InstallationManager.cs" />
|
||||||
<Compile Include="UserViews\CollectionFolderImageProvider.cs" />
|
<Compile Include="UserViews\CollectionFolderImageProvider.cs" />
|
||||||
<Compile Include="UserViews\DynamicImageProvider.cs" />
|
<Compile Include="UserViews\DynamicImageProvider.cs" />
|
||||||
|
<Compile Include="Windows\LoopUtil.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Localization\iso6392.txt" />
|
<EmbeddedResource Include="Localization\iso6392.txt" />
|
||||||
|
|
|
@ -127,7 +127,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
|
|
||||||
SetDeviceSpecificData(item, result.MediaSource, profile, authInfo, request.MaxStreamingBitrate,
|
SetDeviceSpecificData(item, result.MediaSource, profile, authInfo, request.MaxStreamingBitrate,
|
||||||
request.StartTimeTicks ?? 0, result.MediaSource.Id, request.AudioStreamIndex,
|
request.StartTimeTicks ?? 0, result.MediaSource.Id, request.AudioStreamIndex,
|
||||||
request.SubtitleStreamIndex, request.MaxAudioChannels, request.PlaySessionId, request.UserId, true, true, true);
|
request.SubtitleStreamIndex, request.MaxAudioChannels, request.PlaySessionId, request.UserId, true, true, true, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -169,7 +169,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
{
|
{
|
||||||
var mediaSourceId = request.MediaSourceId;
|
var mediaSourceId = request.MediaSourceId;
|
||||||
|
|
||||||
SetDeviceSpecificData(request.Id, info, profile, authInfo, request.MaxStreamingBitrate ?? profile.MaxStreamingBitrate, request.StartTimeTicks ?? 0, mediaSourceId, request.AudioStreamIndex, request.SubtitleStreamIndex, request.MaxAudioChannels, request.UserId, request.EnableDirectPlay, request.EnableDirectStream, request.EnableTranscoding);
|
SetDeviceSpecificData(request.Id, info, profile, authInfo, request.MaxStreamingBitrate ?? profile.MaxStreamingBitrate, request.StartTimeTicks ?? 0, mediaSourceId, request.AudioStreamIndex, request.SubtitleStreamIndex, request.MaxAudioChannels, request.UserId, request.EnableDirectPlay, request.ForceDirectPlayRemoteMediaSource, request.EnableDirectStream, request.EnableTranscoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
|
@ -253,6 +253,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
int? maxAudioChannels,
|
int? maxAudioChannels,
|
||||||
string userId,
|
string userId,
|
||||||
bool enableDirectPlay,
|
bool enableDirectPlay,
|
||||||
|
bool forceDirectPlayRemoteMediaSource,
|
||||||
bool enableDirectStream,
|
bool enableDirectStream,
|
||||||
bool enableTranscoding)
|
bool enableTranscoding)
|
||||||
{
|
{
|
||||||
|
@ -260,7 +261,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
|
|
||||||
foreach (var mediaSource in result.MediaSources)
|
foreach (var mediaSource in result.MediaSources)
|
||||||
{
|
{
|
||||||
SetDeviceSpecificData(item, mediaSource, profile, auth, maxBitrate, startTimeTicks, mediaSourceId, audioStreamIndex, subtitleStreamIndex, maxAudioChannels, result.PlaySessionId, userId, enableDirectPlay, enableDirectStream, enableTranscoding);
|
SetDeviceSpecificData(item, mediaSource, profile, auth, maxBitrate, startTimeTicks, mediaSourceId, audioStreamIndex, subtitleStreamIndex, maxAudioChannels, result.PlaySessionId, userId, enableDirectPlay, forceDirectPlayRemoteMediaSource, enableDirectStream, enableTranscoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
SortMediaSources(result, maxBitrate);
|
SortMediaSources(result, maxBitrate);
|
||||||
|
@ -279,6 +280,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
string playSessionId,
|
string playSessionId,
|
||||||
string userId,
|
string userId,
|
||||||
bool enableDirectPlay,
|
bool enableDirectPlay,
|
||||||
|
bool forceDirectPlayRemoteMediaSource,
|
||||||
bool enableDirectStream,
|
bool enableDirectStream,
|
||||||
bool enableTranscoding)
|
bool enableTranscoding)
|
||||||
{
|
{
|
||||||
|
@ -317,6 +319,11 @@ namespace MediaBrowser.Api.Playback
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mediaSource.SupportsDirectPlay)
|
if (mediaSource.SupportsDirectPlay)
|
||||||
|
{
|
||||||
|
if (mediaSource.IsRemote && forceDirectPlayRemoteMediaSource)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
var supportsDirectStream = mediaSource.SupportsDirectStream;
|
var supportsDirectStream = mediaSource.SupportsDirectStream;
|
||||||
|
|
||||||
|
@ -357,6 +364,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token);
|
SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mediaSource.SupportsDirectStream)
|
if (mediaSource.SupportsDirectStream)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1670,6 +1670,11 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||||
case "h264":
|
case "h264":
|
||||||
if (_mediaEncoder.SupportsDecoder("h264_qsv"))
|
if (_mediaEncoder.SupportsDecoder("h264_qsv"))
|
||||||
{
|
{
|
||||||
|
// qsv decoder does not support 10-bit input
|
||||||
|
if ((state.VideoStream.BitDepth ?? 8) > 8)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return "-c:v h264_qsv ";
|
return "-c:v h264_qsv ";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -27,9 +27,11 @@ namespace MediaBrowser.Model.MediaInfo
|
||||||
public bool EnableDirectPlay { get; set; }
|
public bool EnableDirectPlay { get; set; }
|
||||||
public bool EnableDirectStream { get; set; }
|
public bool EnableDirectStream { get; set; }
|
||||||
public bool EnableTranscoding { get; set; }
|
public bool EnableTranscoding { get; set; }
|
||||||
|
public bool ForceDirectPlayRemoteMediaSource { get; set; }
|
||||||
|
|
||||||
public PlaybackInfoRequest()
|
public PlaybackInfoRequest()
|
||||||
{
|
{
|
||||||
|
ForceDirectPlayRemoteMediaSource = true;
|
||||||
EnableDirectPlay = true;
|
EnableDirectPlay = true;
|
||||||
EnableDirectStream = true;
|
EnableDirectStream = true;
|
||||||
EnableTranscoding = true;
|
EnableTranscoding = true;
|
||||||
|
|
|
@ -56,42 +56,6 @@ namespace MediaBrowser.Server.Mac
|
||||||
return new SyncManager();
|
return new SyncManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override FFMpegInstallInfo GetFfmpegInstallInfo()
|
|
||||||
{
|
|
||||||
var info = new FFMpegInstallInfo();
|
|
||||||
|
|
||||||
info.ArchiveType = "7z";
|
|
||||||
|
|
||||||
switch (EnvironmentInfo.SystemArchitecture)
|
|
||||||
{
|
|
||||||
case Architecture.X64:
|
|
||||||
info.Version = "20160124";
|
|
||||||
break;
|
|
||||||
case Architecture.X86:
|
|
||||||
info.Version = "20150110";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
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/osx/ffmpeg-x64-2.8.5.7z"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// No version available
|
|
||||||
return new string[] { };
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void RestartInternal()
|
protected override void RestartInternal()
|
||||||
{
|
{
|
||||||
MainClass.Restart();
|
MainClass.Restart();
|
||||||
|
|
|
@ -143,7 +143,6 @@
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="MainStartup.cs" />
|
<Compile Include="MainStartup.cs" />
|
||||||
<Compile Include="Native\LnkShortcutHandler.cs" />
|
<Compile Include="Native\LnkShortcutHandler.cs" />
|
||||||
<Compile Include="Native\LoopbackUtil.cs" />
|
|
||||||
<Compile Include="Native\PowerManagement.cs" />
|
<Compile Include="Native\PowerManagement.cs" />
|
||||||
<Compile Include="Native\Standby.cs" />
|
<Compile Include="Native\Standby.cs" />
|
||||||
<Compile Include="Native\ServerAuthorization.cs" />
|
<Compile Include="Native\ServerAuthorization.cs" />
|
||||||
|
|
|
@ -1,358 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace MediaBrowser.ServerApplication.Native
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// http://blogs.msdn.com/b/fiddler/archive/2011/12/10/fiddler-windows-8-apps-enable-LoopUtil-network-isolation-exemption.aspx
|
|
||||||
/// </summary>
|
|
||||||
public class LoopUtil
|
|
||||||
{
|
|
||||||
//http://msdn.microsoft.com/en-us/library/windows/desktop/aa379595(v=vs.85).aspx
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
internal struct SID_AND_ATTRIBUTES
|
|
||||||
{
|
|
||||||
public IntPtr Sid;
|
|
||||||
public uint Attributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayoutAttribute(LayoutKind.Sequential)]
|
|
||||||
internal struct INET_FIREWALL_AC_CAPABILITIES
|
|
||||||
{
|
|
||||||
public uint count;
|
|
||||||
public IntPtr capabilities; //SID_AND_ATTRIBUTES
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayoutAttribute(LayoutKind.Sequential)]
|
|
||||||
internal struct INET_FIREWALL_AC_BINARIES
|
|
||||||
{
|
|
||||||
public uint count;
|
|
||||||
public IntPtr binaries;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayoutAttribute(LayoutKind.Sequential)]
|
|
||||||
internal struct INET_FIREWALL_APP_CONTAINER
|
|
||||||
{
|
|
||||||
internal IntPtr appContainerSid;
|
|
||||||
internal IntPtr userSid;
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)]
|
|
||||||
public string appContainerName;
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)]
|
|
||||||
public string displayName;
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)]
|
|
||||||
public string description;
|
|
||||||
internal INET_FIREWALL_AC_CAPABILITIES capabilities;
|
|
||||||
internal INET_FIREWALL_AC_BINARIES binaries;
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)]
|
|
||||||
public string workingDirectory;
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)]
|
|
||||||
public string packageFullName;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Call this API to free the memory returned by the Enumeration API
|
|
||||||
[DllImport("FirewallAPI.dll")]
|
|
||||||
internal static extern void NetworkIsolationFreeAppContainers(IntPtr pACs);
|
|
||||||
|
|
||||||
// Call this API to load the current list of LoopUtil-enabled AppContainers
|
|
||||||
[DllImport("FirewallAPI.dll")]
|
|
||||||
internal static extern uint NetworkIsolationGetAppContainerConfig(out uint pdwCntACs, out IntPtr appContainerSids);
|
|
||||||
|
|
||||||
// Call this API to set the LoopUtil-exemption list
|
|
||||||
[DllImport("FirewallAPI.dll")]
|
|
||||||
private static extern uint NetworkIsolationSetAppContainerConfig(uint pdwCntACs, SID_AND_ATTRIBUTES[] appContainerSids);
|
|
||||||
|
|
||||||
|
|
||||||
// Use this API to convert a string SID into an actual SID
|
|
||||||
[DllImport("advapi32.dll", SetLastError = true)]
|
|
||||||
internal static extern bool ConvertStringSidToSid(string strSid, out IntPtr pSid);
|
|
||||||
|
|
||||||
[DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
|
|
||||||
static extern bool ConvertSidToStringSid(
|
|
||||||
[MarshalAs(UnmanagedType.LPArray)] byte[] pSID,
|
|
||||||
out IntPtr ptrSid);
|
|
||||||
|
|
||||||
[DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
|
|
||||||
static extern bool ConvertSidToStringSid(IntPtr pSid, out string strSid);
|
|
||||||
|
|
||||||
// Use this API to convert a string reference (e.g. "@{blah.pri?ms-resource://whatever}") into a plain string
|
|
||||||
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
|
|
||||||
internal static extern int SHLoadIndirectString(string pszSource, StringBuilder pszOutBuf);
|
|
||||||
|
|
||||||
// Call this API to enumerate all of the AppContainers on the system
|
|
||||||
[DllImport("FirewallAPI.dll")]
|
|
||||||
internal static extern uint NetworkIsolationEnumAppContainers(uint Flags, out uint pdwCntPublicACs, out IntPtr ppACs);
|
|
||||||
// DWORD NetworkIsolationEnumAppContainers(
|
|
||||||
// _In_ DWORD Flags,
|
|
||||||
// _Out_ DWORD *pdwNumPublicAppCs,
|
|
||||||
// _Out_ PINET_FIREWALL_APP_CONTAINER *ppPublicAppCs
|
|
||||||
//);
|
|
||||||
|
|
||||||
//http://msdn.microsoft.com/en-gb/library/windows/desktop/hh968116.aspx
|
|
||||||
enum NETISO_FLAG
|
|
||||||
{
|
|
||||||
NETISO_FLAG_FORCE_COMPUTE_BINARIES = 0x1,
|
|
||||||
NETISO_FLAG_MAX = 0x2
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class AppContainer
|
|
||||||
{
|
|
||||||
public String appContainerName { get; set; }
|
|
||||||
public String displayName { get; set; }
|
|
||||||
public String workingDirectory { get; set; }
|
|
||||||
public String StringSid { get; set; }
|
|
||||||
public List<uint> capabilities { get; set; }
|
|
||||||
public bool LoopUtil { get; set; }
|
|
||||||
|
|
||||||
public AppContainer(String _appContainerName, String _displayName, String _workingDirectory, IntPtr _sid)
|
|
||||||
{
|
|
||||||
this.appContainerName = _appContainerName;
|
|
||||||
this.displayName = _displayName;
|
|
||||||
this.workingDirectory = _workingDirectory;
|
|
||||||
String tempSid;
|
|
||||||
ConvertSidToStringSid(_sid, out tempSid);
|
|
||||||
this.StringSid = tempSid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal List<LoopUtil.INET_FIREWALL_APP_CONTAINER> _AppList;
|
|
||||||
internal List<LoopUtil.SID_AND_ATTRIBUTES> _AppListConfig;
|
|
||||||
public List<AppContainer> Apps = new List<AppContainer>();
|
|
||||||
internal IntPtr _pACs;
|
|
||||||
|
|
||||||
public LoopUtil()
|
|
||||||
{
|
|
||||||
LoadApps();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadApps()
|
|
||||||
{
|
|
||||||
Apps.Clear();
|
|
||||||
_pACs = IntPtr.Zero;
|
|
||||||
//Full List of Apps
|
|
||||||
_AppList = PI_NetworkIsolationEnumAppContainers();
|
|
||||||
//List of Apps that have LoopUtil enabled.
|
|
||||||
_AppListConfig = PI_NetworkIsolationGetAppContainerConfig();
|
|
||||||
foreach (var PI_app in _AppList)
|
|
||||||
{
|
|
||||||
AppContainer app = new AppContainer(PI_app.appContainerName, PI_app.displayName, PI_app.workingDirectory, PI_app.appContainerSid);
|
|
||||||
|
|
||||||
var app_capabilities = LoopUtil.getCapabilites(PI_app.capabilities);
|
|
||||||
if (app_capabilities.Count > 0)
|
|
||||||
{
|
|
||||||
//var sid = new SecurityIdentifier(app_capabilities[0], 0);
|
|
||||||
|
|
||||||
IntPtr arrayValue = IntPtr.Zero;
|
|
||||||
//var b = LoopUtil.ConvertStringSidToSid(app_capabilities[0].Sid, out arrayValue);
|
|
||||||
//string mysid;
|
|
||||||
//var b = LoopUtil.ConvertSidToStringSid(app_capabilities[0].Sid, out mysid);
|
|
||||||
}
|
|
||||||
app.LoopUtil = CheckLoopback(PI_app.appContainerSid);
|
|
||||||
Apps.Add(app);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private bool CheckLoopback(IntPtr intPtr)
|
|
||||||
{
|
|
||||||
foreach (SID_AND_ATTRIBUTES item in _AppListConfig)
|
|
||||||
{
|
|
||||||
string left, right;
|
|
||||||
ConvertSidToStringSid(item.Sid, out left);
|
|
||||||
ConvertSidToStringSid(intPtr, out right);
|
|
||||||
|
|
||||||
if (left == right)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool CreateExcemptions(string appName)
|
|
||||||
{
|
|
||||||
var hasChanges = false;
|
|
||||||
|
|
||||||
foreach (var app in Apps)
|
|
||||||
{
|
|
||||||
if ((app.appContainerName ?? string.Empty).IndexOf(appName, StringComparison.OrdinalIgnoreCase) != -1 ||
|
|
||||||
(app.displayName ?? string.Empty).IndexOf(appName, StringComparison.OrdinalIgnoreCase) != -1)
|
|
||||||
{
|
|
||||||
if (!app.LoopUtil)
|
|
||||||
{
|
|
||||||
app.LoopUtil = true;
|
|
||||||
hasChanges = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return hasChanges;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Run(string appName)
|
|
||||||
{
|
|
||||||
var util = new LoopUtil();
|
|
||||||
util.LoadApps();
|
|
||||||
|
|
||||||
var hasChanges = util.CreateExcemptions(appName);
|
|
||||||
|
|
||||||
if (hasChanges)
|
|
||||||
{
|
|
||||||
util.SaveLoopbackState();
|
|
||||||
}
|
|
||||||
util.SaveLoopbackState();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<SID_AND_ATTRIBUTES> getCapabilites(INET_FIREWALL_AC_CAPABILITIES cap)
|
|
||||||
{
|
|
||||||
List<SID_AND_ATTRIBUTES> mycap = new List<SID_AND_ATTRIBUTES>();
|
|
||||||
|
|
||||||
IntPtr arrayValue = cap.capabilities;
|
|
||||||
|
|
||||||
var structSize = Marshal.SizeOf(typeof(SID_AND_ATTRIBUTES));
|
|
||||||
for (var i = 0; i < cap.count; i++)
|
|
||||||
{
|
|
||||||
var cur = (SID_AND_ATTRIBUTES)Marshal.PtrToStructure(arrayValue, typeof(SID_AND_ATTRIBUTES));
|
|
||||||
mycap.Add(cur);
|
|
||||||
arrayValue = new IntPtr((long)(arrayValue) + (long)(structSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
return mycap;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<SID_AND_ATTRIBUTES> getContainerSID(INET_FIREWALL_AC_CAPABILITIES cap)
|
|
||||||
{
|
|
||||||
List<SID_AND_ATTRIBUTES> mycap = new List<SID_AND_ATTRIBUTES>();
|
|
||||||
|
|
||||||
IntPtr arrayValue = cap.capabilities;
|
|
||||||
|
|
||||||
var structSize = Marshal.SizeOf(typeof(SID_AND_ATTRIBUTES));
|
|
||||||
for (var i = 0; i < cap.count; i++)
|
|
||||||
{
|
|
||||||
var cur = (SID_AND_ATTRIBUTES)Marshal.PtrToStructure(arrayValue, typeof(SID_AND_ATTRIBUTES));
|
|
||||||
mycap.Add(cur);
|
|
||||||
arrayValue = new IntPtr((long)(arrayValue) + (long)(structSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
return mycap;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<SID_AND_ATTRIBUTES> PI_NetworkIsolationGetAppContainerConfig()
|
|
||||||
{
|
|
||||||
|
|
||||||
IntPtr arrayValue = IntPtr.Zero;
|
|
||||||
uint size = 0;
|
|
||||||
var list = new List<SID_AND_ATTRIBUTES>();
|
|
||||||
|
|
||||||
// Pin down variables
|
|
||||||
GCHandle handle_pdwCntPublicACs = GCHandle.Alloc(size, GCHandleType.Pinned);
|
|
||||||
GCHandle handle_ppACs = GCHandle.Alloc(arrayValue, GCHandleType.Pinned);
|
|
||||||
|
|
||||||
uint retval = NetworkIsolationGetAppContainerConfig(out size, out arrayValue);
|
|
||||||
|
|
||||||
var structSize = Marshal.SizeOf(typeof(SID_AND_ATTRIBUTES));
|
|
||||||
for (var i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
var cur = (SID_AND_ATTRIBUTES)Marshal.PtrToStructure(arrayValue, typeof(SID_AND_ATTRIBUTES));
|
|
||||||
list.Add(cur);
|
|
||||||
arrayValue = new IntPtr((long)(arrayValue) + (long)(structSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
//release pinned variables.
|
|
||||||
handle_pdwCntPublicACs.Free();
|
|
||||||
handle_ppACs.Free();
|
|
||||||
|
|
||||||
return list;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<INET_FIREWALL_APP_CONTAINER> PI_NetworkIsolationEnumAppContainers()
|
|
||||||
{
|
|
||||||
|
|
||||||
IntPtr arrayValue = IntPtr.Zero;
|
|
||||||
uint size = 0;
|
|
||||||
var list = new List<INET_FIREWALL_APP_CONTAINER>();
|
|
||||||
|
|
||||||
// Pin down variables
|
|
||||||
GCHandle handle_pdwCntPublicACs = GCHandle.Alloc(size, GCHandleType.Pinned);
|
|
||||||
GCHandle handle_ppACs = GCHandle.Alloc(arrayValue, GCHandleType.Pinned);
|
|
||||||
|
|
||||||
//uint retval2 = NetworkIsolationGetAppContainerConfig( out size, out arrayValue);
|
|
||||||
|
|
||||||
uint retval = NetworkIsolationEnumAppContainers((Int32)NETISO_FLAG.NETISO_FLAG_MAX, out size, out arrayValue);
|
|
||||||
_pACs = arrayValue; //store the pointer so it can be freed when we close the form
|
|
||||||
|
|
||||||
var structSize = Marshal.SizeOf(typeof(INET_FIREWALL_APP_CONTAINER));
|
|
||||||
for (var i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
var cur = (INET_FIREWALL_APP_CONTAINER)Marshal.PtrToStructure(arrayValue, typeof(INET_FIREWALL_APP_CONTAINER));
|
|
||||||
list.Add(cur);
|
|
||||||
arrayValue = new IntPtr((long)(arrayValue) + (long)(structSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
//release pinned variables.
|
|
||||||
handle_pdwCntPublicACs.Free();
|
|
||||||
handle_ppACs.Free();
|
|
||||||
|
|
||||||
return list;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool SaveLoopbackState()
|
|
||||||
{
|
|
||||||
var countEnabled = CountEnabledLoopUtil();
|
|
||||||
SID_AND_ATTRIBUTES[] arr = new SID_AND_ATTRIBUTES[countEnabled];
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < Apps.Count; i++)
|
|
||||||
{
|
|
||||||
if (Apps[i].LoopUtil)
|
|
||||||
{
|
|
||||||
arr[count].Attributes = 0;
|
|
||||||
//TO DO:
|
|
||||||
IntPtr ptr;
|
|
||||||
ConvertStringSidToSid(Apps[i].StringSid, out ptr);
|
|
||||||
arr[count].Sid = ptr;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (NetworkIsolationSetAppContainerConfig((uint)countEnabled, arr) == 0)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ return false; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private int CountEnabledLoopUtil()
|
|
||||||
{
|
|
||||||
var count = 0;
|
|
||||||
for (int i = 0; i < Apps.Count; i++)
|
|
||||||
{
|
|
||||||
if (Apps[i].LoopUtil)
|
|
||||||
{
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void FreeResources()
|
|
||||||
{
|
|
||||||
NetworkIsolationFreeAppContainers(_pACs);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -10,6 +10,7 @@ using Emby.Server.Core;
|
||||||
using Emby.Server.Implementations;
|
using Emby.Server.Implementations;
|
||||||
using Emby.Server.Implementations.EntryPoints;
|
using Emby.Server.Implementations.EntryPoints;
|
||||||
using Emby.Server.Implementations.FFMpeg;
|
using Emby.Server.Implementations.FFMpeg;
|
||||||
|
using Emby.Server.Implementations.Windows;
|
||||||
using Emby.Server.Sync;
|
using Emby.Server.Sync;
|
||||||
using MediaBrowser.Controller.Connect;
|
using MediaBrowser.Controller.Connect;
|
||||||
using MediaBrowser.Controller.Sync;
|
using MediaBrowser.Controller.Sync;
|
||||||
|
@ -107,11 +108,6 @@ namespace MediaBrowser.ServerApplication
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void EnableLoopbackInternal(string appName)
|
|
||||||
{
|
|
||||||
LoopUtil.Run(appName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool SupportsRunningAsService
|
public override bool SupportsRunningAsService
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
|
@ -456,7 +456,7 @@ namespace SocketHttpListener.Net
|
||||||
|
|
||||||
public long ContentLength64
|
public long ContentLength64
|
||||||
{
|
{
|
||||||
get { return content_length; }
|
get { return is_chunked ? -1 : content_length; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ContentType
|
public string ContentType
|
||||||
|
|
Loading…
Reference in New Issue
Block a user