Deploying to gh-pages from @ 096dcd32e4 🚀

This commit is contained in:
realaravinth
2021-03-11 15:42:10 +00:00
parent a974f0650f
commit 44865c4e31
33 changed files with 619 additions and 120 deletions

View File

@@ -257,6 +257,18 @@
<span id="254">254</span>
<span id="255">255</span>
<span id="256">256</span>
<span id="257">257</span>
<span id="258">258</span>
<span id="259">259</span>
<span id="260">260</span>
<span id="261">261</span>
<span id="262">262</span>
<span id="263">263</span>
<span id="264">264</span>
<span id="265">265</span>
<span id="266">266</span>
<span id="267">267</span>
<span id="268">268</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="comment">/*
* Copyright (C) 2021 Aravinth Manivannan &lt;realaravinth@batsense.net&gt;
@@ -432,13 +444,15 @@
<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;testuser&quot;</span>;
<span class="kw">const</span> <span class="ident">PASSWORD</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;longpassword&quot;</span>;
<span class="kw">const</span> <span class="ident">EMAIL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;testuser1@a.com&quot;</span>;
<span class="kw">const</span> <span class="ident">SIGNIN</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/api/v1/signin&quot;</span>;
<span class="kw">const</span> <span class="ident">SIGNUP</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/api/v1/signup&quot;</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">app</span> <span class="op">=</span> <span class="macro">get_app</span><span class="macro">!</span>(<span class="ident">data</span>).<span class="kw">await</span>;
<span class="ident">delete_user</span>(<span class="ident">NAME</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
<span class="comment">// 1. Register and signin</span>
<span class="kw">let</span> (<span class="ident">data</span>, <span class="kw">_</span>, <span class="ident">signin_resp</span>) <span class="op">=</span> <span class="ident">signin_util</span>(<span class="ident">NAME</span>, <span class="ident">EMAIL</span>, <span class="ident">PASSWORD</span>).<span class="kw">await</span>;
<span class="kw">let</span> (<span class="kw">_</span>, <span class="kw">_</span>, <span class="ident">signin_resp</span>) <span class="op">=</span> <span class="ident">register_and_signin</span>(<span class="ident">NAME</span>, <span class="ident">EMAIL</span>, <span class="ident">PASSWORD</span>).<span class="kw">await</span>;
<span class="kw">let</span> <span class="ident">cookies</span> <span class="op">=</span> <span class="macro">get_cookie</span><span class="macro">!</span>(<span class="ident">signin_resp</span>);
<span class="comment">// 2. check if duplicate username is allowed</span>
@@ -447,49 +461,55 @@
<span class="ident">password</span>: <span class="ident">PASSWORD</span>.<span class="ident">into</span>(),
<span class="ident">email</span>: <span class="ident">EMAIL</span>.<span class="ident">into</span>(),
};
<span class="kw">let</span> <span class="ident">duplicate_user_resp</span> <span class="op">=</span>
<span class="ident">test</span>::<span class="ident">call_service</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>, <span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">msg</span>, <span class="string">&quot;/api/v1/signup&quot;</span>).<span class="ident">to_request</span>()).<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">duplicate_user_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>);
<span class="ident">bad_post_req_test</span>(
<span class="ident">NAME</span>,
<span class="ident">PASSWORD</span>,
<span class="ident">SIGNUP</span>,
<span class="kw-2">&amp;</span><span class="ident">msg</span>,
<span class="ident">ServiceError</span>::<span class="ident">UsernameTaken</span>,
<span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
)
.<span class="kw">await</span>;
<span class="comment">// 3. sigining in with non-existent user</span>
<span class="kw">let</span> <span class="ident">nonexistantuser</span> <span class="op">=</span> <span class="ident">Login</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">login</span> <span class="op">=</span> <span class="ident">Login</span> {
<span class="ident">username</span>: <span class="string">&quot;nonexistantuser&quot;</span>.<span class="ident">into</span>(),
<span class="ident">password</span>: <span class="ident">msg</span>.<span class="ident">password</span>.<span class="ident">clone</span>(),
};
<span class="kw">let</span> <span class="ident">userdoesntexist</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">call_service</span>(
<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>,
<span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">nonexistantuser</span>, <span class="string">&quot;/api/v1/signin&quot;</span>).<span class="ident">to_request</span>(),
<span class="ident">bad_post_req_test</span>(
<span class="ident">NAME</span>,
<span class="ident">PASSWORD</span>,
<span class="ident">SIGNIN</span>,
<span class="kw-2">&amp;</span><span class="ident">login</span>,
<span class="ident">ServiceError</span>::<span class="ident">UsernameNotFound</span>,
<span class="ident">StatusCode</span>::<span class="ident">UNAUTHORIZED</span>,
)
.<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">userdoesntexist</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">UNAUTHORIZED</span>);
<span class="kw">let</span> <span class="ident">txt</span>: <span class="ident">ErrorToResponse</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">read_body_json</span>(<span class="ident">userdoesntexist</span>).<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">txt</span>.<span class="ident">error</span>, <span class="macro">format</span><span class="macro">!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">ServiceError</span>::<span class="ident">UsernameNotFound</span>));
<span class="comment">// 4. trying to signin with wrong password</span>
<span class="kw">let</span> <span class="ident">wrongpassword</span> <span class="op">=</span> <span class="ident">Login</span> {
<span class="ident">username</span>: <span class="ident">NAME</span>.<span class="ident">into</span>(),
<span class="ident">password</span>: <span class="ident">NAME</span>.<span class="ident">into</span>(),
};
<span class="kw">let</span> <span class="ident">wrongpassword_resp</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">call_service</span>(
<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>,
<span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">wrongpassword</span>, <span class="string">&quot;/api/v1/signin&quot;</span>).<span class="ident">to_request</span>(),
<span class="ident">login</span>.<span class="ident">username</span> <span class="op">=</span> <span class="ident">NAME</span>.<span class="ident">into</span>();
<span class="ident">login</span>.<span class="ident">password</span> <span class="op">=</span> <span class="ident">NAME</span>.<span class="ident">into</span>();
<span class="ident">bad_post_req_test</span>(
<span class="ident">NAME</span>,
<span class="ident">PASSWORD</span>,
<span class="ident">SIGNIN</span>,
<span class="kw-2">&amp;</span><span class="ident">login</span>,
<span class="ident">ServiceError</span>::<span class="ident">WrongPassword</span>,
<span class="ident">StatusCode</span>::<span class="ident">UNAUTHORIZED</span>,
)
.<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">wrongpassword_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">UNAUTHORIZED</span>);
<span class="kw">let</span> <span class="ident">txt</span>: <span class="ident">ErrorToResponse</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">read_body_json</span>(<span class="ident">wrongpassword_resp</span>).<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">txt</span>.<span class="ident">error</span>, <span class="macro">format</span><span class="macro">!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">ServiceError</span>::<span class="ident">WrongPassword</span>));
<span class="comment">// 5. signout</span>
<span class="kw">let</span> <span class="ident">signout_resp</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">call_service</span>(
<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>,
<span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">wrongpassword</span>, <span class="string">&quot;/api/v1/signout&quot;</span>)
.<span class="ident">cookie</span>(<span class="ident">cookies</span>.<span class="ident">clone</span>())
<span class="ident">test</span>::<span class="ident">TestRequest</span>::<span class="ident">post</span>()
.<span class="ident">uri</span>(<span class="string">&quot;/api/v1/signout&quot;</span>)
.<span class="ident">cookie</span>(<span class="ident">cookies</span>)
.<span class="ident">to_request</span>(),
)
.<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">signout_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">OK</span>);
<span class="ident">delete_user</span>(<span class="ident">NAME</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
}
<span class="attribute">#[<span class="ident">actix_rt</span>::<span class="ident">test</span>]</span>
@@ -498,7 +518,12 @@
<span class="kw">const</span> <span class="ident">PASSWORD</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;longpassword2&quot;</span>;
<span class="kw">const</span> <span class="ident">EMAIL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;testuser1@a.com2&quot;</span>;
<span class="kw">let</span> (<span class="ident">data</span>, <span class="ident">creds</span>, <span class="ident">signin_resp</span>) <span class="op">=</span> <span class="ident">signin_util</span>(<span class="ident">NAME</span>, <span class="ident">EMAIL</span>, <span class="ident">PASSWORD</span>).<span class="kw">await</span>;
{
<span class="kw">let</span> <span class="ident">data</span> <span class="op">=</span> <span class="ident">Data</span>::<span class="ident">new</span>().<span class="kw">await</span>;
<span class="ident">delete_user</span>(<span class="ident">NAME</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
}
<span class="kw">let</span> (<span class="ident">data</span>, <span class="ident">creds</span>, <span class="ident">signin_resp</span>) <span class="op">=</span> <span class="ident">register_and_signin</span>(<span class="ident">NAME</span>, <span class="ident">EMAIL</span>, <span class="ident">PASSWORD</span>).<span class="kw">await</span>;
<span class="kw">let</span> <span class="ident">cookies</span> <span class="op">=</span> <span class="macro">get_cookie</span><span class="macro">!</span>(<span class="ident">signin_resp</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">app</span> <span class="op">=</span> <span class="macro">get_app</span><span class="macro">!</span>(<span class="ident">data</span>).<span class="kw">await</span>;
@@ -511,7 +536,6 @@
.<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">delete_user_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">OK</span>);
<span class="ident">delete_user</span>(<span class="ident">NAME</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
}
}
</pre></div>

View File

@@ -177,6 +177,123 @@
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<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>
<span id="199">199</span>
<span id="200">200</span>
<span id="201">201</span>
<span id="202">202</span>
<span id="203">203</span>
<span id="204">204</span>
<span id="205">205</span>
<span id="206">206</span>
<span id="207">207</span>
<span id="208">208</span>
<span id="209">209</span>
<span id="210">210</span>
<span id="211">211</span>
<span id="212">212</span>
<span id="213">213</span>
<span id="214">214</span>
<span id="215">215</span>
<span id="216">216</span>
<span id="217">217</span>
<span id="218">218</span>
<span id="219">219</span>
<span id="220">220</span>
<span id="221">221</span>
<span id="222">222</span>
<span id="223">223</span>
<span id="224">224</span>
<span id="225">225</span>
<span id="226">226</span>
<span id="227">227</span>
<span id="228">228</span>
<span id="229">229</span>
<span id="230">230</span>
<span id="231">231</span>
<span id="232">232</span>
<span id="233">233</span>
<span id="234">234</span>
<span id="235">235</span>
<span id="236">236</span>
<span id="237">237</span>
<span id="238">238</span>
<span id="239">239</span>
<span id="240">240</span>
<span id="241">241</span>
<span id="242">242</span>
<span id="243">243</span>
<span id="244">244</span>
<span id="245">245</span>
<span id="246">246</span>
<span id="247">247</span>
<span id="248">248</span>
<span id="249">249</span>
<span id="250">250</span>
<span id="251">251</span>
<span id="252">252</span>
<span id="253">253</span>
<span id="254">254</span>
<span id="255">255</span>
<span id="256">256</span>
<span id="257">257</span>
<span id="258">258</span>
<span id="259">259</span>
<span id="260">260</span>
<span id="261">261</span>
<span id="262">262</span>
<span id="263">263</span>
<span id="264">264</span>
<span id="265">265</span>
<span id="266">266</span>
<span id="267">267</span>
<span id="268">268</span>
<span id="269">269</span>
<span id="270">270</span>
<span id="271">271</span>
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
<span id="279">279</span>
<span id="280">280</span>
<span id="281">281</span>
<span id="282">282</span>
<span id="283">283</span>
<span id="284">284</span>
<span id="285">285</span>
<span id="286">286</span>
<span id="287">287</span>
<span id="288">288</span>
<span id="289">289</span>
<span id="290">290</span>
<span id="291">291</span>
<span id="292">292</span>
<span id="293">293</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="comment">/*
* Copyright (C) 2021 Aravinth Manivannan &lt;realaravinth@batsense.net&gt;
@@ -219,15 +336,18 @@
<span class="kw">let</span> <span class="ident">url</span> <span class="op">=</span> <span class="ident">Url</span>::<span class="ident">parse</span>(<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">name</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">host</span>) <span class="op">=</span> <span class="ident">url</span>.<span class="ident">host_str</span>() {
<span class="kw">let</span> <span class="ident">user</span> <span class="op">=</span> <span class="ident">id</span>.<span class="ident">identity</span>().<span class="ident">unwrap</span>();
<span class="ident">sqlx</span>::<span class="macro">query</span><span class="macro">!</span>(
<span class="kw">let</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">&quot;insert into mcaptcha_domains (name, ID) values
($1, (select ID from mcaptcha_users where name = ($2) ));&quot;</span>,
<span class="ident">host</span>,
<span class="ident">user</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</span>::<span class="prelude-val">Ok</span>())
.<span class="kw">await</span>;
<span class="kw">match</span> <span class="ident">res</span> {
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Err</span>(<span class="ident">dup_error</span>(<span class="ident">e</span>, <span class="ident">ServiceError</span>::<span class="ident">HostnameTaken</span>)),
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</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">NotAUrl</span>)
}
@@ -252,8 +372,9 @@
}
<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">TokenName</span> {
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">CreateToken</span> {
<span class="kw">pub</span> <span class="ident">name</span>: <span class="ident">String</span>,
<span class="kw">pub</span> <span class="ident">domain</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>
@@ -262,34 +383,60 @@
<span class="kw">pub</span> <span class="ident">key</span>: <span class="ident">String</span>,
}
<span class="comment">//#[post(&quot;/api/v1/mcaptcha/domain/token/add&quot;)]</span>
<span class="comment">//pub async fn add_mcaptcha(</span>
<span class="comment">// payload: web::Json&lt;Domain&gt;,</span>
<span class="comment">// data: web::Data&lt;Data&gt;,</span>
<span class="comment">// id: Identity,</span>
<span class="comment">//) -&gt; ServiceResult&lt;impl Responder&gt; {</span>
<span class="comment">// is_authenticated(&amp;id)?;</span>
<span class="comment">// let key = get_random(32);</span>
<span class="comment">// let res = sqlx::query!(</span>
<span class="comment">// &quot;INSERT INTO mcaptcha_config (name, key) VALUES ($1, $2)&quot;,</span>
<span class="comment">// &amp;payload.name,</span>
<span class="comment">// &amp;key,</span>
<span class="comment">// )</span>
<span class="comment">// .execute(&amp;data.db)</span>
<span class="comment">// .await;</span>
<span class="comment">//</span>
<span class="comment">// match res {</span>
<span class="comment">// Err(e) =&gt; Err(dup_error(e, ServiceError::UsernameTaken)),</span>
<span class="comment">// Ok(_) =&gt; {</span>
<span class="comment">// let resp = TokenKeyPair {</span>
<span class="comment">// key,</span>
<span class="comment">// name: payload.name,</span>
<span class="comment">// };</span>
<span class="comment">//</span>
<span class="comment">// Ok(HttpResponse::Ok().json(resp))</span>
<span class="comment">// }</span>
<span class="comment">// }</span>
<span class="comment">//}</span>
<span class="attribute">#[<span class="ident">post</span>(<span class="string">&quot;/api/v1/mcaptcha/domain/token/add&quot;</span>)]</span>
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">add_mcaptcha</span>(
<span class="ident">payload</span>: <span class="ident">web</span>::<span class="ident">Json</span><span class="op">&lt;</span><span class="ident">CreateToken</span><span class="op">&gt;</span>,
<span class="ident">data</span>: <span class="ident">web</span>::<span class="ident">Data</span><span class="op">&lt;</span><span class="ident">Data</span><span class="op">&gt;</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="ident">is_authenticated</span>(<span class="kw-2">&amp;</span><span class="ident">id</span>)<span class="question-mark">?</span>;
<span class="kw">let</span> <span class="ident">key</span> <span class="op">=</span> <span class="ident">get_random</span>(<span class="number">32</span>);
<span class="kw">let</span> <span class="ident">url</span> <span class="op">=</span> <span class="ident">Url</span>::<span class="ident">parse</span>(<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">domain</span>)<span class="question-mark">?</span>;
<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;got req&quot;</span>);
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">host</span>) <span class="op">=</span> <span class="ident">url</span>.<span class="ident">host_str</span>() {
<span class="kw">let</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">&quot;INSERT INTO mcaptcha_config
(name, key, domain_name)
VALUES ($1, $2, (
SELECT name FROM mcaptcha_domains WHERE name = ($3)))&quot;</span>,
<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">name</span>,
<span class="kw-2">&amp;</span><span class="ident">key</span>,
<span class="kw-2">&amp;</span><span class="ident">host</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="kw">match</span> <span class="ident">res</span> {
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Err</span>(<span class="ident">dup_error</span>(<span class="ident">e</span>, <span class="ident">ServiceError</span>::<span class="ident">TokenNameTaken</span>)),
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">resp</span> <span class="op">=</span> <span class="ident">TokenKeyPair</span> {
<span class="ident">key</span>,
<span class="ident">name</span>: <span class="ident">payload</span>.<span class="ident">into_inner</span>().<span class="ident">name</span>,
};
<span class="prelude-val">Ok</span>(<span class="ident">HttpResponse</span>::<span class="prelude-val">Ok</span>().<span class="ident">json</span>(<span class="ident">resp</span>))
}
}
} <span class="kw">else</span> {
<span class="prelude-val">Err</span>(<span class="ident">ServiceError</span>::<span class="ident">NotAUrl</span>)
}
}
<span class="attribute">#[<span class="ident">post</span>(<span class="string">&quot;/api/v1/mcaptcha/domain/token/delete&quot;</span>)]</span>
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">delete_mcaptcha</span>(
<span class="ident">payload</span>: <span class="ident">web</span>::<span class="ident">Json</span><span class="op">&lt;</span><span class="ident">CreateToken</span><span class="op">&gt;</span>,
<span class="ident">data</span>: <span class="ident">web</span>::<span class="ident">Data</span><span class="op">&lt;</span><span class="ident">Data</span><span class="op">&gt;</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="ident">is_authenticated</span>(<span class="kw-2">&amp;</span><span class="ident">id</span>)<span class="question-mark">?</span>;
<span class="ident">sqlx</span>::<span class="macro">query</span><span class="macro">!</span>(
<span class="string">&quot;DELETE FROM mcaptcha_config WHERE name = ($1)&quot;</span>,
<span class="kw-2">&amp;</span><span class="ident">payload</span>.<span class="ident">name</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</span>::<span class="prelude-val">Ok</span>())
}
<span class="kw">fn</span> <span class="ident">get_random</span>(<span class="ident">len</span>: <span class="ident">usize</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">String</span> {
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">iter</span>;
@@ -321,28 +468,36 @@
<span class="kw">const</span> <span class="ident">PASSWORD</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;longpassworddomain&quot;</span>;
<span class="kw">const</span> <span class="ident">EMAIL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;testuserdomain@a.com&quot;</span>;
<span class="kw">const</span> <span class="ident">DOMAIN</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;http://example.com&quot;</span>;
<span class="kw">const</span> <span class="ident">ADD_URL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/api/v1/mcaptcha/domain/add&quot;</span>;
<span class="kw">let</span> (<span class="ident">data</span>, <span class="kw">_</span>, <span class="ident">signin_resp</span>) <span class="op">=</span> <span class="ident">signin_util</span>(<span class="ident">NAME</span>, <span class="ident">EMAIL</span>, <span class="ident">PASSWORD</span>).<span class="kw">await</span>;
{
<span class="kw">let</span> <span class="ident">data</span> <span class="op">=</span> <span class="ident">Data</span>::<span class="ident">new</span>().<span class="kw">await</span>;
<span class="ident">delete_user</span>(<span class="ident">NAME</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
}
<span class="ident">register_and_signin</span>(<span class="ident">NAME</span>, <span class="ident">EMAIL</span>, <span class="ident">PASSWORD</span>).<span class="kw">await</span>;
<span class="comment">// 1. add domain</span>
<span class="kw">let</span> (<span class="ident">data</span>, <span class="kw">_</span>, <span class="ident">signin_resp</span>) <span class="op">=</span> <span class="ident">add_domain_util</span>(<span class="ident">NAME</span>, <span class="ident">PASSWORD</span>, <span class="ident">DOMAIN</span>).<span class="kw">await</span>;
<span class="kw">let</span> <span class="ident">cookies</span> <span class="op">=</span> <span class="macro">get_cookie</span><span class="macro">!</span>(<span class="ident">signin_resp</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">app</span> <span class="op">=</span> <span class="macro">get_app</span><span class="macro">!</span>(<span class="ident">data</span>).<span class="kw">await</span>;
<span class="ident">delete_domain_util</span>(<span class="ident">DOMAIN</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
<span class="comment">// 1. add domain</span>
<span class="kw">let</span> <span class="ident">domain</span> <span class="op">=</span> <span class="ident">Domain</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">domain</span> <span class="op">=</span> <span class="ident">Domain</span> {
<span class="ident">name</span>: <span class="ident">DOMAIN</span>.<span class="ident">into</span>(),
};
<span class="kw">let</span> <span class="ident">add_domain_resp</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">call_service</span>(
<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>,
<span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">domain</span>, <span class="string">&quot;/api/v1/mcaptcha/domain/add&quot;</span>)
.<span class="ident">cookie</span>(<span class="ident">cookies</span>.<span class="ident">clone</span>())
.<span class="ident">to_request</span>(),
<span class="comment">// 2. duplicate domain</span>
<span class="ident">bad_post_req_test</span>(
<span class="ident">NAME</span>,
<span class="ident">PASSWORD</span>,
<span class="ident">ADD_URL</span>,
<span class="kw-2">&amp;</span><span class="ident">domain</span>,
<span class="ident">ServiceError</span>::<span class="ident">HostnameTaken</span>,
<span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
)
.<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">add_domain_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">OK</span>);
<span class="comment">// 2. delete domain</span>
<span class="comment">// 3. delete domain</span>
<span class="kw">let</span> <span class="ident">del_domain_resp</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">call_service</span>(
<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>,
<span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">domain</span>, <span class="string">&quot;/api/v1/mcaptcha/domain/delete&quot;</span>)
@@ -351,7 +506,86 @@
)
.<span class="kw">await</span>;
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">del_domain_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">OK</span>);
<span class="ident">delete_user</span>(<span class="ident">NAME</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
<span class="comment">// 4. not a URL test for adding domain</span>
<span class="ident">domain</span>.<span class="ident">name</span> <span class="op">=</span> <span class="string">&quot;testing&quot;</span>.<span class="ident">into</span>();
<span class="ident">bad_post_req_test</span>(
<span class="ident">NAME</span>,
<span class="ident">PASSWORD</span>,
<span class="ident">ADD_URL</span>,
<span class="kw-2">&amp;</span><span class="ident">domain</span>,
<span class="ident">ServiceError</span>::<span class="ident">NotAUrl</span>,
<span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
)
.<span class="kw">await</span>;
}
<span class="attribute">#[<span class="ident">actix_rt</span>::<span class="ident">test</span>]</span>
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">add_mcaptcha_works</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;testusermcaptcha&quot;</span>;
<span class="kw">const</span> <span class="ident">PASSWORD</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;longpassworddomain&quot;</span>;
<span class="kw">const</span> <span class="ident">EMAIL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;testusermcaptcha@a.com&quot;</span>;
<span class="kw">const</span> <span class="ident">DOMAIN</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;http://mcaptcha.example.com&quot;</span>;
<span class="kw">const</span> <span class="ident">TOKEN_NAME</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;add_mcaptcha_works_token&quot;</span>;
<span class="kw">const</span> <span class="ident">ADD_URL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/api/v1/mcaptcha/domain/token/add&quot;</span>;
<span class="kw">const</span> <span class="ident">DEL_URL</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;/api/v1/mcaptcha/domain/token/delete&quot;</span>;
{
<span class="kw">let</span> <span class="ident">data</span> <span class="op">=</span> <span class="ident">Data</span>::<span class="ident">new</span>().<span class="kw">await</span>;
<span class="ident">delete_user</span>(<span class="ident">NAME</span>, <span class="kw-2">&amp;</span><span class="ident">data</span>).<span class="kw">await</span>;
}
<span class="ident">register_and_signin</span>(<span class="ident">NAME</span>, <span class="ident">EMAIL</span>, <span class="ident">PASSWORD</span>).<span class="kw">await</span>;
<span class="kw">let</span> (<span class="ident">data</span>, <span class="kw">_</span>, <span class="ident">signin_resp</span>) <span class="op">=</span> <span class="ident">add_domain_util</span>(<span class="ident">NAME</span>, <span class="ident">PASSWORD</span>, <span class="ident">DOMAIN</span>).<span class="kw">await</span>;
<span class="kw">let</span> <span class="ident">cookies</span> <span class="op">=</span> <span class="macro">get_cookie</span><span class="macro">!</span>(<span class="ident">signin_resp</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">app</span> <span class="op">=</span> <span class="macro">get_app</span><span class="macro">!</span>(<span class="ident">data</span>).<span class="kw">await</span>;
<span class="comment">// 1. add mcaptcha token</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">domain</span> <span class="op">=</span> <span class="ident">CreateToken</span> {
<span class="ident">domain</span>: <span class="ident">DOMAIN</span>.<span class="ident">into</span>(),
<span class="ident">name</span>: <span class="ident">TOKEN_NAME</span>.<span class="ident">into</span>(),
};
<span class="kw">let</span> <span class="ident">add_token_resp</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">call_service</span>(
<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>,
<span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">domain</span>, <span class="ident">ADD_URL</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="macro">!</span>(<span class="ident">add_token_resp</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">OK</span>);
<span class="comment">// 2. add duplicate mcaptha</span>
<span class="ident">bad_post_req_test</span>(
<span class="ident">NAME</span>,
<span class="ident">PASSWORD</span>,
<span class="ident">ADD_URL</span>,
<span class="kw-2">&amp;</span><span class="ident">domain</span>,
<span class="ident">ServiceError</span>::<span class="ident">TokenNameTaken</span>,
<span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
)
.<span class="kw">await</span>;
<span class="comment">// 4. not a URL test for adding domain</span>
<span class="ident">domain</span>.<span class="ident">domain</span> <span class="op">=</span> <span class="string">&quot;testing&quot;</span>.<span class="ident">into</span>();
<span class="ident">bad_post_req_test</span>(
<span class="ident">NAME</span>,
<span class="ident">PASSWORD</span>,
<span class="ident">ADD_URL</span>,
<span class="kw-2">&amp;</span><span class="ident">domain</span>,
<span class="ident">ServiceError</span>::<span class="ident">NotAUrl</span>,
<span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
)
.<span class="kw">await</span>;
<span class="comment">// 4. delete token</span>
<span class="kw">let</span> <span class="ident">del_token</span> <span class="op">=</span> <span class="ident">test</span>::<span class="ident">call_service</span>(
<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">app</span>,
<span class="macro">post_request</span><span class="macro">!</span>(<span class="kw-2">&amp;</span><span class="ident">domain</span>, <span class="ident">DEL_URL</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="macro">!</span>(<span class="ident">del_token</span>.<span class="ident">status</span>(), <span class="ident">StatusCode</span>::<span class="ident">OK</span>);
}
}
</pre></div>

View File

@@ -35,6 +35,8 @@
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="comment">/*
* Copyright (C) 2021 Aravinth Manivannan &lt;realaravinth@batsense.net&gt;
@@ -69,6 +71,8 @@
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">add_domain</span>);
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">delete_domain</span>);
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">add_mcaptcha</span>);
<span class="ident">cfg</span>.<span class="ident">service</span>(<span class="ident">delete_mcaptcha</span>);
}
</pre></div>
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../../";window.currentCrate = "guard";</script><script src="../../../../main.js"></script><script src="../../../../source-script.js"></script><script src="../../../../source-files.js"></script><script defer src="../../../../search-index.js"></script></body></html>

View File

@@ -178,6 +178,12 @@
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="comment">/*
* Copyright (C) 2021 Aravinth Manivannan &lt;realaravinth@batsense.net&gt;
@@ -257,6 +263,9 @@
<span class="doccomment">/// when the a token name is already taken</span>
<span class="attribute">#[<span class="ident">display</span>(<span class="ident">fmt</span> <span class="op">=</span> <span class="string">&quot;token name not available&quot;</span>)]</span>
<span class="ident">TokenNameTaken</span>,
<span class="doccomment">/// when the a host name is already taken</span>
<span class="attribute">#[<span class="ident">display</span>(<span class="ident">fmt</span> <span class="op">=</span> <span class="string">&quot;host name not available&quot;</span>)]</span>
<span class="ident">HostnameTaken</span>,
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Serialize</span>, <span class="ident">Deserialize</span>)]</span>
@@ -278,6 +287,7 @@
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">tarpaulin_include</span>))]</span>
<span class="kw">fn</span> <span class="ident">status_code</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">StatusCode</span> {
<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>);
<span class="kw">match</span> <span class="kw-2">*</span><span class="self">self</span> {
<span class="ident">ServiceError</span>::<span class="ident">InternalServerError</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">StatusCode</span>::<span class="ident">INTERNAL_SERVER_ERROR</span>,
<span class="ident">ServiceError</span>::<span class="ident">NotAnEmail</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
@@ -292,6 +302,7 @@
<span class="ident">ServiceError</span>::<span class="ident">UsernameCaseMappedError</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
<span class="ident">ServiceError</span>::<span class="ident">UsernameTaken</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
<span class="ident">ServiceError</span>::<span class="ident">TokenNameTaken</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
<span class="ident">ServiceError</span>::<span class="ident">HostnameTaken</span> <span class="op">=</span><span class="op">&gt;</span> <span class="ident">StatusCode</span>::<span class="ident">BAD_REQUEST</span>,
}
}
}
@@ -343,6 +354,7 @@
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">dup_error</span>(<span class="ident">e</span>: <span class="ident">sqlx</span>::<span class="ident">Error</span>, <span class="ident">dup_error</span>: <span class="ident">ServiceError</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">ServiceError</span> {
<span class="kw">use</span> <span class="ident">sqlx</span>::<span class="ident">error</span>::<span class="ident">Error</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">borrow</span>::<span class="ident">Cow</span>;
<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;database error: {:?}&quot;</span>, <span class="kw-2">&amp;</span><span class="ident">e</span>);
<span class="kw">if</span> <span class="kw">let</span> <span class="ident">Error</span>::<span class="ident">Database</span>(<span class="ident">err</span>) <span class="op">=</span> <span class="ident">e</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">&quot;23505&quot;</span>)) {
<span class="ident">dup_error</span>