diff options
author | UbitUmarov | 2017-01-07 16:55:03 +0000 |
---|---|---|
committer | UbitUmarov | 2017-01-07 16:55:03 +0000 |
commit | add27a503e2558b7ddeb951d3e42e09b1c04fb36 (patch) | |
tree | 888ab5919cb52f1e0201fc4ab60987a0df022f1f /OpenSim/Region/Framework/Scenes/GodController.cs | |
parent | Merge branch 'master' into httptests (diff) | |
parent | update permissions module with the new options (diff) | |
download | opensim-SC-add27a503e2558b7ddeb951d3e42e09b1c04fb36.zip opensim-SC-add27a503e2558b7ddeb951d3e42e09b1c04fb36.tar.gz opensim-SC-add27a503e2558b7ddeb951d3e42e09b1c04fb36.tar.bz2 opensim-SC-add27a503e2558b7ddeb951d3e42e09b1c04fb36.tar.xz |
Merge branch 'master' into httptests
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/GodController.cs | 222 |
1 files changed, 140 insertions, 82 deletions
diff --git a/OpenSim/Region/Framework/Scenes/GodController.cs b/OpenSim/Region/Framework/Scenes/GodController.cs index 5763e03..8035760 100644 --- a/OpenSim/Region/Framework/Scenes/GodController.cs +++ b/OpenSim/Region/Framework/Scenes/GodController.cs | |||
@@ -47,23 +47,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
47 | { | 47 | { |
48 | public class GodController | 48 | public class GodController |
49 | { | 49 | { |
50 | public enum ImplicitGodLevels : int | ||
51 | { | ||
52 | EstateManager = 210, // estate manager implicit god level | ||
53 | RegionOwner = 220 // region owner implicit god level should be >= than estate | ||
54 | } | ||
55 | |||
50 | ScenePresence m_scenePresence; | 56 | ScenePresence m_scenePresence; |
51 | Scene m_scene; | 57 | Scene m_scene; |
52 | protected bool m_allowGridGods; | 58 | protected bool m_allowGridGods; |
59 | protected bool m_forceGridGodsOnly; | ||
53 | protected bool m_regionOwnerIsGod; | 60 | protected bool m_regionOwnerIsGod; |
54 | protected bool m_regionManagerIsGod; | 61 | protected bool m_regionManagerIsGod; |
55 | protected bool m_parcelOwnerIsGod; | ||
56 | protected bool m_forceGodModeAlwaysOn; | 62 | protected bool m_forceGodModeAlwaysOn; |
57 | protected bool m_allowGodActionsWithoutGodMode; | 63 | protected bool m_allowGodActionsWithoutGodMode; |
58 | 64 | ||
59 | protected bool m_viewerUiIsGod = false; | ||
60 | |||
61 | protected int m_userLevel = 0; | 65 | protected int m_userLevel = 0; |
62 | 66 | // the god level from local or grid user rights | |
63 | public GodController(Scene scene, ScenePresence sp) | 67 | protected int m_rightsGodLevel = 0; |
68 | // the level seen by viewers | ||
69 | protected int m_godlevel = 0; | ||
70 | // new level that can be fixed or equal to godlevel, acording to options | ||
71 | protected int m_effectivegodlevel = 0; | ||
72 | protected int m_lastLevelToViewer = 0; | ||
73 | |||
74 | public GodController(Scene scene, ScenePresence sp, int userlevel) | ||
64 | { | 75 | { |
65 | m_scene = scene; | 76 | m_scene = scene; |
66 | m_scenePresence = sp; | 77 | m_scenePresence = sp; |
78 | m_userLevel = userlevel; | ||
67 | 79 | ||
68 | IConfigSource config = scene.Config; | 80 | IConfigSource config = scene.Config; |
69 | 81 | ||
@@ -76,21 +88,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
76 | Util.GetConfigVarFromSections<bool>(config, | 88 | Util.GetConfigVarFromSections<bool>(config, |
77 | "allow_grid_gods", sections, false); | 89 | "allow_grid_gods", sections, false); |
78 | 90 | ||
79 | // The owner of a region is a god in his region only. | 91 | // If grid gods are active, dont allow any other gods |
80 | m_regionOwnerIsGod = | 92 | m_forceGridGodsOnly = |
81 | Util.GetConfigVarFromSections<bool>(config, | 93 | Util.GetConfigVarFromSections<bool>(config, |
82 | "region_owner_is_god", sections, true); | 94 | "force_grid_gods_only", sections, false); |
83 | 95 | ||
84 | // Region managers are gods in the regions they manage. | 96 | if(!m_forceGridGodsOnly) |
85 | m_regionManagerIsGod = | 97 | { |
98 | // The owner of a region is a god in his region only. | ||
99 | m_regionOwnerIsGod = | ||
86 | Util.GetConfigVarFromSections<bool>(config, | 100 | Util.GetConfigVarFromSections<bool>(config, |
87 | "region_manager_is_god", sections, false); | 101 | "region_owner_is_god", sections, true); |
88 | 102 | ||
89 | // Parcel owners are gods in their own parcels only. | 103 | // Region managers are gods in the regions they manage. |
90 | m_parcelOwnerIsGod = | 104 | m_regionManagerIsGod = |
91 | Util.GetConfigVarFromSections<bool>(config, | 105 | Util.GetConfigVarFromSections<bool>(config, |
92 | "parcel_owner_is_god", sections, false); | 106 | "region_manager_is_god", sections, false); |
93 | 107 | ||
108 | } | ||
109 | else | ||
110 | m_allowGridGods = true; // reduce potencial user mistakes | ||
111 | |||
94 | // God mode should be turned on in the viewer whenever | 112 | // God mode should be turned on in the viewer whenever |
95 | // the user has god rights somewhere. They may choose | 113 | // the user has god rights somewhere. They may choose |
96 | // to turn it off again, though. | 114 | // to turn it off again, though. |
@@ -105,78 +123,121 @@ namespace OpenSim.Region.Framework.Scenes | |||
105 | Util.GetConfigVarFromSections<bool>(config, | 123 | Util.GetConfigVarFromSections<bool>(config, |
106 | "implicit_gods", sections, false); | 124 | "implicit_gods", sections, false); |
107 | 125 | ||
126 | m_rightsGodLevel = CalcRightsGodLevel(); | ||
127 | |||
128 | if(m_allowGodActionsWithoutGodMode) | ||
129 | { | ||
130 | m_effectivegodlevel = m_rightsGodLevel; | ||
131 | |||
132 | m_forceGodModeAlwaysOn = false; | ||
133 | } | ||
134 | |||
135 | else if(m_forceGodModeAlwaysOn) | ||
136 | { | ||
137 | m_godlevel = m_rightsGodLevel; | ||
138 | m_effectivegodlevel = m_rightsGodLevel; | ||
139 | } | ||
140 | |||
141 | m_scenePresence.isGod = (m_effectivegodlevel >= 200); | ||
142 | m_scenePresence.isLegacyGod = (m_godlevel >= 200); | ||
108 | } | 143 | } |
109 | 144 | ||
110 | protected bool CanBeGod() | 145 | // calculates god level at sp creation from local and grid user god rights |
146 | // for now this is assumed static until user leaves region. | ||
147 | // later estate and gride level updates may update this | ||
148 | protected int CalcRightsGodLevel() | ||
111 | { | 149 | { |
112 | bool canBeGod = false; | 150 | int level = 0; |
151 | if (m_allowGridGods && m_userLevel >= 200) | ||
152 | level = m_userLevel; | ||
113 | 153 | ||
114 | if (m_allowGridGods && m_userLevel > 0) | 154 | if(m_forceGridGodsOnly || level >= (int)ImplicitGodLevels.RegionOwner) |
115 | canBeGod = true; | 155 | return level; |
116 | 156 | ||
117 | if (m_regionOwnerIsGod && m_scene.RegionInfo.EstateSettings.IsEstateOwner(m_scenePresence.UUID)) | 157 | if (m_regionOwnerIsGod && m_scene.RegionInfo.EstateSettings.IsEstateOwner(m_scenePresence.UUID)) |
118 | canBeGod = true; | 158 | level = (int)ImplicitGodLevels.RegionOwner; |
119 | 159 | ||
120 | if (m_regionManagerIsGod && m_scene.Permissions.IsEstateManager(m_scenePresence.UUID)) | 160 | if(level >= (int)ImplicitGodLevels.EstateManager) |
121 | canBeGod = true; | 161 | return level; |
122 | 162 | ||
123 | if (!canBeGod && m_parcelOwnerIsGod) // Skip expensive check if we're already god! | 163 | if (m_regionManagerIsGod && m_scene.Permissions.IsEstateManager(m_scenePresence.UUID)) |
124 | { | 164 | level = (int)ImplicitGodLevels.EstateManager; |
125 | Vector3 pos = m_scenePresence.AbsolutePosition; | ||
126 | ILandObject parcel = m_scene.LandChannel.GetLandObject(pos.X, pos.Y); | ||
127 | if (parcel != null && parcel.LandData.OwnerID == m_scenePresence.UUID) | ||
128 | canBeGod = true; | ||
129 | } | ||
130 | 165 | ||
131 | return canBeGod; | 166 | return level; |
132 | } | 167 | } |
133 | 168 | ||
134 | protected void SyncViewerState() | 169 | protected bool CanBeGod() |
135 | { | 170 | { |
136 | bool canBeGod = CanBeGod(); | 171 | return m_rightsGodLevel >= 200; |
172 | } | ||
137 | 173 | ||
138 | bool shoudBeGod = m_forceGodModeAlwaysOn ? canBeGod : (m_viewerUiIsGod && canBeGod); | 174 | protected void UpdateGodLevels(bool viewerState) |
175 | { | ||
176 | if(!CanBeGod()) | ||
177 | { | ||
178 | m_godlevel = 0; | ||
179 | m_effectivegodlevel = 0; | ||
180 | m_scenePresence.isGod = false; | ||
181 | m_scenePresence.isLegacyGod = false; | ||
182 | return; | ||
183 | } | ||
139 | 184 | ||
140 | int godLevel = m_allowGridGods ? m_userLevel : 200; | 185 | // legacy some are controled by viewer, others are static |
141 | if (!shoudBeGod) | 186 | if(m_allowGodActionsWithoutGodMode) |
142 | godLevel = 0; | 187 | { |
188 | if(viewerState) | ||
189 | m_godlevel = m_rightsGodLevel; | ||
190 | else | ||
191 | m_godlevel = 0; | ||
143 | 192 | ||
144 | if (m_viewerUiIsGod != shoudBeGod) | 193 | m_effectivegodlevel = m_rightsGodLevel; |
194 | } | ||
195 | else | ||
145 | { | 196 | { |
146 | m_scenePresence.ControllingClient.SendAdminResponse(UUID.Zero, (uint)godLevel); | 197 | // new all change with viewer |
147 | m_viewerUiIsGod = shoudBeGod; | 198 | if(viewerState) |
199 | { | ||
200 | m_godlevel = m_rightsGodLevel; | ||
201 | m_effectivegodlevel = m_rightsGodLevel; | ||
202 | } | ||
203 | else | ||
204 | { | ||
205 | m_godlevel = 0; | ||
206 | m_effectivegodlevel = 0; | ||
207 | } | ||
148 | } | 208 | } |
209 | m_scenePresence.isGod = (m_effectivegodlevel >= 200); | ||
210 | m_scenePresence.isLegacyGod = (m_godlevel >= 200); | ||
149 | } | 211 | } |
150 | 212 | ||
151 | public bool RequestGodMode(bool god) | 213 | public void SyncViewerState() |
152 | { | 214 | { |
153 | if (!god) | 215 | if(m_lastLevelToViewer == m_godlevel) |
154 | { | 216 | return; |
155 | if (m_viewerUiIsGod) | ||
156 | m_scenePresence.ControllingClient.SendAdminResponse(UUID.Zero, 0); | ||
157 | 217 | ||
158 | m_viewerUiIsGod = false; | 218 | m_lastLevelToViewer = m_godlevel; |
159 | 219 | ||
160 | return true; | 220 | if(m_scenePresence.IsChildAgent) |
161 | } | 221 | return; |
162 | 222 | ||
163 | if (!CanBeGod()) | 223 | m_scenePresence.ControllingClient.SendAdminResponse(UUID.Zero, (uint)m_godlevel); |
164 | return false; | 224 | } |
165 | |||
166 | int godLevel = m_allowGridGods ? m_userLevel : 200; | ||
167 | |||
168 | if (!m_viewerUiIsGod) | ||
169 | m_scenePresence.ControllingClient.SendAdminResponse(UUID.Zero, (uint)godLevel); | ||
170 | 225 | ||
171 | m_viewerUiIsGod = true; | 226 | public void RequestGodMode(bool god) |
227 | { | ||
228 | UpdateGodLevels(god); | ||
172 | 229 | ||
173 | return true; | 230 | if(m_lastLevelToViewer != m_godlevel) |
231 | { | ||
232 | m_scenePresence.ControllingClient.SendAdminResponse(UUID.Zero, (uint)m_godlevel); | ||
233 | m_lastLevelToViewer = m_godlevel; | ||
234 | } | ||
174 | } | 235 | } |
175 | 236 | ||
176 | public OSD State() | 237 | public OSD State() |
177 | { | 238 | { |
178 | OSDMap godMap = new OSDMap(2); | 239 | OSDMap godMap = new OSDMap(2); |
179 | 240 | bool m_viewerUiIsGod = m_godlevel >= 200; | |
180 | godMap.Add("ViewerUiIsGod", OSD.FromBoolean(m_viewerUiIsGod)); | 241 | godMap.Add("ViewerUiIsGod", OSD.FromBoolean(m_viewerUiIsGod)); |
181 | 242 | ||
182 | return godMap; | 243 | return godMap; |
@@ -184,45 +245,42 @@ namespace OpenSim.Region.Framework.Scenes | |||
184 | 245 | ||
185 | public void SetState(OSD state) | 246 | public void SetState(OSD state) |
186 | { | 247 | { |
187 | OSDMap s = (OSDMap)state; | 248 | bool newstate = false; |
188 | 249 | if(m_forceGodModeAlwaysOn) | |
189 | if (s.ContainsKey("ViewerUiIsGod")) | 250 | newstate = true; |
190 | m_viewerUiIsGod = s["ViewerUiIsGod"].AsBoolean(); | 251 | else |
252 | { | ||
253 | if(state != null) | ||
254 | { | ||
255 | OSDMap s = (OSDMap)state; | ||
256 | |||
257 | if (s.ContainsKey("ViewerUiIsGod")) | ||
258 | newstate = s["ViewerUiIsGod"].AsBoolean(); | ||
259 | m_lastLevelToViewer = m_godlevel; // we are not changing viewer level by default | ||
260 | } | ||
261 | } | ||
262 | UpdateGodLevels(newstate); | ||
263 | } | ||
191 | 264 | ||
192 | SyncViewerState(); | 265 | public void HasMovedAway() |
266 | { | ||
267 | m_lastLevelToViewer = 0; | ||
193 | } | 268 | } |
194 | 269 | ||
195 | public int UserLevel | 270 | public int UserLevel |
196 | { | 271 | { |
197 | get { return m_userLevel; } | 272 | get { return m_userLevel; } |
198 | set { m_userLevel = UserLevel; } | 273 | set { m_userLevel = value; } |
199 | } | 274 | } |
200 | 275 | ||
201 | public int GodLevel | 276 | public int GodLevel |
202 | { | 277 | { |
203 | get | 278 | get { return m_godlevel; } |
204 | { | ||
205 | int godLevel = m_allowGridGods ? m_userLevel : 200; | ||
206 | if (!m_viewerUiIsGod) | ||
207 | godLevel = 0; | ||
208 | |||
209 | return godLevel; | ||
210 | } | ||
211 | } | 279 | } |
212 | 280 | ||
213 | public int EffectiveLevel | 281 | public int EffectiveLevel |
214 | { | 282 | { |
215 | get | 283 | get { return m_effectivegodlevel; } |
216 | { | ||
217 | int godLevel = m_allowGridGods ? m_userLevel : 200; | ||
218 | if (m_viewerUiIsGod) | ||
219 | return godLevel; | ||
220 | |||
221 | if (m_allowGodActionsWithoutGodMode && CanBeGod()) | ||
222 | return godLevel; | ||
223 | |||
224 | return 0; | ||
225 | } | ||
226 | } | 284 | } |
227 | } | 285 | } |
228 | } | 286 | } |