aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/NOTES.txt
diff options
context:
space:
mode:
Diffstat (limited to 'src/NOTES.txt')
-rw-r--r--src/NOTES.txt462
1 files changed, 97 insertions, 365 deletions
diff --git a/src/NOTES.txt b/src/NOTES.txt
index 93ed815..a72e7c8 100644
--- a/src/NOTES.txt
+++ b/src/NOTES.txt
@@ -142,122 +142,6 @@ Last update time for parameters, plus an update frequency. Once a minute.
142 142
143Account creation process in the database. 143Account creation process in the database.
144 144
145Apart from the usual input validation of things...
146
147
148OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs
149 byte[] CreateUser(Dictionary<string, object> request)
150 Looks like their built in web front end, perhaps what is triggered by the console?
151 createdUserAccount
152 = ((UserAccountService)m_UserAccountService).CreateUser(scopeID, principalID, firstName, lastName, password, email, model);
153
154OpenSim/opensim-SC/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
155 An XML RPC interface to -
156 private UserAccount CreateUser(UUID scopeID, string firstName, string lastName, string password, string email)
157 account = new UserAccount(scopeID, UUID.Random(), firstName, lastName, email);
158 if (userAccountService.StoreUserAccount(account))
159 success = authenticationService.SetPassword(account.PrincipalID, password)
160 gridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0));
161 success = inventoryService.CreateUserInventory(account.PrincipalID);
162
163OpenSim/opensim-SC/OpenSim/Services/UserAccountService/UserAccountService.cs
164 Looks like the console command handler.
165 create user [<first> [<last> [<pass> [<email> [<user id> [<model>]]]]]] - Create a new user
166 protected void HandleCreateUser(string module, string[] cmdparams)
167 Gathers console arguments, or prompts for them.
168 CreateUser(UUID.Zero, principalId, firstName, lastName, password, email, model);
169 public UserAccount CreateUser(UUID scopeID, UUID principalID, string firstName, string lastName, string password, string email, string model = "")
170 Looks almost identical to the OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs one above, but they add -
171 CreateDefaultAppearanceEntries(account.PrincipalID)
172
173
174
175account = new UserAccount(scopeID, UUID.Random(), firstName, lastName, email);
176 OpenSim/opensim-SC/OpenSim/Services/Interfaces/IUserAccountService.cs
177 public UserAccount(UUID scopeID, UUID principalID, string firstName, string lastName, string email)
178 Just holds the data in memory, in a dictionary I think.
179 OpenSim/opensim-SC/OpenSim/Services/UserAccountService/UserAccountService.cs
180 public bool StoreUserAccount(UserAccount data)
181 Stuffs the data into a new UserAccountData()
182 m_Database.Store(d)
183 As far as I can tell, just dumps this data into the UserAccounts table -
184 FirstName, LastName, PrincipleID, ScopeID, Email, Created, UserLevel, UserFlags, UserTitle
185 PrincipleID is their randomly generated with no thought to collisions UUID.
186 ScopeID is 00000000-0000-0000-0000-000000000000
187 Userlevel is 0 for most, -1 for Waki, determines if they can log on. Also higher for gods and things.
188 UserFlags, I think the only one is "64 god can login to this account using gods password.
189 UserTitle might default to "Local", or be configurable / and editable.
190 something something URL encoded "ServiceURLs" mumble
191 HomeURI=http%3a%2f%2fgrid.infinitegrid.org%3a8002%2f GatekeeperURI= InventoryServerURI=http%3a%2f%2fgrid.infinitegrid.org%3a8002%2f AssetServerURI=http%3a%2f%2fgrid.infinitegrid.org%3a8002%2f ProfileServerURI=http%3a%2f%2fgrid.infinitegrid.org%3a8002%2f FriendsServerURI=http%3a%2f%2fgrid.infinitegrid.org%3a8002%2f IMServerURI=http%3a%2f%2fgrid.infinitegrid.org%3a8002%2f GroupsServerURI=http%3a%2f%2fgrid.infinitegrid.org%3a8002%2f
192 Though most are either NULL, empty, or -
193 HomeURI= GatekeeperURI= InventoryServerURI= AssetServerURI=
194 Doesn't metion "active", which is always equal to 1 I guess.
195
196
197
198success = authenticationService.SetPassword(account.PrincipalID, password)
199 OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs
200 stores password details in "auth" table -
201 UUID
202 passwordSalt = Util.Md5Hash(UUID.Random().ToString());
203 passwdHash = Util.Md5Hash(Util.Md5Hash(password) + ":" + passwordSalt);
204 accountType = "UserAccount";
205 webLoginKey = UUID.Zero.ToString();
206
207
208
209gridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0));
210 OpenSim/Services/UserAccountService/GridUserService.cs
211 Stores in database table GridUser
212 HomeRegionID, HomePosition, HomeLookAt
213 The other fields in that table -
214 UserID, LastRegionID, LastPosition, LastLookAt, Online (true or false), Login (timestamp or 0), Logout (timestamp or 0).
215
216
217
218success = inventoryService.CreateUserInventory(account.PrincipalID);
219 OpenSim/Services/InventoryService/XInventoryService.cs
220 Create a bunch of folders in the users inventory, of specific types.
221 rootFolder = ConvertToOpenSim(CreateFolder(principalID, UUID.Zero, (int)FolderType.Root, InventoryFolderBase.ROOT_FOLDER_NAME));
222 XInventoryFolder[] sysFolders = GetSystemFolders(principalID, rootFolder.ID)
223 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)FolderType.Animation) return true; return false; }))
224 CreateFolder(principalID, rootFolder.ID, (int)FolderType.Animation, "Animations");
225 FolderType.BodyPart, "Body Parts"
226 XInventoryFolder folder = CreateFolder(principalID, rootFolder.ID, (int)FolderType.CallingCard, "Calling Cards");
227 folder = CreateFolder(principalID, folder.folderID, (int)FolderType.CallingCard, "Friends")
228 CreateFolder(principalID, folder.folderID, (int)FolderType.CallingCard, "All");
229 FolderType.Clothing, "Clothing"
230 FolderType.CurrentOutfit, "Current Outfit"
231 FolderType.Favorites, "Favorites"
232 FolderType.Gesture, "Gestures")
233 FolderType.Landmark, "Landmarks"
234 FolderType.LostAndFound, "Lost And Found"
235 FolderType.Notecard, "Notecards"
236 FolderType.Object, "Objects"
237 FolderType.Snapshot, "Photo Album"
238 FolderType.LSLText, "Scripts"
239 FolderType.Sound, "Sounds"
240 FolderType.Texture, "Textures"
241 FolderType.Trash, "Trash"
242
243 Stores in database inventoryFolders ????
244 folderName, type, version = 1, folderID = UUID.Random(), agentID = principalID, parentFolderID = parentID
245
246
247
248
249CreateDefaultAppearanceEntries(account.PrincipalID)
250 OpenSim/Services/UserAccountService/UserAccountService.cs
251 protected void CreateDefaultAppearanceEntries(UUID principalID)
252 Creates a bunch of "Default *" body parts and clothes, Ruth 1.0, links them in Inventories current outfit folder.
253 Creates a AvatarWearable[] and puts them all in it.
254 AvatarAppearance ap = new AvatarAppearance();
255 ap.SetWearable(i, wearables[i]);
256 m_AvatarService.SetAppearance(principalID, ap);
257
258
259
260
261 145
262UserAccounts table - 146UserAccounts table -
263 UserFlags 64 is "allow gods to log in as me" 147 UserFlags 64 is "allow gods to log in as me"
@@ -284,84 +168,6 @@ userdata (empty, can't find any actual usage in the source code, part of profile
284auth.webLoginKey seems to be some sort of passwordy type thing, though perhaps not actually hashed, rarely used, none of IG members have one. 168auth.webLoginKey seems to be some sort of passwordy type thing, though perhaps not actually hashed, rarely used, none of IG members have one.
285 169
286 170
287PLAN-
288. username
289. password
290. create login
291
292.check if it's a proper two word name
293.login -> check if it's an existing account, get their UUID.
294 create toke_n_munchie
295 write session record
296
297create -> new user
298 create new UUID
299 check if it's an existing UUID
300 dbCount(, "UserAccounts", "PrincipleID='new-UUID'")
301 loop until we get a new one
302 create toke_n_munchie
303 write session record
304
305
306 Create ->
307 (wait a few seconds before showing this page)
308. email
309. email again
310. password again
311. DoB
312. accept terms of service
313. claim to be an adult
314. confirm / cancel
315
316 New user
317 UserAccounts.FirstName = ???
318 UserAccounts.LastName = ???
319 UserAccounts.Email = ???
320 UserAccounts.Created = timestamp
321 UserAccounts.PrincipleID = randomly generate UUID, but check for collisions with other accounts.
322 It's a UNIQUE KEY.
323 UserAccounts.ScopeID = 00000000-0000-0000-0000-000000000000
324 UserAccounts.Userlevel = -200
325 UserAccounts.UserFlags = 64
326 UserAccounts.UserTitle = newbie
327 UserAccounts.ServiceURLs = ""
328 UserAccounts.active = 0
329
330 auth.UUID = UserAccounts.PrincipleID
331 It's a PRIMARY KEY.
332 auth.passwordSalt = Util.Md5Hash(UUID.Random().ToString())
333 auth.passwdHash = Util.Md5Hash(Util.Md5Hash(password) + ":" + passwordSalt)
334 auth.accountType = "UserAccount"
335 auth.webLoginKey (varchar(255)) = "00000000-0000-0000-0000-000000000000"
336
337 userdata.UserId = UserAccounts.PrincipleID
338 userdata.TagId = "account creation data"
339 It's a UNIQUE KEY
340 userdata.DataKey = "DoB"
341 userdata.DataVal = ???
342
343 userdata.UserId = UserAccounts.PrincipleID
344 userdata.TagId = "account creation data"
345 userdata.DataKey = "timezone"
346 userdata.DataVal = ???
347
348 userdata.UserId = UserAccounts.PrincipleID
349 userdata.TagId = "account creation data"
350 userdata.DataKey = "Terms of service"
351 userdata.DataVal = "True"
352
353 userdata.UserId = UserAccounts.PrincipleID
354 userdata.TagId = "account creation data"
355 userdata.DataKey = "claims to be an adult"
356 userdata.DataVal = "True"
357
358
359 Validated via email
360 (wait a few seconds before showing this page)
361 UserAccounts.Userlevel = -100
362 UserAccounts.UserTitle = validated
363
364
365 Vouched for 171 Vouched for
366 userdata.UserId = UserAccounts.PrincipleID 172 userdata.UserId = UserAccounts.PrincipleID
367 userdata.TagId = "vouches" 173 userdata.TagId = "vouches"
@@ -372,26 +178,6 @@ create -> new user
372 UserAccounts.UserTitle = vouched for 178 UserAccounts.UserTitle = vouched for
373 179
374 180
375 Admin approved
376 GridUser.UserID = UserAccounts.PrincipleID
377 It's a PRIMARY KEY.
378 GridUser.HomeRegionID = ???
379 GridUser.HomePosition = ???
380 GridUser.HomeLookAt = ???
381 GridUser.LastRegionID = ???
382 GridUser.LastPosition = ???
383 GridUser.LastLookAt = ???
384 GridUser.Online = False
385 GridUser.Login = 0
386 GridUser.Logout = 0
387
388 UserAccounts.active = 1
389 UserAccounts.Userlevel = 1
390 UserAccounts.UserTitle = Member / Local / whatever
391
392 Load the default IAR.
393
394
395------------------------------------------------------------------- 181-------------------------------------------------------------------
396 182
397https://project-awesome.org/aleksandar-todorovic/awesome-c 183https://project-awesome.org/aleksandar-todorovic/awesome-c
@@ -408,6 +194,12 @@ https://danielmiessler.com/study/http/
408 "should not be used to make security decisions as it is controlled by the client" 194 "should not be used to make security decisions as it is controlled by the client"
409 Though others tell us to do precisely that. lol 195 Though others tell us to do precisely that. lol
410 196
197http://opensimulator.org/wiki/Userlevel
198
199http://www.catb.org/esr/structure-packing/
200 A good read, including a few links to other good stuff.
201 Am I doing this stuff properly by intuition, or completely ballsing it up? lol
202 http://www.catb.org/esr/time-programming/
411 203
412------------------------------------------------------------------- 204-------------------------------------------------------------------
413 205
@@ -480,172 +272,112 @@ long list of stuff I have to deal with manually, and now I are one. lol
480 272
481 273
482------------------------------------------------------------------- 274-------------------------------------------------------------------
275-------------------------------------------------------------------
483 276
484Time for a restructure of the web page / field / database stuff. 277For logged in user, at the top show their name as linky to their accountView http://localhost/sledjchisl.fcgi/account.html?user=account+name
485 278 That accountView offers edit / logout button, etc.
486Will need to include a "what page is this" cookie, or maybe query ?mode=add 279 Display account stuff, but not edit it until they hit the edit button.
487 280
488 281When showing other users
489 282 accountView, with edit / delete buttons if logged in user is high enough level.
490old validate UUID
491 define the UUID based UserAccounts db static dbRequest, fill it if needed.
492 if create
493 try to find an unused UUID
494 fill Rd->stuff with UUID
495 if confirm
496 check it's length
497 otherwise
498 check it's length
499 look it up, bitch if not found
500 If we found it, put level into Rd->database
501 fill Rd->stuff with UUID
502
503old validateName
504 define the name based UserAccounts db static dbRequest, fill it if needed.
505 Do the Lua file lookup, fill a tnm hash.
506 Do the database lookup, fill rows.
507 if login
508 convert tnm to Rd->database, or dbPull(rows)
509 fill Rd->stuff with name, UUID, and level
510 if create
511 complain if we found a record
512 try to find an unused UUID
513 fill Rd->database with new data
514 fill Rd->stuff with name, UUID, and level
515
516old validatePassword
517 define the UUID based auth db static dbRequest, fill it if needed.
518 if login
519 do the database lookup, fill rows
520 check if the name validation found us a UUID, fail login if it didn't
521 do the pasword+salt hash and compare
522 fill Rd->stuff with passwordHash and passwordSalt
523 if create
524 fill Rd->stuff with paswordHash and passwordSalt
525 if confirm
526 check if password hashess are the same
527
528
529
530
531
532freeSesh(Rd, linky, wipe)
533 linky - Rd->shs or Rd->lnk
534 %s/sessions/%s.lua or %s/sessions/%s.linky
535 wipe - wipe or delete session
536 wiping means remove session stuff from Rd->stuff
537 Which happens on - session failing to write, redirecting login form, showing login form if not confirm, vegOut (session timeout, bitchSession)
538
539newSesh(Rd, linky)
540 linky - old Rd->shs or a new Rd->lnk
541 setToken_n_munchie(Rd, linky); Only caller of setToken_n_munchie(Rd, linky);
542
543
544setToken_n_munchie(Rd, linky)
545 linky - Rd->shs or Rd->lnk
546 %s/sessions/%s.lua or %s/sessions/%s.linky
547 !linky - actually set the cookies.
548 if error writing session file - freeSesh(Rd, linky, TRUE);
549
550
551//validateSesh()
552sessionValidate()
553 bitchSession() for bad session things.
554 sets chillOut for validated session linky.
555 Rd->chillOut = TRUE;
556 freeSesh(Rd, linky, FALSE);
557 Rd->func = (pageBuildFunction) loginPage;
558 Rd->doit = "logout";
559 sets vegOut if the session timed out.
560
561//validatePassword()
562 sets chillOut for validated password on create.
563
564bitchSession() called if there's anything wrong with the session trackers, if we can't load / run the users Lua file,
565 sets vegOut
566
567account_HTML()
568 sets chillOut for POST confirm
569 createUser(Rd);
570 newSesh(Rd, TRUE);
571 Rd->chillOut = TRUE;
572 sets chillOut for POST login
573 Rd->chillOut = TRUE;
574
575
576 POST with no errors will
577 form == accountLogin freeSesh(Rd, FALSE, TRUE)
578 doit == login chillOut = TRUE
579 vegOut freeSesh(Rd, FALSE, TRUE);
580 else chillOut freeSesh(Rd, FALSE, FALSE); newSesh(Rd, FALSE);
581 else no Rd->shs.leaf newSesh(Rd, FALSE);
582 redirect to GET
583 otherwise
584 form == accountLogin
585 doit == confirm freeSesh(Rd, FALSE, TRUE)
586 newSesh(Rd, FALSE)
587 else if errors reeSesh(Rd, FALSE, FALSE) newSesh(Rd, FALSE)
588 show page
589
590
591
592LOGGED IN means that the session stored on disk has a valid UUID.
593 When creating a new user, we create a new UUID firstish.
594
595
596accountLoginWeb() / accountOut()
597 freeSesh(Rd, FALSE, TRUE)
598 newSesh(Rd, FALSE)
599
600accountView()
601 freeSesh(Rd, FALSE, FALSE)
602 newSesh(Rd, FALSE)
603
604accountAdd()
605 Note that this is in two parts, first they click "create" on login page, then "confirm" on the account creation page.
606
607
608
609Account creation
610 accountLoginWeb()
611 "create" ->
612 Show accountCreateWeb and await confirmation.
613 accountCreateWeb()
614 "confirm" -> accountAdd()
615 create UUID
616 create user
617 store user
618 wipe old session
619 store new session with UUID, user is logged in now
620 create linky
621 email linky
622 Show usual logged in page.
623 "cancel" ->
624 283
625 284
626------------------------------------------------------------------- 285-------------------------------------------------------------------
627 286
287NEXT -
628 288
629Maybe - /opt/opensim_SC/var/cache/sessions/uuid-uuid-uuid-uuid.logged symlink to session. 289 Have the grid start up code also run the web backend inside the left over tmux panel.
290 And have it restart if it crashes.
630 291
631https://localhost/sledjchisl.fcgi/account.html?user=account_name 292 Add the account.html stuff to the opensim-SC configuration, so viewers can get to it.
632https://localhost/sledjchisl.fcgi/account.html/users/account_name 293 ditto loginpage.html
633 logged in user is in the sesion, but they can view / vouch / edit / delete any other user depending on their access level 294 retire all the OpenSim web stuff I added before
295 write a stub page for the other pages viewers want
634 296
297 Implement poorMansCron.html.
635 298
636For logged in user, at the top show their name as linky to their accountView http://localhost/sledjchisl.fcgi/account.html/users/account_name 299 Add the red asterisk to required fields, like every one else does.
637 That accountView offers edit / logout button, etc.
638 Display account stuff, but not edit it until they hit the edit button.
639 300
640When showing other users 301 In var/cache/sessions, keep a uuid.lua full of the sessions for that user.
641 accountView, with edit / delete buttons if logged in user is high enough level. 302 Use it to clear out old sessions on login.
303 Use it to clear out old sessions on validation.
304 Use it to update the level in their session if some one changes their level.
642 305
643------------------------------------------------------------------- 306-------------------------------------------------------------------
644------------------------------------------------------------------- 307
308Should clean things up.
309TODO -
310 Move any side effects out of Validate functions, they should just stuff things into Rd->stuff.
311 sessionValidate should be the only thing putting things into shs?
312 Nope, gotta get uuid, name, and level from database / uuid.lua when they log in.
313 Move those side effects into Sub functions.
314
315iF = accountPages->get(accountPages, form, NULL, false);
316..
317sub = iF->subs->get(iF->subs, doit, NULL, false);
318..
319 i = collectFields(Rd, iF, iV, t); Stuffs cookies, body, queries, NOT stuff, into iV (including source type).
320// Validate the input data. Loops through iV.
321 iV[i].field->validate(Rd, iF, &iV[i]); Stuffs things into Rd->stuff.
322 sessionValidate Is special, ignores iV, gets things directly, reads the session.lua, stuffs things into shs and Rd->stuff.
323 nameValidate Also combines names into Rd->stuff, and into shs.
324 passwordValidate Also special...
325 emailValidate Stuffs both into stuff even if not validated.
326..
327// Submit the data. TODO - do more stuff here, like login/out the account. Login should check the password here and put things in shs.
328 Usually -
329 accountRead(Rd, iF, iV);
330 complain if found / not found
331 ...
332 freeSesh(Rd, FALSE, wipe);
333 newSesh(Rd, FALSE);
334 accountExploreValidatedVoucherSub Does nothing.
335..
336// Return the result.
337 if no errors
338 redirect to GET if it's POST, otcherwise -
339 find the output form
340 collect from stuff into iV
341 call oF->web(Rd, iF, iV)
342 else
343 collect from stuff into iV
344 call iF->eweb()
345
645------------------------------------------------------------------- 346-------------------------------------------------------------------
646 347
348Coffee Grid -
349
350Destiny Grid -
351 Auto add Hypergrid visitors group to "partner" grids.
352 Estate has "Allow parcel access overide?". Not sure what that means.
353 Which does fuck all, and turns itself off.
354
355Infinite Grid -
356 Set up the deault member and their IAR.
357
358-------------------------------------------------------------------
359-------------------------------------------------------------------
647 360
648BUGS! 361BUGS!
649----- 362-----
650Redo the santize(), though that needs extensive changes each time we read Rd->cookies, Rd->queries, and Rd->body
651 363
364Check length in database values.
365
366Names are case insensitive in world, should be on the web page to?
367 I think they are on the database side, so I should store the Lua files with lower case file names, but use the case from within the files for display.
368 I may have seen case insensitive grid logins fail, so should test this.
369 Now I have seen them work. Viewer dependant?
370
371The autogroup thing seems to have broke. Doesn't work for gods.
372 Or I did that on purpose, should check. lol
373
374Should limit viewing of other peoples account details, especially emails, to gods.
375
376Clear out landmarks from the default IAR.
377
378-------------------------------------------------------------------
379-------------------------------------------------------------------
380
381Hacks I should send up stream.
382
383 qlibc/src/extensions/qconfig.c line 402 - free(varstr)