diff options
Merge branch 'master' into 0.7-post-fixes
Diffstat (limited to 'OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs')
-rw-r--r-- | OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | 945 |
1 files changed, 606 insertions, 339 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 7ebb5de..e57aaa0 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | |||
@@ -998,6 +998,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
998 | string firstname = (string) requestData["user_firstname"]; | 998 | string firstname = (string) requestData["user_firstname"]; |
999 | string lastname = (string) requestData["user_lastname"]; | 999 | string lastname = (string) requestData["user_lastname"]; |
1000 | string passwd = (string) requestData["user_password"]; | 1000 | string passwd = (string) requestData["user_password"]; |
1001 | |||
1001 | uint regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); | 1002 | uint regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); |
1002 | uint regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); | 1003 | uint regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); |
1003 | 1004 | ||
@@ -1005,28 +1006,25 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1005 | if (requestData.Contains("user_email")) | 1006 | if (requestData.Contains("user_email")) |
1006 | email = (string)requestData["user_email"]; | 1007 | email = (string)requestData["user_email"]; |
1007 | 1008 | ||
1008 | UUID scopeID = m_app.SceneManager.CurrentOrFirstScene.RegionInfo.ScopeID; | 1009 | Scene scene = m_app.SceneManager.CurrentOrFirstScene; |
1009 | 1010 | UUID scopeID = scene.RegionInfo.ScopeID; | |
1010 | UserAccount account = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.GetUserAccount(scopeID, firstname, lastname); | ||
1011 | |||
1012 | if (null != account) | ||
1013 | throw new Exception(String.Format("Account {0} {1} already exists", firstname, lastname)); | ||
1014 | 1011 | ||
1015 | account = new UserAccount(scopeID, firstname, lastname, email); | 1012 | UserAccount account = CreateUser(scopeID, firstname, lastname, passwd, email); |
1016 | 1013 | ||
1017 | bool success = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.StoreUserAccount(account); | 1014 | if (null == account) |
1018 | |||
1019 | if (!success) | ||
1020 | throw new Exception(String.Format("failed to create new user {0} {1}", | 1015 | throw new Exception(String.Format("failed to create new user {0} {1}", |
1021 | firstname, lastname)); | 1016 | firstname, lastname)); |
1022 | 1017 | ||
1023 | // Store the password | 1018 | // Set home position |
1024 | m_app.SceneManager.CurrentOrFirstScene.AuthenticationService.SetPassword(account.PrincipalID, passwd); | ||
1025 | 1019 | ||
1026 | GridRegion home = m_app.SceneManager.CurrentOrFirstScene.GridService.GetRegionByPosition(scopeID, | 1020 | GridRegion home = scene.GridService.GetRegionByPosition(scopeID, |
1027 | (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); | 1021 | (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); |
1028 | if (home == null) | 1022 | if (null == home) { |
1029 | m_log.WarnFormat("[RADMIN]: Unable to set home region for newly created user account {0} {1}", firstname, lastname); | 1023 | m_log.WarnFormat("[RADMIN]: Unable to set home region for newly created user account {0} {1}", firstname, lastname); |
1024 | } else { | ||
1025 | scene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); | ||
1026 | m_log.DebugFormat("[RADMIN]: Set home region {0} for updated user account {1} {2}", home.RegionID, firstname, lastname); | ||
1027 | } | ||
1030 | 1028 | ||
1031 | // Establish the avatar's initial appearance | 1029 | // Establish the avatar's initial appearance |
1032 | 1030 | ||
@@ -1169,9 +1167,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1169 | /// <item><term>start_region_y</term> | 1167 | /// <item><term>start_region_y</term> |
1170 | /// <description>avatar's start region coordinates, Y | 1168 | /// <description>avatar's start region coordinates, Y |
1171 | /// value (changeable)</description></item> | 1169 | /// value (changeable)</description></item> |
1172 | /// <item><term>about_real_world</term> | 1170 | /// <item><term>about_real_world (not implemented yet)</term> |
1173 | /// <description>"about" text of avatar owner (changeable)</description></item> | 1171 | /// <description>"about" text of avatar owner (changeable)</description></item> |
1174 | /// <item><term>about_virtual_world</term> | 1172 | /// <item><term>about_virtual_world (not implemented yet)</term> |
1175 | /// <description>"about" text of avatar (changeable)</description></item> | 1173 | /// <description>"about" text of avatar (changeable)</description></item> |
1176 | /// </list> | 1174 | /// </list> |
1177 | /// | 1175 | /// |
@@ -1182,6 +1180,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1182 | /// <description>true or false</description></item> | 1180 | /// <description>true or false</description></item> |
1183 | /// <item><term>error</term> | 1181 | /// <item><term>error</term> |
1184 | /// <description>error message if success is false</description></item> | 1182 | /// <description>error message if success is false</description></item> |
1183 | /// <item><term>avatar_uuid</term> | ||
1184 | /// <description>UUID of the updated avatar | ||
1185 | /// account; UUID.Zero if failed. | ||
1186 | /// </description></item> | ||
1185 | /// </list> | 1187 | /// </list> |
1186 | /// </remarks> | 1188 | /// </remarks> |
1187 | 1189 | ||
@@ -1189,31 +1191,34 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1189 | { | 1191 | { |
1190 | m_log.Info("[RADMIN]: UpdateUserAccount: new request"); | 1192 | m_log.Info("[RADMIN]: UpdateUserAccount: new request"); |
1191 | m_log.Warn("[RADMIN]: This method needs update for 0.7"); | 1193 | m_log.Warn("[RADMIN]: This method needs update for 0.7"); |
1194 | |||
1195 | FailIfRemoteAdminDisabled("UpdateUserAccount"); | ||
1196 | |||
1192 | XmlRpcResponse response = new XmlRpcResponse(); | 1197 | XmlRpcResponse response = new XmlRpcResponse(); |
1193 | Hashtable responseData = new Hashtable(); | 1198 | Hashtable responseData = new Hashtable(); |
1194 | 1199 | ||
1195 | //lock (rslock) | 1200 | lock (rslock) |
1196 | //{ | 1201 | { |
1197 | // try | 1202 | try |
1198 | // { | 1203 | { |
1199 | // Hashtable requestData = (Hashtable) request.Params[0]; | 1204 | Hashtable requestData = (Hashtable) request.Params[0]; |
1200 | 1205 | ||
1201 | // // check completeness | 1206 | // check completeness |
1202 | // checkStringParameters(request, new string[] { | 1207 | checkStringParameters(request, new string[] { |
1203 | // "password", "user_firstname", | 1208 | "password", "user_firstname", |
1204 | // "user_lastname"}); | 1209 | "user_lastname"}); |
1205 | 1210 | ||
1206 | // // check password | 1211 | // check password |
1207 | // if (!String.IsNullOrEmpty(m_requiredPassword) && | 1212 | if (!String.IsNullOrEmpty(m_requiredPassword) && |
1208 | // (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | 1213 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); |
1209 | 1214 | ||
1210 | // // do the job | 1215 | // do the job |
1211 | // string firstname = (string) requestData["user_firstname"]; | 1216 | string firstname = (string) requestData["user_firstname"]; |
1212 | // string lastname = (string) requestData["user_lastname"]; | 1217 | string lastname = (string) requestData["user_lastname"]; |
1213 | 1218 | ||
1214 | // string passwd = String.Empty; | 1219 | string passwd = String.Empty; |
1215 | // uint? regX = null; | 1220 | uint? regX = null; |
1216 | // uint? regY = null; | 1221 | uint? regY = null; |
1217 | // uint? ulaX = null; | 1222 | // uint? ulaX = null; |
1218 | // uint? ulaY = null; | 1223 | // uint? ulaY = null; |
1219 | // uint? ulaZ = null; | 1224 | // uint? ulaZ = null; |
@@ -1223,11 +1228,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1223 | // string aboutFirstLive = String.Empty; | 1228 | // string aboutFirstLive = String.Empty; |
1224 | // string aboutAvatar = String.Empty; | 1229 | // string aboutAvatar = String.Empty; |
1225 | 1230 | ||
1226 | // if (requestData.ContainsKey("user_password")) passwd = (string) requestData["user_password"]; | 1231 | if (requestData.ContainsKey("user_password")) passwd = (string) requestData["user_password"]; |
1227 | // if (requestData.ContainsKey("start_region_x")) | 1232 | if (requestData.ContainsKey("start_region_x")) |
1228 | // regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); | 1233 | regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); |
1229 | // if (requestData.ContainsKey("start_region_y")) | 1234 | if (requestData.ContainsKey("start_region_y")) |
1230 | // regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); | 1235 | regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); |
1231 | 1236 | ||
1232 | // if (requestData.ContainsKey("start_lookat_x")) | 1237 | // if (requestData.ContainsKey("start_lookat_x")) |
1233 | // ulaX = Convert.ToUInt32((Int32) requestData["start_lookat_x"]); | 1238 | // ulaX = Convert.ToUInt32((Int32) requestData["start_lookat_x"]); |
@@ -1247,21 +1252,18 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1247 | // if (requestData.ContainsKey("about_virtual_world")) | 1252 | // if (requestData.ContainsKey("about_virtual_world")) |
1248 | // aboutAvatar = (string)requestData["about_virtual_world"]; | 1253 | // aboutAvatar = (string)requestData["about_virtual_world"]; |
1249 | 1254 | ||
1250 | // UserProfileData userProfile | 1255 | Scene scene = m_app.SceneManager.CurrentOrFirstScene; |
1251 | // = m_app.CommunicationsManager.UserService.GetUserProfile(firstname, lastname); | 1256 | UUID scopeID = scene.RegionInfo.ScopeID; |
1252 | 1257 | UserAccount account = scene.UserAccountService.GetUserAccount(scopeID, firstname, lastname); | |
1253 | // if (null == userProfile) | ||
1254 | // throw new Exception(String.Format("avatar {0} {1} does not exist", firstname, lastname)); | ||
1255 | 1258 | ||
1256 | // if (!String.IsNullOrEmpty(passwd)) | 1259 | if (null == account) |
1257 | // { | 1260 | throw new Exception(String.Format("avatar {0} {1} does not exist", firstname, lastname)); |
1258 | // m_log.DebugFormat("[RADMIN]: UpdateUserAccount: updating password for avatar {0} {1}", firstname, lastname); | ||
1259 | // string md5PasswdHash = Util.Md5Hash(Util.Md5Hash(passwd) + ":" + String.Empty); | ||
1260 | // userProfile.PasswordHash = md5PasswdHash; | ||
1261 | // } | ||
1262 | 1261 | ||
1263 | // if (null != regX) userProfile.HomeRegionX = (uint) regX; | 1262 | if (!String.IsNullOrEmpty(passwd)) |
1264 | // if (null != regY) userProfile.HomeRegionY = (uint) regY; | 1263 | { |
1264 | m_log.DebugFormat("[RADMIN]: UpdateUserAccount: updating password for avatar {0} {1}", firstname, lastname); | ||
1265 | ChangeUserPassword(firstname, lastname, passwd); | ||
1266 | } | ||
1265 | 1267 | ||
1266 | // if (null != usaX) userProfile.HomeLocationX = (uint) usaX; | 1268 | // if (null != usaX) userProfile.HomeLocationX = (uint) usaX; |
1267 | // if (null != usaY) userProfile.HomeLocationY = (uint) usaY; | 1269 | // if (null != usaY) userProfile.HomeLocationY = (uint) usaY; |
@@ -1274,35 +1276,48 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1274 | // if (String.Empty != aboutFirstLive) userProfile.FirstLifeAboutText = aboutFirstLive; | 1276 | // if (String.Empty != aboutFirstLive) userProfile.FirstLifeAboutText = aboutFirstLive; |
1275 | // if (String.Empty != aboutAvatar) userProfile.AboutText = aboutAvatar; | 1277 | // if (String.Empty != aboutAvatar) userProfile.AboutText = aboutAvatar; |
1276 | 1278 | ||
1277 | // // User has been created. Now establish gender and appearance. | 1279 | // Set home position |
1278 | 1280 | ||
1279 | // updateUserAppearance(responseData, requestData, userProfile.ID); | 1281 | if ((null != regX) && (null != regY)) |
1282 | { | ||
1283 | GridRegion home = scene.GridService.GetRegionByPosition(scopeID, | ||
1284 | (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); | ||
1285 | if (null == home) { | ||
1286 | m_log.WarnFormat("[RADMIN]: Unable to set home region for updated user account {0} {1}", firstname, lastname); | ||
1287 | } else { | ||
1288 | scene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); | ||
1289 | m_log.DebugFormat("[RADMIN]: Set home region {0} for updated user account {1} {2}", home.RegionID, firstname, lastname); | ||
1290 | } | ||
1291 | } | ||
1280 | 1292 | ||
1281 | // if (!m_app.CommunicationsManager.UserService.UpdateUserProfile(userProfile)) | 1293 | // User has been created. Now establish gender and appearance. |
1282 | // throw new Exception("did not manage to update user profile"); | ||
1283 | 1294 | ||
1284 | // responseData["success"] = true; | 1295 | updateUserAppearance(responseData, requestData, account.PrincipalID); |
1285 | 1296 | ||
1286 | // response.Value = responseData; | 1297 | responseData["success"] = true; |
1298 | responseData["avatar_uuid"] = account.PrincipalID.ToString(); | ||
1287 | 1299 | ||
1288 | // m_log.InfoFormat("[RADMIN]: UpdateUserAccount: account for user {0} {1} updated, UUID {2}", | 1300 | response.Value = responseData; |
1289 | // firstname, lastname, | ||
1290 | // userProfile.ID); | ||
1291 | // } | ||
1292 | // catch (Exception e) | ||
1293 | // { | ||
1294 | // m_log.ErrorFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.Message); | ||
1295 | // m_log.DebugFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.ToString()); | ||
1296 | 1301 | ||
1297 | // responseData["success"] = false; | 1302 | m_log.InfoFormat("[RADMIN]: UpdateUserAccount: account for user {0} {1} updated, UUID {2}", |
1298 | // responseData["error"] = e.Message; | 1303 | firstname, lastname, |
1304 | account.PrincipalID); | ||
1305 | } | ||
1306 | catch (Exception e) | ||
1307 | { | ||
1299 | 1308 | ||
1300 | // response.Value = responseData; | 1309 | m_log.ErrorFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.Message); |
1301 | // } | 1310 | m_log.DebugFormat("[RADMIN] UpdateUserAccount: failed: {0}", e.ToString()); |
1302 | //} | ||
1303 | 1311 | ||
1304 | m_log.Info("[RADMIN]: UpdateUserAccount: request complete"); | 1312 | responseData["success"] = false; |
1305 | return response; | 1313 | responseData["avatar_uuid"] = UUID.Zero.ToString(); |
1314 | responseData["error"] = e.Message; | ||
1315 | |||
1316 | response.Value = responseData; | ||
1317 | } | ||
1318 | m_log.Info("[RADMIN]: UpdateUserAccount: request complete"); | ||
1319 | return response; | ||
1320 | } | ||
1306 | } | 1321 | } |
1307 | 1322 | ||
1308 | /// <summary> | 1323 | /// <summary> |
@@ -1316,73 +1331,74 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1316 | private void updateUserAppearance(Hashtable responseData, Hashtable requestData, UUID userid) | 1331 | private void updateUserAppearance(Hashtable responseData, Hashtable requestData, UUID userid) |
1317 | { | 1332 | { |
1318 | m_log.DebugFormat("[RADMIN] updateUserAppearance"); | 1333 | m_log.DebugFormat("[RADMIN] updateUserAppearance"); |
1319 | m_log.Warn("[RADMIN]: This method needs update for 0.7"); | ||
1320 | 1334 | ||
1321 | //string dmale = m_config.GetString("default_male", "Default Male"); | 1335 | string dmale = m_config.GetString("default_male", "Default Male"); |
1322 | //string dfemale = m_config.GetString("default_female", "Default Female"); | 1336 | string dfemale = m_config.GetString("default_female", "Default Female"); |
1323 | //string dneut = m_config.GetString("default_female", "Default Default"); | 1337 | string dneut = m_config.GetString("default_female", "Default Default"); |
1324 | string model = String.Empty; | 1338 | string model = String.Empty; |
1325 | 1339 | ||
1326 | //// Has a gender preference been supplied? | 1340 | // Has a gender preference been supplied? |
1327 | 1341 | ||
1328 | //if (requestData.Contains("gender")) | 1342 | if (requestData.Contains("gender")) |
1329 | //{ | 1343 | { |
1330 | // switch ((string)requestData["gender"]) | 1344 | switch ((string)requestData["gender"]) |
1331 | // { | 1345 | { |
1332 | // case "m" : | 1346 | case "m" : |
1333 | // model = dmale; | 1347 | case "male" : |
1334 | // break; | 1348 | model = dmale; |
1335 | // case "f" : | 1349 | break; |
1336 | // model = dfemale; | 1350 | case "f" : |
1337 | // break; | 1351 | case "female" : |
1338 | // case "n" : | 1352 | model = dfemale; |
1339 | // default : | 1353 | break; |
1340 | // model = dneut; | 1354 | case "n" : |
1341 | // break; | 1355 | case "neutral" : |
1342 | // } | 1356 | default : |
1343 | //} | 1357 | model = dneut; |
1344 | 1358 | break; | |
1345 | //// Has an explicit model been specified? | 1359 | } |
1346 | 1360 | } | |
1347 | //if (requestData.Contains("model")) | 1361 | |
1348 | //{ | 1362 | // Has an explicit model been specified? |
1349 | // model = (string)requestData["model"]; | 1363 | |
1350 | //} | 1364 | if (requestData.Contains("model") && (String.IsNullOrEmpty((string)requestData["gender"]))) |
1351 | 1365 | { | |
1352 | //// No appearance attributes were set | 1366 | model = (string)requestData["model"]; |
1353 | 1367 | } | |
1354 | //if (model == String.Empty) | 1368 | |
1355 | //{ | 1369 | // No appearance attributes were set |
1356 | // m_log.DebugFormat("[RADMIN] Appearance update not requested"); | 1370 | |
1357 | // return; | 1371 | if (String.IsNullOrEmpty(model)) |
1358 | //} | 1372 | { |
1359 | 1373 | m_log.DebugFormat("[RADMIN] Appearance update not requested"); | |
1360 | //m_log.DebugFormat("[RADMIN] Setting appearance for avatar {0}, using model {1}", userid, model); | 1374 | return; |
1361 | 1375 | } | |
1362 | //string[] nomens = model.Split(); | 1376 | |
1363 | //if (nomens.Length != 2) | 1377 | m_log.DebugFormat("[RADMIN] Setting appearance for avatar {0}, using model <{1}>", userid, model); |
1364 | //{ | 1378 | |
1365 | // m_log.WarnFormat("[RADMIN] User appearance not set for {0}. Invalid model name : <{1}>", userid, model); | 1379 | string[] nomens = model.Split(); |
1366 | // // nomens = dmodel.Split(); | 1380 | if (nomens.Length != 2) |
1367 | // return; | 1381 | { |
1368 | //} | 1382 | m_log.WarnFormat("[RADMIN] User appearance not set for {0}. Invalid model name : <{1}>", userid, model); |
1369 | 1383 | // nomens = dmodel.Split(); | |
1370 | //UserProfileData mprof = m_app.CommunicationsManager.UserService.GetUserProfile(nomens[0], nomens[1]); | 1384 | return; |
1371 | 1385 | } | |
1372 | //// Is this the first time one of the default models has been used? Create it if that is the case | 1386 | |
1373 | //// otherwise default to male. | 1387 | Scene scene = m_app.SceneManager.CurrentOrFirstScene; |
1374 | 1388 | UUID scopeID = scene.RegionInfo.ScopeID; | |
1375 | //if (mprof == null) | 1389 | UserAccount mprof = scene.UserAccountService.GetUserAccount(scopeID, nomens[0], nomens[1]); |
1376 | //{ | 1390 | |
1377 | // m_log.WarnFormat("[RADMIN] Requested model ({0}) not found. Appearance unchanged", model); | 1391 | if (mprof == null) |
1378 | // return; | 1392 | { |
1379 | //} | 1393 | m_log.WarnFormat("[RADMIN] Requested model ({0}) not found. Appearance unchanged", model); |
1380 | 1394 | return; | |
1381 | //// Set current user's appearance. This bit is easy. The appearance structure is populated with | 1395 | } |
1382 | //// actual asset ids, however to complete the magic we need to populate the inventory with the | 1396 | |
1383 | //// assets in question. | 1397 | // Set current user's appearance. This bit is easy. The appearance structure is populated with |
1384 | 1398 | // actual asset ids, however to complete the magic we need to populate the inventory with the | |
1385 | //establishAppearance(userid, mprof.ID); | 1399 | // assets in question. |
1400 | |||
1401 | establishAppearance(userid, mprof.PrincipalID); | ||
1386 | 1402 | ||
1387 | m_log.DebugFormat("[RADMIN] Finished setting appearance for avatar {0}, using model {1}", | 1403 | m_log.DebugFormat("[RADMIN] Finished setting appearance for avatar {0}, using model {1}", |
1388 | userid, model); | 1404 | userid, model); |
@@ -1397,116 +1413,312 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1397 | private void establishAppearance(UUID dest, UUID srca) | 1413 | private void establishAppearance(UUID dest, UUID srca) |
1398 | { | 1414 | { |
1399 | m_log.DebugFormat("[RADMIN] Initializing inventory for {0} from {1}", dest, srca); | 1415 | m_log.DebugFormat("[RADMIN] Initializing inventory for {0} from {1}", dest, srca); |
1416 | Scene scene = m_app.SceneManager.CurrentOrFirstScene; | ||
1400 | AvatarAppearance ava = null; | 1417 | AvatarAppearance ava = null; |
1401 | AvatarData avatar = m_app.SceneManager.CurrentOrFirstScene.AvatarService.GetAvatar(srca); | 1418 | AvatarData avatar = scene.AvatarService.GetAvatar(srca); |
1402 | if (avatar != null) | 1419 | if (avatar != null) |
1403 | ava = avatar.ToAvatarAppearance(srca); | 1420 | ava = avatar.ToAvatarAppearance(srca); |
1404 | 1421 | ||
1405 | // If the model has no associated appearance we're done. | 1422 | // If the model has no associated appearance we're done. |
1406 | |||
1407 | // if (ava == null) | ||
1408 | // { | ||
1409 | // return new AvatarAppearance(); | ||
1410 | // } | ||
1411 | |||
1412 | if (ava == null) | 1423 | if (ava == null) |
1413 | return; | 1424 | return; |
1414 | 1425 | ||
1415 | UICallback sic = new UICallback(); | 1426 | // Simple appearance copy or copy Clothing and Bodyparts folders? |
1416 | UICallback dic = new UICallback(); | 1427 | bool copyFolders = m_config.GetBoolean("copy_folders", false); |
1417 | IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; | 1428 | |
1429 | if (!copyFolders) | ||
1430 | { | ||
1431 | // Simple copy of wearables and appearance update | ||
1432 | try | ||
1433 | { | ||
1434 | copyWearablesAndAttachments(dest, srca, ava); | ||
1418 | 1435 | ||
1436 | AvatarData adata = new AvatarData(ava); | ||
1437 | scene.AvatarService.SetAvatar(dest, adata); | ||
1438 | } | ||
1439 | catch (Exception e) | ||
1440 | { | ||
1441 | m_log.WarnFormat("[RADMIN] Error transferring appearance for {0} : {1}", | ||
1442 | dest, e.Message); | ||
1443 | } | ||
1444 | |||
1445 | return; | ||
1446 | } | ||
1447 | |||
1448 | // Copy Clothing and Bodypart folders and appearance update | ||
1419 | try | 1449 | try |
1420 | { | 1450 | { |
1421 | Dictionary<UUID,UUID> imap = new Dictionary<UUID,UUID>(); | 1451 | Dictionary<UUID,UUID> imap = new Dictionary<UUID,UUID>(); |
1452 | copyInventoryFolders(dest, srca, AssetType.Clothing, imap, ava); | ||
1453 | copyInventoryFolders(dest, srca, AssetType.Bodypart, imap, ava); | ||
1422 | 1454 | ||
1423 | iserv.GetUserInventory(dest, dic.callback); | 1455 | AvatarWearable[] wearables = ava.Wearables; |
1424 | iserv.GetUserInventory(srca, sic.callback); | ||
1425 | |||
1426 | dic.GetInventory(); | ||
1427 | sic.GetInventory(); | ||
1428 | 1456 | ||
1429 | if (sic.OK && dic.OK) | 1457 | for (int i=0; i<wearables.Length; i++) |
1430 | { | 1458 | { |
1431 | InventoryFolderImpl efolder; | 1459 | if (imap.ContainsKey(wearables[i].ItemID)) |
1432 | InventoryFolderImpl srcf = sic.root.FindFolderForType(5); | 1460 | { |
1433 | InventoryFolderImpl dstf = dic.root.FindFolderForType(5); | 1461 | AvatarWearable dw = new AvatarWearable(); |
1462 | dw.AssetID = wearables[i].AssetID; | ||
1463 | dw.ItemID = imap[wearables[i].ItemID]; | ||
1464 | ava.SetWearable(i, dw); | ||
1465 | } | ||
1466 | } | ||
1467 | |||
1468 | AvatarData adata = new AvatarData(ava); | ||
1469 | scene.AvatarService.SetAvatar(dest, adata); | ||
1470 | } | ||
1471 | catch (Exception e) | ||
1472 | { | ||
1473 | m_log.WarnFormat("[RADMIN] Error transferring appearance for {0} : {1}", | ||
1474 | dest, e.Message); | ||
1475 | } | ||
1434 | 1476 | ||
1435 | if (srcf == null || dstf == null) | 1477 | return; |
1436 | throw new Exception("Cannot locate clothing folder(s)"); | 1478 | } |
1479 | |||
1480 | /// <summary> | ||
1481 | /// This method is called by establishAppearance to do a copy all inventory items | ||
1482 | /// worn or attached to the Clothing inventory folder of the receiving avatar. | ||
1483 | /// In parallel the avatar wearables and attachments are updated. | ||
1484 | /// </summary> | ||
1485 | |||
1486 | private void copyWearablesAndAttachments(UUID dest, UUID srca, AvatarAppearance ava) | ||
1487 | { | ||
1488 | IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; | ||
1437 | 1489 | ||
1438 | foreach (InventoryFolderImpl folder in sic.folders) | 1490 | // Get Clothing folder of receiver |
1491 | InventoryFolderBase dstf = iserv.GetFolderForType(dest, AssetType.Clothing); | ||
1492 | |||
1493 | if (dstf == null) | ||
1494 | throw new Exception("Cannot locate folder(s)"); | ||
1495 | |||
1496 | // Missing destination folder? This should *never* be the case | ||
1497 | if (dstf.Type != (short)AssetType.Clothing) | ||
1498 | { | ||
1499 | dstf = new InventoryFolderBase(); | ||
1500 | dstf.ID = UUID.Random(); | ||
1501 | dstf.Name = "Clothing"; | ||
1502 | dstf.Owner = dest; | ||
1503 | dstf.Type = (short)AssetType.Clothing; | ||
1504 | dstf.ParentID = iserv.GetRootFolder(dest).ID; | ||
1505 | dstf.Version = 1; | ||
1506 | iserv.AddFolder(dstf); // store base record | ||
1507 | m_log.ErrorFormat("[RADMIN] Created folder for destination {0}", srca); | ||
1508 | } | ||
1509 | |||
1510 | // Wearables | ||
1511 | AvatarWearable[] wearables = ava.Wearables; | ||
1512 | AvatarWearable wearable; | ||
1513 | |||
1514 | for (int i=0; i<wearables.Length; i++) | ||
1515 | { | ||
1516 | wearable = wearables[i]; | ||
1517 | if (wearable.ItemID != UUID.Zero) | ||
1518 | { | ||
1519 | // Get inventory item and copy it | ||
1520 | InventoryItemBase item = new InventoryItemBase(wearable.ItemID, srca); | ||
1521 | item = iserv.GetItem(item); | ||
1522 | |||
1523 | if (item != null) | ||
1439 | { | 1524 | { |
1440 | if (folder.ParentID == srcf.ID) | 1525 | InventoryItemBase dsti = new InventoryItemBase(UUID.Random(), dest); |
1441 | { | 1526 | dsti.Name = item.Name; |
1442 | efolder = new InventoryFolderImpl(); | 1527 | dsti.Description = item.Description; |
1443 | efolder.ID = UUID.Random(); | 1528 | dsti.InvType = item.InvType; |
1444 | efolder.Name = folder.Name; | 1529 | dsti.CreatorId = item.CreatorId; |
1445 | efolder.Type = folder.Type; | 1530 | dsti.CreatorIdAsUuid = item.CreatorIdAsUuid; |
1446 | efolder.Version = folder.Version; | 1531 | dsti.NextPermissions = item.NextPermissions; |
1447 | efolder.Owner = dest; | 1532 | dsti.CurrentPermissions = item.CurrentPermissions; |
1448 | dstf.AddChildFolder(efolder); | 1533 | dsti.BasePermissions = item.BasePermissions; |
1449 | iserv.AddFolder(efolder); | 1534 | dsti.EveryOnePermissions = item.EveryOnePermissions; |
1450 | m_log.DebugFormat("[RADMIN] Added outfile folder {0} to folder {1}", efolder.ID, srcf.ID); | 1535 | dsti.GroupPermissions = item.GroupPermissions; |
1451 | foreach (InventoryItemBase item in sic.items) | 1536 | dsti.AssetType = item.AssetType; |
1452 | { | 1537 | dsti.AssetID = item.AssetID; |
1453 | if (item.Folder == folder.ID) | 1538 | dsti.GroupID = item.GroupID; |
1454 | { | 1539 | dsti.GroupOwned = item.GroupOwned; |
1455 | InventoryItemBase dsti = new InventoryItemBase(); | 1540 | dsti.SalePrice = item.SalePrice; |
1456 | dsti.ID = UUID.Random(); | 1541 | dsti.SaleType = item.SaleType; |
1457 | dsti.Name = item.Name; | 1542 | dsti.Flags = item.Flags; |
1458 | dsti.Description = item.Description; | 1543 | dsti.CreationDate = item.CreationDate; |
1459 | dsti.InvType = item.InvType; | 1544 | dsti.Folder = dstf.ID; |
1460 | dsti.AssetType = item.AssetType; | 1545 | |
1461 | dsti.Flags = item.Flags; | 1546 | iserv.AddItem(dsti); |
1462 | dsti.AssetID = item.AssetID; | 1547 | m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", dsti.ID, dstf.ID); |
1463 | dsti.Folder = efolder.ID; | 1548 | |
1464 | dsti.Owner = dest; | 1549 | // Wear item |
1465 | dsti.BasePermissions = item.BasePermissions; | 1550 | AvatarWearable dw = new AvatarWearable(); |
1466 | dsti.NextPermissions = item.NextPermissions; | 1551 | dw.AssetID = wearable.AssetID; |
1467 | dsti.CurrentPermissions = item.CurrentPermissions; | 1552 | dw.ItemID = dsti.ID; |
1468 | dsti.GroupPermissions = item.GroupPermissions; | 1553 | ava.SetWearable(i, dw); |
1469 | dsti.EveryOnePermissions = item.EveryOnePermissions; | ||
1470 | iserv.AddItem(dsti); | ||
1471 | imap.Add(item.ID, dsti.ID); | ||
1472 | m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", dsti.ID, efolder.ID); | ||
1473 | } | ||
1474 | } | ||
1475 | } | ||
1476 | } | 1554 | } |
1477 | 1555 | else | |
1478 | // Update appearance tables | ||
1479 | AvatarWearable[] wearables = ava.Wearables; | ||
1480 | for (int i=0; i<wearables.Length; i++) | ||
1481 | { | 1556 | { |
1482 | if (imap.ContainsKey(wearables[i].ItemID)) | 1557 | m_log.WarnFormat("[RADMIN] Error transferring {0} to folder {1}", wearable.ItemID, dstf.ID); |
1483 | { | ||
1484 | AvatarWearable dw = new AvatarWearable(); | ||
1485 | dw.AssetID = wearables[i].AssetID; | ||
1486 | dw.ItemID = imap[wearables[i].ItemID]; | ||
1487 | ava.SetWearable(i, dw); | ||
1488 | } | ||
1489 | } | 1558 | } |
1490 | } | 1559 | } |
1491 | else | 1560 | } |
1561 | |||
1562 | // Attachments | ||
1563 | Dictionary<int, UUID[]> attachments = ava.GetAttachmentDictionary(); | ||
1564 | |||
1565 | foreach (KeyValuePair<int, UUID[]> kvp in attachments) | ||
1566 | { | ||
1567 | int attachpoint = kvp.Key; | ||
1568 | UUID itemID = kvp.Value[0]; | ||
1569 | |||
1570 | if (itemID != UUID.Zero) | ||
1492 | { | 1571 | { |
1493 | throw new Exception("Unable to load both inventories"); | 1572 | // Get inventory item and copy it |
1573 | InventoryItemBase item = new InventoryItemBase(itemID, srca); | ||
1574 | item = iserv.GetItem(item); | ||
1575 | |||
1576 | if (item != null) | ||
1577 | { | ||
1578 | InventoryItemBase dsti = new InventoryItemBase(UUID.Random(), dest); | ||
1579 | dsti.Name = item.Name; | ||
1580 | dsti.Description = item.Description; | ||
1581 | dsti.InvType = item.InvType; | ||
1582 | dsti.CreatorId = item.CreatorId; | ||
1583 | dsti.CreatorIdAsUuid = item.CreatorIdAsUuid; | ||
1584 | dsti.NextPermissions = item.NextPermissions; | ||
1585 | dsti.CurrentPermissions = item.CurrentPermissions; | ||
1586 | dsti.BasePermissions = item.BasePermissions; | ||
1587 | dsti.EveryOnePermissions = item.EveryOnePermissions; | ||
1588 | dsti.GroupPermissions = item.GroupPermissions; | ||
1589 | dsti.AssetType = item.AssetType; | ||
1590 | dsti.AssetID = item.AssetID; | ||
1591 | dsti.GroupID = item.GroupID; | ||
1592 | dsti.GroupOwned = item.GroupOwned; | ||
1593 | dsti.SalePrice = item.SalePrice; | ||
1594 | dsti.SaleType = item.SaleType; | ||
1595 | dsti.Flags = item.Flags; | ||
1596 | dsti.CreationDate = item.CreationDate; | ||
1597 | dsti.Folder = dstf.ID; | ||
1598 | |||
1599 | iserv.AddItem(dsti); | ||
1600 | m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", dsti.ID, dstf.ID); | ||
1601 | |||
1602 | // Attach item | ||
1603 | ava.SetAttachment(attachpoint, dsti.ID, dsti.AssetID); | ||
1604 | m_log.DebugFormat("[RADMIN] Attached {0}", dsti.ID); | ||
1605 | } | ||
1606 | else | ||
1607 | { | ||
1608 | m_log.WarnFormat("[RADMIN] Error transferring {0} to folder {1}", itemID, dstf.ID); | ||
1609 | } | ||
1494 | } | 1610 | } |
1611 | } | ||
1495 | 1612 | ||
1496 | AvatarData adata = new AvatarData(ava); | 1613 | |
1497 | m_app.SceneManager.CurrentOrFirstScene.AvatarService.SetAvatar(dest, adata); | 1614 | } |
1615 | |||
1616 | /// <summary> | ||
1617 | /// This method is called by establishAppearance to copy inventory folders to make | ||
1618 | /// copies of Clothing and Bodyparts inventory folders and attaches worn attachments | ||
1619 | /// </summary> | ||
1620 | |||
1621 | private void copyInventoryFolders(UUID dest, UUID srca, AssetType assettype, Dictionary<UUID,UUID> imap, | ||
1622 | AvatarAppearance ava) | ||
1623 | { | ||
1624 | IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; | ||
1625 | |||
1626 | InventoryFolderBase srcf = iserv.GetFolderForType(srca, assettype); | ||
1627 | InventoryFolderBase dstf = iserv.GetFolderForType(dest, assettype); | ||
1628 | |||
1629 | if (srcf == null || dstf == null) | ||
1630 | throw new Exception("Cannot locate folder(s)"); | ||
1631 | |||
1632 | // Missing source folder? This should *never* be the case | ||
1633 | if (srcf.Type != (short)assettype) | ||
1634 | { | ||
1635 | srcf = new InventoryFolderBase(); | ||
1636 | srcf.ID = UUID.Random(); | ||
1637 | if (assettype == AssetType.Clothing) { | ||
1638 | srcf.Name = "Clothing"; | ||
1639 | } else { | ||
1640 | srcf.Name = "Body Parts"; | ||
1641 | } | ||
1642 | srcf.Owner = srca; | ||
1643 | srcf.Type = (short)assettype; | ||
1644 | srcf.ParentID = iserv.GetRootFolder(srca).ID; | ||
1645 | srcf.Version = 1; | ||
1646 | iserv.AddFolder(srcf); // store base record | ||
1647 | m_log.ErrorFormat("[RADMIN] Created folder for source {0}", srca); | ||
1498 | } | 1648 | } |
1499 | catch (Exception e) | 1649 | |
1650 | // Missing destination folder? This should *never* be the case | ||
1651 | if (dstf.Type != (short)assettype) | ||
1500 | { | 1652 | { |
1501 | m_log.WarnFormat("[RADMIN] Error transferring inventory for {0} : {1}", | 1653 | dstf = new InventoryFolderBase(); |
1502 | dest, e.Message); | 1654 | dstf.ID = UUID.Random(); |
1503 | return; | 1655 | dstf.Name = assettype.ToString(); |
1656 | dstf.Owner = dest; | ||
1657 | dstf.Type = (short)assettype; | ||
1658 | dstf.ParentID = iserv.GetRootFolder(dest).ID; | ||
1659 | dstf.Version = 1; | ||
1660 | iserv.AddFolder(dstf); // store base record | ||
1661 | m_log.ErrorFormat("[RADMIN] Created folder for destination {0}", srca); | ||
1504 | } | 1662 | } |
1505 | 1663 | ||
1506 | return; | 1664 | InventoryFolderBase efolder; |
1665 | List<InventoryFolderBase> folders = iserv.GetFolderContent(srca, srcf.ID).Folders; | ||
1666 | |||
1667 | foreach (InventoryFolderBase folder in folders) | ||
1668 | { | ||
1669 | |||
1670 | efolder = new InventoryFolderBase(); | ||
1671 | efolder.ID = UUID.Random(); | ||
1672 | efolder.Name = folder.Name; | ||
1673 | efolder.Owner = dest; | ||
1674 | efolder.Type = folder.Type; | ||
1675 | efolder.Version = folder.Version; | ||
1676 | efolder.ParentID = dstf.ID; | ||
1677 | iserv.AddFolder(efolder); | ||
1678 | |||
1679 | m_log.DebugFormat("[RADMIN] Added folder {0} to folder {1}", efolder.ID, srcf.ID); | ||
1680 | |||
1681 | List<InventoryItemBase> items = iserv.GetFolderContent(srca, folder.ID).Items; | ||
1682 | |||
1683 | foreach (InventoryItemBase item in items) | ||
1684 | { | ||
1685 | InventoryItemBase dsti = new InventoryItemBase(UUID.Random(), dest); | ||
1686 | dsti.Name = item.Name; | ||
1687 | dsti.Description = item.Description; | ||
1688 | dsti.InvType = item.InvType; | ||
1689 | dsti.CreatorId = item.CreatorId; | ||
1690 | dsti.CreatorIdAsUuid = item.CreatorIdAsUuid; | ||
1691 | dsti.NextPermissions = item.NextPermissions; | ||
1692 | dsti.CurrentPermissions = item.CurrentPermissions; | ||
1693 | dsti.BasePermissions = item.BasePermissions; | ||
1694 | dsti.EveryOnePermissions = item.EveryOnePermissions; | ||
1695 | dsti.GroupPermissions = item.GroupPermissions; | ||
1696 | dsti.AssetType = item.AssetType; | ||
1697 | dsti.AssetID = item.AssetID; | ||
1698 | dsti.GroupID = item.GroupID; | ||
1699 | dsti.GroupOwned = item.GroupOwned; | ||
1700 | dsti.SalePrice = item.SalePrice; | ||
1701 | dsti.SaleType = item.SaleType; | ||
1702 | dsti.Flags = item.Flags; | ||
1703 | dsti.CreationDate = item.CreationDate; | ||
1704 | dsti.Folder = efolder.ID; | ||
1705 | |||
1706 | iserv.AddItem(dsti); | ||
1707 | imap.Add(item.ID, dsti.ID); | ||
1708 | m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", dsti.ID, efolder.ID); | ||
1709 | |||
1710 | // Attach item, if original is attached | ||
1711 | int attachpoint = ava.GetAttachpoint(item.ID); | ||
1712 | if (attachpoint != 0) | ||
1713 | { | ||
1714 | ava.SetAttachment(attachpoint, dsti.ID, dsti.AssetID); | ||
1715 | m_log.DebugFormat("[RADMIN] Attached {0}", dsti.ID); | ||
1716 | } | ||
1717 | } | ||
1718 | } | ||
1507 | } | 1719 | } |
1508 | 1720 | ||
1509 | ///<summary> | 1721 | /// <summary> |
1510 | /// This method is called if a given model avatar name can not be found. If the external | 1722 | /// This method is called if a given model avatar name can not be found. If the external |
1511 | /// file has already been loaded once, then control returns immediately. If not, then it | 1723 | /// file has already been loaded once, then control returns immediately. If not, then it |
1512 | /// looks for a default appearance file. This file contains XML definitions of zero or more named | 1724 | /// looks for a default appearance file. This file contains XML definitions of zero or more named |
@@ -1557,9 +1769,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1557 | bool include = false; | 1769 | bool include = false; |
1558 | bool select = false; | 1770 | bool select = false; |
1559 | 1771 | ||
1560 | UICallback uic; | 1772 | Scene scene = m_app.SceneManager.CurrentOrFirstScene; |
1561 | IInventoryService iserv = m_app.SceneManager.CurrentOrFirstScene.InventoryService; | 1773 | IInventoryService iserv = scene.InventoryService; |
1562 | IAssetService aserv = m_app.SceneManager.CurrentOrFirstScene.AssetService; | 1774 | IAssetService aserv = scene.AssetService; |
1563 | 1775 | ||
1564 | doc.LoadXml(File.ReadAllText(dafn)); | 1776 | doc.LoadXml(File.ReadAllText(dafn)); |
1565 | 1777 | ||
@@ -1596,29 +1808,31 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1596 | passwd = GetStringAttribute(avatar,"password",passwd); | 1808 | passwd = GetStringAttribute(avatar,"password",passwd); |
1597 | 1809 | ||
1598 | string[] nomens = name.Split(); | 1810 | string[] nomens = name.Split(); |
1599 | UUID scopeID = m_app.SceneManager.CurrentOrFirstScene.RegionInfo.ScopeID; | 1811 | UUID scopeID = scene.RegionInfo.ScopeID; |
1600 | UserAccount account = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.GetUserAccount(scopeID, nomens[0], nomens[1]); | 1812 | UserAccount account = scene.UserAccountService.GetUserAccount(scopeID, nomens[0], nomens[1]); |
1601 | if (null == account) | 1813 | if (null == account) |
1602 | { | 1814 | { |
1603 | account = new UserAccount(scopeID, nomens[0], nomens[1], email); | 1815 | account = CreateUser(scopeID, nomens[0], nomens[1], passwd, email); |
1604 | bool success = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.StoreUserAccount(account); | 1816 | if (null == account) |
1605 | if (!success) | ||
1606 | { | 1817 | { |
1607 | m_log.ErrorFormat("[RADMIN] Avatar {0} {1} was not created", nomens[0], nomens[1]); | 1818 | m_log.ErrorFormat("[RADMIN] Avatar {0} {1} was not created", nomens[0], nomens[1]); |
1608 | return false; | 1819 | return false; |
1609 | } | 1820 | } |
1610 | // !!! REFACTORING PROBLEM: need to set the password | ||
1611 | |||
1612 | GridRegion home = m_app.SceneManager.CurrentOrFirstScene.GridService.GetRegionByPosition(scopeID, | ||
1613 | (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); | ||
1614 | if (home != null) | ||
1615 | m_app.SceneManager.CurrentOrFirstScene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); | ||
1616 | } | 1821 | } |
1617 | else | 1822 | |
1618 | { | 1823 | // Set home position |
1619 | ID = account.PrincipalID; | 1824 | |
1825 | GridRegion home = scene.GridService.GetRegionByPosition(scopeID, | ||
1826 | (int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize)); | ||
1827 | if (null == home) { | ||
1828 | m_log.WarnFormat("[RADMIN]: Unable to set home region for newly created user account {0} {1}", nomens[0], nomens[1]); | ||
1829 | } else { | ||
1830 | scene.GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); | ||
1831 | m_log.DebugFormat("[RADMIN]: Set home region {0} for updated user account {1} {2}", home.RegionID, nomens[0], nomens[1]); | ||
1620 | } | 1832 | } |
1621 | 1833 | ||
1834 | ID = account.PrincipalID; | ||
1835 | |||
1622 | m_log.DebugFormat("[RADMIN] User {0}[{1}] created or retrieved", name, ID); | 1836 | m_log.DebugFormat("[RADMIN] User {0}[{1}] created or retrieved", name, ID); |
1623 | include = true; | 1837 | include = true; |
1624 | } | 1838 | } |
@@ -1635,46 +1849,36 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1635 | 1849 | ||
1636 | if (include) | 1850 | if (include) |
1637 | { | 1851 | { |
1638 | uic = new UICallback(); | 1852 | // Setup for appearance processing |
1639 | // Request the inventory | 1853 | AvatarData adata = scene.AvatarService.GetAvatar(ID); |
1640 | iserv.GetUserInventory(ID, uic.callback); | ||
1641 | |||
1642 | // While the inventory is being fetched, setup for appearance processing | ||
1643 | AvatarData adata = m_app.SceneManager.CurrentOrFirstScene.AvatarService.GetAvatar(ID); | ||
1644 | if (adata != null) | 1854 | if (adata != null) |
1645 | mava = adata.ToAvatarAppearance(ID); | 1855 | mava = adata.ToAvatarAppearance(ID); |
1646 | else | 1856 | else |
1647 | mava = new AvatarAppearance(); | 1857 | mava = new AvatarAppearance(); |
1648 | 1858 | ||
1859 | AvatarWearable[] wearables = mava.Wearables; | ||
1860 | for (int i=0; i<wearables.Length; i++) | ||
1649 | { | 1861 | { |
1650 | AvatarWearable[] wearables = mava.Wearables; | 1862 | wearables[i] = new AvatarWearable(); |
1651 | for (int i=0; i<wearables.Length; i++) | ||
1652 | { | ||
1653 | wearables[i] = new AvatarWearable(); | ||
1654 | } | ||
1655 | } | 1863 | } |
1656 | 1864 | ||
1657 | // Wait for the inventory to arrive | ||
1658 | uic.GetInventory(); | ||
1659 | |||
1660 | // We can only get dresssed if an inventory is forthcoming | ||
1661 | if (uic.OK) | ||
1662 | try | 1865 | try |
1663 | { | 1866 | { |
1664 | m_log.DebugFormat("[RADMIN] {0} folders, {1} items in inventory", | 1867 | // m_log.DebugFormat("[RADMIN] {0} folders, {1} items in inventory", |
1665 | uic.folders.Count, uic.items.Count); | 1868 | // uic.folders.Count, uic.items.Count); |
1666 | 1869 | ||
1667 | InventoryFolderImpl cfolder = uic.root.FindFolderForType(5); | 1870 | InventoryFolderBase cfolder = iserv.GetFolderForType(ID, AssetType.Clothing); |
1668 | 1871 | ||
1669 | // This should *never* be the case | 1872 | // This should *never* be the case |
1670 | if (cfolder == null) | 1873 | if (cfolder == null || cfolder.Type != (short)AssetType.Clothing) |
1671 | { | 1874 | { |
1672 | cfolder = new InventoryFolderImpl(); | 1875 | cfolder = new InventoryFolderBase(); |
1876 | cfolder.ID = UUID.Random(); | ||
1673 | cfolder.Name = "Clothing"; | 1877 | cfolder.Name = "Clothing"; |
1674 | cfolder.Type = 5; | ||
1675 | cfolder.Version = 1; | ||
1676 | cfolder.Owner = ID; | 1878 | cfolder.Owner = ID; |
1677 | uic.root.AddChildFolder(cfolder); // make connection | 1879 | cfolder.Type = (short)AssetType.Clothing; |
1880 | cfolder.ParentID = iserv.GetRootFolder(ID).ID; | ||
1881 | cfolder.Version = 1; | ||
1678 | iserv.AddFolder(cfolder); // store base record | 1882 | iserv.AddFolder(cfolder); // store base record |
1679 | m_log.ErrorFormat("[RADMIN] Created clothing folder for {0}/{1}", name, ID); | 1883 | m_log.ErrorFormat("[RADMIN] Created clothing folder for {0}/{1}", name, ID); |
1680 | } | 1884 | } |
@@ -1683,7 +1887,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1683 | // default appearance XMl file. | 1887 | // default appearance XMl file. |
1684 | 1888 | ||
1685 | XmlNodeList outfits = avatar.GetElementsByTagName("Ensemble"); | 1889 | XmlNodeList outfits = avatar.GetElementsByTagName("Ensemble"); |
1686 | InventoryFolderImpl efolder; | 1890 | InventoryFolderBase efolder; |
1687 | string oname; | 1891 | string oname; |
1688 | UUID assetid; | 1892 | UUID assetid; |
1689 | 1893 | ||
@@ -1694,13 +1898,16 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1694 | 1898 | ||
1695 | oname = GetStringAttribute(outfit,"name",""); | 1899 | oname = GetStringAttribute(outfit,"name",""); |
1696 | select = (GetStringAttribute(outfit,"default","no") == "yes"); | 1900 | select = (GetStringAttribute(outfit,"default","no") == "yes"); |
1697 | efolder = null; | ||
1698 | 1901 | ||
1699 | // If the folder already exists, re-use it. The defaults may | 1902 | // If the folder already exists, re-use it. The defaults may |
1700 | // change over time. Augment only. | 1903 | // change over time. Augment only. |
1701 | foreach (InventoryFolderImpl folder in uic.folders) | 1904 | |
1905 | List<InventoryFolderBase> folders = iserv.GetFolderContent(ID, cfolder.ID).Folders; | ||
1906 | efolder = null; | ||
1907 | |||
1908 | foreach (InventoryFolderBase folder in folders) | ||
1702 | { | 1909 | { |
1703 | if (folder.Name == oname && folder.ParentID == cfolder.ID) | 1910 | if (folder.Name == oname) |
1704 | { | 1911 | { |
1705 | efolder = folder; | 1912 | efolder = folder; |
1706 | break; | 1913 | break; |
@@ -1711,14 +1918,14 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1711 | if (efolder == null) | 1918 | if (efolder == null) |
1712 | { | 1919 | { |
1713 | m_log.DebugFormat("[RADMIN] Creating outfit folder {0} for {1}", oname, name); | 1920 | m_log.DebugFormat("[RADMIN] Creating outfit folder {0} for {1}", oname, name); |
1714 | efolder = new InventoryFolderImpl(); | 1921 | efolder = new InventoryFolderBase(); |
1715 | efolder.ID = UUID.Random(); | 1922 | efolder.ID = UUID.Random(); |
1716 | efolder.Name = oname; | 1923 | efolder.Name = oname; |
1717 | efolder.Type = 5; | ||
1718 | efolder.Version = 1; | ||
1719 | efolder.Owner = ID; | 1924 | efolder.Owner = ID; |
1720 | cfolder.AddChildFolder(efolder); // make connection | 1925 | efolder.Type = (short)AssetType.Clothing; |
1721 | iserv.AddFolder(efolder); // store base record | 1926 | efolder.Version = 1; |
1927 | efolder.ParentID = cfolder.ID; | ||
1928 | iserv.AddFolder(efolder); | ||
1722 | m_log.DebugFormat("[RADMIN] Adding outfile folder {0} to folder {1}", efolder.ID, cfolder.ID); | 1929 | m_log.DebugFormat("[RADMIN] Adding outfile folder {0} to folder {1}", efolder.ID, cfolder.ID); |
1723 | } | 1930 | } |
1724 | 1931 | ||
@@ -1745,26 +1952,55 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1745 | 1952 | ||
1746 | InventoryItemBase iitem = null; | 1953 | InventoryItemBase iitem = null; |
1747 | 1954 | ||
1748 | if ((iitem = efolder.FindAsset(assetid)) == null) | 1955 | // Check if asset is in inventory already |
1956 | iitem = null; | ||
1957 | List<InventoryItemBase> iitems = iserv.GetFolderContent(ID, efolder.ID).Items; | ||
1958 | |||
1959 | foreach (InventoryItemBase litem in iitems) | ||
1960 | { | ||
1961 | if (litem.AssetID == assetid) | ||
1962 | { | ||
1963 | iitem = litem; | ||
1964 | break; | ||
1965 | } | ||
1966 | } | ||
1967 | |||
1968 | // Create inventory item | ||
1969 | if (iitem == null) | ||
1749 | { | 1970 | { |
1750 | iitem = new InventoryItemBase(); | 1971 | iitem = new InventoryItemBase(UUID.Random(), ID); |
1751 | iitem.ID = UUID.Random(); | ||
1752 | iitem.Name = GetStringAttribute(item,"name",""); | 1972 | iitem.Name = GetStringAttribute(item,"name",""); |
1753 | iitem.Description = GetStringAttribute(item,"desc",""); | 1973 | iitem.Description = GetStringAttribute(item,"desc",""); |
1754 | iitem.InvType = GetIntegerAttribute(item,"invtype",-1); | 1974 | iitem.InvType = GetIntegerAttribute(item,"invtype",-1); |
1755 | iitem.AssetType = GetIntegerAttribute(item,"assettype",-1); | 1975 | iitem.CreatorId = GetStringAttribute(item,"creatorid",""); |
1756 | iitem.Flags = GetUnsignedAttribute(item,"flags",0); | 1976 | iitem.CreatorIdAsUuid = (UUID)GetStringAttribute(item,"creatoruuid",""); |
1757 | iitem.AssetID = assetid; // associated asset | ||
1758 | iitem.Folder = efolder.ID; // Parent folder | ||
1759 | iitem.Owner = ID; // Agent ID | ||
1760 | iitem.BasePermissions = GetUnsignedAttribute(perms,"base",0x7fffffff); | ||
1761 | iitem.NextPermissions = GetUnsignedAttribute(perms,"next",0x7fffffff); | 1977 | iitem.NextPermissions = GetUnsignedAttribute(perms,"next",0x7fffffff); |
1762 | iitem.CurrentPermissions = GetUnsignedAttribute(perms,"current",0x7fffffff); | 1978 | iitem.CurrentPermissions = GetUnsignedAttribute(perms,"current",0x7fffffff); |
1763 | iitem.GroupPermissions = GetUnsignedAttribute(perms,"group",0x7fffffff); | 1979 | iitem.BasePermissions = GetUnsignedAttribute(perms,"base",0x7fffffff); |
1764 | iitem.EveryOnePermissions = GetUnsignedAttribute(perms,"everyone",0x7fffffff); | 1980 | iitem.EveryOnePermissions = GetUnsignedAttribute(perms,"everyone",0x7fffffff); |
1765 | m_log.DebugFormat("[RADMIN] Adding item {0} to folder {1}", iitem.ID, efolder.ID); | 1981 | iitem.GroupPermissions = GetUnsignedAttribute(perms,"group",0x7fffffff); |
1982 | iitem.AssetType = GetIntegerAttribute(item,"assettype",-1); | ||
1983 | iitem.AssetID = assetid; // associated asset | ||
1984 | iitem.GroupID = (UUID)GetStringAttribute(item,"groupid",""); | ||
1985 | iitem.GroupOwned = (GetStringAttribute(item,"groupowned","false") == "true"); | ||
1986 | iitem.SalePrice = GetIntegerAttribute(item,"saleprice",0); | ||
1987 | iitem.SaleType = (byte)GetIntegerAttribute(item,"saletype",0); | ||
1988 | iitem.Flags = GetUnsignedAttribute(item,"flags",0); | ||
1989 | iitem.CreationDate = GetIntegerAttribute(item,"creationdate",Util.UnixTimeSinceEpoch()); | ||
1990 | iitem.Folder = efolder.ID; // Parent folder | ||
1991 | |||
1766 | iserv.AddItem(iitem); | 1992 | iserv.AddItem(iitem); |
1993 | m_log.DebugFormat("[RADMIN] Added item {0} to folder {1}", iitem.ID, efolder.ID); | ||
1994 | } | ||
1995 | |||
1996 | // Attach item, if attachpoint is specified | ||
1997 | int attachpoint = GetIntegerAttribute(item,"attachpoint",0); | ||
1998 | if (attachpoint != 0) | ||
1999 | { | ||
2000 | mava.SetAttachment(attachpoint, iitem.ID, iitem.AssetID); | ||
2001 | m_log.DebugFormat("[RADMIN] Attached {0}", iitem.ID); | ||
1767 | } | 2002 | } |
2003 | |||
1768 | // Record whether or not the item is to be initially worn | 2004 | // Record whether or not the item is to be initially worn |
1769 | try | 2005 | try |
1770 | { | 2006 | { |
@@ -1774,25 +2010,22 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1774 | mava.Wearables[iitem.Flags].AssetID = iitem.AssetID; | 2010 | mava.Wearables[iitem.Flags].AssetID = iitem.AssetID; |
1775 | } | 2011 | } |
1776 | } | 2012 | } |
1777 | catch {} | 2013 | catch (Exception e) |
2014 | { | ||
2015 | m_log.WarnFormat("[RADMIN] Error wearing item {0} : {1}", iitem.ID, e.Message); | ||
2016 | } | ||
1778 | } // foreach item in outfit | 2017 | } // foreach item in outfit |
1779 | m_log.DebugFormat("[RADMIN] Outfit {0} load completed", oname); | 2018 | m_log.DebugFormat("[RADMIN] Outfit {0} load completed", oname); |
1780 | } // foreach outfit | 2019 | } // foreach outfit |
1781 | m_log.DebugFormat("[RADMIN] Inventory update complete for {0}", name); | 2020 | m_log.DebugFormat("[RADMIN] Inventory update complete for {0}", name); |
1782 | AvatarData adata2 = new AvatarData(mava); | 2021 | AvatarData adata2 = new AvatarData(mava); |
1783 | m_app.SceneManager.CurrentOrFirstScene.AvatarService.SetAvatar(ID, adata2); | 2022 | scene.AvatarService.SetAvatar(ID, adata2); |
1784 | } | 2023 | } |
1785 | catch (Exception e) | 2024 | catch (Exception e) |
1786 | { | 2025 | { |
1787 | m_log.WarnFormat("[RADMIN] Inventory processing incomplete for user {0} : {1}", | 2026 | m_log.WarnFormat("[RADMIN] Inventory processing incomplete for user {0} : {1}", |
1788 | name, e.Message); | 2027 | name, e.Message); |
1789 | } | 2028 | } |
1790 | else | ||
1791 | { | ||
1792 | m_log.WarnFormat("[RADMIN] Unable to retrieve inventory for {0}[{1}]", | ||
1793 | name, ID); | ||
1794 | // continue to next avatar | ||
1795 | } | ||
1796 | } // End of include | 2029 | } // End of include |
1797 | } | 2030 | } |
1798 | m_log.DebugFormat("[RADMIN] Default avatar loading complete"); | 2031 | m_log.DebugFormat("[RADMIN] Default avatar loading complete"); |
@@ -2660,81 +2893,115 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2660 | public void Dispose() | 2893 | public void Dispose() |
2661 | { | 2894 | { |
2662 | } | 2895 | } |
2663 | } | ||
2664 | |||
2665 | class UICallback | ||
2666 | { | ||
2667 | private Object uilock = new Object(); | ||
2668 | internal InventoryFolderImpl root = null; | ||
2669 | internal List<InventoryFolderImpl> folders; | ||
2670 | internal List<InventoryItemBase> items; | ||
2671 | internal bool OK = false; | ||
2672 | |||
2673 | public void callback(ICollection<InventoryFolderImpl> p_folders, ICollection<InventoryItemBase> p_items) | ||
2674 | { | ||
2675 | lock (uilock) | ||
2676 | { | ||
2677 | folders = (List<InventoryFolderImpl>) p_folders; | ||
2678 | items = (List<InventoryItemBase>) p_items; | ||
2679 | OK = true; | ||
2680 | System.Threading.Monitor.Pulse(uilock); | ||
2681 | } | ||
2682 | } | ||
2683 | 2896 | ||
2684 | public void GetInventory() | 2897 | /// <summary> |
2898 | /// Create a user | ||
2899 | /// </summary> | ||
2900 | /// <param name="scopeID"></param> | ||
2901 | /// <param name="firstName"></param> | ||
2902 | /// <param name="lastName"></param> | ||
2903 | /// <param name="password"></param> | ||
2904 | /// <param name="email"></param> | ||
2905 | private UserAccount CreateUser(UUID scopeID, string firstName, string lastName, string password, string email) | ||
2685 | { | 2906 | { |
2686 | Dictionary<UUID, InventoryFolderImpl> fmap = new Dictionary<UUID, InventoryFolderImpl>(); | 2907 | Scene scene = m_app.SceneManager.CurrentOrFirstScene; |
2687 | 2908 | IUserAccountService m_UserAccountService = scene.UserAccountService; | |
2688 | if (OK == false) | 2909 | IGridService m_GridService = scene.GridService; |
2910 | IAuthenticationService m_AuthenticationService = scene.AuthenticationService; | ||
2911 | IGridUserService m_GridUserService = scene.GridUserService; | ||
2912 | IInventoryService m_InventoryService = scene.InventoryService; | ||
2913 | |||
2914 | UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); | ||
2915 | if (null == account) | ||
2689 | { | 2916 | { |
2690 | lock (uilock) | 2917 | account = new UserAccount(scopeID, firstName, lastName, email); |
2918 | if (account.ServiceURLs == null || (account.ServiceURLs != null && account.ServiceURLs.Count == 0)) | ||
2691 | { | 2919 | { |
2692 | if (OK == false) | 2920 | account.ServiceURLs = new Dictionary<string, object>(); |
2693 | System.Threading.Monitor.Wait(uilock); | 2921 | account.ServiceURLs["HomeURI"] = string.Empty; |
2922 | account.ServiceURLs["GatekeeperURI"] = string.Empty; | ||
2923 | account.ServiceURLs["InventoryServerURI"] = string.Empty; | ||
2924 | account.ServiceURLs["AssetServerURI"] = string.Empty; | ||
2694 | } | 2925 | } |
2695 | } | ||
2696 | |||
2697 | // Got the inventory OK. So now merge the content of the default appearance | ||
2698 | // file with whatever we already have in-world. For convenience we initialize | ||
2699 | // the inventory hierarchy. | ||
2700 | 2926 | ||
2701 | // Find root and build an index | 2927 | if (m_UserAccountService.StoreUserAccount(account)) |
2702 | |||
2703 | foreach (InventoryFolderImpl folder in folders) | ||
2704 | { | ||
2705 | if (folder.ParentID == UUID.Zero) | ||
2706 | { | 2928 | { |
2707 | if (root == null) | 2929 | bool success; |
2930 | if (m_AuthenticationService != null) | ||
2708 | { | 2931 | { |
2709 | root = folder; | 2932 | success = m_AuthenticationService.SetPassword(account.PrincipalID, password); |
2933 | if (!success) | ||
2934 | m_log.WarnFormat("[RADMIN]: Unable to set password for account {0} {1}.", | ||
2935 | firstName, lastName); | ||
2936 | } | ||
2937 | |||
2938 | GridRegion home = null; | ||
2939 | if (m_GridService != null) | ||
2940 | { | ||
2941 | List<GridRegion> defaultRegions = m_GridService.GetDefaultRegions(UUID.Zero); | ||
2942 | if (defaultRegions != null && defaultRegions.Count >= 1) | ||
2943 | home = defaultRegions[0]; | ||
2944 | |||
2945 | if (m_GridUserService != null && home != null) | ||
2946 | m_GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); | ||
2947 | else | ||
2948 | m_log.WarnFormat("[RADMIN]: Unable to set home for account {0} {1}.", | ||
2949 | firstName, lastName); | ||
2710 | } | 2950 | } |
2711 | else | 2951 | else |
2952 | m_log.WarnFormat("[RADMIN]: Unable to retrieve home region for account {0} {1}.", | ||
2953 | firstName, lastName); | ||
2954 | |||
2955 | if (m_InventoryService != null) | ||
2712 | { | 2956 | { |
2713 | throw new Exception("Multiple root folders found"); | 2957 | success = m_InventoryService.CreateUserInventory(account.PrincipalID); |
2958 | if (!success) | ||
2959 | m_log.WarnFormat("[RADMIN]: Unable to create inventory for account {0} {1}.", | ||
2960 | firstName, lastName); | ||
2714 | } | 2961 | } |
2962 | |||
2963 | m_log.InfoFormat("[RADMIN]: Account {0} {1} created successfully", firstName, lastName); | ||
2964 | return account; | ||
2965 | } else { | ||
2966 | m_log.ErrorFormat("[RADMIN]: Account creation failed for account {0} {1}", firstName, lastName); | ||
2715 | } | 2967 | } |
2716 | fmap.Add(folder.ID, folder); | ||
2717 | } | 2968 | } |
2718 | 2969 | else | |
2719 | // Hard to continue if the root folder is not there | ||
2720 | if (root == null) | ||
2721 | { | 2970 | { |
2722 | throw new Exception("Root folder not found"); | 2971 | m_log.ErrorFormat("[RADMIN]: A user with the name {0} {1} already exists!", firstName, lastName); |
2723 | } | 2972 | } |
2973 | return null; | ||
2974 | } | ||
2724 | 2975 | ||
2725 | // Construct the folder hierarchy | 2976 | /// <summary> |
2726 | foreach (InventoryFolderImpl folder in folders) | 2977 | /// Change password |
2978 | /// </summary> | ||
2979 | /// <param name="firstName"></param> | ||
2980 | /// <param name="lastName"></param> | ||
2981 | /// <param name="password"></param> | ||
2982 | private bool ChangeUserPassword(string firstName, string lastName, string password) | ||
2983 | { | ||
2984 | Scene scene = m_app.SceneManager.CurrentOrFirstScene; | ||
2985 | IUserAccountService m_UserAccountService = scene.UserAccountService; | ||
2986 | IAuthenticationService m_AuthenticationService = scene.AuthenticationService; | ||
2987 | |||
2988 | UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, firstName, lastName); | ||
2989 | if (null != account) | ||
2727 | { | 2990 | { |
2728 | if (folder.ID != root.ID) | 2991 | bool success = false; |
2729 | { | 2992 | if (m_AuthenticationService != null) |
2730 | fmap[folder.ParentID].AddChildFolder(folder); | 2993 | success = m_AuthenticationService.SetPassword(account.PrincipalID, password); |
2994 | if (!success) { | ||
2995 | m_log.WarnFormat("[RADMIN]: Unable to set password for account {0} {1}.", | ||
2996 | firstName, lastName); | ||
2997 | return false; | ||
2731 | } | 2998 | } |
2999 | return true; | ||
2732 | } | 3000 | } |
2733 | 3001 | else | |
2734 | // Find a home for every pre-existing item | ||
2735 | foreach (InventoryItemBase item in items) | ||
2736 | { | 3002 | { |
2737 | fmap[item.Folder].Items.Add(item.ID, item); | 3003 | m_log.ErrorFormat("[RADMIN]: No such user"); |
3004 | return false; | ||
2738 | } | 3005 | } |
2739 | } | 3006 | } |
2740 | } | 3007 | } |