aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs')
-rw-r--r--OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs98
1 files changed, 78 insertions, 20 deletions
diff --git a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs
index 5f1bde1..aef3e9f 100644
--- a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs
+++ b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs
@@ -41,7 +41,7 @@ namespace OpenSim.Services.AuthenticationService
41 // Generic Authentication service used for identifying 41 // Generic Authentication service used for identifying
42 // and authenticating principals. 42 // and authenticating principals.
43 // Principals may be clients acting on users' behalf, 43 // Principals may be clients acting on users' behalf,
44 // or any other components that need 44 // or any other components that need
45 // verifiable identification. 45 // verifiable identification.
46 // 46 //
47 public class PasswordAuthenticationService : 47 public class PasswordAuthenticationService :
@@ -50,7 +50,13 @@ namespace OpenSim.Services.AuthenticationService
50 private static readonly ILog m_log = 50 private static readonly ILog m_log =
51 LogManager.GetLogger( 51 LogManager.GetLogger(
52 MethodBase.GetCurrentMethod().DeclaringType); 52 MethodBase.GetCurrentMethod().DeclaringType);
53 53
54 public PasswordAuthenticationService(IConfigSource config, IUserAccountService userService) :
55 base(config, userService)
56 {
57 m_log.Debug("[AUTH SERVICE]: Started with User Account access");
58 }
59
54 public PasswordAuthenticationService(IConfigSource config) : 60 public PasswordAuthenticationService(IConfigSource config) :
55 base(config) 61 base(config)
56 { 62 {
@@ -58,42 +64,94 @@ namespace OpenSim.Services.AuthenticationService
58 64
59 public string Authenticate(UUID principalID, string password, int lifetime) 65 public string Authenticate(UUID principalID, string password, int lifetime)
60 { 66 {
67 UUID realID;
68 return Authenticate(principalID, password, lifetime, out realID);
69 }
70
71 public string Authenticate(UUID principalID, string password, int lifetime, out UUID realID)
72 {
73 realID = UUID.Zero;
74
75 m_log.DebugFormat("[AUTH SERVICE]: Authenticating for {0}, user account service present: {1}", principalID, m_UserAccountService != null);
61 AuthenticationData data = m_Database.Get(principalID); 76 AuthenticationData data = m_Database.Get(principalID);
77 UserAccount user = null;
78 if (m_UserAccountService != null)
79 user = m_UserAccountService.GetUserAccount(UUID.Zero, principalID);
62 80
63 if (data == null) 81 if (data == null || data.Data == null)
64 { 82 {
65 m_log.DebugFormat("[AUTH SERVICE]: PrincipalID {0} not found", principalID); 83 m_log.DebugFormat("[AUTH SERVICE]: PrincipalID {0} or its data not found", principalID);
66 return String.Empty; 84 return String.Empty;
67 } 85 }
68 else if (data.Data == null) 86
87 if (!data.Data.ContainsKey("passwordHash") ||
88 !data.Data.ContainsKey("passwordSalt"))
89 {
90 m_log.DebugFormat("[AUTH SERVICE]: No credentials.");
91 return String.Empty;
92 }
93
94 string hashed = Util.Md5Hash(password + ":" +
95 data.Data["passwordSalt"].ToString());
96
97// m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}", password, hashed, data.Data["passwordHash"].ToString());
98
99 if (data.Data["passwordHash"].ToString() == hashed)
100 {
101 return GetToken(principalID, lifetime);
102 }
103
104 if (user == null)
69 { 105 {
70 m_log.DebugFormat("[AUTH SERVICE]: PrincipalID {0} data not found", principalID); 106 m_log.DebugFormat("[PASS AUTH]: No user record for {0}", principalID);
71 return String.Empty; 107 return String.Empty;
72 } 108 }
73 else if (!data.Data.ContainsKey("passwordHash") || !data.Data.ContainsKey("passwordSalt")) 109
110 int impersonateFlag = 1 << 6;
111
112 if ((user.UserFlags & impersonateFlag) == 0)
74 { 113 {
75 m_log.DebugFormat( 114 m_log.DebugFormat("[AUTH SERVICE]: Not trying impersonation {0} {1}.", user.UserFlags, impersonateFlag);
76 "[AUTH SERVICE]: PrincipalID {0} data didn't contain either passwordHash or passwordSalt", principalID);
77 return String.Empty; 115 return String.Empty;
78 } 116 }
79 else 117
118 m_log.DebugFormat("[PASS AUTH]: Attempting impersonation.");
119
120 List<UserAccount> accounts = m_UserAccountService.GetUserAccountsWhere(UUID.Zero, "UserLevel >= 200");
121 if (accounts == null || accounts.Count == 0)
122 return String.Empty;
123
124 foreach (UserAccount a in accounts)
80 { 125 {
81 string hashed = Util.Md5Hash(password + ":" + data.Data["passwordSalt"].ToString()); 126 data = m_Database.Get(a.PrincipalID);
127 if (data == null || data.Data == null ||
128 !data.Data.ContainsKey("passwordHash") ||
129 !data.Data.ContainsKey("passwordSalt"))
130 {
131 continue;
132 }
133
134// m_log.DebugFormat("[PASS AUTH]: Trying {0}", data.PrincipalID);
82 135
83 m_log.DebugFormat("[PASS AUTH]: got {0}; hashed = {1}; stored = {2}", password, hashed, data.Data["passwordHash"].ToString()); 136 hashed = Util.Md5Hash(password + ":" +
137 data.Data["passwordSalt"].ToString());
84 138
85 if (data.Data["passwordHash"].ToString() == hashed) 139 if (data.Data["passwordHash"].ToString() == hashed)
86 { 140 {
141 m_log.InfoFormat("[PASS AUTH]: {0} {1} impersonating {2}, proceeding with login", a.FirstName, a.LastName, principalID);
142 realID = a.PrincipalID;
87 return GetToken(principalID, lifetime); 143 return GetToken(principalID, lifetime);
88 } 144 }
89 else 145// else
90 { 146// {
91 m_log.DebugFormat( 147// m_log.DebugFormat(
92 "[AUTH SERVICE]: Salted hash {0} of given password did not match salted hash of {1} for PrincipalID {2}. Authentication failure.", 148// "[AUTH SERVICE]: Salted hash {0} of given password did not match salted hash of {1} for PrincipalID {2}. Authentication failure.",
93 hashed, data.Data["passwordHash"], principalID); 149// hashed, data.Data["passwordHash"], data.PrincipalID);
94 return String.Empty; 150// }
95 }
96 } 151 }
152
153 m_log.InfoFormat("[PASS AUTH]: Impersonation of {0} failed", principalID);
154 return String.Empty;
97 } 155 }
98 } 156 }
99} \ No newline at end of file 157}