diff options
Diffstat (limited to 'src/NOTES.txt')
-rw-r--r-- | src/NOTES.txt | 462 |
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 | ||
143 | Account creation process in the database. | 143 | Account creation process in the database. |
144 | 144 | ||
145 | Apart from the usual input validation of things... | ||
146 | |||
147 | |||
148 | OpenSim/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 | |||
154 | OpenSim/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 | |||
163 | OpenSim/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 | |||
175 | account = 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 | |||
198 | success = 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 | |||
209 | gridUserService.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 | |||
218 | success = 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 | |||
249 | CreateDefaultAppearanceEntries(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 | ||
262 | UserAccounts table - | 146 | UserAccounts 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 | |||
284 | auth.webLoginKey seems to be some sort of passwordy type thing, though perhaps not actually hashed, rarely used, none of IG members have one. | 168 | auth.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 | ||
287 | PLAN- | ||
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 | |||
297 | create -> 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 | |||
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 | ||
397 | https://project-awesome.org/aleksandar-todorovic/awesome-c | 183 | https://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 | ||
197 | http://opensimulator.org/wiki/Userlevel | ||
198 | |||
199 | http://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 | ||
484 | Time for a restructure of the web page / field / database stuff. | 277 | For 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. | |
486 | Will 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 | 281 | When showing other users | |
489 | 282 | accountView, with edit / delete buttons if logged in user is high enough level. | |
490 | old 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 | |||
503 | old 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 | |||
516 | old 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 | |||
532 | freeSesh(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 | |||
539 | newSesh(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 | |||
544 | setToken_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() | ||
552 | sessionValidate() | ||
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 | |||
564 | bitchSession() called if there's anything wrong with the session trackers, if we can't load / run the users Lua file, | ||
565 | sets vegOut | ||
566 | |||
567 | account_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 | |||
592 | LOGGED 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 | |||
596 | accountLoginWeb() / accountOut() | ||
597 | freeSesh(Rd, FALSE, TRUE) | ||
598 | newSesh(Rd, FALSE) | ||
599 | |||
600 | accountView() | ||
601 | freeSesh(Rd, FALSE, FALSE) | ||
602 | newSesh(Rd, FALSE) | ||
603 | |||
604 | accountAdd() | ||
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 | |||
609 | Account 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 | ||
287 | NEXT - | ||
628 | 288 | ||
629 | Maybe - /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 | ||
631 | https://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. |
632 | https://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 | ||
636 | For 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 | ||
640 | When 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 | |
308 | Should clean things up. | ||
309 | TODO - | ||
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 | |||
315 | iF = accountPages->get(accountPages, form, NULL, false); | ||
316 | .. | ||
317 | sub = 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 | ||
348 | Coffee Grid - | ||
349 | |||
350 | Destiny 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 | |||
355 | Infinite Grid - | ||
356 | Set up the deault member and their IAR. | ||
357 | |||
358 | ------------------------------------------------------------------- | ||
359 | ------------------------------------------------------------------- | ||
647 | 360 | ||
648 | BUGS! | 361 | BUGS! |
649 | ----- | 362 | ----- |
650 | Redo the santize(), though that needs extensive changes each time we read Rd->cookies, Rd->queries, and Rd->body | ||
651 | 363 | ||
364 | Check length in database values. | ||
365 | |||
366 | Names 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 | |||
371 | The autogroup thing seems to have broke. Doesn't work for gods. | ||
372 | Or I did that on purpose, should check. lol | ||
373 | |||
374 | Should limit viewing of other peoples account details, especially emails, to gods. | ||
375 | |||
376 | Clear out landmarks from the default IAR. | ||
377 | |||
378 | ------------------------------------------------------------------- | ||
379 | ------------------------------------------------------------------- | ||
380 | |||
381 | Hacks I should send up stream. | ||
382 | |||
383 | qlibc/src/extensions/qconfig.c line 402 - free(varstr) | ||