mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2026-02-12 10:35:39 +00:00
feat: add psuedo ID support to publish campaign IDs
This commit is contained in:
@@ -13,6 +13,7 @@ async-trait = "0.1.51"
|
||||
db-core = {path = "../db-core"}
|
||||
futures = "0.3.15"
|
||||
sqlx = { version = "0.5.13", features = [ "runtime-actix-rustls", "mysql", "time", "offline" ] }
|
||||
uuid = { version = "1.4.0", features = ["v4", "serde"] }
|
||||
|
||||
[dev-dependencies]
|
||||
actix-rt = "2"
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
CREATE TABLE IF NOT EXISTS mcaptcha_psuedo_campaign_id (
|
||||
ID INT auto_increment,
|
||||
PRIMARY KEY(ID),
|
||||
psuedo_id varchar(100) NOT NULL UNIQUE,
|
||||
config_id INT NOT NULL,
|
||||
|
||||
CONSTRAINT `fk_mcaptcha_psuedo_campaign_id_config_id`
|
||||
FOREIGN KEY (config_id)
|
||||
REFERENCES mcaptcha_config (config_id)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE
|
||||
|
||||
);
|
||||
@@ -25,6 +25,31 @@
|
||||
},
|
||||
"query": "SELECT time FROM mcaptcha_pow_confirmed_stats \n WHERE \n config_id = (\n SELECT config_id FROM mcaptcha_config \n WHERE \n captcha_key = ?\n AND\n user_id = (\n SELECT \n ID FROM mcaptcha_users WHERE name = ?))\n ORDER BY time DESC"
|
||||
},
|
||||
"14dc89b2988b221fd24e4f319b1d48f5e6c65c760c30d11c9c29087f09cee23a": {
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "captcha_key",
|
||||
"ordinal": 0,
|
||||
"type_info": {
|
||||
"char_set": 224,
|
||||
"flags": {
|
||||
"bits": 4101
|
||||
},
|
||||
"max_size": 400,
|
||||
"type": "VarString"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nullable": [
|
||||
false
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
}
|
||||
},
|
||||
"query": "SELECT\n captcha_key\n FROM\n mcaptcha_config\n WHERE\n config_id = (\n SELECT\n config_id\n FROM\n mcaptcha_psuedo_campaign_id\n WHERE\n psuedo_id = ?\n );"
|
||||
},
|
||||
"22e697114c3ed5b0156cdceab11a398f1ef3a804f482e1cd948bc615ef95fc92": {
|
||||
"describe": {
|
||||
"columns": [],
|
||||
@@ -154,6 +179,31 @@
|
||||
},
|
||||
"query": "INSERT INTO mcaptcha_pow_fetched_stats \n (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config where captcha_key= ?), ?)"
|
||||
},
|
||||
"5ad1ef722a961183228d851813b9f50284520bf8cc8118c765b72c108daaf6fb": {
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "psuedo_id",
|
||||
"ordinal": 0,
|
||||
"type_info": {
|
||||
"char_set": 224,
|
||||
"flags": {
|
||||
"bits": 4101
|
||||
},
|
||||
"max_size": 400,
|
||||
"type": "VarString"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nullable": [
|
||||
false
|
||||
],
|
||||
"parameters": {
|
||||
"Right": 1
|
||||
}
|
||||
},
|
||||
"query": "SELECT psuedo_id FROM\n mcaptcha_psuedo_campaign_id\n WHERE\n config_id = (SELECT config_id FROM mcaptcha_config WHERE captcha_key = (?));\n "
|
||||
},
|
||||
"5d5a106981345e9f62bc2239c00cdc683d3aaaa820d63da300dc51e3f6f363d3": {
|
||||
"describe": {
|
||||
"columns": [],
|
||||
@@ -406,6 +456,16 @@
|
||||
},
|
||||
"query": "UPDATE mcaptcha_users set email = ?\n WHERE name = ?"
|
||||
},
|
||||
"9e45969a0f79eab8caba41b0d91e5e3b85a1a68a49136f89fc90793c38f00041": {
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"nullable": [],
|
||||
"parameters": {
|
||||
"Right": 2
|
||||
}
|
||||
},
|
||||
"query": "\n INSERT INTO\n mcaptcha_psuedo_campaign_id (config_id, psuedo_id)\n VALUES (\n (SELECT config_id FROM mcaptcha_config WHERE captcha_key = (?)),\n ?\n );"
|
||||
},
|
||||
"9f10afb0f242f11c58389803c5e85e244cc59102b8929a21e3fcaa852d57a52c": {
|
||||
"describe": {
|
||||
"columns": [
|
||||
|
||||
@@ -22,6 +22,7 @@ use sqlx::mysql::MySqlPoolOptions;
|
||||
use sqlx::types::time::OffsetDateTime;
|
||||
use sqlx::ConnectOptions;
|
||||
use sqlx::MySqlPool;
|
||||
use uuid::Uuid;
|
||||
|
||||
pub mod errors;
|
||||
#[cfg(test)]
|
||||
@@ -968,6 +969,86 @@ impl MCDatabase for Database {
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
/// Create psuedo ID against campaign ID to publish analytics
|
||||
async fn analytics_create_psuedo_id_if_not_exists(
|
||||
&self,
|
||||
captcha_id: &str,
|
||||
) -> DBResult<()> {
|
||||
let id = Uuid::new_v4();
|
||||
sqlx::query!(
|
||||
"
|
||||
INSERT INTO
|
||||
mcaptcha_psuedo_campaign_id (config_id, psuedo_id)
|
||||
VALUES (
|
||||
(SELECT config_id FROM mcaptcha_config WHERE captcha_key = (?)),
|
||||
?
|
||||
);",
|
||||
captcha_id,
|
||||
&id.to_string(),
|
||||
)
|
||||
.execute(&self.pool)
|
||||
.await
|
||||
.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Get psuedo ID from campaign ID
|
||||
async fn analytics_get_psuedo_id_from_capmaign_id(
|
||||
&self,
|
||||
captcha_id: &str,
|
||||
) -> DBResult<String> {
|
||||
struct ID {
|
||||
psuedo_id: String,
|
||||
}
|
||||
|
||||
let res = sqlx::query_as!(
|
||||
ID,
|
||||
"SELECT psuedo_id FROM
|
||||
mcaptcha_psuedo_campaign_id
|
||||
WHERE
|
||||
config_id = (SELECT config_id FROM mcaptcha_config WHERE captcha_key = (?));
|
||||
",
|
||||
captcha_id
|
||||
).fetch_one(&self.pool)
|
||||
.await
|
||||
.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
|
||||
|
||||
Ok(res.psuedo_id)
|
||||
}
|
||||
|
||||
/// Get campaign ID from psuedo ID
|
||||
async fn analytics_get_capmaign_id_from_psuedo_id(
|
||||
&self,
|
||||
psuedo_id: &str,
|
||||
) -> DBResult<String> {
|
||||
struct ID {
|
||||
captcha_key: String,
|
||||
}
|
||||
|
||||
let res = sqlx::query_as!(
|
||||
ID,
|
||||
"SELECT
|
||||
captcha_key
|
||||
FROM
|
||||
mcaptcha_config
|
||||
WHERE
|
||||
config_id = (
|
||||
SELECT
|
||||
config_id
|
||||
FROM
|
||||
mcaptcha_psuedo_campaign_id
|
||||
WHERE
|
||||
psuedo_id = ?
|
||||
);",
|
||||
psuedo_id
|
||||
)
|
||||
.fetch_one(&self.pool)
|
||||
.await
|
||||
.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
|
||||
Ok(res.captcha_key)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
|
||||
Reference in New Issue
Block a user