forked from Scribouilli/toctoctoc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
github.js
95 lines (83 loc) · 3.2 KB
/
github.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import got from 'got'
import { htmlTemplate, allowlist } from './tools.js'
/**
* @param {import('./types.js').GithubOauthServiceConfiguration} githubConfig
* @returns {import('fastify').RouteHandler}
*/
export const makeGithubRouteHandler = ({client_id, client_secret}) => {
if(!client_id){
throw new TypeError('Missing github.client_id in configuration')
}
if(!client_secret){
throw new TypeError('Missing github.client_secret in configuration')
}
return (req, res) => {
//@ts-ignore
const {code, destination} = req.query
if(!code){
res.status(400)
.header('Content-Type', 'text/html')
.send(htmlTemplate`
<h1>Erreur</h1>
<p>le paramètre <code>code</code> est manquant</p>
<p>Peut-être que l'API github ne fonctionne plus pareil. Regarder l'API Rest github</p>
`)
return;
}
if(!destination){
res.status(400)
.header('Content-Type', 'text/html')
.send(htmlTemplate`
<h1>Erreur</h1>
<p>le paramètre <code>destination</code> est manquant.</p>
<p>Il est sûrement manquant en tant que paramètre du <code>redirect_uri</code> du lien "login with github"
`)
return;
}
const redirectUrl = new URL(destination)
const hostname = redirectUrl.hostname
if(!hostname){
res.status(400)
.header('Content-Type', 'text/html')
.send(htmlTemplate(`
<h1>Erreur</h1>
<p>le paramètre <code>destination</code> n'a pas de hostname. (destination : ${destination})</p>
<p>Rajouter une origine au paramètre <code>destination<code>
`))
return;
}
if(hostname !== 'localhost' && !allowlist.has(hostname)){
res.status(403)
.header('Content-Type', 'text/html')
.send(htmlTemplate(`
<h1>Erreur</h1>
<p>La destination est ${destination}, et son hostname (${hostname}) n'est pas présent dans notre <a href="https://github.com/Scribouilli/toctoctoc/blob/main/allowlist.csv">liste de hostname autorisés</a>.</p>
<p>Liste des hostname autorisés :
<ul>
${[...allowlist].map(hostname => `<li>${hostname}</li>`).join('')}
</ul>
</p>
<p>Changer cette liste ou installez une nouvelle instance de toctoctoc où ce hostname est autorisé</p>
`))
return;
}
const urlGithubOAuth =
`https://github.com/login/oauth/access_token?code=${code}&client_id=${client_id}&client_secret=${client_secret}`
got.post(urlGithubOAuth, { json: true }).then(githubResponse => {
const access_token = new URLSearchParams(githubResponse.body).get('access_token')
if(!access_token){
res.status(400)
.header('Content-Type', 'text/html')
.send(htmlTemplate`
<h1>Erreur</h1>
<p>le <code>access_token</code> attendu de la part de Github n'a pas été récupéré</p>
<p>Peut-être que le fonctionnement de l'API github a changé ou que le code ne le trouve pas au bon endroit</p>
`)
return;
}
redirectUrl.searchParams.set(`access_token`, access_token)
redirectUrl.searchParams.set(`type`, 'github')
res.redirect(302, redirectUrl.toString())
})
}
}