diff options
-rw-r--r-- | OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | 240 | ||||
-rw-r--r-- | bin/OpenSim.ini.example | 4 | ||||
-rw-r--r-- | bin/OpenSimDefaults.ini | 4 |
3 files changed, 124 insertions, 124 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 76ff68b..ba461f0 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | |||
@@ -67,21 +67,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
67 | private IConfig m_config; | 67 | private IConfig m_config; |
68 | private IConfigSource m_configSource; | 68 | private IConfigSource m_configSource; |
69 | private string m_requiredPassword = String.Empty; | 69 | private string m_requiredPassword = String.Empty; |
70 | private List<string> m_accessIP; | ||
70 | 71 | ||
71 | private string m_name = "RemoteAdminPlugin"; | 72 | private string m_name = "RemoteAdminPlugin"; |
72 | private string m_version = "0.0"; | 73 | private string m_version = "0.0"; |
73 | 74 | ||
74 | //guard for XmlRpc-related methods | ||
75 | private void FailIfRemoteAdminDisabled(string requestName) | ||
76 | { | ||
77 | if (m_config == null) | ||
78 | { | ||
79 | string errorMessage = String.Format("[RADMIN] {0}: Remote admin request denied! Please set [RemoteAdmin]enabled=true in OpenSim.ini in order to enable remote admin functionality", requestName); | ||
80 | m_log.Error(errorMessage); | ||
81 | throw new ApplicationException(errorMessage); | ||
82 | } | ||
83 | } | ||
84 | |||
85 | public string Version | 75 | public string Version |
86 | { | 76 | { |
87 | get { return m_version; } | 77 | get { return m_version; } |
@@ -115,6 +105,20 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
115 | m_requiredPassword = m_config.GetString("access_password", String.Empty); | 105 | m_requiredPassword = m_config.GetString("access_password", String.Empty); |
116 | int port = m_config.GetInt("port", 0); | 106 | int port = m_config.GetInt("port", 0); |
117 | 107 | ||
108 | string accessIP = m_config.GetString("access_ip_addresses", String.Empty); | ||
109 | m_accessIP = new List<string>(); | ||
110 | if (accessIP != String.Empty) | ||
111 | { | ||
112 | string[] ips = accessIP.Split(new char[] { ',' }); | ||
113 | foreach (string ip in ips) | ||
114 | { | ||
115 | string current = ip.Trim(); | ||
116 | |||
117 | if (current != String.Empty) | ||
118 | m_accessIP.Add(current); | ||
119 | } | ||
120 | } | ||
121 | |||
118 | m_application = openSim; | 122 | m_application = openSim; |
119 | string bind_ip_address = m_config.GetString("bind_ip_address", "0.0.0.0"); | 123 | string bind_ip_address = m_config.GetString("bind_ip_address", "0.0.0.0"); |
120 | IPAddress ipaddr = IPAddress.Parse(bind_ip_address); | 124 | IPAddress ipaddr = IPAddress.Parse(bind_ip_address); |
@@ -190,6 +194,31 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
190 | } | 194 | } |
191 | } | 195 | } |
192 | 196 | ||
197 | private void FailIfRemoteAdminDisabled(string requestName) | ||
198 | { | ||
199 | if (m_config == null) | ||
200 | { | ||
201 | string errorMessage = String.Format("[RADMIN] {0}: Remote admin request denied! Please set [RemoteAdmin] enabled=true in OpenSim.ini in order to enable remote admin functionality", requestName); | ||
202 | m_log.Error(errorMessage); | ||
203 | throw new ApplicationException(errorMessage); | ||
204 | } | ||
205 | } | ||
206 | |||
207 | private void FailIfRemoteAdminNotAllowed(string password, string check_ip_address) | ||
208 | { | ||
209 | if (m_accessIP.Count > 0 && !m_accessIP.Contains(check_ip_address)) | ||
210 | { | ||
211 | m_log.WarnFormat("[RADMIN]: Unauthorized acess blocked from IP {0}", check_ip_address); | ||
212 | throw new Exception("not authorized"); | ||
213 | } | ||
214 | |||
215 | if (m_requiredPassword != String.Empty && password != m_requiredPassword) | ||
216 | { | ||
217 | m_log.WarnFormat("[RADMIN]: Wrong password, blocked access from IP {0}", check_ip_address); | ||
218 | throw new Exception("wrong password"); | ||
219 | } | ||
220 | } | ||
221 | |||
193 | public XmlRpcResponse XmlRpcRestartMethod(XmlRpcRequest request, IPEndPoint remoteClient) | 222 | public XmlRpcResponse XmlRpcRestartMethod(XmlRpcRequest request, IPEndPoint remoteClient) |
194 | { | 223 | { |
195 | XmlRpcResponse response = new XmlRpcResponse(); | 224 | XmlRpcResponse response = new XmlRpcResponse(); |
@@ -202,11 +231,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
202 | m_log.Info("[RADMIN]: Request to restart Region."); | 231 | m_log.Info("[RADMIN]: Request to restart Region."); |
203 | CheckStringParameters(request, new string[] {"password", "regionID"}); | 232 | CheckStringParameters(request, new string[] {"password", "regionID"}); |
204 | 233 | ||
205 | if (m_requiredPassword != String.Empty && | 234 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
206 | (!requestData.Contains("password") || (string) requestData["password"] != m_requiredPassword)) | ||
207 | { | ||
208 | throw new Exception("wrong password"); | ||
209 | } | ||
210 | 235 | ||
211 | UUID regionID = new UUID((string) requestData["regionID"]); | 236 | UUID regionID = new UUID((string) requestData["regionID"]); |
212 | 237 | ||
@@ -292,9 +317,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
292 | 317 | ||
293 | CheckStringParameters(request, new string[] {"password", "message"}); | 318 | CheckStringParameters(request, new string[] {"password", "message"}); |
294 | 319 | ||
295 | if (m_requiredPassword != String.Empty && | 320 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
296 | (!requestData.Contains("password") || (string) requestData["password"] != m_requiredPassword)) | ||
297 | throw new Exception("wrong password"); | ||
298 | 321 | ||
299 | string message = (string) requestData["message"]; | 322 | string message = (string) requestData["message"]; |
300 | m_log.InfoFormat("[RADMIN]: Broadcasting: {0}", message); | 323 | m_log.InfoFormat("[RADMIN]: Broadcasting: {0}", message); |
@@ -392,9 +415,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
392 | 415 | ||
393 | CheckStringParameters(request, new string[] {"password", "filename", "regionid"}); | 416 | CheckStringParameters(request, new string[] {"password", "filename", "regionid"}); |
394 | 417 | ||
395 | if (m_requiredPassword != String.Empty && | 418 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
396 | (!requestData.Contains("password") || (string) requestData["password"] != m_requiredPassword)) | ||
397 | throw new Exception("wrong password"); | ||
398 | 419 | ||
399 | string file = (string) requestData["filename"]; | 420 | string file = (string) requestData["filename"]; |
400 | UUID regionID = (UUID) (string) requestData["regionid"]; | 421 | UUID regionID = (UUID) (string) requestData["regionid"]; |
@@ -457,9 +478,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
457 | 478 | ||
458 | CheckStringParameters(request, new string[] { "password", "filename", "regionid" }); | 479 | CheckStringParameters(request, new string[] { "password", "filename", "regionid" }); |
459 | 480 | ||
460 | if (m_requiredPassword != String.Empty && | 481 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
461 | (!requestData.Contains("password") || (string)requestData["password"] != m_requiredPassword)) | ||
462 | throw new Exception("wrong password"); | ||
463 | 482 | ||
464 | string file = (string)requestData["filename"]; | 483 | string file = (string)requestData["filename"]; |
465 | UUID regionID = (UUID)(string)requestData["regionid"]; | 484 | UUID regionID = (UUID)(string)requestData["regionid"]; |
@@ -507,9 +526,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
507 | { | 526 | { |
508 | Hashtable requestData = (Hashtable) request.Params[0]; | 527 | Hashtable requestData = (Hashtable) request.Params[0]; |
509 | 528 | ||
510 | if (m_requiredPassword != String.Empty && | 529 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
511 | (!requestData.Contains("password") || (string) requestData["password"] != m_requiredPassword)) | ||
512 | throw new Exception("wrong password"); | ||
513 | 530 | ||
514 | responseData["accepted"] = true; | 531 | responseData["accepted"] = true; |
515 | response.Value = responseData; | 532 | response.Value = responseData; |
@@ -681,9 +698,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
681 | }); | 698 | }); |
682 | CheckIntegerParams(request, new string[] {"region_x", "region_y", "listen_port"}); | 699 | CheckIntegerParams(request, new string[] {"region_x", "region_y", "listen_port"}); |
683 | 700 | ||
684 | // check password | 701 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
685 | if (!String.IsNullOrEmpty(m_requiredPassword) && | ||
686 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
687 | 702 | ||
688 | // check whether we still have space left (iff we are using limits) | 703 | // check whether we still have space left (iff we are using limits) |
689 | if (m_regionLimit != 0 && m_application.SceneManager.Scenes.Count >= m_regionLimit) | 704 | if (m_regionLimit != 0 && m_application.SceneManager.Scenes.Count >= m_regionLimit) |
@@ -945,6 +960,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
945 | public XmlRpcResponse XmlRpcDeleteRegionMethod(XmlRpcRequest request, IPEndPoint remoteClient) | 960 | public XmlRpcResponse XmlRpcDeleteRegionMethod(XmlRpcRequest request, IPEndPoint remoteClient) |
946 | { | 961 | { |
947 | m_log.Info("[RADMIN]: DeleteRegion: new request"); | 962 | m_log.Info("[RADMIN]: DeleteRegion: new request"); |
963 | |||
948 | XmlRpcResponse response = new XmlRpcResponse(); | 964 | XmlRpcResponse response = new XmlRpcResponse(); |
949 | Hashtable responseData = new Hashtable(); | 965 | Hashtable responseData = new Hashtable(); |
950 | 966 | ||
@@ -955,6 +971,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
955 | Hashtable requestData = (Hashtable) request.Params[0]; | 971 | Hashtable requestData = (Hashtable) request.Params[0]; |
956 | CheckStringParameters(request, new string[] {"password", "region_name"}); | 972 | CheckStringParameters(request, new string[] {"password", "region_name"}); |
957 | 973 | ||
974 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); | ||
975 | |||
958 | Scene scene = null; | 976 | Scene scene = null; |
959 | string regionName = (string) requestData["region_name"]; | 977 | string regionName = (string) requestData["region_name"]; |
960 | if (!m_application.SceneManager.TryGetScene(regionName, out scene)) | 978 | if (!m_application.SceneManager.TryGetScene(regionName, out scene)) |
@@ -1024,6 +1042,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1024 | Hashtable requestData = (Hashtable) request.Params[0]; | 1042 | Hashtable requestData = (Hashtable) request.Params[0]; |
1025 | CheckStringParameters(request, new string[] {"password"}); | 1043 | CheckStringParameters(request, new string[] {"password"}); |
1026 | 1044 | ||
1045 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); | ||
1046 | |||
1027 | if (requestData.ContainsKey("region_id") && | 1047 | if (requestData.ContainsKey("region_id") && |
1028 | !String.IsNullOrEmpty((string) requestData["region_id"])) | 1048 | !String.IsNullOrEmpty((string) requestData["region_id"])) |
1029 | { | 1049 | { |
@@ -1118,6 +1138,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1118 | Hashtable requestData = (Hashtable) request.Params[0]; | 1138 | Hashtable requestData = (Hashtable) request.Params[0]; |
1119 | CheckStringParameters(request, new string[] {"password", "region_name"}); | 1139 | CheckStringParameters(request, new string[] {"password", "region_name"}); |
1120 | 1140 | ||
1141 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); | ||
1142 | |||
1121 | Scene scene = null; | 1143 | Scene scene = null; |
1122 | string regionName = (string) requestData["region_name"]; | 1144 | string regionName = (string) requestData["region_name"]; |
1123 | if (!m_application.SceneManager.TryGetScene(regionName, out scene)) | 1145 | if (!m_application.SceneManager.TryGetScene(regionName, out scene)) |
@@ -1231,9 +1253,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1231 | }); | 1253 | }); |
1232 | CheckIntegerParams(request, new string[] {"start_region_x", "start_region_y"}); | 1254 | CheckIntegerParams(request, new string[] {"start_region_x", "start_region_y"}); |
1233 | 1255 | ||
1234 | // check password | 1256 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
1235 | if (!String.IsNullOrEmpty(m_requiredPassword) && | ||
1236 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
1237 | 1257 | ||
1238 | // do the job | 1258 | // do the job |
1239 | string firstName = (string) requestData["user_firstname"]; | 1259 | string firstName = (string) requestData["user_firstname"]; |
@@ -1341,6 +1361,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1341 | // check completeness | 1361 | // check completeness |
1342 | CheckStringParameters(request, new string[] {"password", "user_firstname", "user_lastname"}); | 1362 | CheckStringParameters(request, new string[] {"password", "user_firstname", "user_lastname"}); |
1343 | 1363 | ||
1364 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); | ||
1365 | |||
1344 | string firstName = (string) requestData["user_firstname"]; | 1366 | string firstName = (string) requestData["user_firstname"]; |
1345 | string lastName = (string) requestData["user_lastname"]; | 1367 | string lastName = (string) requestData["user_lastname"]; |
1346 | 1368 | ||
@@ -1425,7 +1447,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1425 | /// </description></item> | 1447 | /// </description></item> |
1426 | /// </list> | 1448 | /// </list> |
1427 | /// </remarks> | 1449 | /// </remarks> |
1428 | |||
1429 | public XmlRpcResponse XmlRpcUpdateUserAccountMethod(XmlRpcRequest request, IPEndPoint remoteClient) | 1450 | public XmlRpcResponse XmlRpcUpdateUserAccountMethod(XmlRpcRequest request, IPEndPoint remoteClient) |
1430 | { | 1451 | { |
1431 | m_log.Info("[RADMIN]: UpdateUserAccount: new request"); | 1452 | m_log.Info("[RADMIN]: UpdateUserAccount: new request"); |
@@ -1447,9 +1468,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1447 | "password", "user_firstname", | 1468 | "password", "user_firstname", |
1448 | "user_lastname"}); | 1469 | "user_lastname"}); |
1449 | 1470 | ||
1450 | // check password | 1471 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
1451 | if (!String.IsNullOrEmpty(m_requiredPassword) && | ||
1452 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
1453 | 1472 | ||
1454 | // do the job | 1473 | // do the job |
1455 | string firstName = (string) requestData["user_firstname"]; | 1474 | string firstName = (string) requestData["user_firstname"]; |
@@ -1565,7 +1584,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1565 | /// file, or pre-existing in the user database. | 1584 | /// file, or pre-existing in the user database. |
1566 | /// This should probably get moved into somewhere more core eventually. | 1585 | /// This should probably get moved into somewhere more core eventually. |
1567 | /// </summary> | 1586 | /// </summary> |
1568 | |||
1569 | private void UpdateUserAppearance(Hashtable responseData, Hashtable requestData, UUID userid) | 1587 | private void UpdateUserAppearance(Hashtable responseData, Hashtable requestData, UUID userid) |
1570 | { | 1588 | { |
1571 | m_log.DebugFormat("[RADMIN]: updateUserAppearance"); | 1589 | m_log.DebugFormat("[RADMIN]: updateUserAppearance"); |
@@ -1647,7 +1665,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1647 | /// ratified, or an appropriate default value has been adopted. The intended prototype | 1665 | /// ratified, or an appropriate default value has been adopted. The intended prototype |
1648 | /// is known to exist, as is the target avatar. | 1666 | /// is known to exist, as is the target avatar. |
1649 | /// </summary> | 1667 | /// </summary> |
1650 | |||
1651 | private void EstablishAppearance(UUID destination, UUID source) | 1668 | private void EstablishAppearance(UUID destination, UUID source) |
1652 | { | 1669 | { |
1653 | m_log.DebugFormat("[RADMIN]: Initializing inventory for {0} from {1}", destination, source); | 1670 | m_log.DebugFormat("[RADMIN]: Initializing inventory for {0} from {1}", destination, source); |
@@ -1715,7 +1732,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1715 | /// worn or attached to the Clothing inventory folder of the receiving avatar. | 1732 | /// worn or attached to the Clothing inventory folder of the receiving avatar. |
1716 | /// In parallel the avatar wearables and attachments are updated. | 1733 | /// In parallel the avatar wearables and attachments are updated. |
1717 | /// </summary> | 1734 | /// </summary> |
1718 | |||
1719 | private void CopyWearablesAndAttachments(UUID destination, UUID source, AvatarAppearance avatarAppearance) | 1735 | private void CopyWearablesAndAttachments(UUID destination, UUID source, AvatarAppearance avatarAppearance) |
1720 | { | 1736 | { |
1721 | IInventoryService inventoryService = m_application.SceneManager.CurrentOrFirstScene.InventoryService; | 1737 | IInventoryService inventoryService = m_application.SceneManager.CurrentOrFirstScene.InventoryService; |
@@ -1745,7 +1761,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1745 | AvatarWearable[] wearables = avatarAppearance.Wearables; | 1761 | AvatarWearable[] wearables = avatarAppearance.Wearables; |
1746 | AvatarWearable wearable; | 1762 | AvatarWearable wearable; |
1747 | 1763 | ||
1748 | for (int i=0; i<wearables.Length; i++) | 1764 | for (int i = 0; i<wearables.Length; i++) |
1749 | { | 1765 | { |
1750 | wearable = wearables[i]; | 1766 | wearable = wearables[i]; |
1751 | if (wearable[0].ItemID != UUID.Zero) | 1767 | if (wearable[0].ItemID != UUID.Zero) |
@@ -1848,15 +1864,12 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1848 | } | 1864 | } |
1849 | } | 1865 | } |
1850 | } | 1866 | } |
1851 | |||
1852 | |||
1853 | } | 1867 | } |
1854 | 1868 | ||
1855 | /// <summary> | 1869 | /// <summary> |
1856 | /// This method is called by establishAppearance to copy inventory folders to make | 1870 | /// This method is called by establishAppearance to copy inventory folders to make |
1857 | /// copies of Clothing and Bodyparts inventory folders and attaches worn attachments | 1871 | /// copies of Clothing and Bodyparts inventory folders and attaches worn attachments |
1858 | /// </summary> | 1872 | /// </summary> |
1859 | |||
1860 | private void CopyInventoryFolders(UUID destination, UUID source, AssetType assetType, Dictionary<UUID,UUID> inventoryMap, | 1873 | private void CopyInventoryFolders(UUID destination, UUID source, AssetType assetType, Dictionary<UUID,UUID> inventoryMap, |
1861 | AvatarAppearance avatarAppearance) | 1874 | AvatarAppearance avatarAppearance) |
1862 | { | 1875 | { |
@@ -1891,9 +1904,12 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1891 | { | 1904 | { |
1892 | destinationFolder = new InventoryFolderBase(); | 1905 | destinationFolder = new InventoryFolderBase(); |
1893 | destinationFolder.ID = UUID.Random(); | 1906 | destinationFolder.ID = UUID.Random(); |
1894 | if (assetType == AssetType.Clothing) { | 1907 | if (assetType == AssetType.Clothing) |
1908 | { | ||
1895 | destinationFolder.Name = "Clothing"; | 1909 | destinationFolder.Name = "Clothing"; |
1896 | } else { | 1910 | } |
1911 | else | ||
1912 | { | ||
1897 | destinationFolder.Name = "Body Parts"; | 1913 | destinationFolder.Name = "Body Parts"; |
1898 | } | 1914 | } |
1899 | destinationFolder.Owner = destination; | 1915 | destinationFolder.Owner = destination; |
@@ -1909,7 +1925,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1909 | 1925 | ||
1910 | foreach (InventoryFolderBase folder in folders) | 1926 | foreach (InventoryFolderBase folder in folders) |
1911 | { | 1927 | { |
1912 | |||
1913 | extraFolder = new InventoryFolderBase(); | 1928 | extraFolder = new InventoryFolderBase(); |
1914 | extraFolder.ID = UUID.Random(); | 1929 | extraFolder.ID = UUID.Random(); |
1915 | extraFolder.Name = folder.Name; | 1930 | extraFolder.Name = folder.Name; |
@@ -1967,7 +1982,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
1967 | /// <summary> | 1982 | /// <summary> |
1968 | /// Apply next owner permissions. | 1983 | /// Apply next owner permissions. |
1969 | /// </summary> | 1984 | /// </summary> |
1970 | |||
1971 | private void ApplyNextOwnerPermissions(InventoryItemBase item) | 1985 | private void ApplyNextOwnerPermissions(InventoryItemBase item) |
1972 | { | 1986 | { |
1973 | if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) | 1987 | if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) |
@@ -2360,18 +2374,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2360 | { | 2374 | { |
2361 | Hashtable requestData = (Hashtable) request.Params[0]; | 2375 | Hashtable requestData = (Hashtable) request.Params[0]; |
2362 | 2376 | ||
2363 | // check completeness | 2377 | CheckStringParameters(request, new string[] { |
2364 | foreach (string parameter in new string[] {"password", "filename"}) | 2378 | "password", "filename"}); |
2365 | { | ||
2366 | if (!requestData.Contains(parameter)) | ||
2367 | throw new Exception(String.Format("missing parameter {0}", parameter)); | ||
2368 | if (String.IsNullOrEmpty((string) requestData[parameter])) | ||
2369 | throw new Exception(String.Format("parameter {0} is empty", parameter)); | ||
2370 | } | ||
2371 | 2379 | ||
2372 | // check password | 2380 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2373 | if (!String.IsNullOrEmpty(m_requiredPassword) && | ||
2374 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
2375 | 2381 | ||
2376 | string filename = (string) requestData["filename"]; | 2382 | string filename = (string) requestData["filename"]; |
2377 | Scene scene = null; | 2383 | Scene scene = null; |
@@ -2477,18 +2483,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2477 | { | 2483 | { |
2478 | Hashtable requestData = (Hashtable) request.Params[0]; | 2484 | Hashtable requestData = (Hashtable) request.Params[0]; |
2479 | 2485 | ||
2480 | // check completeness | 2486 | CheckStringParameters(request, new string[] { |
2481 | foreach (string p in new string[] {"password", "filename"}) | 2487 | "password", "filename"}); |
2482 | { | ||
2483 | if (!requestData.Contains(p)) | ||
2484 | throw new Exception(String.Format("missing parameter {0}", p)); | ||
2485 | if (String.IsNullOrEmpty((string) requestData[p])) | ||
2486 | throw new Exception(String.Format("parameter {0} is empty")); | ||
2487 | } | ||
2488 | 2488 | ||
2489 | // check password | 2489 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2490 | if (!String.IsNullOrEmpty(m_requiredPassword) && | ||
2491 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
2492 | 2490 | ||
2493 | string filename = (string) requestData["filename"]; | 2491 | string filename = (string) requestData["filename"]; |
2494 | Scene scene = null; | 2492 | Scene scene = null; |
@@ -2534,11 +2532,16 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2534 | { | 2532 | { |
2535 | scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted; | 2533 | scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted; |
2536 | archiver.ArchiveRegion(filename, options); | 2534 | archiver.ArchiveRegion(filename, options); |
2537 | lock (m_saveOarLock) Monitor.Wait(m_saveOarLock,5000); | 2535 | |
2536 | lock (m_saveOarLock) | ||
2537 | Monitor.Wait(m_saveOarLock,5000); | ||
2538 | |||
2538 | scene.EventManager.OnOarFileSaved -= RemoteAdminOarSaveCompleted; | 2539 | scene.EventManager.OnOarFileSaved -= RemoteAdminOarSaveCompleted; |
2539 | } | 2540 | } |
2540 | else | 2541 | else |
2542 | { | ||
2541 | throw new Exception("Archiver module not present for scene"); | 2543 | throw new Exception("Archiver module not present for scene"); |
2544 | } | ||
2542 | 2545 | ||
2543 | responseData["saved"] = true; | 2546 | responseData["saved"] = true; |
2544 | 2547 | ||
@@ -2579,18 +2582,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2579 | { | 2582 | { |
2580 | Hashtable requestData = (Hashtable) request.Params[0]; | 2583 | Hashtable requestData = (Hashtable) request.Params[0]; |
2581 | 2584 | ||
2582 | // check completeness | 2585 | CheckStringParameters(request, new string[] { |
2583 | foreach (string p in new string[] {"password", "filename"}) | 2586 | "password", "filename"}); |
2584 | { | ||
2585 | if (!requestData.Contains(p)) | ||
2586 | throw new Exception(String.Format("missing parameter {0}", p)); | ||
2587 | if (String.IsNullOrEmpty((string) requestData[p])) | ||
2588 | throw new Exception(String.Format("parameter {0} is empty")); | ||
2589 | } | ||
2590 | 2587 | ||
2591 | // check password | 2588 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2592 | if (!String.IsNullOrEmpty(m_requiredPassword) && | ||
2593 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
2594 | 2589 | ||
2595 | string filename = (string) requestData["filename"]; | 2590 | string filename = (string) requestData["filename"]; |
2596 | if (requestData.Contains("region_uuid")) | 2591 | if (requestData.Contains("region_uuid")) |
@@ -2598,6 +2593,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2598 | UUID region_uuid = (UUID) (string) requestData["region_uuid"]; | 2593 | UUID region_uuid = (UUID) (string) requestData["region_uuid"]; |
2599 | if (!m_application.SceneManager.TrySetCurrentScene(region_uuid)) | 2594 | if (!m_application.SceneManager.TrySetCurrentScene(region_uuid)) |
2600 | throw new Exception(String.Format("failed to switch to region {0}", region_uuid.ToString())); | 2595 | throw new Exception(String.Format("failed to switch to region {0}", region_uuid.ToString())); |
2596 | |||
2601 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_uuid.ToString()); | 2597 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_uuid.ToString()); |
2602 | } | 2598 | } |
2603 | else if (requestData.Contains("region_name")) | 2599 | else if (requestData.Contains("region_name")) |
@@ -2605,6 +2601,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2605 | string region_name = (string) requestData["region_name"]; | 2601 | string region_name = (string) requestData["region_name"]; |
2606 | if (!m_application.SceneManager.TrySetCurrentScene(region_name)) | 2602 | if (!m_application.SceneManager.TrySetCurrentScene(region_name)) |
2607 | throw new Exception(String.Format("failed to switch to region {0}", region_name)); | 2603 | throw new Exception(String.Format("failed to switch to region {0}", region_name)); |
2604 | |||
2608 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_name); | 2605 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_name); |
2609 | } | 2606 | } |
2610 | else throw new Exception("neither region_name nor region_uuid given"); | 2607 | else throw new Exception("neither region_name nor region_uuid given"); |
@@ -2663,18 +2660,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2663 | { | 2660 | { |
2664 | Hashtable requestData = (Hashtable) request.Params[0]; | 2661 | Hashtable requestData = (Hashtable) request.Params[0]; |
2665 | 2662 | ||
2666 | // check completeness | 2663 | CheckStringParameters(request, new string[] { |
2667 | foreach (string p in new string[] {"password", "filename"}) | 2664 | "password", "filename"}); |
2668 | { | ||
2669 | if (!requestData.Contains(p)) | ||
2670 | throw new Exception(String.Format("missing parameter {0}", p)); | ||
2671 | if (String.IsNullOrEmpty((string) requestData[p])) | ||
2672 | throw new Exception(String.Format("parameter {0} is empty")); | ||
2673 | } | ||
2674 | 2665 | ||
2675 | // check password | 2666 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2676 | if (!String.IsNullOrEmpty(m_requiredPassword) && | ||
2677 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
2678 | 2667 | ||
2679 | string filename = (string) requestData["filename"]; | 2668 | string filename = (string) requestData["filename"]; |
2680 | if (requestData.Contains("region_uuid")) | 2669 | if (requestData.Contains("region_uuid")) |
@@ -2749,17 +2738,17 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2749 | 2738 | ||
2750 | Hashtable requestData = (Hashtable) request.Params[0]; | 2739 | Hashtable requestData = (Hashtable) request.Params[0]; |
2751 | 2740 | ||
2752 | // check completeness | 2741 | CheckStringParameters(request, new string[] { |
2753 | if (!requestData.Contains("password")) | 2742 | "password"}); |
2754 | throw new Exception(String.Format("missing required parameter")); | 2743 | |
2755 | if (!String.IsNullOrEmpty(m_requiredPassword) && | 2744 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2756 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
2757 | 2745 | ||
2758 | if (requestData.Contains("region_uuid")) | 2746 | if (requestData.Contains("region_uuid")) |
2759 | { | 2747 | { |
2760 | UUID region_uuid = (UUID) (string) requestData["region_uuid"]; | 2748 | UUID region_uuid = (UUID) (string) requestData["region_uuid"]; |
2761 | if (!m_application.SceneManager.TrySetCurrentScene(region_uuid)) | 2749 | if (!m_application.SceneManager.TrySetCurrentScene(region_uuid)) |
2762 | throw new Exception(String.Format("failed to switch to region {0}", region_uuid.ToString())); | 2750 | throw new Exception(String.Format("failed to switch to region {0}", region_uuid.ToString())); |
2751 | |||
2763 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_uuid.ToString()); | 2752 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_uuid.ToString()); |
2764 | } | 2753 | } |
2765 | else if (requestData.Contains("region_name")) | 2754 | else if (requestData.Contains("region_name")) |
@@ -2767,6 +2756,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2767 | string region_name = (string) requestData["region_name"]; | 2756 | string region_name = (string) requestData["region_name"]; |
2768 | if (!m_application.SceneManager.TrySetCurrentScene(region_name)) | 2757 | if (!m_application.SceneManager.TrySetCurrentScene(region_name)) |
2769 | throw new Exception(String.Format("failed to switch to region {0}", region_name)); | 2758 | throw new Exception(String.Format("failed to switch to region {0}", region_name)); |
2759 | |||
2770 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_name); | 2760 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_name); |
2771 | } | 2761 | } |
2772 | else throw new Exception("neither region_name nor region_uuid given"); | 2762 | else throw new Exception("neither region_name nor region_uuid given"); |
@@ -2792,6 +2782,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2792 | } | 2782 | } |
2793 | 2783 | ||
2794 | m_log.Info("[RADMIN]: Query XML Administrator Request complete"); | 2784 | m_log.Info("[RADMIN]: Query XML Administrator Request complete"); |
2785 | |||
2795 | return response; | 2786 | return response; |
2796 | } | 2787 | } |
2797 | 2788 | ||
@@ -2810,14 +2801,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2810 | 2801 | ||
2811 | Hashtable requestData = (Hashtable) request.Params[0]; | 2802 | Hashtable requestData = (Hashtable) request.Params[0]; |
2812 | 2803 | ||
2813 | // check completeness | 2804 | CheckStringParameters(request, new string[] { |
2814 | if (!requestData.Contains("password")) | 2805 | "password", "command"}); |
2815 | throw new Exception(String.Format("missing required parameter")); | 2806 | |
2816 | if (!String.IsNullOrEmpty(m_requiredPassword) && | 2807 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2817 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | ||
2818 | 2808 | ||
2819 | if (!requestData.Contains("command")) | ||
2820 | throw new Exception(String.Format("missing required parameter")); | ||
2821 | MainConsole.Instance.RunCommand(requestData["command"].ToString()); | 2809 | MainConsole.Instance.RunCommand(requestData["command"].ToString()); |
2822 | 2810 | ||
2823 | response.Value = responseData; | 2811 | response.Value = responseData; |
@@ -2851,10 +2839,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2851 | 2839 | ||
2852 | Hashtable requestData = (Hashtable) request.Params[0]; | 2840 | Hashtable requestData = (Hashtable) request.Params[0]; |
2853 | 2841 | ||
2854 | if (!requestData.Contains("password")) | 2842 | CheckStringParameters(request, new string[] { |
2855 | throw new Exception(String.Format("missing required parameter")); | 2843 | "password"}); |
2856 | if (!String.IsNullOrEmpty(m_requiredPassword) && | 2844 | |
2857 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | 2845 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2858 | 2846 | ||
2859 | if (requestData.Contains("region_uuid")) | 2847 | if (requestData.Contains("region_uuid")) |
2860 | { | 2848 | { |
@@ -2868,12 +2856,14 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2868 | string region_name = (string) requestData["region_name"]; | 2856 | string region_name = (string) requestData["region_name"]; |
2869 | if (!m_application.SceneManager.TrySetCurrentScene(region_name)) | 2857 | if (!m_application.SceneManager.TrySetCurrentScene(region_name)) |
2870 | throw new Exception(String.Format("failed to switch to region {0}", region_name)); | 2858 | throw new Exception(String.Format("failed to switch to region {0}", region_name)); |
2859 | |||
2871 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_name); | 2860 | m_log.InfoFormat("[RADMIN]: Switched to region {0}", region_name); |
2872 | } | 2861 | } |
2873 | else throw new Exception("neither region_name nor region_uuid given"); | 2862 | else throw new Exception("neither region_name nor region_uuid given"); |
2874 | 2863 | ||
2875 | Scene scene = m_application.SceneManager.CurrentScene; | 2864 | Scene scene = m_application.SceneManager.CurrentScene; |
2876 | scene.RegionInfo.EstateSettings.EstateAccess = new UUID[]{}; | 2865 | scene.RegionInfo.EstateSettings.EstateAccess = new UUID[]{}; |
2866 | |||
2877 | if (scene.RegionInfo.Persistent) | 2867 | if (scene.RegionInfo.Persistent) |
2878 | scene.RegionInfo.EstateSettings.Save(); | 2868 | scene.RegionInfo.EstateSettings.Save(); |
2879 | } | 2869 | } |
@@ -2908,10 +2898,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2908 | 2898 | ||
2909 | Hashtable requestData = (Hashtable) request.Params[0]; | 2899 | Hashtable requestData = (Hashtable) request.Params[0]; |
2910 | 2900 | ||
2911 | if (!requestData.Contains("password")) | 2901 | CheckStringParameters(request, new string[] { |
2912 | throw new Exception(String.Format("missing required parameter")); | 2902 | "password"}); |
2913 | if (!String.IsNullOrEmpty(m_requiredPassword) && | 2903 | |
2914 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | 2904 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
2915 | 2905 | ||
2916 | if (requestData.Contains("region_uuid")) | 2906 | if (requestData.Contains("region_uuid")) |
2917 | { | 2907 | { |
@@ -2995,10 +2985,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
2995 | 2985 | ||
2996 | Hashtable requestData = (Hashtable) request.Params[0]; | 2986 | Hashtable requestData = (Hashtable) request.Params[0]; |
2997 | 2987 | ||
2998 | if (!requestData.Contains("password")) | 2988 | CheckStringParameters(request, new string[] { |
2999 | throw new Exception(String.Format("missing required parameter")); | 2989 | "password"}); |
3000 | if (!String.IsNullOrEmpty(m_requiredPassword) && | 2990 | |
3001 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | 2991 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
3002 | 2992 | ||
3003 | if (requestData.Contains("region_uuid")) | 2993 | if (requestData.Contains("region_uuid")) |
3004 | { | 2994 | { |
@@ -3082,10 +3072,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
3082 | 3072 | ||
3083 | Hashtable requestData = (Hashtable) request.Params[0]; | 3073 | Hashtable requestData = (Hashtable) request.Params[0]; |
3084 | 3074 | ||
3085 | if (!requestData.Contains("password")) | 3075 | CheckStringParameters(request, new string[] { |
3086 | throw new Exception(String.Format("missing required parameter")); | 3076 | "password"}); |
3087 | if (!String.IsNullOrEmpty(m_requiredPassword) && | 3077 | |
3088 | (string) requestData["password"] != m_requiredPassword) throw new Exception("wrong password"); | 3078 | FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString()); |
3089 | 3079 | ||
3090 | if (requestData.Contains("region_uuid")) | 3080 | if (requestData.Contains("region_uuid")) |
3091 | { | 3081 | { |
@@ -3299,7 +3289,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
3299 | bool success = false; | 3289 | bool success = false; |
3300 | if (authenticationService != null) | 3290 | if (authenticationService != null) |
3301 | success = authenticationService.SetPassword(account.PrincipalID, password); | 3291 | success = authenticationService.SetPassword(account.PrincipalID, password); |
3302 | if (!success) { | 3292 | |
3293 | if (!success) | ||
3294 | { | ||
3303 | m_log.WarnFormat("[RADMIN]: Unable to set password for account {0} {1}.", | 3295 | m_log.WarnFormat("[RADMIN]: Unable to set password for account {0} {1}.", |
3304 | firstName, lastName); | 3296 | firstName, lastName); |
3305 | return false; | 3297 | return false; |
@@ -3313,4 +3305,4 @@ namespace OpenSim.ApplicationPlugins.RemoteController | |||
3313 | } | 3305 | } |
3314 | } | 3306 | } |
3315 | } | 3307 | } |
3316 | } | 3308 | } \ No newline at end of file |
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index d795952..d7c3a64 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -405,6 +405,10 @@ | |||
405 | ;; the "password" parameter) | 405 | ;; the "password" parameter) |
406 | ; access_password = "" | 406 | ; access_password = "" |
407 | 407 | ||
408 | ;# List the IP addresses allowed to call RemoteAdmin | ||
409 | ;; access_ip_addresses = 0.0.0.0, 0.0.0.0 ... | ||
410 | ; access_ip_addresses = | ||
411 | |||
408 | ;# {create_region_enable_voice} {enabled:true} {Enable voice for newly created regions?} {true false} false | 412 | ;# {create_region_enable_voice} {enabled:true} {Enable voice for newly created regions?} {true false} false |
409 | ;; set this variable to true if you want the create_region XmlRpc | 413 | ;; set this variable to true if you want the create_region XmlRpc |
410 | ;; call to unconditionally enable voice on all parcels for a newly | 414 | ;; call to unconditionally enable voice on all parcels for a newly |
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index c4f5592..a2542da 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini | |||
@@ -802,6 +802,10 @@ | |||
802 | ; This password is required to make any XMLRPC call (should be set as the "password" parameter) | 802 | ; This password is required to make any XMLRPC call (should be set as the "password" parameter) |
803 | access_password = unknown | 803 | access_password = unknown |
804 | 804 | ||
805 | ; List the IP addresses allowed to call RemoteAdmin | ||
806 | ; access_ip_addresses = 0.0.0.0, 0.0.0.0 ... | ||
807 | ; access_ip_addresses = | ||
808 | |||
805 | ; set this variable to true if you want the create_region XmlRpc | 809 | ; set this variable to true if you want the create_region XmlRpc |
806 | ; call to unconditionally enable voice on all parcels for a newly | 810 | ; call to unconditionally enable voice on all parcels for a newly |
807 | ; created region [default: false] | 811 | ; created region [default: false] |