{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/comments/39851641","id":39851641,"diff_hunk":"@@ -0,0 +1,254 @@\n+Comment chiffrer ses données avec Kinto.js\n+##########################################\n+\n+:date: 2015-09-16\n+:summary: Comment utiliser Kinto.js pour chiffrer ses données dans Kinto.\n+:slug: kinto-encryption-example\n+:lang: fr\n+:url: kinto-chiffrer-ses-donnees\n+:scripts: kinto-61ad959.min.js, kinto-encryption-example.js\n+\n+.. note::\n+\n+    Traduit de l'anglais par `Rémy Hubscher <https://twitter.com/Natim>`_.\n+\n+Voici un article rédigé par `Michiel de Jong\n+<https://michielbdejong.com/>`_ de l'équipe Firefox OS.\n+\n+Lorsqu'on souhaite sauvegarder les données d'une application\n+\"Offline-first\" (qui fonctionne normalement hors connexion) de manière\n+chiffrer dans le cloud, ça a du sens de les garder déchiffrées\n+localement et de les chiffrer uniquement avant de les téléverser vers\n+un serveur distant.\n+\n+Ainsi, il est facile et efficace d'y accéder pour les afficher ou\n+mettre à jour la copie locale, sans avoir le coût répété de les\n+chiffrer/déchiffrer à chaque opération.\n+\n+De la même manière, on peut déchiffrer les données venant du serveur\n+une seule fois, tout de suite après les avoir télécharger et\n+l'application peut ensuite afficher les données aussi souvent que\n+nécessaire sans coût de calculs supplémentaires.\n+\n+Synchroniser les données d'une telle application vers et depuis \"le\n+cloud\" est une science en elle-même et `Kinto.js\n+<https://github.com/Kinto/kinto.js>`_ est un outil brillant pour ce\n+fairem éveloppé par la toute aussi brillante équipe du Service de\n+nuages de Mozilla. La release 1.0 ne devrait plus tarder et vous en\n+saurez sûrement plus sur ce blog très prochainement.\n+\n+Il se trouve que Kinto,js supporte maintenant les `RemoteTransformers\n+<http://kintojs.readthedocs.org/en/latest/api/#transformers>`_, qui\n+permettent de manière très simple d'appliquer n'importe quel type de\n+transformations que vous souhaitez faire sur les enregistrements d'une\n+collection avant qu'ils ne soient stocker dans la base de données\n+locale (``RemoteTransformer#decode``) mais aussi avant qu'ils ne\n+soient sauvegarder sur le serveur distant\n+(``RemoteTransformer#encode``).\n+\n+Cet article de blog montre comment utiliser un ``RemoteTransformer``\n+pour chiffrer vos données juste avant de les envoyer dans les\n+nuages. De plus nous utilisons WebCrypto pour la partie cryptographie.\n+\n+Notez que je ne suis pas un expert en sécurité et que ce code est\n+simplement un exemple écrit en une après-midi. Si vous copiez/collez\n+ce code, ne l'utilisez pas pour quoi que ce soit de sensible sans\n+avoir fait votre propre revue de sécurité au préalable ! :) Par\n+exemple il n'y a aucun mot de passe sur la clé de chiffrement, aucune\n+signature et vérification des enregistrements, c'est uniquement un\n+chiffrement/déchiffrement très basique pour la démonstration.\n+\n+L'idée derrière un ``RemoteTransformer`` c'est d'exposer deux\n+fonctions, ``encode`` et ``decode``, et Kinto.js s'assure d'appeler la\n+fonction ``encode`` sur chaque enregistrement qui est téléverser dans\n+le cloud et d'appeler ``decode`` sur chaque enregistrement\n+télécharger. Vous pouvez en lire plus à ce sujet\n+`dans la documentation de Kinto.js <http://kintojs.readthedocs.org/en/latest/api/#transformers>`_.\n+\n+La manière dont nous spécifions à Kinto.js d'utiliser nos fonctions\n+``encode`` et ``decode`` est assez simple. Lorsqu'on créé une\n+collection Kinto, on passe en paramètre un ``RemoteTransformer``. Le\n+code d'exemple complet se trouve ici \n+`here <{filename}/scripts/kinto-encryption-example.js>`_ (notez qu'il ne\n+fonctionne pour l'instant qu'avec\n+`la dernière version de Kinto.js master <{filename}/scripts/kinto-61ad959.min.js>`_),\n+mais regardons le code étape par étape.\n+\n+Si vous n'êtes pas familier avec ES6, vous pouvez être un peu surpris par sa syntaxe ; utilisons cette opportunité pour nous y habituer ! Voici une petite table de correspondance :\n+\n+- `() => {} <http://babeljs.io/docs/learn-es2015/#arrows-and-lexical-this>`_ corresponds à ``(function() {}).bind(this)``.\n+- `const foo = 'bar'; let foo = 'bar'; <http://babeljs.io/docs/learn-es2015/#let-const>`_ correspondent à ``var foo = 'bar'``.\n+- `{ a, b } <http://babeljs.io/docs/learn-es2015/#enhanced-object-literals>`_ corresponds à ``{ a: a, b: b }``.\n+- `\\`Hello ${foo}\\` <http://babeljs.io/docs/learn-es2015/#template-strings>`_ (notez les backticks) corresponds à ``'Hello ' + foo``.\n+\n+Pour commencer, nous avons besoin de quelques fonctions utilitaires\n+que nous utiliserons plus tard pour convertir des `byte arrays\n+<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays>`_\n+en chaines de caractères ASCII et inversemment.\n+\n+.. code-block:: JavaScript\n+\n+    // Helper functions:\n+    const rawStringToByteArray = (str) => {\n+      const strLen = str.length;\n+      var byteArray = new Uint8Array(strLen);\n+      for (var i = 0; i < strLen; i++) {\n+        byteArray[i] = str.charCodeAt(i);\n+      }\n+      return byteArray;\n+    };\n+    const base64StringToByteArray = (base64) => {\n+      return rawStringToByteArray(window.atob(base64));\n+    };\n+    const byteArrayToBase64String = (buffer) => {\n+      var bytes = new Uint8Array(buffer);\n+      var binary = '';\n+      for (var i=0; i<bytes.byteLength; i++) {\n+          binary += String.fromCharCode(bytes[i]);\n+      }\n+      return window.btoa(binary);\n+    };\n+\n+Ensuite, nous devons créer un ``RemoteTransformer`` qui peut chiffrer et déchiffrer nos enregistrements. Et pour cela, nous avons besoin de générer une clé de chiffrement symétrique\n+`AES <https://en.wikipedia.org/wiki/Advanced_Encryption_Standard>`_.\n+\n+`WebCrypto <https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto>`_ est\n+une API assez récent de `la plateforme web <https://platform.html5.org/>`_ \n+vraiment géniale ! Nous allons utiliser cette clé de chiffrement pour\n+chiffrer et déchiffrer les données qui vont passer dans notre\n+``RemoteTransformer``:\n+\n+.. code-block:: JavaScript\n+\n+    // RemoteTransformer:\n+    const generateAesKey = () => {\n+      // See http://www.w3.org/TR/WebCryptoAPI/#examples-symmetric-encryption\n+      return window.crypto.subtle.generateKey({ name: 'AES-CBC', length: 128 },\n+           false, ['encrypt', 'decrypt']);\n+    };\n+\n+    const createTransformer = (aesKey) => {\n+      const encode = (record) => {\n+        const cleartext = rawStringToByteArray(JSON.stringify(record));\n+        const IV = window.crypto.getRandomValues(new Uint8Array(16));\n+\n+        return window.crypto.subtle.encrypt({ name: 'AES-CBC', iv: IV }, aesKey,\n+            cleartext).then(ciphertext => {\n+          return {\n+            id: record.id,\n+            ciphertext: byteArrayToBase64String(new Uint8Array(ciphertext)),\n+            IV: byteArrayToBase64String(IV)\n+          };\n+        });\n+      };\n+\n+      const decode = (record) => {\n+        const ciphertext = base64StringToByteArray(record.ciphertext);\n+        const IV = base64StringToByteArray(record.IV);\n+\n+        return crypto.subtle.decrypt({ name: 'AES-CBC', iv: IV }, aesKey,\n+            ciphertext).then(recordArrayBuffer => {\n+\n+          return JSON.parse(String.fromCharCode.apply(null,\n+              new Uint8Array(recordArrayBuffer)));\n+        }, () => {\n+          record.undecryptable = true;\n+          return record;\n+        });\n+      };\n+\n+      return {\n+        encode,\n+        decode\n+      };\n+    };\n+\n+Nous créons deux instances Kinto, afin de pouvoir faire des tests de\n+synchronization d'une instance à l'autre à l'aide du serveur de démo\n+de Kinto. Créer plusieurs instances Kinto depuis la même origine est\n+possible à l'aide de la toute récente option ``dbPrefix``:\n+\n+.. code-block:: JavaScript\n+\n+    // Kinto collection:\n+    const createCollection = (transformer, testRun, instanceNo) => {\n+      const kinto = new Kinto({\n+        dbPrefix: `${testRun}-${instanceNo}`,\n+        remote: 'https://kinto.dev.mozaws.net/v1/',\n+        headers: {\n+          Authorization: 'Basic ' + btoa('public-demo:s3cr3t')\n+        }\n+      });\n+\n+      return kinto.collection(`kinto-encryption-example-${testRun}`, {\n+        remoteTransformers: [ transformer ]\n+      });\n+    };\n+\n+    var coll1, coll2;\n+    const prepare = () => {\n+      return generateAesKey().then(aesKey => {\n+        return createTransformer(aesKey);\n+      }).then(transformer => {\n+        // Create two fresh empty Kinto instances for testing:\n+        const testRun = new Date().getTime().toString();\n+        coll1 = createCollection(transformer, testRun, 1);\n+        coll2 = createCollection(transformer, testRun, 2);\n+      });\n+    };\n+\n+Maintenant, testons que nous puissions créer un nouvel enregistrement\n+dans la collection 1, synchronisons le (les données envoyées au\n+serveur doivent être chiffrer, ce qu'on peut vérifier avec l'onglet\n+Réseau de la console du navigateur):\n+\n+.. image:: {filename}/images/kinto-encryption-example-network-tab.png\n+   :alt: Onglet Réseau de la console Firefox\n+\n+.. code-block:: JavaScript\n+\n+    const syncUp = () => {\n+      // Use first Kinto instance to demonstrate encryption:\n+      return coll1.create({\n+        URL: 'http://www.w3.org/TR/WebCryptoAPI/',\n+        name: 'Web Cryptography API'\n+      }).then(() => {\n+        return coll1.sync();\n+      }).then(syncResults => {\n+        console.log('Sync up', syncResults);\n+      });\n+    };\n+\n+\n+Puis synchronisons la collection 2 depuis le serveur Kinto. Là encore,\n+les données téléchargées doivent être chiffrée mais les données\n+déchiffrées doivent être stocker dans la base IndexDB et afficher dans","path":"content/2015.09.kinto-encryption-example-fr.rst","position":226,"original_position":225,"commit_id":"5d1d5771991c3ca91ba2134e131b00863b9fae56","original_commit_id":"7881f62d2af378f37b392e23838d9a0214f686cd","user":{"login":"michielbdejong","id":408412,"avatar_url":"https://avatars.githubusercontent.com/u/408412?v=3","gravatar_id":"","url":"https://api.github.com/users/michielbdejong","html_url":"https://github.com/michielbdejong","followers_url":"https://api.github.com/users/michielbdejong/followers","following_url":"https://api.github.com/users/michielbdejong/following{/other_user}","gists_url":"https://api.github.com/users/michielbdejong/gists{/gist_id}","starred_url":"https://api.github.com/users/michielbdejong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michielbdejong/subscriptions","organizations_url":"https://api.github.com/users/michielbdejong/orgs","repos_url":"https://api.github.com/users/michielbdejong/repos","events_url":"https://api.github.com/users/michielbdejong/events{/privacy}","received_events_url":"https://api.github.com/users/michielbdejong/received_events","type":"User","site_admin":false},"body":"(same as above) stocker -> stocké?","created_at":"2015-09-18T13:00:50Z","updated_at":"2015-09-18T13:00:50Z","html_url":"https://github.com/mozilla-services/servicedenuages.fr/pull/66#discussion_r39851641","pull_request_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66","_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/comments/39851641"},"html":{"href":"https://github.com/mozilla-services/servicedenuages.fr/pull/66#discussion_r39851641"},"pull_request":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66","id":45400777,"html_url":"https://github.com/mozilla-services/servicedenuages.fr/pull/66","diff_url":"https://github.com/mozilla-services/servicedenuages.fr/pull/66.diff","patch_url":"https://github.com/mozilla-services/servicedenuages.fr/pull/66.patch","issue_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/66","number":66,"state":"open","locked":false,"title":"Traduction de l'article sur le chiffrement des données avec Kinto.js","user":{"login":"Natim","id":229453,"avatar_url":"https://avatars.githubusercontent.com/u/229453?v=3","gravatar_id":"","url":"https://api.github.com/users/Natim","html_url":"https://github.com/Natim","followers_url":"https://api.github.com/users/Natim/followers","following_url":"https://api.github.com/users/Natim/following{/other_user}","gists_url":"https://api.github.com/users/Natim/gists{/gist_id}","starred_url":"https://api.github.com/users/Natim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Natim/subscriptions","organizations_url":"https://api.github.com/users/Natim/orgs","repos_url":"https://api.github.com/users/Natim/repos","events_url":"https://api.github.com/users/Natim/events{/privacy}","received_events_url":"https://api.github.com/users/Natim/received_events","type":"User","site_admin":false},"body":"r? @ametaireau @michielbdejong @bnjbvr ","created_at":"2015-09-18T12:29:51Z","updated_at":"2015-09-18T13:00:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e52199315d24ff7c813d1086005a7fae20e45ed1","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66/commits","review_comments_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66/comments","review_comment_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/66/comments","statuses_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/statuses/5d1d5771991c3ca91ba2134e131b00863b9fae56","head":{"label":"mozilla-services:encrypter-les-donnees","ref":"encrypter-les-donnees","sha":"5d1d5771991c3ca91ba2134e131b00863b9fae56","user":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"repo":{"id":34000996,"name":"servicedenuages.fr","full_name":"mozilla-services/servicedenuages.fr","owner":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-services/servicedenuages.fr","description":"Da french team blog.","fork":false,"url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr","forks_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/forks","keys_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/teams","hooks_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/hooks","issue_events_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/events","assignees_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/tags","blobs_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/languages","stargazers_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/stargazers","contributors_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/contributors","subscribers_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/subscribers","subscription_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/subscription","commits_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/merges","archive_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/downloads","issues_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/releases{/id}","created_at":"2015-04-15T15:07:57Z","updated_at":"2015-08-27T13:07:27Z","pushed_at":"2015-09-18T13:00:37Z","git_url":"git://github.com/mozilla-services/servicedenuages.fr.git","ssh_url":"git@github.com:mozilla-services/servicedenuages.fr.git","clone_url":"https://github.com/mozilla-services/servicedenuages.fr.git","svn_url":"https://github.com/mozilla-services/servicedenuages.fr","homepage":"http://www.servicedenuages.fr","size":8518,"stargazers_count":3,"watchers_count":3,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":4,"mirror_url":null,"open_issues_count":10,"forks":4,"open_issues":10,"watchers":3,"default_branch":"master"}},"base":{"label":"mozilla-services:master","ref":"master","sha":"c6c4e99020cc2d06ffcd72cf6761c7ba3d33e603","user":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"repo":{"id":34000996,"name":"servicedenuages.fr","full_name":"mozilla-services/servicedenuages.fr","owner":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-services/servicedenuages.fr","description":"Da french team blog.","fork":false,"url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr","forks_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/forks","keys_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/teams","hooks_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/hooks","issue_events_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/events","assignees_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/tags","blobs_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/languages","stargazers_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/stargazers","contributors_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/contributors","subscribers_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/subscribers","subscription_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/subscription","commits_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/merges","archive_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/downloads","issues_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/releases{/id}","created_at":"2015-04-15T15:07:57Z","updated_at":"2015-08-27T13:07:27Z","pushed_at":"2015-09-18T13:00:37Z","git_url":"git://github.com/mozilla-services/servicedenuages.fr.git","ssh_url":"git@github.com:mozilla-services/servicedenuages.fr.git","clone_url":"https://github.com/mozilla-services/servicedenuages.fr.git","svn_url":"https://github.com/mozilla-services/servicedenuages.fr","homepage":"http://www.servicedenuages.fr","size":8518,"stargazers_count":3,"watchers_count":3,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":4,"mirror_url":null,"open_issues_count":10,"forks":4,"open_issues":10,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66"},"html":{"href":"https://github.com/mozilla-services/servicedenuages.fr/pull/66"},"issue":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/66"},"comments":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/issues/66/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/pulls/66/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla-services/servicedenuages.fr/statuses/5d1d5771991c3ca91ba2134e131b00863b9fae56"}}}}