webdav token regeneration
This commit is contained in:
@@ -74,6 +74,51 @@ pub fn list_webdav_tokens(
|
||||
Ok(tokens)
|
||||
}
|
||||
|
||||
pub fn regenerate_webdav_token(
|
||||
conn: &mut PgPooledConnection,
|
||||
token_id: Uuid,
|
||||
user_id: Uuid,
|
||||
tenant_id: Option<Uuid>,
|
||||
) -> Result<IssuedWebdavToken, AppError> {
|
||||
let mut query = webdav_tokens::table
|
||||
.filter(webdav_tokens::id.eq(token_id))
|
||||
.filter(webdav_tokens::user_id.eq(user_id))
|
||||
.into_boxed();
|
||||
|
||||
if let Some(tenant) = tenant_id {
|
||||
query = query.filter(webdav_tokens::tenant_id.eq(tenant));
|
||||
}
|
||||
|
||||
let record = query
|
||||
.first::<WebdavToken>(conn)
|
||||
.optional()
|
||||
.map_err(AppError::from)?
|
||||
.ok_or_else(AppError::not_found)?;
|
||||
|
||||
if record.revoked_at.is_some() {
|
||||
return Err(AppError::bad_request(
|
||||
"cannot regenerate a revoked WebDAV token",
|
||||
));
|
||||
}
|
||||
|
||||
let raw_secret = generate_secret()?;
|
||||
let token_prefix = raw_secret[..TOKEN_PREFIX_LENGTH].to_string();
|
||||
let token_hash = hash_secret(&raw_secret)?;
|
||||
|
||||
let updated = diesel::update(webdav_tokens::table.find(record.id))
|
||||
.set((
|
||||
webdav_tokens::token_prefix.eq(&token_prefix),
|
||||
webdav_tokens::token_hash.eq(&token_hash),
|
||||
webdav_tokens::last_used_at.eq::<Option<NaiveDateTime>>(None),
|
||||
))
|
||||
.get_result::<WebdavToken>(conn)?;
|
||||
|
||||
Ok(IssuedWebdavToken {
|
||||
token: raw_secret,
|
||||
record: updated,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn find_active_token_by_secret(
|
||||
conn: &mut PgPooledConnection,
|
||||
user_id: Uuid,
|
||||
|
||||
Reference in New Issue
Block a user