aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs34
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs44
-rw-r--r--OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs22
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs15
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs2
-rw-r--r--OpenSim/Region/Framework/Interfaces/IGroupsModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs144
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs69
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs10
-rw-r--r--OpenSim/Services/HypergridService/GatekeeperService.cs13
-rw-r--r--OpenSim/Services/HypergridService/HGInventoryService.cs2
-rw-r--r--OpenSim/Services/HypergridService/UserAgentService.cs14
-rw-r--r--OpenSim/Services/InventoryService/XInventoryService.cs2
15 files changed, 325 insertions, 53 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 0103761..ef6dedb 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -114,6 +114,7 @@ namespace OpenSim.Region.ClientStack.Linden
114 private IAssetService m_assetService; 114 private IAssetService m_assetService;
115 private bool m_dumpAssetsToFile = false; 115 private bool m_dumpAssetsToFile = false;
116 private string m_regionName; 116 private string m_regionName;
117 private int m_levelUpload = 0;
117 118
118 public BunchOfCaps(Scene scene, Caps caps) 119 public BunchOfCaps(Scene scene, Caps caps)
119 { 120 {
@@ -124,7 +125,10 @@ namespace OpenSim.Region.ClientStack.Linden
124 { 125 {
125 IConfig sconfig = config.Configs["Startup"]; 126 IConfig sconfig = config.Configs["Startup"];
126 if (sconfig != null) 127 if (sconfig != null)
128 {
127 m_persistBakedTextures = sconfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); 129 m_persistBakedTextures = sconfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
130 m_levelUpload = sconfig.GetInt("LevelUpload", 0);
131 }
128 } 132 }
129 133
130 m_assetService = m_Scene.AssetService; 134 m_assetService = m_Scene.AssetService;
@@ -367,21 +371,37 @@ namespace OpenSim.Region.ClientStack.Linden
367 llsdRequest.asset_type == "animation" || 371 llsdRequest.asset_type == "animation" ||
368 llsdRequest.asset_type == "sound") 372 llsdRequest.asset_type == "sound")
369 { 373 {
374 ScenePresence avatar = null;
370 IClientAPI client = null; 375 IClientAPI client = null;
371 IScene scene = null; 376 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar);
372 if (GetClient != null) 377
378 // check user level
379 if (avatar != null)
373 { 380 {
374 client = GetClient(m_HostCapsObj.AgentID); 381 client = avatar.ControllingClient;
375 scene = client.Scene; 382
383 if (avatar.UserLevel < m_levelUpload)
384 {
385 if (client != null)
386 client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false);
376 387
377 IMoneyModule mm = scene.RequestModuleInterface<IMoneyModule>(); 388 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
389 errorResponse.uploader = "";
390 errorResponse.state = "error";
391 return errorResponse;
392 }
393 }
394
395 // check funds
396 if (client != null)
397 {
398 IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>();
378 399
379 if (mm != null) 400 if (mm != null)
380 { 401 {
381 if (!mm.UploadCovered(client.AgentId, mm.UploadCharge)) 402 if (!mm.UploadCovered(client.AgentId, mm.UploadCharge))
382 { 403 {
383 if (client != null) 404 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
384 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
385 405
386 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); 406 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
387 errorResponse.uploader = ""; 407 errorResponse.uploader = "";
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs
index 1117f2a..91872c5 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs
@@ -56,6 +56,7 @@ namespace OpenSim.Region.ClientStack.Linden
56// private IAssetService m_assetService; 56// private IAssetService m_assetService;
57 private bool m_dumpAssetsToFile = false; 57 private bool m_dumpAssetsToFile = false;
58 private bool m_enabled = true; 58 private bool m_enabled = true;
59 private int m_levelUpload = 0;
59 60
60 #region IRegionModuleBase Members 61 #region IRegionModuleBase Members
61 62
@@ -72,6 +73,7 @@ namespace OpenSim.Region.ClientStack.Linden
72 return; 73 return;
73 74
74 m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true); 75 m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true);
76 m_levelUpload = meshConfig.GetInt("LevelUpload", 0);
75 } 77 }
76 78
77 public void AddRegion(Scene pScene) 79 public void AddRegion(Scene pScene)
@@ -137,25 +139,41 @@ namespace OpenSim.Region.ClientStack.Linden
137 // llsdRequest.asset_type == "animation" || 139 // llsdRequest.asset_type == "animation" ||
138 // llsdRequest.asset_type == "sound") 140 // llsdRequest.asset_type == "sound")
139 // { 141 // {
142 // check user level
143 ScenePresence avatar = null;
140 IClientAPI client = null; 144 IClientAPI client = null;
145 m_scene.TryGetScenePresence(agentID, out avatar);
141 146
142 147 if (avatar != null)
148 {
149 client = avatar.ControllingClient;
150
151 if (avatar.UserLevel < m_levelUpload)
152 {
153 if (client != null)
154 client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false);
155
156 LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse();
157 errorResponse.rsvp = "";
158 errorResponse.state = "error";
159 return errorResponse;
160 }
161 }
162
163 // check funds
143 IMoneyModule mm = m_scene.RequestModuleInterface<IMoneyModule>(); 164 IMoneyModule mm = m_scene.RequestModuleInterface<IMoneyModule>();
144 165
145 if (mm != null) 166 if (mm != null)
146 { 167 {
147 if (m_scene.TryGetClient(agentID, out client)) 168 if (!mm.UploadCovered(agentID, mm.UploadCharge))
148 { 169 {
149 if (!mm.UploadCovered(client.AgentId, mm.UploadCharge)) 170 if (client != null)
150 { 171 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
151 if (client != null) 172
152 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); 173 LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse();
153 174 errorResponse.rsvp = "";
154 LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); 175 errorResponse.state = "error";
155 errorResponse.rsvp = ""; 176 return errorResponse;
156 errorResponse.state = "error";
157 return errorResponse;
158 }
159 } 177 }
160 } 178 }
161 // } 179 // }
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs
index 95e3aec..874693e 100644
--- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs
@@ -47,6 +47,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
47 47
48 protected Scene m_Scene; 48 protected Scene m_Scene;
49 private bool m_dumpAssetsToFile = false; 49 private bool m_dumpAssetsToFile = false;
50 private int m_levelUpload = 0;
50 51
51 /// <summary> 52 /// <summary>
52 /// Each agent has its own singleton collection of transactions 53 /// Each agent has its own singleton collection of transactions
@@ -56,8 +57,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
56 57
57 #region IRegionModule Members 58 #region IRegionModule Members
58 59
59 public void Initialise(IConfigSource config) 60 public void Initialise(IConfigSource source)
60 { 61 {
62 IConfig sconfig = source.Configs["Startup"];
63 if (sconfig != null)
64 {
65 m_levelUpload = sconfig.GetInt("LevelUpload", 0);
66 }
61 } 67 }
62 68
63 public void AddRegion(Scene scene) 69 public void AddRegion(Scene scene)
@@ -241,7 +247,21 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
241 (AssetType)type == AssetType.Animation) && 247 (AssetType)type == AssetType.Animation) &&
242 tempFile == false) 248 tempFile == false)
243 { 249 {
250 ScenePresence avatar = null;
244 Scene scene = (Scene)remoteClient.Scene; 251 Scene scene = (Scene)remoteClient.Scene;
252 scene.TryGetScenePresence(remoteClient.AgentId, out avatar);
253
254 // check user level
255 if (avatar != null)
256 {
257 if (avatar.UserLevel < m_levelUpload)
258 {
259 remoteClient.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false);
260 return;
261 }
262 }
263
264 // check funds
245 IMoneyModule mm = scene.RequestModuleInterface<IMoneyModule>(); 265 IMoneyModule mm = scene.RequestModuleInterface<IMoneyModule>();
246 266
247 if (mm != null) 267 if (mm != null)
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index a2d833b..a422552 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -60,6 +60,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
60 set { m_MaxTransferDistance = value; } 60 set { m_MaxTransferDistance = value; }
61 } 61 }
62 62
63 private int m_levelHGTeleport = 0;
64
63 protected bool m_Enabled = false; 65 protected bool m_Enabled = false;
64 protected Scene m_aScene; 66 protected Scene m_aScene;
65 protected List<Scene> m_Scenes = new List<Scene>(); 67 protected List<Scene> m_Scenes = new List<Scene>();
@@ -101,7 +103,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
101 { 103 {
102 IConfig transferConfig = source.Configs["EntityTransfer"]; 104 IConfig transferConfig = source.Configs["EntityTransfer"];
103 if (transferConfig != null) 105 if (transferConfig != null)
106 {
104 MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); 107 MaxTransferDistance = transferConfig.GetInt("max_distance", 4095);
108 m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0);
109 }
105 110
106 m_agentsInTransit = new List<UUID>(); 111 m_agentsInTransit = new List<UUID>();
107 m_Enabled = true; 112 m_Enabled = true;
@@ -228,6 +233,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
228 return; 233 return;
229 } 234 }
230 235
236 // check if HyperGrid teleport is allowed, based on user level
237 int flags = m_aScene.GridService.GetRegionFlags(sp.Scene.RegionInfo.ScopeID, reg.RegionID);
238
239 if (((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) && (sp.UserLevel < m_levelHGTeleport))
240 {
241 m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent.");
242 sp.ControllingClient.SendTeleportFailed("HyperGrid teleport not permitted");
243 return;
244 }
245
231 uint curX = 0, curY = 0; 246 uint curX = 0, curY = 0;
232 Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); 247 Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY);
233 int curCellX = (int)(curX / Constants.RegionSize); 248 int curCellX = (int)(curX / Constants.RegionSize);
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
index 10ab6d0..77573c3 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
@@ -167,7 +167,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
167 167
168 public List<InventoryFolderBase> GetInventorySkeleton(UUID userId) 168 public List<InventoryFolderBase> GetInventorySkeleton(UUID userId)
169 { 169 {
170 return new List<InventoryFolderBase>(); 170 return m_RemoteConnector.GetInventorySkeleton(userId);
171 } 171 }
172 172
173 public InventoryCollection GetUserInventory(UUID userID) 173 public InventoryCollection GetUserInventory(UUID userID)
diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
index 4c501f6..6885327 100644
--- a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
@@ -93,7 +93,9 @@ namespace OpenSim.Region.Framework.Interfaces
93 void JoinGroupRequest(IClientAPI remoteClient, UUID GroupID); 93 void JoinGroupRequest(IClientAPI remoteClient, UUID GroupID);
94 void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID); 94 void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID);
95 void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID); 95 void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID);
96 void EjectGroupMember(IClientAPI remoteClient, UUID agentID, UUID GroupID, UUID EjecteeID);
96 void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID); 97 void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID);
98 void InviteGroup(IClientAPI remoteClient, UUID agentID, UUID GroupID, UUID InviteeID, UUID RoleID);
97 void NotifyChange(UUID GroupID); 99 void NotifyChange(UUID GroupID);
98 } 100 }
99} \ No newline at end of file 101} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index fc1034d..973be39 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1881,8 +1881,8 @@ namespace OpenSim.Region.Framework.Scenes
1881 1881
1882 foreach (SceneObjectGroup group in PrimsFromDB) 1882 foreach (SceneObjectGroup group in PrimsFromDB)
1883 { 1883 {
1884 EventManager.TriggerOnSceneObjectLoaded(group);
1885 AddRestoredSceneObject(group, true, true); 1884 AddRestoredSceneObject(group, true, true);
1885 EventManager.TriggerOnSceneObjectLoaded(group);
1886 SceneObjectPart rootPart = group.GetChildPart(group.UUID); 1886 SceneObjectPart rootPart = group.GetChildPart(group.UUID);
1887 rootPart.Flags &= ~PrimFlags.Scripted; 1887 rootPart.Flags &= ~PrimFlags.Scripted;
1888 rootPart.TrimPermissions(); 1888 rootPart.TrimPermissions();
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index d39b847..9ff3652 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -84,6 +84,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
84 private bool m_groupsEnabled = false; 84 private bool m_groupsEnabled = false;
85 private bool m_groupNoticesEnabled = true; 85 private bool m_groupNoticesEnabled = true;
86 private bool m_debugEnabled = false; 86 private bool m_debugEnabled = false;
87 private int m_levelGroupCreate = 0;
87 88
88 #region IRegionModuleBase Members 89 #region IRegionModuleBase Members
89 90
@@ -115,6 +116,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
115 116
116 m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true); 117 m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true);
117 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", false); 118 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", false);
119 m_levelGroupCreate = groupsConfig.GetInt("LevelGroupCreate", 0);
118 } 120 }
119 } 121 }
120 122
@@ -708,13 +710,29 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
708 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists."); 710 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists.");
709 return UUID.Zero; 711 return UUID.Zero;
710 } 712 }
713
714 // check user level
715 ScenePresence avatar = null;
716 Scene scene = (Scene)remoteClient.Scene;
717 scene.TryGetScenePresence(remoteClient.AgentId, out avatar);
718
719 if (avatar != null)
720 {
721 if (avatar.UserLevel < m_levelGroupCreate)
722 {
723 remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got insufficient permissions to create a group.");
724 return UUID.Zero;
725 }
726 }
727
728 // check funds
711 // is there is a money module present ? 729 // is there is a money module present ?
712 IMoneyModule money = remoteClient.Scene.RequestModuleInterface<IMoneyModule>(); 730 IMoneyModule money = scene.RequestModuleInterface<IMoneyModule>();
713 if (money != null) 731 if (money != null)
714 { 732 {
715 // do the transaction, that is if the agent has got sufficient funds 733 // do the transaction, that is if the agent has got sufficient funds
716 if (!money.AmountCovered(remoteClient.AgentId, money.GroupCreationCharge)) { 734 if (!money.AmountCovered(remoteClient.AgentId, money.GroupCreationCharge)) {
717 remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got issuficient funds to create a group."); 735 remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got insufficient funds to create a group.");
718 return UUID.Zero; 736 return UUID.Zero;
719 } 737 }
720 money.ApplyCharge(GetRequestingAgentID(remoteClient), money.GroupCreationCharge, "Group Creation"); 738 money.ApplyCharge(GetRequestingAgentID(remoteClient), money.GroupCreationCharge, "Group Creation");
@@ -939,17 +957,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
939 957
940 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID) 958 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID)
941 { 959 {
942 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 960 EjectGroupMember(remoteClient, GetRequestingAgentID(remoteClient), groupID, ejecteeID);
961 }
943 962
963 public void EjectGroupMember(IClientAPI remoteClient, UUID agentID, UUID groupID, UUID ejecteeID)
964 {
965 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
944 966
945 // Todo: Security check? 967 // Todo: Security check?
946 m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), ejecteeID, groupID); 968 m_groupData.RemoveAgentFromGroup(agentID, ejecteeID, groupID);
947 969
948 remoteClient.SendEjectGroupMemberReply(GetRequestingAgentID(remoteClient), groupID, true); 970 string agentName;
971 RegionInfo regionInfo;
949 972
950 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null); 973 // remoteClient provided or just agentID?
974 if (remoteClient != null)
975 {
976 agentName = remoteClient.Name;
977 regionInfo = remoteClient.Scene.RegionInfo;
978 remoteClient.SendEjectGroupMemberReply(agentID, groupID, true);
979 }
980 else
981 {
982 IClientAPI client = GetActiveClient(agentID);
983
984 if (client != null)
985 {
986 agentName = client.Name;
987 regionInfo = client.Scene.RegionInfo;
988 client.SendEjectGroupMemberReply(agentID, groupID, true);
989 }
990 else
991 {
992 regionInfo = m_sceneList[0].RegionInfo;
993 UserAccount acc = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, agentID);
951 994
952 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, ejecteeID); 995 if (acc != null)
996 {
997 agentName = acc.FirstName + " " + acc.LastName;
998 }
999 else
1000 {
1001 agentName = "Unknown member";
1002 }
1003 }
1004 }
1005
1006 GroupRecord groupInfo = m_groupData.GetGroupRecord(agentID, groupID, null);
1007
1008 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, ejecteeID);
953 if ((groupInfo == null) || (account == null)) 1009 if ((groupInfo == null) || (account == null))
954 { 1010 {
955 return; 1011 return;
@@ -959,23 +1015,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
959 GridInstantMessage msg = new GridInstantMessage(); 1015 GridInstantMessage msg = new GridInstantMessage();
960 1016
961 msg.imSessionID = UUID.Zero.Guid; 1017 msg.imSessionID = UUID.Zero.Guid;
962 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1018 msg.fromAgentID = agentID.Guid;
963 // msg.fromAgentID = info.GroupID; 1019 // msg.fromAgentID = info.GroupID;
964 msg.toAgentID = ejecteeID.Guid; 1020 msg.toAgentID = ejecteeID.Guid;
965 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1021 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
966 msg.timestamp = 0; 1022 msg.timestamp = 0;
967 msg.fromAgentName = remoteClient.Name; 1023 msg.fromAgentName = agentName;
968 msg.message = string.Format("You have been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName); 1024 msg.message = string.Format("You have been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName);
969 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent; 1025 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent;
970 msg.fromGroup = false; 1026 msg.fromGroup = false;
971 msg.offline = (byte)0; 1027 msg.offline = (byte)0;
972 msg.ParentEstateID = 0; 1028 msg.ParentEstateID = 0;
973 msg.Position = Vector3.Zero; 1029 msg.Position = Vector3.Zero;
974 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1030 msg.RegionID = regionInfo.RegionID.Guid;
975 msg.binaryBucket = new byte[0]; 1031 msg.binaryBucket = new byte[0];
976 OutgoingInstantMessage(msg, ejecteeID); 1032 OutgoingInstantMessage(msg, ejecteeID);
977 1033
978
979 // Message to ejector 1034 // Message to ejector
980 // Interop, received special 210 code for ejecting a group member 1035 // Interop, received special 210 code for ejecting a group member
981 // this only works within the comms servers domain, and won't work hypergrid 1036 // this only works within the comms servers domain, and won't work hypergrid
@@ -985,26 +1040,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
985 1040
986 msg = new GridInstantMessage(); 1041 msg = new GridInstantMessage();
987 msg.imSessionID = UUID.Zero.Guid; 1042 msg.imSessionID = UUID.Zero.Guid;
988 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1043 msg.fromAgentID = agentID.Guid;
989 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid; 1044 msg.toAgentID = agentID.Guid;
990 msg.timestamp = 0; 1045 msg.timestamp = 0;
991 msg.fromAgentName = remoteClient.Name; 1046 msg.fromAgentName = agentName;
992 if (account != null) 1047 if (account != null)
993 { 1048 {
994 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, account.FirstName + " " + account.LastName); 1049 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName, account.FirstName + " " + account.LastName);
995 } 1050 }
996 else 1051 else
997 { 1052 {
998 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, "Unknown member"); 1053 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName, "Unknown member");
999 } 1054 }
1000 msg.dialog = (byte)210; //interop 1055 msg.dialog = (byte)210; //interop
1001 msg.fromGroup = false; 1056 msg.fromGroup = false;
1002 msg.offline = (byte)0; 1057 msg.offline = (byte)0;
1003 msg.ParentEstateID = 0; 1058 msg.ParentEstateID = 0;
1004 msg.Position = Vector3.Zero; 1059 msg.Position = Vector3.Zero;
1005 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1060 msg.RegionID = regionInfo.RegionID.Guid;
1006 msg.binaryBucket = new byte[0]; 1061 msg.binaryBucket = new byte[0];
1007 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient)); 1062 OutgoingInstantMessage(msg, agentID);
1008 1063
1009 1064
1010 // SL sends out messages to everyone in the group 1065 // SL sends out messages to everyone in the group
@@ -1014,16 +1069,55 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1014 1069
1015 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID) 1070 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID)
1016 { 1071 {
1072 InviteGroup(remoteClient, GetRequestingAgentID(remoteClient), groupID, invitedAgentID, roleID);
1073 }
1074
1075 public void InviteGroup(IClientAPI remoteClient, UUID agentID, UUID groupID, UUID invitedAgentID, UUID roleID)
1076 {
1017 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 1077 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
1018 1078
1079 string agentName;
1080 RegionInfo regionInfo;
1081
1082 // remoteClient provided or just agentID?
1083 if (remoteClient != null)
1084 {
1085 agentName = remoteClient.Name;
1086 regionInfo = remoteClient.Scene.RegionInfo;
1087 }
1088 else
1089 {
1090 IClientAPI client = GetActiveClient(agentID);
1091
1092 if (client != null)
1093 {
1094 agentName = client.Name;
1095 regionInfo = client.Scene.RegionInfo;
1096 }
1097 else
1098 {
1099 regionInfo = m_sceneList[0].RegionInfo;
1100 UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, agentID);
1101
1102 if (account != null)
1103 {
1104 agentName = account.FirstName + " " + account.LastName;
1105 }
1106 else
1107 {
1108 agentName = "Unknown member";
1109 }
1110 }
1111 }
1112
1019 // Todo: Security check, probably also want to send some kind of notification 1113 // Todo: Security check, probably also want to send some kind of notification
1020 UUID InviteID = UUID.Random(); 1114 UUID InviteID = UUID.Random();
1021 1115
1022 m_groupData.AddAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID, groupID, roleID, invitedAgentID); 1116 m_groupData.AddAgentToGroupInvite(agentID, InviteID, groupID, roleID, invitedAgentID);
1023 1117
1024 // Check to see if the invite went through, if it did not then it's possible 1118 // Check to see if the invite went through, if it did not then it's possible
1025 // the remoteClient did not validate or did not have permission to invite. 1119 // the remoteClient did not validate or did not have permission to invite.
1026 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID); 1120 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(agentID, InviteID);
1027 1121
1028 if (inviteInfo != null) 1122 if (inviteInfo != null)
1029 { 1123 {
@@ -1035,19 +1129,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1035 1129
1036 msg.imSessionID = inviteUUID; 1130 msg.imSessionID = inviteUUID;
1037 1131
1038 // msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid; 1132 // msg.fromAgentID = agentID.Guid;
1039 msg.fromAgentID = groupID.Guid; 1133 msg.fromAgentID = groupID.Guid;
1040 msg.toAgentID = invitedAgentID.Guid; 1134 msg.toAgentID = invitedAgentID.Guid;
1041 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1135 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
1042 msg.timestamp = 0; 1136 msg.timestamp = 0;
1043 msg.fromAgentName = remoteClient.Name; 1137 msg.fromAgentName = agentName;
1044 msg.message = string.Format("{0} has invited you to join a group. There is no cost to join this group.", remoteClient.Name); 1138 msg.message = string.Format("{0} has invited you to join a group. There is no cost to join this group.", agentName);
1045 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation; 1139 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation;
1046 msg.fromGroup = true; 1140 msg.fromGroup = true;
1047 msg.offline = (byte)0; 1141 msg.offline = (byte)0;
1048 msg.ParentEstateID = 0; 1142 msg.ParentEstateID = 0;
1049 msg.Position = Vector3.Zero; 1143 msg.Position = Vector3.Zero;
1050 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1144 msg.RegionID = regionInfo.RegionID.Guid;
1051 msg.binaryBucket = new byte[20]; 1145 msg.binaryBucket = new byte[20];
1052 1146
1053 OutgoingInstantMessage(msg, invitedAgentID); 1147 OutgoingInstantMessage(msg, invitedAgentID);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index d140c26..0dc2aa2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -3026,5 +3026,74 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3026 3026
3027 return String.Empty; 3027 return String.Empty;
3028 } 3028 }
3029
3030 /// <summary>
3031 /// Invite user to the group this object is set to
3032 /// </summary>
3033 /// <param name="agentId"></param>
3034 /// <returns></returns>
3035 public LSL_Integer osInviteToGroup(LSL_Key agentId)
3036 {
3037 CheckThreatLevel(ThreatLevel.VeryLow, "osInviteToGroup");
3038 m_host.AddScriptLPS(1);
3039
3040 UUID agent = new UUID(agentId);
3041
3042 // groups module is required
3043 IGroupsModule groupsModule = m_ScriptEngine.World.RequestModuleInterface<IGroupsModule>();
3044 if (groupsModule == null) return ScriptBaseClass.FALSE;
3045
3046 // object has to be set to a group, but not group owned
3047 if (m_host.GroupID == UUID.Zero || m_host.GroupID == m_host.OwnerID) return ScriptBaseClass.FALSE;
3048
3049 // object owner has to be in that group and required permissions
3050 GroupMembershipData member = groupsModule.GetMembershipData(m_host.GroupID, m_host.OwnerID);
3051 if (member == null || (member.GroupPowers & (ulong)GroupPowers.Invite) == 0) return ScriptBaseClass.FALSE;
3052
3053 // check if agent is in that group already
3054 //member = groupsModule.GetMembershipData(agent, m_host.GroupID, agent);
3055 //if (member != null) return ScriptBaseClass.FALSE;
3056
3057 // invited agent has to be present in this scene
3058 if (World.GetScenePresence(agent) == null) return ScriptBaseClass.FALSE;
3059
3060 groupsModule.InviteGroup(null, m_host.OwnerID, m_host.GroupID, agent, UUID.Zero);
3061
3062 return ScriptBaseClass.TRUE;
3063 }
3064
3065 /// <summary>
3066 /// Eject user from the group this object is set to
3067 /// </summary>
3068 /// <param name="agentId"></param>
3069 /// <returns></returns>
3070 public LSL_Integer osEjectFromGroup(LSL_Key agentId)
3071 {
3072 CheckThreatLevel(ThreatLevel.VeryLow, "osEjectFromGroup");
3073 m_host.AddScriptLPS(1);
3074
3075 UUID agent = new UUID(agentId);
3076
3077 // groups module is required
3078 IGroupsModule groupsModule = m_ScriptEngine.World.RequestModuleInterface<IGroupsModule>();
3079 if (groupsModule == null) return ScriptBaseClass.FALSE;
3080
3081 // object has to be set to a group, but not group owned
3082 if (m_host.GroupID == UUID.Zero || m_host.GroupID == m_host.OwnerID) return ScriptBaseClass.FALSE;
3083
3084 // object owner has to be in that group and required permissions
3085 GroupMembershipData member = groupsModule.GetMembershipData(m_host.GroupID, m_host.OwnerID);
3086 if (member == null || (member.GroupPowers & (ulong)GroupPowers.Eject) == 0) return ScriptBaseClass.FALSE;
3087
3088 // agent has to be in that group
3089 //member = groupsModule.GetMembershipData(agent, m_host.GroupID, agent);
3090 //if (member == null) return ScriptBaseClass.FALSE;
3091
3092 // ejectee can be offline
3093
3094 groupsModule.EjectGroupMember(null, m_host.OwnerID, m_host.GroupID, agent);
3095
3096 return ScriptBaseClass.TRUE;
3097 }
3029 } 3098 }
3030} 3099}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 1f4c4b1..444a681 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -231,5 +231,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
231 LSL_String osUnixTimeToTimestamp(long time); 231 LSL_String osUnixTimeToTimestamp(long time);
232 232
233 LSL_String osGetInventoryDesc(string item); 233 LSL_String osGetInventoryDesc(string item);
234
235 LSL_Integer osInviteToGroup(LSL_Key agentId);
236 LSL_Integer osEjectFromGroup(LSL_Key agentId);
234 } 237 }
235} 238}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 09e5992..680cefb4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -868,5 +868,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
868 { 868 {
869 return m_OSSL_Functions.osGetInventoryDesc(item); 869 return m_OSSL_Functions.osGetInventoryDesc(item);
870 } 870 }
871
872 public LSL_Integer osInviteToGroup(LSL_Key agentId)
873 {
874 return m_OSSL_Functions.osInviteToGroup(agentId);
875 }
876
877 public LSL_Integer osEjectFromGroup(LSL_Key agentId)
878 {
879 return m_OSSL_Functions.osEjectFromGroup(agentId);
880 }
871 } 881 }
872} 882}
diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs
index 4e38687..149a0ab 100644
--- a/OpenSim/Services/HypergridService/GatekeeperService.cs
+++ b/OpenSim/Services/HypergridService/GatekeeperService.cs
@@ -60,6 +60,7 @@ namespace OpenSim.Services.HypergridService
60 60
61 protected string m_AllowedClients = string.Empty; 61 protected string m_AllowedClients = string.Empty;
62 protected string m_DeniedClients = string.Empty; 62 protected string m_DeniedClients = string.Empty;
63 private static bool m_ForeignAgentsAllowed = true;
63 64
64 private static UUID m_ScopeID; 65 private static UUID m_ScopeID;
65 private static bool m_AllowTeleportsToAnyRegion; 66 private static bool m_AllowTeleportsToAnyRegion;
@@ -110,6 +111,7 @@ namespace OpenSim.Services.HypergridService
110 111
111 m_AllowedClients = serverConfig.GetString("AllowedClients", string.Empty); 112 m_AllowedClients = serverConfig.GetString("AllowedClients", string.Empty);
112 m_DeniedClients = serverConfig.GetString("DeniedClients", string.Empty); 113 m_DeniedClients = serverConfig.GetString("DeniedClients", string.Empty);
114 m_ForeignAgentsAllowed = serverConfig.GetBoolean("ForeignAgentsAllowed", true);
113 115
114 if (m_GridService == null || m_PresenceService == null || m_SimulationService == null) 116 if (m_GridService == null || m_PresenceService == null || m_SimulationService == null)
115 throw new Exception("Unable to load a required plugin, Gatekeeper Service cannot function."); 117 throw new Exception("Unable to load a required plugin, Gatekeeper Service cannot function.");
@@ -257,6 +259,17 @@ namespace OpenSim.Services.HypergridService
257 } 259 }
258 m_log.DebugFormat("[GATEKEEPER SERVICE]: User is ok"); 260 m_log.DebugFormat("[GATEKEEPER SERVICE]: User is ok");
259 261
262 //
263 // Foreign agents allowed
264 //
265 if (account == null && !m_ForeignAgentsAllowed)
266 {
267 reason = "Unauthorized";
268 m_log.InfoFormat("[GATEKEEPER SERVICE]: Foreign agents are not permitted {0} {1}. Refusing service.",
269 aCircuit.firstname, aCircuit.lastname);
270 return false;
271 }
272
260 // May want to authorize 273 // May want to authorize
261 274
262 bool isFirstLogin = false; 275 bool isFirstLogin = false;
diff --git a/OpenSim/Services/HypergridService/HGInventoryService.cs b/OpenSim/Services/HypergridService/HGInventoryService.cs
index a1287fd..b29d803 100644
--- a/OpenSim/Services/HypergridService/HGInventoryService.cs
+++ b/OpenSim/Services/HypergridService/HGInventoryService.cs
@@ -53,8 +53,6 @@ namespace OpenSim.Services.HypergridService
53 LogManager.GetLogger( 53 LogManager.GetLogger(
54 MethodBase.GetCurrentMethod().DeclaringType); 54 MethodBase.GetCurrentMethod().DeclaringType);
55 55
56 protected new IXInventoryData m_Database;
57
58 private string m_HomeURL; 56 private string m_HomeURL;
59 private IUserAccountService m_UserAccountService; 57 private IUserAccountService m_UserAccountService;
60 58
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs
index 842ca58..a49993c 100644
--- a/OpenSim/Services/HypergridService/UserAgentService.cs
+++ b/OpenSim/Services/HypergridService/UserAgentService.cs
@@ -73,6 +73,8 @@ namespace OpenSim.Services.HypergridService
73 73
74 protected static string m_GridName; 74 protected static string m_GridName;
75 75
76 protected static int m_LevelOutsideContacts;
77
76 protected static bool m_BypassClientVerification; 78 protected static bool m_BypassClientVerification;
77 79
78 public UserAgentService(IConfigSource config) : this(config, null) 80 public UserAgentService(IConfigSource config) : this(config, null)
@@ -127,6 +129,8 @@ namespace OpenSim.Services.HypergridService
127 } 129 }
128 if (!m_GridName.EndsWith("/")) 130 if (!m_GridName.EndsWith("/"))
129 m_GridName = m_GridName + "/"; 131 m_GridName = m_GridName + "/";
132
133 m_LevelOutsideContacts = serverConfig.GetInt("LevelOutsideContacts", 0);
130 } 134 }
131 } 135 }
132 136
@@ -569,10 +573,16 @@ namespace OpenSim.Services.HypergridService
569 573
570 public UUID GetUUID(String first, String last) 574 public UUID GetUUID(String first, String last)
571 { 575 {
572 // Let's see if it's a local user 576 // Let's see if it's a local user
573 UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, first, last); 577 UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, first, last);
574 if (account != null) 578 if (account != null)
575 return account.PrincipalID; 579 {
580 // check user level
581 if (account.UserLevel < m_LevelOutsideContacts)
582 return UUID.Zero;
583 else
584 return account.PrincipalID;
585 }
576 else 586 else
577 return UUID.Zero; 587 return UUID.Zero;
578 } 588 }
diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs
index 8c57d17..7b2c3a6 100644
--- a/OpenSim/Services/InventoryService/XInventoryService.cs
+++ b/OpenSim/Services/InventoryService/XInventoryService.cs
@@ -318,7 +318,7 @@ namespace OpenSim.Services.InventoryService
318 318
319 if (check.Type != -1 || xFolder.type != -1) 319 if (check.Type != -1 || xFolder.type != -1)
320 { 320 {
321 if (xFolder.version > check.Version) 321 if (xFolder.version < check.Version)
322 return false; 322 return false;
323 check.Version = (ushort)xFolder.version; 323 check.Version = (ushort)xFolder.version;
324 xFolder = ConvertFromOpenSim(check); 324 xFolder = ConvertFromOpenSim(check);