# Prototype de GVA

**URL:** https://forum.duniter.org/t/prototype-de-gva/7688
**Category:** Duniter-v1
**Tags:** gva
**Created:** [18 October 2020 14:40 UTC](https://forum.duniter.org/t/prototype-de-gva/7688 "2020-10-18T14:40:53Z")
**Posts on this page:** 20
**Page:** 9

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [9 June 2021 19:59 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/163 "2021-06-09T19:59:47Z")

</div>

> [@elois](#):
>
> Il semble que async\_graphql n’inclus pas les APQ, après je peux toujours le développer moi-même par-dessus, mais c’est pas dans mes priorités…

En fait si, ce n’est pas suffisamment mis en avant dans leur doc, mais il y a bien une extension APQ : [ApolloPersistedQueries in async\_graphql::extensions::apollo\_persisted\_queries - Rust](https://docs.rs/async-graphql/2.9.1/async_graphql/extensions/apollo_persisted_queries/struct.ApolloPersistedQueries.html)

Je peux l’activer si ça vous semble pertinent, encore faut-il que les clients s’en servent 🙂

---

<div class="post-metadata">

### Author: ![ManUtopiK](https://forum.duniter.org/user_avatar/forum.duniter.org/manutopik/32/29_2.png) [@ManUtopiK](https://forum.duniter.org/u/ManUtopiK)
#### Post date: [9 June 2021 20:06 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/164 "2021-06-09T20:06:03Z")

</div>

> [@elois](#):
>
> c’est aux développeurs de ses clients Ğ1 de m’indiquer de quoi ils ont besoin
> 
> Là je ne comprends pas le but de tes messages, je n’arrive pas à identifier un besoin derrière

Oui, désolé. J’ai eu des idées qu’il faut que je test avant de m’emballer…

Génial pour APQ ! Ben c’est tiptop async\_graphql ! Voilà, il suffit d’en parler 🙂  
Pas besoin de l’activer pour l’instant, mais c’est bon à savoir !

---

<div class="post-metadata">

### Author: ![kimamila](https://forum.duniter.org/user_avatar/forum.duniter.org/kimamila/32/185_2.png) [@kimamila](https://forum.duniter.org/u/kimamila)
#### Post date: [10 June 2021 18:58 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/165 "2021-06-10T18:58:00Z")

</div>

> [@elois](#):
>
> Ma priorité étant que GVA permettent d’optimiser les clients Ğ1 (Cesium v2, Ğecko, Tikka, etc), c’est aux développeurs de ses clients Ğ1 de m’indiquer de quoi ils ont besoin pour que les traitements soient plus optimisés de leur côté.

J’utilise également activement la librairie cliente Apollo. Effectivement le cache nécessite de reconnaître une partie des objets JSON, pour mettre à jour les éléments déjà chargés par d’autres requêtes.  
Dans les serveurs graphql que j’ai en production, au boulot, on se sert du “\_\_typename” et aussi d’un id. Mais l’un comme l’autre peuvent être surchargé.

En fait, le problème de fond est de pouvoir distinguer un objet JSON, dans une grappe de donnée reçue. Il faut un déterminant pour qu’une gestion de cache puisse être agnostique a la requête.  
A voir ce qu’on peut définir, donc, comme clef technique de cache.  
Merci @ManUtopiK de soulever ce problème.

---

<div class="post-metadata">

### Author: ![ManUtopiK](https://forum.duniter.org/user_avatar/forum.duniter.org/manutopik/32/29_2.png) [@ManUtopiK](https://forum.duniter.org/u/ManUtopiK)
#### Post date: [10 June 2021 22:41 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/166 "2021-06-10T22:41:36Z")

</div>

> [@kimamila](#):
>
> En fait, le problème de fond est de pouvoir distinguer un objet JSON, dans une grappe de donnée reçue. Il faut un déterminant pour qu’une gestion de cache puisse être agnostique a la requête.

C’est ça ! Tu as compris ! Et résumé en 2 lignes en + 🙂  
Ouf, j’avais peur d’avoir fait du bruit pour rien…

Ok, on avance. Un autre problème que je n’ai pas résolu encore, c’est la possibilité de _merger_ 2 schémas Graphql (ou [remote joins](https://hasura.io/blog/remote-schema-joins/) ou [schema stitching](https://www.graphql-tools.com/docs/schema-stitching/)). C’est une porte d’entrée vers une architecture micro-services.

Soit ma bdd avec ce schéma :

```auto
User {
    id: uuid!
    mail: String!
    myCustomData: String
    ...
    pubkey: String
}

```

L’idée est d’utiliser la pubkey comme référence pour récupérer les données de GVA et mes données en une seule requête, avec comme _relationships_ entre ma bdd et GVA : `user.pubkey = idty.pubkey` et/ou `user.pubkey = balance.PkOrScriptGva`.

Et hop ! En une requête j’ai tout :

```auto
query fetchUser($id: uuid!) {
  id
  mail
  gva {
    idty {
      username
      isMember
    }
    balance {
       amount
    }
  }
}

```

Sauf, que je n’y arrive pas 😕 Je ne peux pas merger l’api GVA avec mon api, car mon `pubkey` est de type `String` et pas de type `pubkey` ou `PkOrScriptGva`. En tout cas, avec Hasura, je n’ai pas réussi à le faire alors qu’ils sont pourtant [compatibles Apollo Federation](https://hasura.io/blog/data-federation-in-graphql-using-hasura-remote-joins-and-gatsby/).

@elois Je ne demande rien pour l’instant ! C’est juste pour faire remonter mon expérience. Il faut que je fasse d’autres tests…

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [30 June 2021 00:51 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/167 "2021-06-30T00:51:26Z")

</div>

@tuxmain est-ce que tu crois que tu pourrais ajouter à la commande idty GVA l’arguement `username` pour rechercher une pubkey par username ? J’en ai vraiment besoin 🙂

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [30 June 2021 06:29 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/168 "2021-06-30T06:29:16Z")

</div>

Pour rechercher comment ? Je peux faire facilement «&nbsp;commençant exactement par&nbsp;» (ou insensible à la casse, si besoin), mais «&nbsp;contenant&nbsp;» ou en tolérant des fautes, c’est plus compliqué. (c’est faisable mais ça prendra trop de temps à répondre)

Tu veux seulement la pubkey, ou aussi les autres champs de idty, ce qui peut économiser une requête ?

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [30 June 2021 07:22 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/169 "2021-06-30T07:22:53Z")

</div>

> [@tuxmain](#):
>
> Tu veux seulement la pubkey, ou aussi les autres champs de idty, ce qui peut économiser une requête ?

Bah tous les champs tant qu’à faire ?

Juste qui match le username exact.  
Le reste, c’est si tu as envie de chiader le truc 😁

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [30 June 2021 09:40 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/170 "2021-06-30T09:40:05Z")

</div>

Fait&nbsp;: [idty\_by\_username (!3) · Merge requests · nodes / rust / modules / duniter-gva · GitLab](https://git.duniter.org/nodes/rust/modules/duniter-gva/-/merge_requests/3)

Ça ne fait que le match exact, et ça renvoie exactement les mêmes données que idty(pubkey). (et j’ai ajouté un champ pubkey dans la réponse)

C’est plutôt à des services comme Cesium+ de fournir une recherche avancée, et pour les utilisateurs un tel service serait plus intéressant que GVA qui ne saurait faire que les majuscules et le «&nbsp;commence par&nbsp;», donc je ne l’ai pas fait.

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [30 June 2021 13:29 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/171 "2021-06-30T13:29:47Z")

</div>

> [@tuxmain](#):
>
> C’est plutôt à des services comme Cesium+ de fournir une recherche avancée, et pour les utilisateurs un tel service serait plus intéressant que GVA qui ne saurait faire que les majuscules et le « commence par », donc je ne l’ai pas fait.

Peut tu aux moins le rendre insensible à la casse en faisant un to\_uppercase() avant la comparaison ?

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [30 June 2021 14:01 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/172 "2021-06-30T14:01:27Z")

</div>

Ah mais ça veut dire ajouter tout le bazar pour renvoyer une liste ! 😅

Et si la taille max est 100 ça veut dire qu’on peut renvoyer jusqu’à 2^100 résultats, donc il faut paginer.

Et il y a plusieurs manières pour la db&nbsp;: `username(insensible) -> HashMap<username(sensible), pubkey>` ou `username(insensible)+username(sensible) -> pubkey`

Il faudrait aussi ajouter un champ `case_sensitive` vrai par défaut.

Mais je me disais que si cette fonctionnalité est utilisée, c’est forcément pour la recherche par un utilisateur, or un utilisateur voudrait un truc plus sophistiqué (regex, Levenstein, soundex…). Cesium+ ne fait pas encore aussi complet mais fait déjà mieux que juste la casse. Donc je doute de l’utilité d’une telle fonctionnalité.

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [30 June 2021 15:01 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/173 "2021-06-30T15:01:58Z")

</div>

> [@tuxmain](#):
>
> Donc je doute de l’utilité d’une telle fonctionnalité.

Ben c’est demandé par @kimamila l’insensibilité à la casse donc si c’est utile.

> [@tuxmain](#):
>
> Et il y a plusieurs manières pour la db : `username(insensible) -> HashMap<username(sensible), pubkey>` ou `username(insensible)+username(sensible) -> pubkey`
> 
> Il faudrait aussi ajouter un champ `case_sensitive` vrai par défaut.

Pas besoin de faire aussi compliqué, keep it stupid simple: stocke la clé en uppercase et passe par un set (key: `username(uppercase) ++ pubkey`, value: `()`).

Puis récupère les vrais usernames dans BcV2.

Le plus simple c’est de remonter une liste tout le temps puis de filtrer au niveau du resolver si on veut que ça match exact.

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [30 June 2021 15:15 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/174 "2021-06-30T15:15:19Z")

</div>

Ah en effet je viens de voir que Cesium demande à Duniter pour la recherche…

Donc pour éviter de faire une régression il faudrait aussi gérer le «&nbsp;commence par&nbsp;».

Edit: UPPERCASE ça me fait trop penser à Windows, ses API et FAT32… s’il n’y a pas de raison particulière je préfère lowercase. 😋

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [30 June 2021 15:27 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/175 "2021-06-30T15:27:46Z")

</div>

> [@tuxmain](#):
>
> Donc pour éviter de faire une régression il faudrait aussi gérer le « commence par ».

Ça pareil tu peux le gérer avec un filtre dans le résolver, ça évite de complexifier la db 😉

> [@tuxmain](#):
>
> s’il n’y a pas de raison particulière je préfère lowercase.

Oui qu’importe c’est équivalent 🙂

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [30 November 2021 09:24 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/176 "2021-11-30T09:24:20Z")

</div>

> [@elois](#):
>
> L’anti-spam limite à 40 requêtes par tranche de 20 secondes, ça me semble suffisant pour un usage d’un utilisateur final, on pourra toujours augmenter un peu si l’on constate par l’expérience que c’est trop restrictif.

L’anti-spam de GVA est beaucoup trop sévère, si l’on pagine un peu trop vite les pages d’historique d’un profil, on se fait ban assez vite.

Je ne trouve plus comment régler la whitelist dans le conf.json, ceci ne fonctionne pas:

```auto
 "gva": {
  "whitelist": [
   "127.0.0.1",
   "86.201.xx.xx"
  ] 
 }

```

Cela non plus:

```auto
 "dos": {
  "whitelist": [
   "127.0.0.1",
   "86.201.12.250"
  ],

```

Je n’ai pas de champ `gva` dans cette conf par défaut il s’agit d’un noeud docker, dont les paramètres du noeud sont passés en variables d’environnement via le docker-compose.

Quelqu’un saurait comment éditer cette whitelist, ou bien assouplir les valeurs de l’anti-spam, ou bien carrément le désactiver ?

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [30 November 2021 20:12 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/177 "2021-11-30T20:12:52Z")

</div>

Dans le mien j’ai&nbsp;:

```json
 "gva": {
  "enabled": true,
  "ip4": "127.0.0.1",
  "ip6": "::1",
  "path": "gva",
  "port": 30901,
  "subscriptionsPath": "gva-sub",
  "whitelist": [
   "::1",
   "127.0.0.1"
  ]
 }

```

Ça semble cohérent avec le code source (`conf/src/lib.rs`)&nbsp;:

```rust
pub struct GvaConf {
    pub enabled: bool,
    #[serde(default = "ip4_default")]
    pub ip4: Ipv4Addr,
    pub ip6: Option<Ipv6Addr>,
    #[serde(default = "port_default")]
    pub port: u16,
    #[serde(default = "whitelist_default")]
    pub whitelist: Vec<IpAddr>,
    // [...]
}

```

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [1 December 2021 07:38 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/178 "2021-12-01T07:38:39Z")

</div>

Cela ne fonctionne pas dans un nœud docker.

Est-ce que tu sais où et comment changer les valeurs de ce filtre ?  
Réglé ainsi, cela rends GVA inutilisable en condition réelle.

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [1 December 2021 09:12 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/179 "2021-12-01T09:12:35Z")

</div>

Si des variables d’environnement ne sont pas prises en compte dans docker, peut-être voir avec @Pini.

---

<div class="post-metadata">

### Author: ![Pini](https://forum.duniter.org/user_avatar/forum.duniter.org/pini/32/6819_2.png) [@Pini](https://forum.duniter.org/u/Pini)
#### Post date: [1 December 2021 22:04 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/180 "2021-12-01T22:04:38Z")

</div>

Sur la branche `dev` on trouve mention dans la doc [1] d’une variable `DUNITER_GVA_WHITELIST`, mais celle-ci n’apparaît nulle part dans le code.

[1] doc/use/conf\_env\_var.md

Edit - D’ailleurs pratiquement aucune des variables `DUNITER_GVA_*` référencées dans la doc n’existe dans le code.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [2 December 2021 00:53 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/181 "2021-12-02T00:53:42Z")

</div>

On ne peut pas passer une tableau en variable d’environnement:

```auto
ERROR: The Compose file './jinja-compose.yml' is invalid because:
services.duniter.environment.DUNITER_GVA_WHITELIST contains ["127.0.0.1", "::1"], which is an invalid type, it should be a string, number, or a null

```

Il aurait fallut attendre une suite de string séparé par des virgules, et split la chaine ainsi…

* * *

De toute manière ce qui m’intéresse, c’est surtout pour changer les valeurs de ce filtre anti-spam.

Je constate qu’il n’est pas réglé comme indiqué par elois, il suffit d’envoyer 5 requêtes successives pour se faire ban.

J’aimerais augmenter cette valeur.

```auto
$ while true; do jaklis currentUd 2>/dev/null || echo error; sleep 0.5; done
1042
1042
1042
1042
1042
1042
error
error
error
error
error
error
error
error

```

```auto
$ while true; do jaklis currentUd 2>/dev/null || echo error; sleep 1; done
1042
1042
1042
1042
1042
error
1042
1042
1042
1042
1042
error
error
error
error
error
error

```

```auto
$ while true; do jaklis currentUd 2>/dev/null || echo error; sleep 2; done
1042
1042
1042
1042
1042
error
1042
1042
1042
1042
1042
error
1042
1042
1042
1042
1042
error
error
error
error
error
error
error
error
error
error
error
error
error
error
error

```

(les `error` ici sont des bans IP).

Un utilisateurs qui scroll trop vite l’historique d’un profil sur Gecko se fait ban assez facilement.

---

<div class="post-metadata">

### Author: ![Pini](https://forum.duniter.org/user_avatar/forum.duniter.org/pini/32/6819_2.png) [@Pini](https://forum.duniter.org/u/Pini)
#### Post date: [2 December 2021 08:40 UTC](https://forum.duniter.org/t/prototype-de-gva/7688/182 "2021-12-02T08:40:53Z")

</div>

@poka : Peux-tu me pointer la version des sources que tu utilises ? Car comme dit plus haut, je ne trouve aucune référence à cette variable sur la branche `dev`.

[Previous page](https://forum.duniter.org/t/prototype-de-gva/7688.md?page=8)

[Next page](https://forum.duniter.org/t/prototype-de-gva/7688.md?page=10)
