Browse Source

Merge pull request #2400 from MediaBrowser/dev

Dev
Luke 8 years ago
parent
commit
890d9c60dc

+ 2 - 1
Emby.Server.Implementations/Connect/ConnectManager.cs

@@ -1122,7 +1122,7 @@ namespace Emby.Server.Implementations.Connect
             }
         }
 
-        public async Task Authenticate(string username, string passwordMd5)
+        public async Task<ConnectAuthenticationResult> Authenticate(string username, string passwordMd5)
         {
             if (string.IsNullOrWhiteSpace(username))
             {
@@ -1151,6 +1151,7 @@ namespace Emby.Server.Implementations.Connect
             // No need to examine the response
             using (var response = (await _httpClient.SendAsync(options, "POST").ConfigureAwait(false)).Content)
             {
+                return _json.DeserializeFromStream<ConnectAuthenticationResult>(response);
             }
         }
 

+ 2 - 1
Emby.Server.Implementations/Dto/DtoService.cs

@@ -1512,7 +1512,8 @@ namespace Emby.Server.Implementations.Dto
                     return artist;
                 }
             }
-            return item.GetParent();
+
+            return item.DisplayParent ?? item.GetParent();
         }
 
         private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOptions options, BaseItem owner)

+ 7 - 5
Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs

@@ -142,12 +142,14 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
                         }
                     }
                 }
-
-                var fullName = fileSystemInfo.FullName;
-
-                if (libraryManager.IsAudioFile(fullName, libraryOptions))
+                else
                 {
-                    return true;
+                    var fullName = fileSystemInfo.FullName;
+
+                    if (libraryManager.IsAudioFile(fullName, libraryOptions))
+                    {
+                        return true;
+                    }
                 }
             }
 

+ 47 - 13
Emby.Server.Implementations/Library/UserManager.cs

@@ -236,29 +236,63 @@ namespace Emby.Server.Implementations.Library
             var user = Users
                 .FirstOrDefault(i => string.Equals(username, i.Name, StringComparison.OrdinalIgnoreCase));
 
-            if (user == null)
-            {
-                throw new SecurityException("Invalid username or password entered.");
-            }
+            var success = false;
 
-            if (user.Policy.IsDisabled)
+            if (user != null)
             {
-                throw new SecurityException(string.Format("The {0} account is currently disabled. Please consult with your administrator.", user.Name));
-            }
+                // Authenticate using local credentials if not a guest
+                if (!user.ConnectLinkType.HasValue || user.ConnectLinkType.Value != UserLinkType.Guest)
+                {
+                    success = string.Equals(GetPasswordHash(user), passwordSha1.Replace("-", string.Empty), StringComparison.OrdinalIgnoreCase);
 
-            var success = false;
+                    if (!success && _networkManager.IsInLocalNetwork(remoteEndPoint) && user.Configuration.EnableLocalPassword)
+                    {
+                        success = string.Equals(GetLocalPasswordHash(user), passwordSha1.Replace("-", string.Empty), StringComparison.OrdinalIgnoreCase);
+                    }
+                }
 
-            // Authenticate using local credentials if not a guest
-            if (!user.ConnectLinkType.HasValue || user.ConnectLinkType.Value != UserLinkType.Guest)
+                // Maybe user accidently entered connect credentials. let's be flexible
+                if (!success && user.ConnectLinkType.HasValue && !string.IsNullOrWhiteSpace(passwordMd5) && !string.IsNullOrWhiteSpace(user.ConnectUserName))
+                {
+                    try
+                    {
+                        await _connectFactory().Authenticate(user.ConnectUserName, passwordMd5).ConfigureAwait(false);
+                        success = true;
+                    }
+                    catch
+                    {
+
+                    }
+                }
+            }
+
+            // Try originally entered username
+            if (!success && (user == null || !string.Equals(user.ConnectUserName, username, StringComparison.OrdinalIgnoreCase)))
             {
-                success = string.Equals(GetPasswordHash(user), passwordSha1.Replace("-", string.Empty), StringComparison.OrdinalIgnoreCase);
+                try
+                {
+                    var connectAuthResult = await _connectFactory().Authenticate(username, passwordMd5).ConfigureAwait(false);
 
-                if (!success && _networkManager.IsInLocalNetwork(remoteEndPoint) && user.Configuration.EnableLocalPassword)
+                    user = Users.FirstOrDefault(i => string.Equals(i.ConnectUserId, connectAuthResult.User.Id, StringComparison.OrdinalIgnoreCase));
+
+                    success = user != null;
+                }
+                catch
                 {
-                    success = string.Equals(GetLocalPasswordHash(user), passwordSha1.Replace("-", string.Empty), StringComparison.OrdinalIgnoreCase);
+
                 }
             }
 
+            if (user == null)
+            {
+                throw new SecurityException("Invalid username or password entered.");
+            }
+
+            if (user.Policy.IsDisabled)
+            {
+                throw new SecurityException(string.Format("The {0} account is currently disabled. Please consult with your administrator.", user.Name));
+            }
+
             // Update LastActivityDate and LastLoginDate, then save
             if (success)
             {

+ 1 - 1
MediaBrowser.Controller/Connect/IConnectManager.cs

@@ -61,7 +61,7 @@ namespace MediaBrowser.Controller.Connect
         /// <param name="username">The username.</param>
         /// <param name="passwordMd5">The password MD5.</param>
         /// <returns>Task.</returns>
-        Task Authenticate(string username, string passwordMd5);
+        Task<ConnectAuthenticationResult> Authenticate(string username, string passwordMd5);
 
         /// <summary>
         /// Gets the local user.

+ 39 - 31
Mono.Nat/Pmp/PmpNatDevice.cs

@@ -136,34 +136,36 @@ namespace Mono.Nat.Pmp
         {
             while (!cancellationToken.IsCancellationRequested)
             {
-                var result = await udpClient.ReceiveAsync().ConfigureAwait(false);
-                var endPoint = result.RemoteEndPoint;
-                byte[] data = data = result.Buffer;
+                try
+                {
+                    var result = await udpClient.ReceiveAsync().ConfigureAwait(false);
+                    var endPoint = result.RemoteEndPoint;
+                    byte[] data = data = result.Buffer;
 
-                if (data.Length < 16)
-                    continue;
+                    if (data.Length < 16)
+                        continue;
 
-                if (data[0] != PmpConstants.Version)
-                    continue;
+                    if (data[0] != PmpConstants.Version)
+                        continue;
 
-                var opCode = (byte)(data[1] & 127);
+                    var opCode = (byte)(data[1] & 127);
 
-                var protocol = Protocol.Tcp;
-                if (opCode == PmpConstants.OperationCodeUdp)
-                    protocol = Protocol.Udp;
+                    var protocol = Protocol.Tcp;
+                    if (opCode == PmpConstants.OperationCodeUdp)
+                        protocol = Protocol.Udp;
 
-                short resultCode = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 2));
-                int epoch = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data, 4));
+                    short resultCode = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 2));
+                    int epoch = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data, 4));
 
-                short privatePort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 8));
-                short publicPort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 10));
+                    short privatePort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 8));
+                    short publicPort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(data, 10));
 
-                var lifetime = (uint)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data, 12));
+                    var lifetime = (uint)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(data, 12));
 
-                if (privatePort < 0 || publicPort < 0 || resultCode != PmpConstants.ResultCodeSuccess)
-                {
-                    var errors = new[]
-                                     {
+                    if (privatePort < 0 || publicPort < 0 || resultCode != PmpConstants.ResultCodeSuccess)
+                    {
+                        var errors = new[]
+                                         {
                                          "Success",
                                          "Unsupported Version",
                                          "Not Authorized/Refused (e.g. box supports mapping, but user has turned feature off)"
@@ -173,19 +175,25 @@ namespace Mono.Nat.Pmp
                                          "Unsupported opcode"
                                      };
 
-                    var errorMsg = errors[resultCode];
-                    NatUtility.Log("Error in CreatePortMapListen: " + errorMsg);
-                    return;
-                }
+                        var errorMsg = errors[resultCode];
+                        NatUtility.Log("Error in CreatePortMapListen: " + errorMsg);
+                        return;
+                    }
 
-                if (lifetime == 0) return; //mapping was deleted
+                    if (lifetime == 0) return; //mapping was deleted
 
-                //mapping was created
-                //TODO: verify that the private port+protocol are a match
-                mapping.PublicPort = publicPort;
-                mapping.Protocol = protocol;
-                mapping.Expiration = DateTime.Now.AddSeconds(lifetime);
-                return;
+                    //mapping was created
+                    //TODO: verify that the private port+protocol are a match
+                    mapping.PublicPort = publicPort;
+                    mapping.Protocol = protocol;
+                    mapping.Expiration = DateTime.Now.AddSeconds(lifetime);
+                    return;
+                }
+                catch (Exception ex)
+                {
+                    NatUtility.Logger.ErrorException("Error in CreatePortMapListen", ex);
+                    return;
+                }
             }
         }