fix broker choice when creating wallet on public BSP

Niko PLP 1 year ago
parent 117436f990
commit bdcaea3bd7
  1. BIN
      ng-app/dist-file.tar.gz
  2. BIN
      ng-app/dist.tar.gz
  3. 110
      ng-app/src/routes/WalletCreate.svelte
  4. 4
      ng-wallet/src/types.rs
  5. 395
      ngaccount/web/src/routes/Create.svelte
  6. 9
      ngd/README.md
  7. 2
      ngd/src/main.rs
  8. 17
      p2p-broker/src/server_ws.rs
  9. 74
      p2p-net/src/types.rs
  10. 17
      p2p-net/src/utils.rs

Binary file not shown.

Binary file not shown.

@ -109,6 +109,7 @@
let cloud_link; let cloud_link;
let animateDownload = true; let animateDownload = true;
let invitation; let invitation;
let pre_invitation;
let unsub_register_accepted; let unsub_register_accepted;
let unsub_register_error; let unsub_register_error;
@ -159,7 +160,10 @@
param.get("i") param.get("i")
); );
console.log(invitation); console.log(invitation);
if (!invitation) { if (invitation && invitation.V0.url) {
pre_invitation = invitation;
invitation = undefined;
} else if (!invitation) {
let redirect = await ng.get_ngone_url_of_invitation(param.get("i")); let redirect = await ng.get_ngone_url_of_invitation(param.get("i"));
if (redirect) { if (redirect) {
console.error("got an invitation for another broker. redirecting"); console.error("got an invitation for another broker. redirecting");
@ -169,6 +173,11 @@
console.error("invalid invitation. ignoring it"); console.error("invalid invitation. ignoring it");
} }
} }
} else {
pre_invitation = await ng.get_local_bootstrap_with_public(
location.href
);
console.log("pre_invitation", pre_invitation);
} }
} }
scrollToTop(); scrollToTop();
@ -176,10 +185,11 @@
function create_wallet() { function create_wallet() {
intro = false; intro = false;
if (invitation && invitation.V0.url) { // if (invitation && invitation.V0.url) {
// we redirect to the TOS url of the invitation. // // we redirect to the TOS url of the invitation.
window.location.href = invitation.V0.url; // wait = "Redirecting to TOS";
} // window.location.href = invitation.V0.url;
// }
scrollToTop(); scrollToTop();
} }
@ -890,39 +900,67 @@
<h2 class="mt-3 text-xl">Please choose one broker among the list</h2> <h2 class="mt-3 text-xl">Please choose one broker among the list</h2>
</div> </div>
</div> </div>
<div class="row mt-5"> {#if pre_invitation}
<button <div class="row mt-5">
on:click|once={selectEU} <button
class="choice-button text-primary-700 bg-primary-100 hover:bg-primary-100/90 focus:ring-4 focus:outline-none focus:ring-primary-100/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-100/55 mb-2" on:click|once={async () => {
> await select_bsp(pre_invitation.V0.url, pre_invitation.V0.name);
<EULogo class="mr-4 block h-10 w-10" alt="European Union flag" /> }}
For European Union citizens class="choice-button text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:outline-none focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55 mb-2"
</button> >
</div> <svg
fill="none"
stroke="currentColor"
stroke-width="1.5"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
class="mr-4 block h-10 w-10"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418"
/>
</svg>
Register with {pre_invitation.V0.name || "this broker"}
</button>
</div>
{:else}
<div class="row mt-5">
<button
on:click|once={selectEU}
class="choice-button text-primary-700 bg-primary-100 hover:bg-primary-100/90 focus:ring-4 focus:outline-none focus:ring-primary-100/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-100/55 mb-2"
>
<EULogo class="mr-4 block h-10 w-10" alt="European Union flag" />
For European Union citizens
</button>
</div>
<div class="row mt-5"> <div class="row mt-5">
<button <button
on:click|once={selectNET} on:click|once={selectNET}
class="choice-button text-primary-700 bg-primary-100 hover:bg-primary-100/90 focus:ring-4 focus:outline-none focus:ring-primary-100/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-100/55 mb-2" class="choice-button text-primary-700 bg-primary-100 hover:bg-primary-100/90 focus:ring-4 focus:outline-none focus:ring-primary-100/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-100/55 mb-2"
>
<svg
fill="none"
stroke="currentColor"
stroke-width="1.5"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
class="mr-4 block h-10 w-10"
> >
<path <svg
stroke-linecap="round" fill="none"
stroke-linejoin="round" stroke="currentColor"
d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" stroke-width="1.5"
/> viewBox="0 0 24 24"
</svg> xmlns="http://www.w3.org/2000/svg"
For the rest of the world aria-hidden="true"
</button> class="mr-4 block h-10 w-10"
</div> >
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418"
/>
</svg>
For the rest of the world
</button>
</div>
{/if}
<div class="row mt-5"> <div class="row mt-5">
<button <button

@ -113,7 +113,7 @@ pub struct LocalWalletStorageV0 {
impl From<&CreateWalletResultV0> for LocalWalletStorageV0 { impl From<&CreateWalletResultV0> for LocalWalletStorageV0 {
fn from(res: &CreateWalletResultV0) -> Self { fn from(res: &CreateWalletResultV0) -> Self {
LocalWalletStorageV0 { LocalWalletStorageV0 {
bootstrap: BootstrapContent::V0(BootstrapContentV0 { servers: vec![] }), bootstrap: BootstrapContent::V0(BootstrapContentV0::new()),
wallet: res.wallet.clone(), wallet: res.wallet.clone(),
client: res.client.priv_key.to_pub(), client: res.client.priv_key.to_pub(),
} }
@ -123,7 +123,7 @@ impl From<&CreateWalletResultV0> for LocalWalletStorageV0 {
impl LocalWalletStorageV0 { impl LocalWalletStorageV0 {
pub fn new(wallet: Wallet, client: ClientV0) -> Self { pub fn new(wallet: Wallet, client: ClientV0) -> Self {
LocalWalletStorageV0 { LocalWalletStorageV0 {
bootstrap: BootstrapContent::V0(BootstrapContentV0 { servers: vec![] }), bootstrap: BootstrapContent::V0(BootstrapContentV0::new()),
wallet, wallet,
client: client.priv_key.to_pub(), client: client.priv_key.to_pub(),
} }

@ -22,6 +22,7 @@
const param = new URLSearchParams($querystring); const param = new URLSearchParams($querystring);
let ca = param.get("ca"); let ca = param.get("ca");
let go_back = true; let go_back = true;
let wait = false;
let top; let top;
const api_url = import.meta.env.PROD const api_url = import.meta.env.PROD
@ -29,6 +30,7 @@
: "http://192.168.192.2:3031/api/v1/"; : "http://192.168.192.2:3031/api/v1/";
async function register() { async function register() {
wait = true;
const opts = { const opts = {
method: "get", method: "get",
}; };
@ -46,6 +48,7 @@
await success(result); await success(result);
} }
} catch (e) { } catch (e) {
wait = false;
error = e.message; error = e.message;
} }
} }
@ -60,6 +63,7 @@
let window_api = await import("@tauri-apps/plugin-window"); let window_api = await import("@tauri-apps/plugin-window");
let main = window_api.Window.getByLabel("main"); let main = window_api.Window.getByLabel("main");
if (main) { if (main) {
wait = true;
await main.emit("error", result); await main.emit("error", result);
} else { } else {
await window_api.getCurrent().close(); await window_api.getCurrent().close();
@ -70,6 +74,7 @@
go_back = false; go_back = false;
window.location.href = result.url; window.location.href = result.url;
} else { } else {
wait = true;
window.history.go(-1); window.history.go(-1);
} }
} }
@ -103,63 +108,131 @@
}; };
</script> </script>
<main class="container3" bind:this={top}> {#if wait}
<div class="row"> <div class=" max-w-6xl lg:px-8 mx-auto px-4 text-primary-700">
<Logo class="logo block h-24" alt="NextGraph Logo" /> Please wait...
{#if domain == "nextgraph.eu"} <svg
<EULogo class="animate-spin mt-10 h-14 w-14 mx-auto"
class="logo block h-20" xmlns="http://www.w3.org/2000/svg"
style="margin-top: 0.5em;" fill="none"
alt="European Union Logo" stroke="currentColor"
viewBox="0 0 24 24"
>
<circle
class="opacity-25"
cx="12"
cy="12"
r="10"
stroke="currentColor"
stroke-width="4"
/> />
{/if} <path
class="opacity-75"
fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
/>
</svg>
</div> </div>
{#if error} {:else}
<div class=" max-w-6xl lg:px-8 mx-auto px-4 text-red-800"> <main class="container3" bind:this={top}>
<svg <div class="row">
class="animate-bounce mt-10 h-16 w-16 mx-auto" <Logo class="logo block h-24" alt="NextGraph Logo" />
fill="none" {#if domain == "nextgraph.eu"}
stroke="currentColor" <EULogo
stroke-width="1.5" class="logo block h-20"
viewBox="0 0 24 24" style="margin-top: 0.5em;"
xmlns="http://www.w3.org/2000/svg" alt="European Union Logo"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
/> />
</svg>
<p class="max-w-xl md:mx-auto lg:max-w-2xl mb-5">
An error occurred while registering on this broker:<br />{error}
</p>
{#if go_back}
<button
on:click|once={close}
class="text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:outline-none focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55 mb-2"
>
Go back
</button>
{/if} {/if}
</div> </div>
{:else} {#if error}
{#if ca} <div class=" max-w-6xl lg:px-8 mx-auto px-4 text-red-800">
<div class=" max-w-6xl lg:px-8 mx-auto px-4"> <svg
<p class="max-w-xl md:mx-auto lg:max-w-2xl"> class="animate-bounce mt-10 h-16 w-16 mx-auto"
You would like to choose <b>{domain}</b> as your Broker Service fill="none"
Provider.<br />Please read carefully the Terms of Service here below, stroke="currentColor"
before accepting them. stroke-width="1.5"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
/>
</svg>
<p class="max-w-xl md:mx-auto lg:max-w-2xl mb-5">
An error occurred while registering on this broker:<br />{error}
</p> </p>
{#if go_back}
<button
on:click|once={close}
class="text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:outline-none focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55 mb-2"
>
Go back
</button>
{/if}
</div> </div>
{/if} {:else}
<div class="px-4 pt-5 mx-auto max-w-6xl lg:px-8 lg:pt-10 dark:bg-slate-800"> {#if ca}
<div class="max-w-xl md:mx-auto sm:text-center lg:max-w-2xl"> <div class=" max-w-6xl lg:px-8 mx-auto px-4">
<h2 class="pb-5 text-xl">{domain} Terms of Service</h2> <p class="max-w-xl md:mx-auto lg:max-w-2xl">
You would like to choose <b>{domain}</b> as your Broker Service
Provider.<br />Please read carefully the Terms of Service here
below, before accepting them.
</p>
</div>
{/if}
<div
class="px-4 pt-5 mx-auto max-w-6xl lg:px-8 lg:pt-10 dark:bg-slate-800"
>
<div class="max-w-xl md:mx-auto sm:text-center lg:max-w-2xl">
<h2 class="pb-5 text-xl">{domain} Terms of Service</h2>
<ul class="mb-8 space-y-4 text-left text-gray-500 dark:text-gray-400"> <ul class="mb-8 space-y-4 text-left text-gray-500 dark:text-gray-400">
{#if domain == "nextgraph.eu"} {#if domain == "nextgraph.eu"}
<li class="flex space-x-3">
<svg
class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400"
fill="none"
stroke="currentColor"
stroke-width="1.5"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M20.893 13.393l-1.135-1.135a2.252 2.252 0 01-.421-.585l-1.08-2.16a.414.414 0 00-.663-.107.827.827 0 01-.812.21l-1.273-.363a.89.89 0 00-.738 1.595l.587.39c.59.395.674 1.23.172 1.732l-.2.2c-.212.212-.33.498-.33.796v.41c0 .409-.11.809-.32 1.158l-1.315 2.191a2.11 2.11 0 01-1.81 1.025 1.055 1.055 0 01-1.055-1.055v-1.172c0-.92-.56-1.747-1.414-2.089l-.655-.261a2.25 2.25 0 01-1.383-2.46l.007-.042a2.25 2.25 0 01.29-.787l.09-.15a2.25 2.25 0 012.37-1.048l1.178.236a1.125 1.125 0 001.302-.795l.208-.73a1.125 1.125 0 00-.578-1.315l-.665-.332-.091.091a2.25 2.25 0 01-1.591.659h-.18c-.249 0-.487.1-.662.274a.931.931 0 01-1.458-1.137l1.411-2.353a2.25 2.25 0 00.286-.76m11.928 9.869A9 9 0 008.965 3.525m11.928 9.868A9 9 0 118.965 3.525"
/>
</svg>
<span
>Our servers are located in Germany, and we comply with the
GDPR regulation.</span
>
</li>
<li class="flex space-x-3">
<svg
class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400"
fill="none"
stroke="currentColor"
stroke-width="1.5"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75"
/>
</svg>
<span>legal details about GDPR... TBD</span>
</li>
{/if}
<li class="flex space-x-3"> <li class="flex space-x-3">
<svg <svg
class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400" class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400"
@ -173,12 +246,14 @@
<path <path
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
d="M20.893 13.393l-1.135-1.135a2.252 2.252 0 01-.421-.585l-1.08-2.16a.414.414 0 00-.663-.107.827.827 0 01-.812.21l-1.273-.363a.89.89 0 00-.738 1.595l.587.39c.59.395.674 1.23.172 1.732l-.2.2c-.212.212-.33.498-.33.796v.41c0 .409-.11.809-.32 1.158l-1.315 2.191a2.11 2.11 0 01-1.81 1.025 1.055 1.055 0 01-1.055-1.055v-1.172c0-.92-.56-1.747-1.414-2.089l-.655-.261a2.25 2.25 0 01-1.383-2.46l.007-.042a2.25 2.25 0 01.29-.787l.09-.15a2.25 2.25 0 012.37-1.048l1.178.236a1.125 1.125 0 001.302-.795l.208-.73a1.125 1.125 0 00-.578-1.315l-.665-.332-.091.091a2.25 2.25 0 01-1.591.659h-.18c-.249 0-.487.1-.662.274a.931.931 0 01-1.458-1.137l1.411-2.353a2.25 2.25 0 00.286-.76m11.928 9.869A9 9 0 008.965 3.525m11.928 9.868A9 9 0 118.965 3.525" d="M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z"
/> />
</svg> </svg>
<span <span
>Our servers are located in Germany, and we comply with the GDPR >All the data you exchange with us while using the broker is
regulation.</span end-to-end encrypted and we do not have access to your
decryption keys, meaning that we cannot see the content of your
documents.</span
> >
</li> </li>
<li class="flex space-x-3"> <li class="flex space-x-3">
@ -194,93 +269,87 @@
<path <path
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
d="M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75" d="M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88"
/> />
</svg> </svg>
<span>legal details about GDPR... TBD</span> <span
>We do not log any private information about you (nor IP, nor
country, nor statistics of any kind). Only your UserId is kept,
together with the list of devices (clientId) you use to connect
to the broker. We collect general purpose information about your
device (OS version, browser version, and if you use the app, the
version and date of last update). We do not have access to any
unique tracking identifier of your device (like Android MAID or
iPhone IDFA). We could nevertheless be asked by law enforcement
authorities, depending on the jurisdiction of the server, to log
the IP you use when connecting to the broker, and/or to provide
them with the encrypted content you have stored on our servers.
If you prefer to avoid that eventually, please refrain from any
illegal activity while using this broker.</span
>
</li> </li>
{/if} <li class="flex space-x-3">
<li class="flex space-x-3"> <svg
<svg class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400"
class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400" fill="none"
fill="none" stroke="currentColor"
stroke="currentColor" stroke-width="1.5"
stroke-width="1.5" viewBox="0 0 24 24"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" aria-hidden="true"
aria-hidden="true" >
> <path
<path stroke-linecap="round"
stroke-linecap="round" stroke-linejoin="round"
stroke-linejoin="round" d="M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
d="M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z" />
/> </svg>
</svg> <span>
<span You can delete your account with us at any time by going to the
>All the data you exchange with us while using the broker is link <a target="_blank" href="https://account.{domain}/#/delete"
end-to-end encrypted and we do not have access to your decryption >https://account.{domain}/#/delete</a
keys, meaning that we cannot see the content of your documents.</span > or by entering in your NextGraph application and selecting the
> menu, then Accounts, then under broker "delete registration"</span
</li> >
<li class="flex space-x-3"> </li>
<svg <li class="flex space-x-3">
class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400" <svg
fill="none" class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400"
stroke="currentColor" fill="none"
stroke-width="1.5" stroke="currentColor"
viewBox="0 0 24 24" stroke-width="1.5"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
> aria-hidden="true"
<path >
stroke-linecap="round" <path
stroke-linejoin="round" stroke-linecap="round"
d="M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88" stroke-linejoin="round"
/> d="M14.25 7.756a4.5 4.5 0 100 8.488M7.5 10.5h5.25m-5.25 3h5.25M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
</svg> />
<span </svg>
>We do not log any private information about you (nor IP, nor <span
country, nor statistics of any kind). Only your UserId is kept, >Registration is free of charge. And it would be very nice of
together with the list of devices (clientId) you use to connect to you if you wanted to donate a small amount to help us cover the
the broker. We collect general purpose information about your fees we have to pay for operating the servers. Here is the
device (OS version, browser version, and if you use the app, the donation link: <a
version and date of last update). We do not have access to any target="_blank"
unique tracking identifier of your device (like Android MAID or href="https://nextgraph.org/donate"
iPhone IDFA). We could nevertheless be asked by law enforcement >https://nextgraph.org/donate</a
authorities, depending on the jurisdiction of the server, to log >
the IP you use when connecting to the broker, and/or to provide </span>
them with the encrypted content you have stored on our servers. If </li>
you prefer to avoid that eventually, please refrain from any </ul>
illegal activity while using this broker.</span </div>
> </div>
</li> {#if ca}
<li class="flex space-x-3"> <div class="row mb-20">
<svg <button
class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400" on:click|once={accept}
fill="none" class="mr-5 text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:outline-none focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55 mb-2"
stroke="currentColor" >
stroke-width="1.5"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</svg>
<span>
You can delete your account with us at any time by going to the
link <a target="_blank" href="https://account.{domain}/#/delete"
>https://account.{domain}/#/delete</a
> or by entering in your NextGraph application and selecting the menu,
then Accounts, then under broker "delete registration"</span
>
</li>
<li class="flex space-x-3">
<svg <svg
class="flex-shrink-0 w-5 h-5 text-green-500 dark:text-green-400" class="w-8 h-8 mr-2 -ml-1"
fill="none" fill="none"
stroke="currentColor" stroke="currentColor"
stroke-width="1.5" stroke-width="1.5"
@ -291,51 +360,19 @@
<path <path
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
d="M14.25 7.756a4.5 4.5 0 100 8.488M7.5 10.5h5.25m-5.25 3h5.25M21 12a9 9 0 11-18 0 9 9 0 0118 0z" d="M19 7.5v3m0 0v3m0-3h3m-3 0h-3m-2.25-4.125a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zM4 19.235v-.11a6.375 6.375 0 0112.75 0v.109A12.318 12.318 0 0110.374 21c-2.331 0-4.512-.645-6.374-1.766z"
/> />
</svg> </svg>
<span I accept
>Registration is free of charge. And it would be very nice of you </button>
if you wanted to donate a small amount to help us cover the fees <button
we have to pay for operating the servers. Here is the donation on:click|once={refuse}
link: <a target="_blank" href="https://nextgraph.org/donate" class="text-primary-700 bg-primary-100 hover:bg-primary-100/90 focus:ring-4 focus:outline-none focus:ring-primary-100/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-100/55 mr-2 mb-2"
>https://nextgraph.org/donate</a
>
</span>
</li>
</ul>
</div>
</div>
{#if ca}
<div class="row mb-20">
<button
on:click|once={accept}
class="mr-5 text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:outline-none focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55 mb-2"
>
<svg
class="w-8 h-8 mr-2 -ml-1"
fill="none"
stroke="currentColor"
stroke-width="1.5"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
> >
<path I refuse
stroke-linecap="round" </button>
stroke-linejoin="round" </div>
d="M19 7.5v3m0 0v3m0-3h3m-3 0h-3m-2.25-4.125a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zM4 19.235v-.11a6.375 6.375 0 0112.75 0v.109A12.318 12.318 0 0110.374 21c-2.331 0-4.512-.645-6.374-1.766z" {/if}
/>
</svg>
I accept
</button>
<button
on:click|once={refuse}
class="text-primary-700 bg-primary-100 hover:bg-primary-100/90 focus:ring-4 focus:outline-none focus:ring-primary-100/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-100/55 mr-2 mb-2"
>
I refuse
</button>
</div>
{/if} {/if}
{/if} </main>
</main> {/if}

@ -13,8 +13,13 @@ If you prefer to change the base directory, use the argument `--base [PATH]` whe
``` ```
ngcli gen-key ngcli gen-key
ngd --save-key -d <DOMAIN_NAME> -l 1440 --admin <THE_USER_ID_YOU_JUST_CREATED> ngd -v --save-key -d <DOMAIN_NAME> -l 1440 --admin <THE_USER_ID_YOU_JUST_CREATED>
// note the server peerID in the logs // note the server peerID from the logs
```
in another terminal:
```
ngcli --save-key -s 127.0.0.1,1440,<PEER_ID_OF_SERVER> -u <THE_PRIVATE_KEY_OF_THE_USER_YOU_JUST_CREATED> admin add-user <THE_USER_ID_YOU_JUST_CREATED> -a ngcli --save-key -s 127.0.0.1,1440,<PEER_ID_OF_SERVER> -u <THE_PRIVATE_KEY_OF_THE_USER_YOU_JUST_CREATED> admin add-user <THE_USER_ID_YOU_JUST_CREATED> -a
``` ```

@ -996,7 +996,7 @@ async fn main_inner() -> Result<(), ()> {
config_path.to_str().unwrap() config_path.to_str().unwrap()
); );
log_info!( log_info!(
"You not be able to use any Quick config options anymore on the command line at the next command-line start of the server. But you can go to modify the config file directly, or delete it.", "You will not be able to use any Quick config options anymore on the command line at the next command-line start of the server. But you can go to modify the config file directly, or delete it.",
); );
} }
} else { } else {

@ -656,6 +656,8 @@ pub async fn run_server_v0(
let mut servers: Vec<BrokerServerV0> = vec![]; let mut servers: Vec<BrokerServerV0> = vec![];
let registration_url = config.registration_url;
// Preparing the listeners addrs and infos // Preparing the listeners addrs and infos
for listener in config.listeners { for listener in config.listeners {
if !listener.accept_direct && listener.accept_forward_for == AcceptForwardForV0::No { if !listener.accept_direct && listener.accept_forward_for == AcceptForwardForV0::No {
@ -757,8 +759,13 @@ pub async fn run_server_v0(
log_warn!("There isn't any listener that accept clients. This is a misconfiguration as a core server that cannot receive client connections is useless"); log_warn!("There isn't any listener that accept clients. This is a misconfiguration as a core server that cannot receive client connections is useless");
} }
let bootstrap_v0 = BootstrapContentV0 { servers }; let bootstrap_v0 = BootstrapContentV0 { servers };
let bootstrap = BootstrapContent::V0(bootstrap_v0.clone()); let local_bootstrap_info = LocalBootstrapInfo::V0(LocalBootstrapInfoV0 {
BOOTSTRAP_STRING.set(json!(bootstrap).to_string()).unwrap(); bootstrap: bootstrap_v0.clone(),
registration_url: registration_url.clone(),
});
BOOTSTRAP_STRING
.set(json!(local_bootstrap_info).to_string())
.unwrap();
// saving the infos in the broker. This needs to happen before we start listening, as new incoming connections can happen anytime after that. // saving the infos in the broker. This needs to happen before we start listening, as new incoming connections can happen anytime after that.
// and we need those infos for permission checking. // and we need those infos for permission checking.
@ -772,7 +779,7 @@ pub async fn run_server_v0(
&mut path, &mut path,
wallet_master_key, wallet_master_key,
if admin_invite { if admin_invite {
Some(bootstrap_v0) Some(bootstrap_v0.clone())
} else { } else {
None None
}, },
@ -788,9 +795,9 @@ pub async fn run_server_v0(
overlays_configs: config.overlays_configs, overlays_configs: config.overlays_configs,
registration: config.registration, registration: config.registration,
admin_user: config.admin_user, admin_user: config.admin_user,
registration_url: config.registration_url, registration_url,
peer_id, peer_id,
bootstrap, bootstrap: BootstrapContent::V0(bootstrap_v0),
}; };
broker.set_server_config(server_config); broker.set_server_config(server_config);
} }

@ -546,6 +546,15 @@ impl BootstrapContentV0 {
pub fn get_first_peer_id(&self) -> Option<PubKey> { pub fn get_first_peer_id(&self) -> Option<PubKey> {
self.servers.first().map(|s| s.peer_id) self.servers.first().map(|s| s.peer_id)
} }
pub fn get_domain(&self) -> Option<String> {
for server in self.servers.iter() {
if let BrokerServerTypeV0::Domain(name) = &server.server_type {
return Some(name.clone());
}
}
None
}
} }
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Serialize, Deserialize)]
@ -561,6 +570,43 @@ impl BootstrapContent {
} }
} }
/// Local Bootstrap info Version 0, served at /.ng_bootstrap
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct LocalBootstrapInfoV0 {
/// list of servers, in order of preference
pub bootstrap: BootstrapContentV0,
/// optional registration_url for public server that accept to be BSP for new clients
pub registration_url: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum LocalBootstrapInfo {
V0(LocalBootstrapInfoV0),
}
impl LocalBootstrapInfo {
pub fn servers(&self) -> &Vec<BrokerServerV0> {
match self {
Self::V0(v0) => &v0.bootstrap.servers,
}
}
}
impl From<LocalBootstrapInfo> for Invitation {
fn from(value: LocalBootstrapInfo) -> Self {
let LocalBootstrapInfo::V0(info) = value;
let name = info.bootstrap.get_domain();
let url = info.registration_url.clone();
Invitation::V0(InvitationV0 {
bootstrap: info.bootstrap,
code: None,
name,
url,
})
}
}
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Serialize, Deserialize)]
pub enum InvitationCode { pub enum InvitationCode {
Unique(SymKey), Unique(SymKey),
@ -609,7 +655,7 @@ impl InvitationV0 {
} }
pub fn empty(name: Option<String>) -> Self { pub fn empty(name: Option<String>) -> Self {
InvitationV0 { InvitationV0 {
bootstrap: BootstrapContentV0 { servers: vec![] }, bootstrap: BootstrapContentV0::new(),
code: None, code: None,
name, name,
url: None, url: None,
@ -668,7 +714,7 @@ impl Invitation {
pub fn intersects(&self, invite2: Invitation) -> Invitation { pub fn intersects(&self, invite2: Invitation) -> Invitation {
let Invitation::V0(v0) = self; let Invitation::V0(v0) = self;
let mut new_invite = InvitationV0 { let mut new_invite = InvitationV0 {
bootstrap: BootstrapContentV0 { servers: vec![] }, bootstrap: BootstrapContentV0::new(),
code: v0.code.clone(), code: v0.code.clone(),
name: v0.name.clone(), name: v0.name.clone(),
url: v0.url.clone(), url: v0.url.clone(),
@ -763,18 +809,18 @@ pub enum Invitation {
V0(InvitationV0), V0(InvitationV0),
} }
impl From<BootstrapContent> for Invitation { // impl From<BootstrapContent> for Invitation {
fn from(value: BootstrapContent) -> Self { // fn from(value: BootstrapContent) -> Self {
let BootstrapContent::V0(boot) = value; // let BootstrapContent::V0(boot) = value;
// let name = boot.get_domain();
Invitation::V0(InvitationV0 { // Invitation::V0(InvitationV0 {
bootstrap: boot, // bootstrap: boot,
code: None, // code: None,
name: None, // name,
url: None, // url: None,
}) // })
} // }
} // }
/// Create an account at a Broker Service Provider (BSP). /// Create an account at a Broker Service Provider (BSP).
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Serialize, Deserialize)]

@ -115,7 +115,7 @@ pub fn check_is_local_url(bootstrap: &BrokerServerV0, location: &String) -> Opti
} }
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
async fn retrieve_ng_bootstrap(location: &String) -> Option<BootstrapContent> { async fn retrieve_ng_bootstrap(location: &String) -> Option<LocalBootstrapInfo> {
let prefix = if (APP_PREFIX == "") { let prefix = if (APP_PREFIX == "") {
let url = Url::parse(location).unwrap(); let url = Url::parse(location).unwrap();
url.origin().unicode_serialization() url.origin().unicode_serialization()
@ -126,7 +126,7 @@ async fn retrieve_ng_bootstrap(location: &String) -> Option<BootstrapContent> {
//log_info!("url {}", url); //log_info!("url {}", url);
let resp = reqwest::get(url).await; let resp = reqwest::get(url).await;
if resp.is_ok() { if resp.is_ok() {
let resp = resp.unwrap().json::<BootstrapContent>().await; let resp = resp.unwrap().json::<LocalBootstrapInfo>().await;
return Some(resp.unwrap()); return Some(resp.unwrap());
} else { } else {
//log_info!("err {}", resp.unwrap_err()); //log_info!("err {}", resp.unwrap_err());
@ -136,11 +136,11 @@ async fn retrieve_ng_bootstrap(location: &String) -> Option<BootstrapContent> {
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
pub async fn retrieve_local_url(location: String) -> Option<String> { pub async fn retrieve_local_url(location: String) -> Option<String> {
let bootstraps = retrieve_ng_bootstrap(&location).await; let info = retrieve_ng_bootstrap(&location).await;
if bootstraps.is_none() { if info.is_none() {
return None; return None;
} }
for bootstrap in bootstraps.unwrap().servers() { for bootstrap in info.unwrap().servers() {
let res = check_is_local_url(bootstrap, &location); let res = check_is_local_url(bootstrap, &location);
if res.is_some() { if res.is_some() {
return res; return res;
@ -165,12 +165,11 @@ pub async fn retrieve_local_bootstrap(
log_debug!("invite_String {:?} invite1{:?}", invite_string, invite1); log_debug!("invite_String {:?} invite1{:?}", invite_string, invite1);
let invite2: Option<Invitation> = { let invite2: Option<Invitation> = {
let bootstraps = retrieve_ng_bootstrap(&location_string).await; let info = retrieve_ng_bootstrap(&location_string).await;
if bootstraps.is_none() { if info.is_none() {
None None
} else { } else {
let mut inv: Invitation = bootstraps.unwrap().into(); let mut inv: Invitation = info.unwrap().into();
inv.set_url(BROKER.read().await.get_registration_url());
Some(inv) Some(inv)
} }
}; };

Loading…
Cancel
Save