diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 52b84febb8..c6c885bab0 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -3686,57 +3686,435 @@ namespace OpenSim.Framework /// the first name part (e.g. Test) /// the last name part (e.g User) /// the secret part - public static bool ParseUniversalUserIdentifier(string value, out UUID uuid, out string url, out string firstname, out string lastname, out string secret) + public static unsafe bool ParseUniversalUserIdentifier(string value, out UUID uuid, out string url, out string firstname, out string lastname, out string secret) { - uuid = UUID.Zero; - url = string.Empty; - firstname = "Unknown"; - lastname = "UserUPUUI"; secret = string.Empty; - string[] parts = value.Split(';'); - if (parts.Length < 1) - return false; - - if (!UUID.TryParse(parts[0], out uuid)) - return false; - - if (parts.Length >= 2) + if (value.Length == 36) { - url = parts[1].ToLower(); - - if (parts.Length >= 3) - { - string[] name = parts[2].Split(new char[] {' ' },StringSplitOptions.RemoveEmptyEntries); - if(name.Length > 0) - { - firstname = name[0]; - if (name.Length > 1) - lastname = name[1]; - } - - if (parts.Length >= 4) - secret = parts[3]; - } + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return UUID.TryParse(value, out uuid); } + + if (value.Length < 38) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + uuid = UUID.Zero; + return false; + } + + if (!UUID.TryParse(value.Substring(0, 36), out uuid)) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + int* seps = stackalloc int[3]; + int nseps = 0; + for (int i = 37; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + + if (nseps < 2) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + uuid = UUID.Zero; + return false; + } + + int indxA = seps[0] + 1; + int indxB = seps[1]; + url = value.Substring(indxA, indxB - indxA).Trim().ToLower(); + + ++indxB; + if (indxB >= value.Length) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + string n; + if (nseps == 2) + n = value.Substring(indxB).Trim(); + else + { + indxA = seps[2]; + n = value.Substring(indxB, indxA - indxB); + ++indxA; + if (indxA < value.Length) + secret = value.Substring(indxA); + } + + string[] name = n.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (name.Length == 0) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + firstname = name[0]; + lastname = (name.Length > 1) ? name[1] : string.Empty; + + return firstname.Length > 0; + } + + public static unsafe bool ParseFullUniversalUserIdentifier(string value, out UUID uuid, out string url, out string firstname, out string lastname, out string secret) + { + secret = string.Empty; + + if (value.Length < 38) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + uuid = UUID.Zero; + return false; + } + + if (!UUID.TryParse(value.Substring(0, 36), out uuid)) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + int* seps = stackalloc int[3]; + int nseps = 0; + for (int i = 37; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + + if (nseps < 2) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + uuid = UUID.Zero; + return false; + } + + int indxA = seps[0] + 1; + int indxB = seps[1]; + url = value.Substring(indxA, indxB - indxA).Trim().ToLower(); + + ++indxB; + if (indxB >= value.Length) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + string n; + if (nseps == 2) + n = value.Substring(indxB).Trim(); + else + { + indxA = seps[2]; + n = value.Substring(indxB, indxA - indxB); + ++indxA; + if (indxA < value.Length) + secret = value.Substring(indxA); + } + + string[] name = n.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (name.Length == 0) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + firstname = name[0]; + lastname = (name.Length > 1) ? name[1] : string.Empty; + + return firstname.Length > 0; + } + + public static unsafe bool ParseUniversalUserIdentifier(string value, out UUID uuid, out string url, out string firstname, out string lastname) + { + if (value.Length == 36) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return UUID.TryParse(value, out uuid); + } + + if (value.Length < 38) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + uuid = UUID.Zero; + return false; + } + + if (!UUID.TryParse(value.Substring(0, 36), out uuid)) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + int* seps = stackalloc int[3]; + int nseps = 0; + for (int i = 37; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + + if (nseps < 2) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + int indxA = seps[0] + 1; + int indxB = seps[1]; + url = value.Substring(indxA, indxB - indxA).Trim().ToLower(); + + ++indxB; + if (indxB >= value.Length) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + string n; + if (nseps == 2) + n = value.Substring(indxB); + else + n = value.Substring(indxB, seps[2] - indxB); + + string[] name = n.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (name.Length == 0) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + firstname = name[0]; + lastname = (name.Length > 1) ? name[1] : string.Empty; + + return firstname.Length > 0; + } + + public static unsafe bool ParseFullUniversalUserIdentifier(string value, out UUID uuid, out string url, out string firstname, out string lastname) + { + if (value.Length < 38) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + uuid = UUID.Zero; + return false; + } + + if (!UUID.TryParse(value.Substring(0, 36), out uuid)) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + int* seps = stackalloc int[3]; + int nseps = 0; + for (int i = 36; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + + if (nseps < 2) + { + url = string.Empty; + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + int indxA = seps[0] + 1; + int indxB = seps[1]; + url = value.Substring(indxA, indxB - indxA).Trim().ToLower(); + + ++indxB; + if (indxB >= value.Length) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + string n; + if (nseps == 2) + n = value.Substring(indxB); + else + n = value.Substring(indxB, seps[2] - indxB); + + string[] name = n.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (name.Length == 0) + { + firstname = string.Empty; + lastname = string.Empty; + return false; + } + + firstname = name[0]; + lastname = (name.Length > 1) ? name[1] : string.Empty; + + return firstname.Length > 0; + } + + public static unsafe bool ParseFullUniversalUserIdentifier(string value, out UUID uuid, out string url) + { + if (value.Length < 38) + { + url = string.Empty; + uuid = UUID.Zero; + return false; + } + + if (!UUID.TryParse(value.Substring(0, 36), out uuid)) + { + url = string.Empty; + return false; + } + + int* seps = stackalloc int[3]; + int nseps = 0; + for (int i = 36; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + + if (nseps < 2) + { + url = string.Empty; + uuid = UUID.Zero; + return false; + } + + int indxA = seps[0] + 1; + int indxB = seps[1]; + url = value.Substring(indxA, indxB - indxA).Trim().ToLower(); + + indxA = seps[1] + 3; + indxB = nseps > 2 ? seps[2] : value.Length; + + return indxA < indxB; + } + + public static unsafe bool ParseUniversalUserIdentifier(string value, out UUID uuid, out string url) + { + if (value.Length < 38) + { + url = string.Empty; + uuid = UUID.Zero; + return false; + } + + if (!UUID.TryParse(value.Substring(0, 36), out uuid)) + { + url = string.Empty; + return false; + } + + int* seps = stackalloc int[3]; + int nseps = 0; + for (int i = 36; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + + if (nseps < 2) + { + url = string.Empty; + uuid = UUID.Zero; + return false; + } + + int indxA = seps[0] + 1; + int indxB = seps[1]; + url = value.Substring(indxA, indxB - indxA).Trim().ToLower(); + return true; } - public static bool ParseUniversalUserIdentifier(string value, out UUID uuid, out string url) + public static unsafe bool ParseFullUniversalUserIdentifier(string value, out UUID uuid) { - uuid = UUID.Zero; - url = string.Empty; + if (value.Length < 38) + { + uuid = UUID.Zero; + return false; + } - string[] parts = value.Split(';'); - if (parts.Length < 1) + int nseps = 0; + int* seps = stackalloc int[3]; + for (int i = 36; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + if (nseps < 2) + { + uuid = UUID.Zero; + return false; + } + + if (!UUID.TryParse(value.Substring(0, seps[0]), out uuid)) return false; - if (!UUID.TryParse(parts[0], out uuid)) - return false; + int indxA = seps[1] + 3; + int indxB = nseps > 2 ? seps[2] : value.Length; - if (parts.Length >= 2) - url = parts[1].ToLower(); - return true; + return indxA < indxB; + } + + public static bool ParseUniversalUserIdentifier(string value, out UUID uuid) + { + if (value.Length < 36) + { + uuid = UUID.Zero; + return false; + } + return (value.Length == 36) ? UUID.TryParse(value, out uuid) : UUID.TryParse(value.Substring(0, 36), out uuid); + } + + public static unsafe string RemoveUniversalUserIdentifierSecret(string value) + { + if (value.Length < 39) + return value; + int nseps = 0; + int* seps = stackalloc int[3]; + for (int i = 36; i < value.Length && nseps < 3; ++i) + { + if (value[i] == ';') + seps[nseps++] = i; + } + if (nseps < 3) + return value; + return value.Substring(0, seps[3]); } /// @@ -3751,7 +4129,7 @@ namespace OpenSim.Framework return false; string[] parts = firstname.Split('.'); - if(parts.Length != 2) + if (parts.Length != 2) return false; realFirstName = parts[0].Trim();