1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//! Create the `backend_remember_tokens` table and its user index.
use laterite_core::strata::*;
use crate::schema::{BackendRememberTokens, BackendUsers};
/// Creates the `backend_remember_tokens` table and its user index.
pub struct Migration;
#[async_trait(?Send)]
impl laterite_core::Migration for Migration {
fn name(&self) -> &str {
"0012_create_backend_remember_tokens"
}
async fn up(&self, s: &mut Schema<'_>) -> CoreResult<()> {
s.exec(
Table::create()
.table(BackendRememberTokens::Table)
.if_not_exists()
// The cookie carries `selector:verifier`. The selector is the
// lookup key and is stored plain; only the verifier is secret,
// and only its hash is kept, so a leaked table grants nothing.
.col(
key_col(BackendRememberTokens::Selector)
.not_null()
.primary_key(),
)
.col(
key_col(BackendRememberTokens::VerifierHash)
.not_null(),
)
.col(
ColumnDef::new(BackendRememberTokens::BackendUserId)
.big_integer()
.not_null(),
)
.col(
ColumnDef::new(BackendRememberTokens::CreatedAt)
.text()
.not_null(),
)
.col(
ColumnDef::new(BackendRememberTokens::ExpiresAt)
.text()
.not_null(),
)
.foreign_key(
ForeignKey::create()
.from(
BackendRememberTokens::Table,
BackendRememberTokens::BackendUserId,
)
.to(BackendUsers::Table, BackendUsers::Id)
.on_delete(ForeignKeyAction::Cascade),
)
.to_owned(),
)
.await?;
s.exec(
Index::create()
.name("backend_remember_tokens_user_idx")
.table(BackendRememberTokens::Table)
.col(BackendRememberTokens::BackendUserId)
.to_owned(),
)
.await
}
async fn down(&self, s: &mut Schema<'_>) -> CoreResult<()> {
s.exec(
Table::drop()
.table(BackendRememberTokens::Table)
.to_owned(),
)
.await
}
}