{{{La gateway}}}
eeVote dispose d'un serveur particulier : la gateway.

C'est par ce serveur que doivent transiter tous les appels distants aux serveurs eeVote.

Ce serveur "gateway" apporte plusieurs avantages :
 - Il permet de n'ouvrir qu'un seul port vers l'extrieur et facilite ainsi la scurisation du systme.
 - Il permet aux applications distantes de n'ouvrir qu'une seule socket, ce qui peut acclrer la communication.
 - Il permettra  terme de vrifier l'identit des applications distantes par change de clefs, sans avoir  alourdir les appels entre les diffrents serveurs eeVote locaux


1. Utilisation de la gateway

La gateway est conue pour tre la plus transparente possible vis  vis des applications distantes.

Or la premire fonction appele par toutes les applications avant d'accder  un serveur est toujours la fonction getServerAccessor du dispatcher.

La gateway doit donc tre configure pour prendre la place du dispatcher et overrider la fonction getServerAccessor.

Soit la gateway est installe sur un ordinateur servant de passerelle, alors que les autres serveurs eeVote sont installs sur d'autres ordinateurs  l'intrieur d'un rseau priv, soit la gateway est install sur le mme serveur que les autres serveurs eeVote.

1.1. Gateway sur un ordinateur servant de passerelle

Dans ce cas, la gateway est configure pour utiliser le port rserv normalement au dispatcher et c'est elle qui rpond  la place du dispatcher.

1.1. Gateway sur le mme ordinateur que le dispatcher

Dans ce cas, l'adminstrateur du systme doit configurer son fichier firewall, pour couper tous les ports d'eeVote de l'extrieur, sauf le port du dispatcher qu'il redirige vers le port de la gateway.


2. Les ids

Tous les ids d'objets sont complets, mme les ids locaux  un serveur.

L'inconvnient : Quand on renomme un serveur Glasnot, par exemple glasnost://toto.entrouvert.org en glasnost://glasnost.entrouvert.org, il faut que la fonction repair de chaque serveur change tous les ids, modifie tous les ids avec une liste des anciens applicationIds  transformer en un nouvel applicationId.
Cet inconvnient est mineur car il suffit de relancer les serveurs. Il n'introduit aucun autre inconvnient.

Ces anciens applicationIds ainsi que le nouveau sont dans le fichier config.


3. Les templates

Les templates doivent tre arborescentes. Il doit y avoir une template pour un bouton, une template pour la barre des boutons, une template pour le corps de page, une template pour le header, une pour le footer.
Pour Glasnost, il ne me semble pas que la notion de template soit approprie, au moins pour l'instant. Quand on met  jour Glasnost, il est prfrable de ne ne pas faire planter toutes les versions personnalises. Il faut donc minimiser le nombre de templates, au moins tant que l'application n'est pas stable.
D'autre part, pour les applications classiques, ce n'est pas le graphiste qui dcide de la structure de l'application. Glasnost n'est pas une application marketing. La personnalisation n'a pas  tre forcment tre extrmement pousse.
Il faut privilgier au maximum l'utilisation de stylesheets dans Glasnost.


4. La variable req

Dans Glasnost, la variable req de mod_python est utilise en tant que contexte HTTP.
Il faut progressivement minimiser l'usage de cette variable et la remplacer par la variable context (accessible par getGlobalContext()).


5. Les traductions

Une traduction est ajoute au serveur de traduction au moment o elle est lue pour la premire fois : la plupart des objets sont lus juste aprs avoir t crs et cela permet de grer la traduction au niveau du client et non au niveau de chaque serveur. L'inconvnient, c'est que quand un objet est supprim, les traductions de ses strings restent. Si cela s'avre tre un vrai problme, on pourra toujours mettre ultrieurement la cration des traductions au niveau de chaque serveur.

Pour avoir le droit d'accder  une traduction, il faut fournir le texte original (ou au moins son digest, qui en thorie demande forcment le texte original pour tre calcul). Il n'y a donc pas de risque qu'un utilisateur puisse accder  une traduction dont il n'est pas un lecteur autoris.
Mais le problme se pose pour les traducteurs : il ne faut pas qu'un traducteur ait  traduire un texte qu'il n'a pas le droit de lire.  chaque string est associe un id (de l'object qui contient la string). Avant qu'un traducteur puisse lire une string, le serveur de traduction doit au pralable demander au serveur de l'objet si le traducteur a le droit de lire l'objet en gnral et la string en particulier.

Certains labels ne sont pas traduisibles, par exemple, celui d'une personne. Dans ce cas, getObjectLabelAndLanguage doit rendre '', pour indiquer que le label n'est pas  traduire.


6. Virtual hosting

Il y a un serveur de virtual host.
Quand on lui fournit l'url il retrouve l'id du virtual host correspondant.
Un virtual host contient l'id, le hostName, le port, le path, la template, sa mainRubric.
Un utilisateur peut tre rattach  plusieurs virtual hosts (qui ne se trouvent pas forcment sur la mme machine).
Un article, peut tre rattach  plusieurs virtual hosts. Par dfaut, celui propos est celui actuel, mais un menu propose tous ceux auquel appartient l'diteur (ainsi que tous ceux qui ont dj t mis par les diteurs prcdents ?)


5. Notes

La gateway n'est pas un serveur comme les autres, en ce sens qu'elle sert  cacher le dispatcher de l'extrieur et elle en prend la place. Elle ne peut pas tre appele par un serveur eeVote interne et n'est pas enregistre auprs du dispatcher par un registerServer.


6.  faire
 - Changer la licence de Glasnost (rflexion Afero)
 - Rendre les serveurs rentrants et multi-threaded : c'est indispensable, si les serveurs eeVote sont appels par plusieurs applications simultanment. Par exemple, 
 - si une application X fait appel  une fonction f du serveur A et que cette fonction appelle  son tour une fonction g du serveur B
 - et si simultanment une application Y fait appel  une fonction h du serveur B et que cette fonction appelle  son tour une fonction i du serveur A,
 - alors on a un deadlock !
 - Donner un wikiName  certains objets (article, person, rubric, ...)
 - Est-ce que le wikiName doit tre indpendant du type de l'objet ? Oui.
 - Tous les wikinames doivent tre convertis en minuscules. L'espace doit tre remplace par un underscore.
 - Faire les objets systmes (tous les objets dont le wikiName commence par 'glasnost_').
 - Les objets systmes ne doivent jamais tre rfrencs par leur id mais par leur wikiName.
 - Transformer la page  propos en article systme
 - La moulinette d'extraction des objets systmes doit vrifier qu'aucun objet systme ne contient des ids qui ne sont pas des wikiNames ou qui ne sont pas des wikiNames d'objets systmes.

7. Bloc notes

 -  faire
  - Supprimer req des getHtml... Quand req est ncessaire, utiliser context.req ?
  - Modifier makeErrorMessage()
  - Dplacer les appels  replaceSpecialTags pour le mettre une fois que l'ensemble du HTML est gnr.
  - Modifier Url et UrlNoReq pour qu'elles drivent de (ou soient remplaces par) la nouvelle classe (ou plutot fonction) X.url ou les classes X.httpUrl, X.glasnostUrl.
  - Supprimer les addId() et remplacer par une X.url (qui donne une une X.glasnostUrl).
  - Supprimer le paramtre req partout et le rcuprer par mainModule.context.req.
  - Modifier getContainedMemberIds et getContainedNonMemberIds, pour qu'elles se connectent  un serveur extrieur, quand l'objet examin n'est pas local (par exemple, un groupe d'un autre serveur Glasnost). Attention aux appels rentrants !
  - Modifier l'exportation et l'importation pour qu'elles utilisent les mmes fonctions que celles des ObjectWebs et pour qu'elles n'utilisent pas xmlRpcFieldNames, mais un champ xxx_importExport = 1 ou plutot un champ xxx_dontImport = 1 et un champ xxx_dontExport = 1
  - Remplacer getObjectItemLabel par getObjectLabelTranslated en supprimant le userToken.
  - Remplacer getObjectItemLabels par getObjectLabelsTranslated en supprimant le userToken.

 - Fait
  - Remplac getServerLocation par getServerAccessor.
  - Cr une prfrence defaultDispatcheId pour chaque application. C'est le dispatcher auquel se connecte par dfaut l'application. C'est un rglage gnrai, stock dans mainModule.defaultDispatcherId, et rcupr par getDefaultDispatcherId (de dispatcherProxy), comme getApplicationToken().
  - Remplac toutes les occurrences de callDispatcher par callServer.
  - Corrig un bug dans la stylesheet entrouvert2, qui empchait les pages d'alerte de s'afficher. (Frdric Pters).
  - Modifi UrlNoReq.addId et webhandler.py pour qu'elles fonctionnent avec des ids distants.
  - Remplac serverId par serverRole. Par exemple "eePeopleServer" est devenu "people".
  - Remplac applicationId par applicationName et applicationRole. Idem pour clientId.
  - Supprim certaines notions de variables globales mises dans mainModule : en effet, bien souvent une variable globale a un module suffit, puisqu'un module n'est en ralit import qu'une seule fois en mmoire, quoi qu'il arrive.
  - Supprim les fonctions clone (datant de rig2entrouvert).
  - Modifi _getSetContainedIds, getSetContainedIds, getGroupContainedIds, getObjectContainedIds, getSetDeltaContainedIds, getContainedIds, getContainedMemberIds et getContainedNonMemberIds, et les fonctions appelantes pour qu'elles aients serverRoles en paramtre et non plus serverIds.
  - Dans les articles, remplac les mots cls des liens par des mots cls anglais.
  - Modifi toutes les fonctions utilisant getWeb(s) ou getProx(y|ies)pour qu'elles fonctionnent avec des ids distants. Attention aux appels rentrants !
  - Ajout le type "mapping".
  - Remplac le type "multi" par "sequence".
  - Ajout une template de fallback. (Frdric Pters)
  - Ajout une option pour le tri ou non des sous-rubriques. (Frdric Pters)
  - Modifi l'index, l'about, les articles, les rubriques, pour qu'ils utilisent des templates. (Frdric Pters)
  - Cration d'un serveur de traduction. (Frdric Pters)
  - Supprim l'exception qui se produisait quand la rubrique principale n'tait pas lisible par l'utilisateur.
  - Ajout un fichier translation.py dans common.
  - Remplac makeObjectsMenu par getObjectLabelsTranslated.
  - Supprim tous les getObjectsMenu.
  - Rendu le textarea readonly dans ObjectsWeb.
  - Modifi getObjectsSectionLayout, pour utiliser getLabelTranslated au lieu de...
  - Les label dans les handleEditObject ne sont plus traduits.
  - Remplac None pour les readers et pour les admins.
  - Supprim les templates inutiles.
  - Supprim test.py et sample.html.

8. Mise  jour des serveurs XMLRPC

 - Dans les servers :
  - Remplacer isAdmin par self.isAdmin(userToken, xxx)
 - Dans les proxies :
  - Remplacer getApplicationToken() par getApplicationToken(context = context)
 - Rajouter applicationId dans
   - getUserId [authentication]
   - getUserIdAndToken [authentication]
   - checkObjectAuthentication [people]