mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2025-11-24 14:35:46 +00:00
duplicate token id loop
This commit is contained in:
parent
40dd7a2009
commit
1e25b66e42
36
network.sh
36
network.sh
@ -1,36 +0,0 @@
|
|||||||
set -e
|
|
||||||
|
|
||||||
launch_kv() {
|
|
||||||
bash -c "exec -a kv ./target/debug/kv-test-util $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
kill_kv() {
|
|
||||||
kill -9 $(pidof kv)
|
|
||||||
}
|
|
||||||
|
|
||||||
help() {
|
|
||||||
cat << EOF
|
|
||||||
USAGE:
|
|
||||||
./network.sh
|
|
||||||
launch launches key-value server
|
|
||||||
kill kills key-value server
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ -z $1 ]
|
|
||||||
then
|
|
||||||
help
|
|
||||||
elif [ $1 == 'launch' ]
|
|
||||||
then
|
|
||||||
if [ -z $2 ]
|
|
||||||
then
|
|
||||||
help
|
|
||||||
else
|
|
||||||
launch_kv $2
|
|
||||||
fi
|
|
||||||
elif [ $1 == 'kill' ]
|
|
||||||
then
|
|
||||||
kill_kv
|
|
||||||
else
|
|
||||||
help
|
|
||||||
fi
|
|
||||||
@ -78,20 +78,28 @@ pub async fn update_token(
|
|||||||
data: web::Data<Data>,
|
data: web::Data<Data>,
|
||||||
id: Identity,
|
id: Identity,
|
||||||
) -> ServiceResult<impl Responder> {
|
) -> ServiceResult<impl Responder> {
|
||||||
|
use std::borrow::Cow;
|
||||||
|
|
||||||
is_authenticated(&id)?;
|
is_authenticated(&id)?;
|
||||||
let key = get_random(32);
|
|
||||||
let url = Url::parse(&payload.domain)?;
|
let url = Url::parse(&payload.domain)?;
|
||||||
|
let mut key;
|
||||||
|
|
||||||
let host = url.host_str().ok_or(ServiceError::NotAUrl)?;
|
let host = url.host_str().ok_or(ServiceError::NotAUrl)?;
|
||||||
sqlx::query!(
|
loop {
|
||||||
"UPDATE mcaptcha_config SET key = $1
|
key = get_random(32);
|
||||||
WHERE name = $2 AND domain_name = $3",
|
let res = update_token_helper(&key, &payload.name, &host, &data).await;
|
||||||
&key,
|
if res.is_ok() {
|
||||||
&payload.name,
|
break;
|
||||||
&host,
|
} else {
|
||||||
)
|
if let Err(sqlx::Error::Database(err)) = res {
|
||||||
.execute(&data.db)
|
if err.code() == Some(Cow::from("23505")) {
|
||||||
.await?;
|
continue;
|
||||||
|
} else {
|
||||||
|
Err(sqlx::Error::Database(err))?;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let resp = MCaptchaDetails {
|
let resp = MCaptchaDetails {
|
||||||
key,
|
key,
|
||||||
@ -101,6 +109,24 @@ pub async fn update_token(
|
|||||||
Ok(HttpResponse::Ok().json(resp))
|
Ok(HttpResponse::Ok().json(resp))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn update_token_helper(
|
||||||
|
key: &str,
|
||||||
|
name: &str,
|
||||||
|
host: &str,
|
||||||
|
data: &Data,
|
||||||
|
) -> Result<(), sqlx::Error> {
|
||||||
|
sqlx::query!(
|
||||||
|
"UPDATE mcaptcha_config SET key = $1
|
||||||
|
WHERE name = $2 AND domain_name = $3",
|
||||||
|
&key,
|
||||||
|
&name,
|
||||||
|
&host,
|
||||||
|
)
|
||||||
|
.execute(&data.db)
|
||||||
|
.await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[post("/api/v1/mcaptcha/domain/token/get")]
|
#[post("/api/v1/mcaptcha/domain/token/get")]
|
||||||
pub async fn get_token(
|
pub async fn get_token(
|
||||||
payload: web::Json<MCaptchaID>,
|
payload: web::Json<MCaptchaID>,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user