mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2026-02-12 10:35:39 +00:00
Deploying to gh-pages from @ cc17f2048f 🚀
This commit is contained in:
@@ -98,7 +98,7 @@
|
||||
<span class="kw">use</span> <span class="ident">actix_identity</span>::<span class="ident">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="kw">super</span>::<span class="ident">auth</span>::<span class="ident">Password</span>;
|
||||
<span class="kw">use</span> <span class="kw">super</span>::<span class="ident">auth</span>::<span class="ident">runners</span>::<span class="ident">Password</span>;
|
||||
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">errors</span>::<span class="kw-2">*</span>;
|
||||
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">AppData</span>;
|
||||
|
||||
|
||||
@@ -183,6 +183,22 @@
|
||||
<span id="180">180</span>
|
||||
<span id="181">181</span>
|
||||
<span id="182">182</span>
|
||||
<span id="183">183</span>
|
||||
<span id="184">184</span>
|
||||
<span id="185">185</span>
|
||||
<span id="186">186</span>
|
||||
<span id="187">187</span>
|
||||
<span id="188">188</span>
|
||||
<span id="189">189</span>
|
||||
<span id="190">190</span>
|
||||
<span id="191">191</span>
|
||||
<span id="192">192</span>
|
||||
<span id="193">193</span>
|
||||
<span id="194">194</span>
|
||||
<span id="195">195</span>
|
||||
<span id="196">196</span>
|
||||
<span id="197">197</span>
|
||||
<span id="198">198</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">/*
|
||||
* Copyright (C) 2021 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
@@ -200,12 +216,10 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/</span>
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">borrow</span>::<span class="ident">Cow</span>;
|
||||
|
||||
<span class="kw">use</span> <span class="ident">actix_identity</span>::<span class="ident">Identity</span>;
|
||||
<span class="kw">use</span> <span class="ident">actix_web</span>::<span class="ident">http</span>::<span class="ident">header</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">log</span>::<span class="ident">debug</span>;
|
||||
<span class="kw">use</span> <span class="ident">serde</span>::{<span class="ident">Deserialize</span>, <span class="ident">Serialize</span>};
|
||||
|
||||
<span class="kw">use</span> <span class="kw">super</span>::<span class="ident">mcaptcha</span>::<span class="ident">get_random</span>;
|
||||
@@ -233,127 +247,145 @@
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">runners</span> {
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">borrow</span>::<span class="ident">Cow</span>;
|
||||
|
||||
<span class="kw">use</span> <span class="kw">super</span>::<span class="kw-2">*</span>;
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Register</span> {
|
||||
<span class="kw">pub</span> <span class="ident">username</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">password</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">confirm_password</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">email</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">String</span><span class="op">></span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Login</span> {
|
||||
<span class="kw">pub</span> <span class="ident">username</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">password</span>: <span class="ident">String</span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Password</span> {
|
||||
<span class="kw">pub</span> <span class="ident">password</span>: <span class="ident">String</span>,
|
||||
}
|
||||
|
||||
<span class="doccomment">/// returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise</span>
|
||||
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">login_runner</span>(<span class="ident">payload</span>: <span class="kw-2">&</span><span class="ident">Login</span>, <span class="ident">data</span>: <span class="kw-2">&</span><span class="ident">AppData</span>) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceResult</span><span class="op"><</span>()<span class="op">></span> {
|
||||
<span class="kw">use</span> <span class="ident">argon2_creds</span>::<span class="ident">Config</span>;
|
||||
<span class="kw">use</span> <span class="ident">sqlx</span>::<span class="ident">Error</span>::<span class="ident">RowNotFound</span>;
|
||||
|
||||
<span class="kw">let</span> <span class="ident">rec</span> <span class="op">=</span> <span class="ident">sqlx</span>::<span class="macro">query_as</span><span class="macro">!</span>(
|
||||
<span class="ident">Password</span>,
|
||||
<span class="string">r#"SELECT password FROM mcaptcha_users WHERE name = ($1)"#</span>,
|
||||
<span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">username</span>,
|
||||
)
|
||||
.<span class="ident">fetch_one</span>(<span class="kw-2">&</span><span class="ident">data</span>.<span class="ident">db</span>)
|
||||
.<span class="kw">await</span>;
|
||||
|
||||
<span class="kw">match</span> <span class="ident">rec</span> {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">Config</span>::<span class="ident">verify</span>(<span class="kw-2">&</span><span class="ident">s</span>.<span class="ident">password</span>, <span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">password</span>)<span class="question-mark">?</span> {
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">WrongPassword</span>)
|
||||
}
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">RowNotFound</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">UsernameNotFound</span>),
|
||||
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">InternalServerError</span>),
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">register_runner</span>(
|
||||
<span class="ident">payload</span>: <span class="kw-2">&</span><span class="ident">Register</span>,
|
||||
<span class="ident">data</span>: <span class="kw-2">&</span><span class="ident">AppData</span>,
|
||||
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceResult</span><span class="op"><</span>()<span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="kw">crate</span>::<span class="ident">SETTINGS</span>.<span class="ident">server</span>.<span class="ident">allow_registration</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">ClosedForRegistration</span>);
|
||||
}
|
||||
|
||||
<span class="kw">if</span> <span class="ident">payload</span>.<span class="ident">password</span> <span class="op">!</span><span class="op">=</span> <span class="ident">payload</span>.<span class="ident">confirm_password</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">PasswordsDontMatch</span>);
|
||||
}
|
||||
<span class="kw">let</span> <span class="ident">username</span> <span class="op">=</span> <span class="ident">data</span>.<span class="ident">creds</span>.<span class="ident">username</span>(<span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">username</span>)<span class="question-mark">?</span>;
|
||||
<span class="kw">let</span> <span class="ident">hash</span> <span class="op">=</span> <span class="ident">data</span>.<span class="ident">creds</span>.<span class="ident">password</span>(<span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">password</span>)<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">email</span>) <span class="op">=</span> <span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">email</span> {
|
||||
<span class="ident">data</span>.<span class="ident">creds</span>.<span class="ident">email</span>(<span class="kw-2">&</span><span class="ident">email</span>)<span class="question-mark">?</span>;
|
||||
}
|
||||
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">secret</span>;
|
||||
|
||||
<span class="kw">loop</span> {
|
||||
<span class="ident">secret</span> <span class="op">=</span> <span class="ident">get_random</span>(<span class="number">32</span>);
|
||||
<span class="kw">let</span> <span class="ident">res</span>;
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">email</span>) <span class="op">=</span> <span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">email</span> {
|
||||
<span class="ident">res</span> <span class="op">=</span> <span class="ident">sqlx</span>::<span class="macro">query</span><span class="macro">!</span>(
|
||||
<span class="string">"INSERT INTO mcaptcha_users
|
||||
(name , password, email, secret) VALUES ($1, $2, $3, $4)"</span>,
|
||||
<span class="kw-2">&</span><span class="ident">username</span>,
|
||||
<span class="kw-2">&</span><span class="ident">hash</span>,
|
||||
<span class="kw-2">&</span><span class="ident">email</span>,
|
||||
<span class="kw-2">&</span><span class="ident">secret</span>,
|
||||
)
|
||||
.<span class="ident">execute</span>(<span class="kw-2">&</span><span class="ident">data</span>.<span class="ident">db</span>)
|
||||
.<span class="kw">await</span>;
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">res</span> <span class="op">=</span> <span class="ident">sqlx</span>::<span class="macro">query</span><span class="macro">!</span>(
|
||||
<span class="string">"INSERT INTO mcaptcha_users
|
||||
(name , password, secret) VALUES ($1, $2, $3)"</span>,
|
||||
<span class="kw-2">&</span><span class="ident">username</span>,
|
||||
<span class="kw-2">&</span><span class="ident">hash</span>,
|
||||
<span class="kw-2">&</span><span class="ident">secret</span>,
|
||||
)
|
||||
.<span class="ident">execute</span>(<span class="kw-2">&</span><span class="ident">data</span>.<span class="ident">db</span>)
|
||||
.<span class="kw">await</span>;
|
||||
}
|
||||
<span class="kw">if</span> <span class="ident">res</span>.<span class="ident">is_ok</span>() {
|
||||
<span class="kw">break</span>;
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">sqlx</span>::<span class="ident">Error</span>::<span class="ident">Database</span>(<span class="ident">err</span>)) <span class="op">=</span> <span class="ident">res</span> {
|
||||
<span class="kw">if</span> <span class="ident">err</span>.<span class="ident">code</span>() <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">Cow</span>::<span class="ident">from</span>(<span class="string">"23505"</span>)) {
|
||||
<span class="kw">let</span> <span class="ident">msg</span> <span class="op">=</span> <span class="ident">err</span>.<span class="ident">message</span>();
|
||||
<span class="kw">if</span> <span class="ident">msg</span>.<span class="ident">contains</span>(<span class="string">"mcaptcha_users_name_key"</span>) {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">UsernameTaken</span>);
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">msg</span>.<span class="ident">contains</span>(<span class="string">"mcaptcha_users_secret_key"</span>) {
|
||||
<span class="kw">continue</span>;
|
||||
} <span class="kw">else</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">InternalServerError</span>);
|
||||
}
|
||||
} <span class="kw">else</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">sqlx</span>::<span class="ident">Error</span>::<span class="ident">Database</span>(<span class="ident">err</span>).<span class="ident">into</span>());
|
||||
}
|
||||
};
|
||||
}
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">services</span>(<span class="ident">cfg</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">web</span>::<span class="ident">ServiceConfig</span>) {
|
||||
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">signup</span>);
|
||||
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">signin</span>);
|
||||
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">register</span>);
|
||||
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">login</span>);
|
||||
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">signout</span>);
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Register</span> {
|
||||
<span class="kw">pub</span> <span class="ident">username</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">password</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">confirm_password</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">email</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">String</span><span class="op">></span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Login</span> {
|
||||
<span class="kw">pub</span> <span class="ident">username</span>: <span class="ident">String</span>,
|
||||
<span class="kw">pub</span> <span class="ident">password</span>: <span class="ident">String</span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Password</span> {
|
||||
<span class="kw">pub</span> <span class="ident">password</span>: <span class="ident">String</span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">my_codegen</span>::<span class="ident">post</span>(<span class="ident">path</span> <span class="op">=</span> <span class="string">"crate::V1_API_ROUTES.auth.register"</span>)]</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">signup</span>(
|
||||
<span class="ident">payload</span>: <span class="ident">web</span>::<span class="ident">Json</span><span class="op"><</span><span class="ident">Register</span><span class="op">></span>,
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">register</span>(
|
||||
<span class="ident">payload</span>: <span class="ident">web</span>::<span class="ident">Json</span><span class="op"><</span><span class="ident">runners</span>::<span class="ident">Register</span><span class="op">></span>,
|
||||
<span class="ident">data</span>: <span class="ident">AppData</span>,
|
||||
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceResult</span><span class="op"><</span><span class="kw">impl</span> <span class="ident">Responder</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="op">!</span><span class="kw">crate</span>::<span class="ident">SETTINGS</span>.<span class="ident">server</span>.<span class="ident">allow_registration</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">ClosedForRegistration</span>);
|
||||
}
|
||||
|
||||
<span class="kw">if</span> <span class="ident">payload</span>.<span class="ident">password</span> <span class="op">!</span><span class="op">=</span> <span class="ident">payload</span>.<span class="ident">confirm_password</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">PasswordsDontMatch</span>);
|
||||
}
|
||||
<span class="kw">let</span> <span class="ident">username</span> <span class="op">=</span> <span class="ident">data</span>.<span class="ident">creds</span>.<span class="ident">username</span>(<span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">username</span>)<span class="question-mark">?</span>;
|
||||
<span class="kw">let</span> <span class="ident">hash</span> <span class="op">=</span> <span class="ident">data</span>.<span class="ident">creds</span>.<span class="ident">password</span>(<span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">password</span>)<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">email</span>) <span class="op">=</span> <span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">email</span> {
|
||||
<span class="ident">data</span>.<span class="ident">creds</span>.<span class="ident">email</span>(<span class="kw-2">&</span><span class="ident">email</span>)<span class="question-mark">?</span>;
|
||||
}
|
||||
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">secret</span>;
|
||||
|
||||
<span class="kw">loop</span> {
|
||||
<span class="ident">secret</span> <span class="op">=</span> <span class="ident">get_random</span>(<span class="number">32</span>);
|
||||
<span class="kw">let</span> <span class="ident">res</span>;
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">email</span>) <span class="op">=</span> <span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">email</span> {
|
||||
<span class="ident">res</span> <span class="op">=</span> <span class="ident">sqlx</span>::<span class="macro">query</span><span class="macro">!</span>(
|
||||
<span class="string">"INSERT INTO mcaptcha_users
|
||||
(name , password, email, secret) VALUES ($1, $2, $3, $4)"</span>,
|
||||
<span class="kw-2">&</span><span class="ident">username</span>,
|
||||
<span class="kw-2">&</span><span class="ident">hash</span>,
|
||||
<span class="kw-2">&</span><span class="ident">email</span>,
|
||||
<span class="kw-2">&</span><span class="ident">secret</span>,
|
||||
)
|
||||
.<span class="ident">execute</span>(<span class="kw-2">&</span><span class="ident">data</span>.<span class="ident">db</span>)
|
||||
.<span class="kw">await</span>;
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">res</span> <span class="op">=</span> <span class="ident">sqlx</span>::<span class="macro">query</span><span class="macro">!</span>(
|
||||
<span class="string">"INSERT INTO mcaptcha_users
|
||||
(name , password, secret) VALUES ($1, $2, $3)"</span>,
|
||||
<span class="kw-2">&</span><span class="ident">username</span>,
|
||||
<span class="kw-2">&</span><span class="ident">hash</span>,
|
||||
<span class="kw-2">&</span><span class="ident">secret</span>,
|
||||
)
|
||||
.<span class="ident">execute</span>(<span class="kw-2">&</span><span class="ident">data</span>.<span class="ident">db</span>)
|
||||
.<span class="kw">await</span>;
|
||||
}
|
||||
<span class="kw">if</span> <span class="ident">res</span>.<span class="ident">is_ok</span>() {
|
||||
<span class="kw">break</span>;
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">sqlx</span>::<span class="ident">Error</span>::<span class="ident">Database</span>(<span class="ident">err</span>)) <span class="op">=</span> <span class="ident">res</span> {
|
||||
<span class="kw">if</span> <span class="ident">err</span>.<span class="ident">code</span>() <span class="op">=</span><span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">Cow</span>::<span class="ident">from</span>(<span class="string">"23505"</span>)) {
|
||||
<span class="kw">let</span> <span class="ident">msg</span> <span class="op">=</span> <span class="ident">err</span>.<span class="ident">message</span>();
|
||||
<span class="kw">if</span> <span class="ident">msg</span>.<span class="ident">contains</span>(<span class="string">"mcaptcha_users_name_key"</span>) {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">UsernameTaken</span>);
|
||||
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">msg</span>.<span class="ident">contains</span>(<span class="string">"mcaptcha_users_secret_key"</span>) {
|
||||
<span class="kw">continue</span>;
|
||||
} <span class="kw">else</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">InternalServerError</span>);
|
||||
}
|
||||
} <span class="kw">else</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">sqlx</span>::<span class="ident">Error</span>::<span class="ident">Database</span>(<span class="ident">err</span>).<span class="ident">into</span>());
|
||||
}
|
||||
};
|
||||
}
|
||||
<span class="ident">runners</span>::<span class="ident">register_runner</span>(<span class="kw-2">&</span><span class="ident">payload</span>, <span class="kw-2">&</span><span class="ident">data</span>).<span class="kw">await</span><span class="question-mark">?</span>;
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">HttpResponse</span>::<span class="prelude-val">Ok</span>())
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">my_codegen</span>::<span class="ident">post</span>(<span class="ident">path</span> <span class="op">=</span> <span class="string">"crate::V1_API_ROUTES.auth.login"</span>)]</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">signin</span>(
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">login</span>(
|
||||
<span class="ident">id</span>: <span class="ident">Identity</span>,
|
||||
<span class="ident">payload</span>: <span class="ident">web</span>::<span class="ident">Json</span><span class="op"><</span><span class="ident">Login</span><span class="op">></span>,
|
||||
<span class="ident">payload</span>: <span class="ident">web</span>::<span class="ident">Json</span><span class="op"><</span><span class="ident">runners</span>::<span class="ident">Login</span><span class="op">></span>,
|
||||
<span class="ident">data</span>: <span class="ident">AppData</span>,
|
||||
) <span class="op">-</span><span class="op">></span> <span class="ident">ServiceResult</span><span class="op"><</span><span class="kw">impl</span> <span class="ident">Responder</span><span class="op">></span> {
|
||||
<span class="kw">use</span> <span class="ident">argon2_creds</span>::<span class="ident">Config</span>;
|
||||
<span class="kw">use</span> <span class="ident">sqlx</span>::<span class="ident">Error</span>::<span class="ident">RowNotFound</span>;
|
||||
|
||||
<span class="kw">let</span> <span class="ident">rec</span> <span class="op">=</span> <span class="ident">sqlx</span>::<span class="macro">query_as</span><span class="macro">!</span>(
|
||||
<span class="ident">Password</span>,
|
||||
<span class="string">r#"SELECT password FROM mcaptcha_users WHERE name = ($1)"#</span>,
|
||||
<span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">username</span>,
|
||||
)
|
||||
.<span class="ident">fetch_one</span>(<span class="kw-2">&</span><span class="ident">data</span>.<span class="ident">db</span>)
|
||||
.<span class="kw">await</span>;
|
||||
|
||||
<span class="kw">match</span> <span class="ident">rec</span> {
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">Config</span>::<span class="ident">verify</span>(<span class="kw-2">&</span><span class="ident">s</span>.<span class="ident">password</span>, <span class="kw-2">&</span><span class="ident">payload</span>.<span class="ident">password</span>)<span class="question-mark">?</span> {
|
||||
<span class="macro">debug</span><span class="macro">!</span>(<span class="string">"remembered {}"</span>, <span class="ident">payload</span>.<span class="ident">username</span>);
|
||||
<span class="ident">id</span>.<span class="ident">remember</span>(<span class="ident">payload</span>.<span class="ident">into_inner</span>().<span class="ident">username</span>);
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">HttpResponse</span>::<span class="prelude-val">Ok</span>())
|
||||
} <span class="kw">else</span> {
|
||||
<span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">WrongPassword</span>)
|
||||
}
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">RowNotFound</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">UsernameNotFound</span>),
|
||||
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">></span> <span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">InternalServerError</span>),
|
||||
}
|
||||
<span class="ident">runners</span>::<span class="ident">login_runner</span>(<span class="kw-2">&</span><span class="ident">payload</span>, <span class="kw-2">&</span><span class="ident">data</span>).<span class="kw">await</span><span class="question-mark">?</span>;
|
||||
<span class="ident">id</span>.<span class="ident">remember</span>(<span class="ident">payload</span>.<span class="ident">into_inner</span>().<span class="ident">username</span>);
|
||||
<span class="prelude-val">Ok</span>(<span class="ident">HttpResponse</span>::<span class="prelude-val">Ok</span>())
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">my_codegen</span>::<span class="ident">get</span>(<span class="ident">path</span> <span class="op">=</span> <span class="string">"crate::V1_API_ROUTES.auth.logout"</span>, <span class="ident">wrap</span> <span class="op">=</span> <span class="string">"crate::CheckLogin"</span>)]</span>
|
||||
|
||||
Reference in New Issue
Block a user