Deploying to gh-pages from @ ea8264054a 🚀

This commit is contained in:
realaravinth
2021-07-16 12:15:16 +00:00
parent bbcd4fbf33
commit 36f45e01e7
43 changed files with 820 additions and 202 deletions

View File

@@ -331,43 +331,6 @@
<span id="328">328</span>
<span id="329">329</span>
<span id="330">330</span>
<span id="331">331</span>
<span id="332">332</span>
<span id="333">333</span>
<span id="334">334</span>
<span id="335">335</span>
<span id="336">336</span>
<span id="337">337</span>
<span id="338">338</span>
<span id="339">339</span>
<span id="340">340</span>
<span id="341">341</span>
<span id="342">342</span>
<span id="343">343</span>
<span id="344">344</span>
<span id="345">345</span>
<span id="346">346</span>
<span id="347">347</span>
<span id="348">348</span>
<span id="349">349</span>
<span id="350">350</span>
<span id="351">351</span>
<span id="352">352</span>
<span id="353">353</span>
<span id="354">354</span>
<span id="355">355</span>
<span id="356">356</span>
<span id="357">357</span>
<span id="358">358</span>
<span id="359">359</span>
<span id="360">360</span>
<span id="361">361</span>
<span id="362">362</span>
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="comment">/*
* Copyright (C) 2021 Aravinth Manivannan &lt;realaravinth@batsense.net&gt;
@@ -387,6 +350,7 @@
*/</span>
<span class="kw">use</span> <span class="ident">actix_identity::Identity</span>;
<span class="kw">use</span> <span class="ident">actix_web</span>::{<span class="ident">web</span>, <span class="ident">HttpResponse</span>, <span class="ident">Responder</span>};
<span class="kw">use</span> <span class="ident">futures::future::try_join_all</span>;
<span class="kw">use</span> <span class="ident">libmcaptcha</span>::{<span class="ident">defense::Level</span>, <span class="ident">DefenseBuilder</span>};
<span class="kw">use</span> <span class="ident">log::debug</span>;
<span class="kw">use</span> <span class="ident">serde</span>::{<span class="ident">Deserialize</span>, <span class="ident">Serialize</span>};
@@ -400,7 +364,7 @@
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Levels</span> {
<span class="kw">pub</span> <span class="ident">add</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;static</span> <span class="ident">str</span>,
<span class="kw">pub</span> <span class="ident">delete</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;static</span> <span class="ident">str</span>,
<span class="comment">// pub delete: &amp;&#39;static str,</span>
<span class="kw">pub</span> <span class="ident">get</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;static</span> <span class="ident">str</span>,
<span class="kw">pub</span> <span class="ident">update</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;static</span> <span class="ident">str</span>,
}
@@ -409,11 +373,11 @@
<span class="kw">pub</span> <span class="kw">const</span> <span class="kw">fn</span> <span class="ident">new</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Levels</span> {
<span class="kw">let</span> <span class="ident">add</span> <span class="op">=</span> <span class="string">&quot;/api/v1/mcaptcha/levels/add&quot;</span>;
<span class="kw">let</span> <span class="ident">update</span> <span class="op">=</span> <span class="string">&quot;/api/v1/mcaptcha/levels/update&quot;</span>;
<span class="kw">let</span> <span class="ident">delete</span> <span class="op">=</span> <span class="string">&quot;/api/v1/mcaptcha/levels/delete&quot;</span>;
<span class="comment">// let delete = &quot;/api/v1/mcaptcha/levels/delete&quot;;</span>
<span class="kw">let</span> <span class="ident">get</span> <span class="op">=</span> <span class="string">&quot;/api/v1/mcaptcha/levels/get&quot;</span>;
<span class="ident">Levels</span> {
<span class="ident">add</span>,
<span class="ident">delete</span>,
<span class="comment">// delete,</span>
<span class="ident">get</span>,
<span class="ident">update</span>,
}
@@ -431,7 +395,6 @@
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">services</span>(<span class="ident">cfg</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">web::ServiceConfig</span>) {
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">add_levels</span>);
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">update_levels</span>);
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">delete_levels</span>);
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">get_levels</span>);
}
@@ -458,10 +421,12 @@
<span class="macro">debug!</span>(<span class="string">&quot;config created&quot;</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">futs</span> <span class="op">=</span> <span class="ident">Vec::with_capacity</span>(<span class="ident">payload</span>.<span class="ident">levels</span>.<span class="ident">len</span>());
<span class="kw">for</span> <span class="ident">level</span> <span class="kw">in</span> <span class="ident">payload</span>.<span class="ident">levels</span>.<span class="ident">iter</span>() {
<span class="kw">let</span> <span class="ident">difficulty_factor</span> <span class="op">=</span> <span class="ident">level</span>.<span class="ident">difficulty_factor</span> <span class="kw">as</span> <span class="ident">i32</span>;
<span class="kw">let</span> <span class="ident">visitor_threshold</span> <span class="op">=</span> <span class="ident">level</span>.<span class="ident">visitor_threshold</span> <span class="kw">as</span> <span class="ident">i32</span>;
<span class="macro">sqlx::query!</span>(
<span class="kw">let</span> <span class="ident">fut</span> <span class="op">=</span> <span class="macro">sqlx::query!</span>(
<span class="string">&quot;INSERT INTO mcaptcha_levels (
difficulty_factor,
visitor_threshold,
@@ -476,17 +441,20 @@
<span class="kw-2">&amp;</span><span class="ident">mcaptcha_config</span>.<span class="ident">key</span>,
<span class="kw-2">&amp;</span><span class="ident">username</span>,
)
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>)
.<span class="kw">await</span><span class="question-mark">?</span>;
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>);
<span class="ident">futs</span>.<span class="ident">push</span>(<span class="ident">fut</span>);
}
<span class="ident">try_join_all</span>(<span class="ident">futs</span>).<span class="kw">await</span><span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(<span class="ident">HttpResponse::Ok</span>().<span class="ident">json</span>(<span class="ident">mcaptcha_config</span>))
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">UpdateLevels</span> {
<span class="kw">pub</span> <span class="ident">levels</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Level</span><span class="op">&gt;</span>,
<span class="doccomment">/// name is config_name</span>
<span class="kw">pub</span> <span class="ident">duration</span>: <span class="ident">u32</span>,
<span class="kw">pub</span> <span class="ident">description</span>: <span class="ident">String</span>,
<span class="kw">pub</span> <span class="ident">key</span>: <span class="ident">String</span>,
}
@@ -511,7 +479,8 @@
<span class="comment">// still, needs to be benchmarked</span>
<span class="ident">defense</span>.<span class="ident">build</span>()<span class="question-mark">?</span>;
<span class="macro">sqlx::query!</span>(
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">futs</span> <span class="op">=</span> <span class="ident">Vec::with_capacity</span>(<span class="ident">payload</span>.<span class="ident">levels</span>.<span class="ident">len</span>() <span class="op">+</span> <span class="number">2</span>);
<span class="kw">let</span> <span class="ident">del_fut</span> <span class="op">=</span> <span class="macro">sqlx::query!</span>(
<span class="string">&quot;DELETE FROM mcaptcha_levels
WHERE config_id = (
SELECT config_id FROM mcaptcha_config where key = ($1)
@@ -522,13 +491,26 @@
<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">key</span>,
<span class="kw-2">&amp;</span><span class="ident">username</span>
)
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>)
.<span class="kw">await</span><span class="question-mark">?</span>;
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>); <span class="comment">//.await?;</span>
<span class="kw">let</span> <span class="ident">update_fut</span> <span class="op">=</span> <span class="macro">sqlx::query!</span>(
<span class="string">&quot;UPDATE mcaptcha_config SET name = $1, duration = $2
WHERE user_id = (SELECT ID FROM mcaptcha_users WHERE name = $3)
AND key = $4&quot;</span>,
<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">description</span>,
<span class="ident">payload</span>.<span class="ident">duration</span> <span class="kw">as</span> <span class="ident">i32</span>,
<span class="kw-2">&amp;</span><span class="ident">username</span>,
<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">key</span>,
)
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>); <span class="comment">//.await?;</span>
<span class="ident">futs</span>.<span class="ident">push</span>(<span class="ident">del_fut</span>);
<span class="ident">futs</span>.<span class="ident">push</span>(<span class="ident">update_fut</span>);
<span class="kw">for</span> <span class="ident">level</span> <span class="kw">in</span> <span class="ident">payload</span>.<span class="ident">levels</span>.<span class="ident">iter</span>() {
<span class="kw">let</span> <span class="ident">difficulty_factor</span> <span class="op">=</span> <span class="ident">level</span>.<span class="ident">difficulty_factor</span> <span class="kw">as</span> <span class="ident">i32</span>;
<span class="kw">let</span> <span class="ident">visitor_threshold</span> <span class="op">=</span> <span class="ident">level</span>.<span class="ident">visitor_threshold</span> <span class="kw">as</span> <span class="ident">i32</span>;
<span class="macro">sqlx::query!</span>(
<span class="kw">let</span> <span class="ident">fut</span> <span class="op">=</span> <span class="macro">sqlx::query!</span>(
<span class="string">&quot;INSERT INTO mcaptcha_levels (
difficulty_factor,
visitor_threshold,
@@ -544,40 +526,11 @@
<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">key</span>,
<span class="kw-2">&amp;</span><span class="ident">username</span>,
)
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>)
.<span class="kw">await</span><span class="question-mark">?</span>;
}
<span class="prelude-val">Ok</span>(<span class="ident">HttpResponse::Ok</span>())
}
<span class="attribute">#[<span class="ident">my_codegen::post</span>(
<span class="ident">path</span> <span class="op">=</span> <span class="string">&quot;crate::V1_API_ROUTES.levels.delete&quot;</span>,
<span class="ident">wrap</span> <span class="op">=</span> <span class="string">&quot;crate::CheckLogin&quot;</span>
)]</span>
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">delete_levels</span>(
<span class="ident">payload</span>: <span class="ident">web::Json</span><span class="op">&lt;</span><span class="ident">UpdateLevels</span><span class="op">&gt;</span>,
<span class="ident">data</span>: <span class="ident">AppData</span>,
<span class="ident">id</span>: <span class="ident">Identity</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">ServiceResult</span><span class="op">&lt;</span><span class="kw">impl</span> <span class="ident">Responder</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">username</span> <span class="op">=</span> <span class="ident">id</span>.<span class="ident">identity</span>().<span class="ident">unwrap</span>();
<span class="kw">for</span> <span class="ident">level</span> <span class="kw">in</span> <span class="ident">payload</span>.<span class="ident">levels</span>.<span class="ident">iter</span>() {
<span class="kw">let</span> <span class="ident">difficulty_factor</span> <span class="op">=</span> <span class="ident">level</span>.<span class="ident">difficulty_factor</span> <span class="kw">as</span> <span class="ident">i32</span>;
<span class="macro">sqlx::query!</span>(
<span class="string">&quot;DELETE FROM mcaptcha_levels WHERE
config_id = (
SELECT config_id FROM mcaptcha_config WHERE key = $1 AND
user_id = (SELECT ID from mcaptcha_users WHERE name = $3)
) AND difficulty_factor = ($2);&quot;</span>,
<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">key</span>,
<span class="ident">difficulty_factor</span>,
<span class="kw-2">&amp;</span><span class="ident">username</span>
)
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>)
.<span class="kw">await</span><span class="question-mark">?</span>;
.<span class="ident">execute</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>); <span class="comment">//.await?;</span>
<span class="ident">futs</span>.<span class="ident">push</span>(<span class="ident">fut</span>);
}
<span class="ident">try_join_all</span>(<span class="ident">futs</span>).<span class="kw">await</span><span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(<span class="ident">HttpResponse::Ok</span>())
}
@@ -616,7 +569,8 @@
config_id = (
SELECT config_id FROM mcaptcha_config WHERE key = ($1)
AND user_id = (SELECT ID from mcaptcha_users WHERE name = $2)
);&quot;</span>,
)
ORDER BY difficulty_factor ASC;&quot;</span>,
<span class="ident">key</span>,
<span class="kw-2">&amp;</span><span class="ident">username</span>
)
@@ -637,6 +591,15 @@
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::tests</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="kw-2">*</span>;
<span class="kw">const</span> <span class="ident">L1</span>: <span class="ident">Level</span> <span class="op">=</span> <span class="ident">Level</span> {
<span class="ident">difficulty_factor</span>: <span class="number">100</span>,
<span class="ident">visitor_threshold</span>: <span class="number">10</span>,
};
<span class="kw">const</span> <span class="ident">L2</span>: <span class="ident">Level</span> <span class="op">=</span> <span class="ident">Level</span> {
<span class="ident">difficulty_factor</span>: <span class="number">1000</span>,
<span class="ident">visitor_threshold</span>: <span class="number">1000</span>,
};
<span class="attribute">#[<span class="ident">actix_rt::test</span>]</span>
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">level_routes_work</span>() {
<span class="kw">const</span> <span class="ident">NAME</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;testuserlevelroutes&quot;</span>;
@@ -655,8 +618,7 @@
<span class="comment">// 2. get level</span>
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="macro">vec!</span>[<span class="ident">L1</span>, <span class="ident">L2</span>];
<span class="kw">let</span> <span class="ident">add_level</span> <span class="op">=</span> <span class="ident">get_level_data</span>();
<span class="kw">let</span> <span class="ident">get_level_resp</span> <span class="op">=</span> <span class="ident">test::call_service</span>(
<span class="kw-2">&amp;</span><span class="ident">app</span>,
<span class="macro">post_request!</span>(<span class="kw-2">&amp;</span><span class="ident">key</span>, <span class="ident">ROUTES</span>.<span class="ident">levels</span>.<span class="ident">get</span>)
@@ -666,31 +628,28 @@
.<span class="kw">await</span>;
<span class="macro">assert_eq!</span>(<span class="ident">get_level_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode::OK</span>);
<span class="kw">let</span> <span class="ident">res_levels</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Level</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">test::read_body_json</span>(<span class="ident">get_level_resp</span>).<span class="kw">await</span>;
<span class="macro">assert_eq!</span>(<span class="ident">res_levels</span>, <span class="ident">levels</span>);
<span class="macro">assert_eq!</span>(<span class="ident">res_levels</span>, <span class="ident">add_level</span>.<span class="ident">levels</span>);
<span class="comment">// 3. update level</span>
<span class="kw">let</span> <span class="ident">l1</span> <span class="op">=</span> <span class="ident">Level</span> {
<span class="ident">difficulty_factor</span>: <span class="number">10</span>,
<span class="ident">visitor_threshold</span>: <span class="number">10</span>,
};
<span class="kw">let</span> <span class="ident">l2</span> <span class="op">=</span> <span class="ident">Level</span> {
<span class="ident">difficulty_factor</span>: <span class="number">5000</span>,
<span class="ident">visitor_threshold</span>: <span class="number">5000</span>,
};
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="macro">vec!</span>[<span class="ident">l1</span>, <span class="ident">l2</span>];
<span class="kw">let</span> <span class="ident">add_level</span> <span class="op">=</span> <span class="ident">UpdateLevels</span> {
<span class="ident">levels</span>: <span class="ident">levels</span>.<span class="ident">clone</span>(),
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="macro">vec!</span>[<span class="ident">L1</span>, <span class="ident">L2</span>];
<span class="kw">let</span> <span class="ident">update_level</span> <span class="op">=</span> <span class="ident">UpdateLevels</span> {
<span class="ident">key</span>: <span class="ident">key</span>.<span class="ident">key</span>.<span class="ident">clone</span>(),
<span class="ident">levels</span>: <span class="ident">levels</span>.<span class="ident">clone</span>(),
<span class="ident">description</span>: <span class="ident">add_level</span>.<span class="ident">description</span>,
<span class="ident">duration</span>: <span class="ident">add_level</span>.<span class="ident">duration</span>,
};
<span class="kw">let</span> <span class="ident">add_token_resp</span> <span class="op">=</span> <span class="ident">test::call_service</span>(
<span class="kw-2">&amp;</span><span class="ident">app</span>,
<span class="macro">post_request!</span>(<span class="kw-2">&amp;</span><span class="ident">add_level</span>, <span class="ident">ROUTES</span>.<span class="ident">levels</span>.<span class="ident">update</span>)
<span class="macro">post_request!</span>(<span class="kw-2">&amp;</span><span class="ident">update_level</span>, <span class="kw-2">&amp;</span><span class="ident">ROUTES</span>.<span class="ident">levels</span>.<span class="ident">update</span>)
.<span class="ident">cookie</span>(<span class="ident">cookies</span>.<span class="ident">clone</span>())
.<span class="ident">to_request</span>(),
)
.<span class="kw">await</span>;
<span class="macro">assert_eq!</span>(<span class="ident">add_token_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode::OK</span>);
<span class="kw">let</span> <span class="ident">get_level_resp</span> <span class="op">=</span> <span class="ident">test::call_service</span>(
<span class="kw-2">&amp;</span><span class="ident">app</span>,
<span class="macro">post_request!</span>(<span class="kw-2">&amp;</span><span class="ident">key</span>, <span class="ident">ROUTES</span>.<span class="ident">levels</span>.<span class="ident">get</span>)
@@ -701,39 +660,6 @@
<span class="macro">assert_eq!</span>(<span class="ident">get_level_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode::OK</span>);
<span class="kw">let</span> <span class="ident">res_levels</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Level</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">test::read_body_json</span>(<span class="ident">get_level_resp</span>).<span class="kw">await</span>;
<span class="macro">assert_eq!</span>(<span class="ident">res_levels</span>, <span class="ident">levels</span>);
<span class="comment">// 4. delete level</span>
<span class="kw">let</span> <span class="ident">l1</span> <span class="op">=</span> <span class="ident">Level</span> {
<span class="ident">difficulty_factor</span>: <span class="number">10</span>,
<span class="ident">visitor_threshold</span>: <span class="number">10</span>,
};
<span class="kw">let</span> <span class="ident">l2</span> <span class="op">=</span> <span class="ident">Level</span> {
<span class="ident">difficulty_factor</span>: <span class="number">5000</span>,
<span class="ident">visitor_threshold</span>: <span class="number">5000</span>,
};
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="macro">vec!</span>[<span class="ident">l1</span>, <span class="ident">l2</span>];
<span class="kw">let</span> <span class="ident">add_level</span> <span class="op">=</span> <span class="ident">UpdateLevels</span> {
<span class="ident">levels</span>: <span class="ident">levels</span>.<span class="ident">clone</span>(),
<span class="ident">key</span>: <span class="ident">key</span>.<span class="ident">key</span>.<span class="ident">clone</span>(),
};
<span class="kw">let</span> <span class="ident">add_token_resp</span> <span class="op">=</span> <span class="ident">test::call_service</span>(
<span class="kw-2">&amp;</span><span class="ident">app</span>,
<span class="macro">post_request!</span>(<span class="kw-2">&amp;</span><span class="ident">add_level</span>, <span class="ident">ROUTES</span>.<span class="ident">levels</span>.<span class="ident">delete</span>)
.<span class="ident">cookie</span>(<span class="ident">cookies</span>.<span class="ident">clone</span>())
.<span class="ident">to_request</span>(),
)
.<span class="kw">await</span>;
<span class="macro">assert_eq!</span>(<span class="ident">add_token_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode::OK</span>);
<span class="kw">let</span> <span class="ident">get_level_resp</span> <span class="op">=</span> <span class="ident">test::call_service</span>(
<span class="kw-2">&amp;</span><span class="ident">app</span>,
<span class="macro">post_request!</span>(<span class="kw-2">&amp;</span><span class="ident">key</span>, <span class="ident">ROUTES</span>.<span class="ident">levels</span>.<span class="ident">get</span>)
.<span class="ident">cookie</span>(<span class="ident">cookies</span>.<span class="ident">clone</span>())
.<span class="ident">to_request</span>(),
)
.<span class="kw">await</span>;
<span class="macro">assert_eq!</span>(<span class="ident">get_level_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode::OK</span>);
<span class="kw">let</span> <span class="ident">res_levels</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Level</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">test::read_body_json</span>(<span class="ident">get_level_resp</span>).<span class="kw">await</span>;
<span class="macro">assert_eq!</span>(<span class="ident">res_levels</span>, <span class="ident">Vec::new</span>());
}
}
</pre></div>

View File

@@ -299,7 +299,7 @@
<span class="string">&quot;SELECT difficulty_factor, visitor_threshold FROM mcaptcha_levels WHERE
config_id = (
SELECT config_id FROM mcaptcha_config WHERE key = ($1)
);&quot;</span>,
) ORDER BY difficulty_factor ASC;&quot;</span>,
<span class="kw-2">&amp;</span><span class="ident">key</span>,
)
.<span class="ident">fetch_all</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>.<span class="ident">db</span>);