aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/GodController.cs
diff options
context:
space:
mode:
authorUbitUmarov2017-01-07 16:55:03 +0000
committerUbitUmarov2017-01-07 16:55:03 +0000
commitadd27a503e2558b7ddeb951d3e42e09b1c04fb36 (patch)
tree888ab5919cb52f1e0201fc4ab60987a0df022f1f /OpenSim/Region/Framework/Scenes/GodController.cs
parentMerge branch 'master' into httptests (diff)
parentupdate permissions module with the new options (diff)
downloadopensim-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.cs222
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}