summaryrefslogtreecommitdiff
path: root/src/login
Commit message (Collapse)AuthorAge
* Write tests.Owen Jacobson2024-09-20
|
* Pass dates around by ref more consistentlyOwen Jacobson2024-09-20
|
* Remove the HTML client, and expose a JSON API.Owen Jacobson2024-09-20
| | | | | | | | | | | | | This API structure fell out of a conversation with Kit. Described loosely: kit: ok kit: Here's what I'm picturing in a client kit: list channels, make-new-channel, zero to one active channels, post-to-active. kit: login/sign-up, logout owen: you will likely also want "am I logged in" here kit: sure, whoami
* Expire messages after 90 days.Owen Jacobson2024-09-20
| | | | | | | | | | This is intended to manage storage growth. A community with broadly steady traffic will now reach a steady state (ish) where the amount of storage in use stays within a steady band. The 90 day threshold is a spitball; this should be made configurable for the community's needs. I've also hoisted expiry out into the `app` classes, to reduce the amount of non-database work repo types are doing. This should make it easier to make expiry configurable later on. Includes incidental cleanup and style changes.
* Less Option calisthenicOwen Jacobson2024-09-20
|
* Most pass-through errors do not need additional message textOwen Jacobson2024-09-18
|
* Return 404s when resources are not found.Owen Jacobson2024-09-18
| | | | This is implemented by making the return values, in most cases, idiosyncratic ad-hoc types that then convert to the approprate error response. This also should make endpoints more testable, since the return values can now be inspected to check their properties without having to process or parse an HTTP response.
* App methods now return errors that allow not-found cases to be distinguished.Owen Jacobson2024-09-18
|
* Express record dependencies through types.Owen Jacobson2024-09-17
| | | | This provides a convenient place to _stick_ "not found" errors, though actually introducing them will come in a later commit.
* Consolidate most repository types into a repo module.Owen Jacobson2024-09-16
| | | | | | | | | | | | Having them contained in the individual endpoint groups conveyed an unintended sense that their intended scope was _only_ that endpoint group. It also made most repo-related import paths _quite_ long. This splits up the repos as follows: * "General applicability" repos - those that are only loosely connected to a single task, and are likely to be shared between tasks - go in crate::repo. * Specialized repos - those tightly connected to a specific task - go in the module for that task, under crate::PATH::repo. In both cases, each repo goes in its own submodule, to make it easier to use the module name as a namespace. Which category a repo goes in is a judgment call. `crate::channel::repo::broadcast` (formerly `channel::repo::messages`) is used outside of `crate::channel`, for example, but its main purpose is to support channel message broadcasts. It could arguably live under `crate::event::repo::channel`, but the resulting namespace is less legible to me.
* Revoking a nonexistent token should failOwen Jacobson2024-09-16
|
* Expose sqlx errors directly in repo interfaces.Owen Jacobson2024-09-16
| | | | BoxedError conceals the exact nature of the error, which in turn prevents me from using sqlx::Error::RowNotFound to signal absences.
* Return unauthorized, not forbidden, when authenticating with an invalid cookieOwen Jacobson2024-09-16
|
* Pass through CookieJar encoding/decoding errors using its own types.Owen Jacobson2024-09-16
| | | | This is mostly a style thing, the type stays `Infallible`, we're just less coupled to the specifics.
* Generate the required structure for broadcasting from a join, not from O(n) ↵Owen Jacobson2024-09-13
| | | | queries.
* Suggested fixes from Clippy, via nursery and pedantic sets.Owen Jacobson2024-09-13
|
* Embed the sender's whole login (id and name) in messages, drop the redundant ↵Owen Jacobson2024-09-13
| | | | channel ID.
* Transmit messages via `/:chan/send` and `/:chan/events`.Owen Jacobson2024-09-13
|
* Consolidate the (now) two definitions of DateTime.Owen Jacobson2024-09-12
|
* Push most endpoint and extractor logic into functoins of `App`.Owen Jacobson2024-09-12
| | | | | | | | This is, again, groundwork for logic that requires more than just a database connection. The login process has been changed to be more conventional, attempting login _before_ account creation rather than after it. This was not previously possible, because the data access methods used to perform these steps did not return enough information to carry out the workflow in that order. Separating storage from password validation and hashing forces the issue, and makes it clearer _at the App_ whether an account exists or not. This does introduce the possibility of two racing inserts trying to lay claim to the same username. Transaction isolation should ensure that only one of them "wins," which is what you get before this change anyways.
* Wrap the database pool in an App struct.Owen Jacobson2024-09-12
| | | | | | This is a jumping-off point for adding logic that needs more than just the DB for state, such as chat message handling. The name sucks, but it's the best I've got.
* Be a bit more consistent about 'token', the whole record, versus 'secret', ↵Owen Jacobson2024-09-12
| | | | the value in that record used to verify logins.
* Expire tokens based on when they were last used, not based on when they were ↵Owen Jacobson2024-09-11
| | | | | | | | issued. This lets us shorten the expiry interval - by quite a bit. Tokens in regular use will now live indefinitely, while tokens that go unused for _one week_ will be invalidated and deleted. This will reduce the number of "dead" tokens (still valid, but _de facto_ no longer in use) stored in the table, and limit the exposure period if a token is leaked and then not used immediately. It's also much less likely to produce surprise logouts three months after installation. You'll either stay logged in, or have to log in again much, much sooner, making it feel a lot more regular and less surprising.
* Align /login form type name with other form type names.Owen Jacobson2024-09-04
|
* Fix mis-placed commentOwen Jacobson2024-09-04
|
* Login fixes:Owen Jacobson2024-09-04
| | | | | | | | 1. Stop rejecting login attempts when there's an identity cookie already set. This looked like a good idea, but in practice it's not a sufficient check, as it doesnt' ensure the identity cookie is actually valid. Validating it is an option, but the do-nothing alternative (which I went with) is that a login request while already logged in overwrites your identity cookie, instead. It's less code, semantically not bonkers, and doesn't _appear_ to introduce any interesting user security issues. 2. Redirect to / after successful login/logout, instead of dropping the user on a useless text page.
* Expire sessions after 90 days.Owen Jacobson2024-09-04
|
* Display a different / page depending on whether the current identity is ↵Owen Jacobson2024-09-04
| | | | | | | | valid or not. This is mostly a proof of concept for the implementation of form login implemented in previous commits, but it _is_ useful as it controls whether the / page shows login, or shows logout. From here, chat is next!
* Add logout support.Owen Jacobson2024-09-03
|
* Allow login creation and authentication.Owen Jacobson2024-09-03
This is a beefy change, as it adds a TON of smaller pieces needed to make this all function: * A database migration. * A ton of new crates for things like password validation, timekeeping, and HTML generation. * A first cut at a module structure for routes, templates, repositories. * A family of ID types, for identifying various kinds of domain thing. * AppError, which _doesn't_ implement Error but can be sent to clients.