Kreu uzanton kun "admin" rajtoj se "savanni" ne ekzistas
This commit is contained in:
parent
f4164a62c4
commit
612ad89b70
|
@ -1 +0,0 @@
|
||||||
[{"jti":"fa613049-e370-4576-b3f0-b7757c3e0cca","aud":"savanni","exp":1672379098,"iss":"savanni","iat":1640843098,"sub":"admin","perms":["admin"]}]
|
|
|
@ -181,6 +181,8 @@ pub trait AŭtentigoDB: Send {
|
||||||
) -> Option<UzantIdentigilo>;
|
) -> Option<UzantIdentigilo>;
|
||||||
|
|
||||||
fn aŭtentigu_per_sesio(&self, ĵetono: &SesiaĴetono) -> Option<(UzantIdentigilo, Uzantnomo)>;
|
fn aŭtentigu_per_sesio(&self, ĵetono: &SesiaĴetono) -> Option<(UzantIdentigilo, Uzantnomo)>;
|
||||||
|
|
||||||
|
fn uzanto_ekzistas(&self, uzantnomo: Uzantnomo) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct MemAŭtentigo {
|
pub struct MemAŭtentigo {
|
||||||
|
@ -244,6 +246,10 @@ impl AŭtentigoDB for MemAŭtentigo {
|
||||||
let uzantnomo = self.uzantoj.get(&identigilo).cloned()?;
|
let uzantnomo = self.uzantoj.get(&identigilo).cloned()?;
|
||||||
Some((identigilo, uzantnomo))
|
Some((identigilo, uzantnomo))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn uzanto_ekzistas(&self, uzantnomo: Uzantnomo) -> bool {
|
||||||
|
self.inversa_uzantoj.get(&uzantnomo).is_some()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DBAŭtentigo {
|
pub struct DBAŭtentigo {
|
||||||
|
@ -386,6 +392,18 @@ impl AŭtentigoDB for DBAŭtentigo {
|
||||||
.optional()
|
.optional()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn uzanto_ekzistas(&self, uzantnomo: Uzantnomo) -> bool {
|
||||||
|
let konekto = self.pool.konektu().unwrap();
|
||||||
|
let cnt: usize = konekto
|
||||||
|
.query_row(
|
||||||
|
"SELECT count(*) from uzantoj WHERE nomo = ?",
|
||||||
|
params![String::from(uzantnomo.clone())],
|
||||||
|
|row| row.get("count(*)"),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
cnt > 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -400,6 +418,7 @@ pub fn kun_aŭtentigo(
|
||||||
warp::header("authentication").and_then({
|
warp::header("authentication").and_then({
|
||||||
let auth_ctx = auth_ctx.clone();
|
let auth_ctx = auth_ctx.clone();
|
||||||
move |text: SesiaĴetono| {
|
move |text: SesiaĴetono| {
|
||||||
|
println!("teksto: {:?}", text);
|
||||||
let auth_ctx = auth_ctx.clone();
|
let auth_ctx = auth_ctx.clone();
|
||||||
async move {
|
async move {
|
||||||
match auth_ctx.read().unwrap().aŭtentigu_per_sesio(&text) {
|
match auth_ctx.read().unwrap().aŭtentigu_per_sesio(&text) {
|
||||||
|
@ -428,4 +447,15 @@ mod test {
|
||||||
.aŭtentigu_per_pasvorto(&Uzantnomo::from("savanni"), &Pasvorto::from("abcdefg"));
|
.aŭtentigu_per_pasvorto(&Uzantnomo::from("savanni"), &Pasvorto::from("abcdefg"));
|
||||||
assert_eq!(aŭtentita_identigilo, Some(identigilo));
|
assert_eq!(aŭtentita_identigilo, Some(identigilo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ĝi_scias_kiel_uzanto_ekzistas() {
|
||||||
|
let vojo = NamedTempFile::new().unwrap().into_temp_path();
|
||||||
|
let datumbazo = Datumbazo::kreu(vojo.to_path_buf()).unwrap();
|
||||||
|
let mut aŭtentigo = DBAŭtentigo::kreu(datumbazo);
|
||||||
|
assert!(!(aŭtentigo.uzanto_ekzistas(Uzantnomo::from("savanni"))));
|
||||||
|
|
||||||
|
let _ = aŭtentigo.kreu_uzanton(Uzantnomo::from("savanni"), Pasvorto::from("abcdefg"));
|
||||||
|
assert!(aŭtentigo.uzanto_ekzistas(Uzantnomo::from("savanni")));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ use warp::{Filter, Rejection};
|
||||||
|
|
||||||
#[path = "aŭtentigo.rs"]
|
#[path = "aŭtentigo.rs"]
|
||||||
mod aŭtentigo;
|
mod aŭtentigo;
|
||||||
use aŭtentigo::{kun_aŭtentigo, AŭtentigoDB, AŭtentigoPostulas, Uzantnomo};
|
use aŭtentigo::{kun_aŭtentigo, AŭtentigoDB, AŭtentigoPostulas, Pasvorto, Uzantnomo};
|
||||||
|
|
||||||
mod datumbazo;
|
mod datumbazo;
|
||||||
use datumbazo::Datumbazo;
|
use datumbazo::Datumbazo;
|
||||||
|
@ -51,12 +51,26 @@ pub async fn main() {
|
||||||
let db = Datumbazo::kreu(PathBuf::from("../servilo.db")).unwrap();
|
let db = Datumbazo::kreu(PathBuf::from("../servilo.db")).unwrap();
|
||||||
|
|
||||||
let auth_ctx = Arc::new(RwLock::new(DBAŭtentigo::kreu(db.clone())));
|
let auth_ctx = Arc::new(RwLock::new(DBAŭtentigo::kreu(db.clone())));
|
||||||
|
let rajtigo = Arc::new(RwLock::new(DBRajtigo::kreu(db)));
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut auth_ctx = auth_ctx.write().unwrap();
|
||||||
|
let mut rajtigo = rajtigo.write().unwrap();
|
||||||
|
if !auth_ctx.uzanto_ekzistas(Uzantnomo::from("savanni")) {
|
||||||
|
let uzant_identigilo =
|
||||||
|
auth_ctx.kreu_uzanton(Uzantnomo::from("savanni"), Pasvorto::from("abcdefg"));
|
||||||
|
rajtigo.aldonu_rajtojn(
|
||||||
|
uzant_identigilo,
|
||||||
|
&mut [Rajto::from("admin")].iter().cloned(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let ĵetono = auth_ctx
|
let ĵetono = auth_ctx
|
||||||
.write()
|
.write()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.kreu_sesion(&Uzantnomo::from("savanni"));
|
.kreu_sesion(&Uzantnomo::from("savanni"));
|
||||||
println!("ĵetono: {}", String::from(ĵetono));
|
println!("ĵetono: {}", String::from(ĵetono));
|
||||||
let rajtigo = Arc::new(RwLock::new(DBRajtigo::kreu(db)));
|
|
||||||
|
|
||||||
let listigu_ludantojn = {
|
let listigu_ludantojn = {
|
||||||
let auth_ctx = auth_ctx.clone();
|
let auth_ctx = auth_ctx.clone();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::{aŭtentigo::UzantIdentigilo, datumbazo::Datumbazo};
|
use crate::{aŭtentigo::UzantIdentigilo, datumbazo::Datumbazo};
|
||||||
use rusqlite::OptionalExtension;
|
use rusqlite::{params, OptionalExtension};
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
|
@ -22,7 +22,7 @@ pub trait Rajtigo {
|
||||||
where
|
where
|
||||||
F: FnOnce(&mut (dyn Iterator<Item = Rajto>)) -> bool;
|
F: FnOnce(&mut (dyn Iterator<Item = Rajto>)) -> bool;
|
||||||
fn rajtoj(&self, identigilo: &UzantIdentigilo) -> Vec<Rajto>;
|
fn rajtoj(&self, identigilo: &UzantIdentigilo) -> Vec<Rajto>;
|
||||||
fn aldonu_rajtoj(
|
fn aldonu_rajtojn(
|
||||||
&mut self,
|
&mut self,
|
||||||
identigilo: UzantIdentigilo,
|
identigilo: UzantIdentigilo,
|
||||||
rajtoj: &mut (dyn Iterator<Item = Rajto>),
|
rajtoj: &mut (dyn Iterator<Item = Rajto>),
|
||||||
|
@ -124,11 +124,18 @@ impl Rajtigo for DBRajtigo {
|
||||||
vec![]
|
vec![]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn aldonu_rajtoj(
|
fn aldonu_rajtojn(
|
||||||
&mut self,
|
&mut self,
|
||||||
identigilo: UzantIdentigilo,
|
identigilo: UzantIdentigilo,
|
||||||
rajtoj: &mut (dyn Iterator<Item = Rajto>),
|
rajtoj: &mut (dyn Iterator<Item = Rajto>),
|
||||||
) {
|
) {
|
||||||
|
let konekto = self.pool.konektu().unwrap();
|
||||||
|
let mut stmt = konekto.prepare("INSERT INTO rajtoj VALUES(?, ?)").unwrap();
|
||||||
|
|
||||||
|
rajtoj.for_each(|r| {
|
||||||
|
stmt.execute(params![String::from(identigilo.clone()), String::from(r)])
|
||||||
|
.unwrap();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn foriru_rajtoj(
|
fn foriru_rajtoj(
|
||||||
|
|
Loading…
Reference in New Issue