From 9bf06fffd694f3349027ebbedbc0a85c1042e23d Mon Sep 17 00:00:00 2001 From: red binder Date: Thu, 16 Jul 2026 02:06:51 +0200 Subject: [PATCH] serial number and cert hash route --- ...d9d3e1961530ae963f9ab5442482d81228590.json | 28 +++++++++++++ ...c1c262351465b6f102e98912f67442a1f54d9.json | 21 ---------- ...604095f71324011e7093ec37af15da8c158f4.json | 14 ++++++- ...66fc2a97ac6e25a9733d1d20faf555c67abe1.json | 14 ++++++- ...8c840f66eec4e5458d3709c0e0f09afe51377.json | 15 +++++++ ...d15f9e4bafdfca12d2130a873d44a88dd435b.json | 23 ----------- ...4dc5cd7ae99fac34ae16023f9a6a701857c9.json} | 7 ++-- src/json_api/admin/bans.rs | 6 +-- src/json_api/users/console.rs | 40 +++++++++++++++++++ src/json_api/users/mod.rs | 3 +- src/main.rs | 1 + src/nnid/provider.rs | 9 +++-- 12 files changed, 122 insertions(+), 59 deletions(-) create mode 100644 .sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json delete mode 100644 .sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json create mode 100644 .sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json delete mode 100644 .sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json rename .sqlx/{query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json => query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json} (72%) create mode 100644 src/json_api/users/console.rs diff --git a/.sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json b/.sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json new file mode 100644 index 0000000..64e253e --- /dev/null +++ b/.sqlx/query-0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "select serial from certificates where hash = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "serial", + "type_info": "Varchar", + "origin": { + "Table": { + "table": "certificates", + "name": "serial" + } + } + } + ], + "parameters": { + "Left": [ + "Bytea" + ] + }, + "nullable": [ + true + ] + }, + "hash": "0ef5f08a84d6864291cb6125610d9d3e1961530ae963f9ab5442482d81228590" +} diff --git a/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json b/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json deleted file mode 100644 index 9607895..0000000 --- a/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT nextval('pid_counter') as pid", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "pid", - "type_info": "Int8", - "origin": "Expression" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9" -} diff --git a/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json b/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json index 88cc28a..96c9316 100644 --- a/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json +++ b/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json @@ -68,6 +68,17 @@ "name": "expires" } } + }, + { + "ordinal": 6, + "name": "cert_hash", + "type_info": "Bytea", + "origin": { + "Table": { + "table": "tokens", + "name": "cert_hash" + } + } } ], "parameters": { @@ -83,7 +94,8 @@ false, false, true, - false + false, + true ] }, "hash": "48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4" diff --git a/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json b/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json index b5366a8..fd3faba 100644 --- a/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json +++ b/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json @@ -68,6 +68,17 @@ "name": "expires" } } + }, + { + "ordinal": 6, + "name": "cert_hash", + "type_info": "Bytea", + "origin": { + "Table": { + "table": "tokens", + "name": "cert_hash" + } + } } ], "parameters": { @@ -83,7 +94,8 @@ false, false, true, - false + false, + true ] }, "hash": "9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1" diff --git a/.sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json b/.sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json new file mode 100644 index 0000000..9d62095 --- /dev/null +++ b/.sqlx/query-beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "update certificates set serial = $1 where hash = $2", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Bytea" + ] + }, + "nullable": [] + }, + "hash": "beeeea07993ba8daac1e43c985e8c840f66eec4e5458d3709c0e0f09afe51377" +} diff --git a/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json b/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json deleted file mode 100644 index 103f7d7..0000000 --- a/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT EXISTS(select 1 from users where pid = $1)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "exists", - "type_info": "Bool", - "origin": "Expression" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - null - ] - }, - "hash": "c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b" -} diff --git a/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json b/.sqlx/query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json similarity index 72% rename from .sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json rename to .sqlx/query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json index c190306..d7473a0 100644 --- a/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json +++ b/.sqlx/query-d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "insert into tokens (token_type, pid, title_id)\n values ($1, $2, $3) returning token_id, random", + "query": "insert into tokens (token_type, pid, title_id, cert_hash)\n values ($1, $2, $3, $4) returning token_id, random", "describe": { "columns": [ { @@ -30,7 +30,8 @@ "Left": [ "Int4", "Int4", - "Varchar" + "Varchar", + "Bytea" ] }, "nullable": [ @@ -38,5 +39,5 @@ false ] }, - "hash": "e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2" + "hash": "d8298703381f0e220bdbe122dbdc4dc5cd7ae99fac34ae16023f9a6a701857c9" } diff --git a/src/json_api/admin/bans.rs b/src/json_api/admin/bans.rs index 94ebef5..fa211c6 100644 --- a/src/json_api/admin/bans.rs +++ b/src/json_api/admin/bans.rs @@ -1,11 +1,7 @@ -use rocket::serde::json::Json; use rocket::{post, FromForm, State}; use rocket::form::Form; -use rocket::futures::TryFutureExt; use rocket::http::Status; use crate::account::account::Auth; -use crate::json_api::oauth::generate_token::TokenRequest; -use crate::nnid::people::{build_oauth_profile, GetOwnOAuthProfileData}; use crate::Pool; #[derive(FromForm)] @@ -21,7 +17,7 @@ pub async fn ban_user(pool: &State, auth: Auth, request: Form, auth: Auth) -> Result, (Status, &'static str)> { + let hash = auth.1.ok_or((Status::BadRequest, "token needs cert hash"))?; + + let row = sqlx::query!( + "select serial from certificates where hash = $1", + &hash[..] + ) + .fetch_one(pool.inner()) + .await + .map_err(|e| { + log::error!("failed to execute query: {:?}", e); + (Status::InternalServerError, "error in database query") + })?; + + let hex_hash = hex::encode(hash); + let serial = row.serial.ok_or((Status::BadRequest, "we had no serial"))?; + + Ok( + Json ( + ConsoleData { + serial, + cert_hash: hex_hash + } + ) + ) +} \ No newline at end of file diff --git a/src/json_api/users/mod.rs b/src/json_api/users/mod.rs index b284f7e..a71fca3 100644 --- a/src/json_api/users/mod.rs +++ b/src/json_api/users/mod.rs @@ -1,3 +1,4 @@ pub mod profile; pub mod mii; -pub mod delete; \ No newline at end of file +pub mod delete; +pub mod console; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 35a48df..1ad5ca5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -119,6 +119,7 @@ async fn launch() -> _ { json_api::oauth::authorize::authorize_page, json_api::oauth::authorize::authorize_submit, json_api::admin::bans::ban_user, + json_api::users::console::get_own_console, nnid::people::thing, // graphql::graphiql, // graphql::playground, diff --git a/src/nnid/provider.rs b/src/nnid/provider.rs index bbe41d5..316d003 100644 --- a/src/nnid/provider.rs +++ b/src/nnid/provider.rs @@ -6,7 +6,6 @@ use crate::nnid::oauth::generate_token::token_type::NEX_TOKEN; use crate::xml::Xml; use log::{info, warn}; use nex_account::grpc::Pid; -use reqwest::header::SERVER; use rocket::http::Status; use rocket::request::{FromRequest, Outcome, Request}; use rocket::{State, async_trait, get}; @@ -74,18 +73,20 @@ pub async fn store_or_check_serial(pool: &Pool, serial: &str, cert_hash: [u8; 32 }; let Some(stored_serial) = res.serial else { - query!( + let _row = query!( "update certificates set serial = $1 where hash = $2", serial, &cert_hash[..] - ); + ).execute(pool) + .await + .ok(); return true; }; serial == stored_serial } -struct Serial(String); +pub struct Serial(pub String); #[async_trait] impl<'r> FromRequest<'r> for Serial {