certificates.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. const express = require('express');
  2. const validator = require('../../../lib/validator');
  3. const jwtdecode = require('../../../lib/express/jwt-decode');
  4. const internalCertificate = require('../../../internal/certificate');
  5. const apiValidator = require('../../../lib/validator/api');
  6. let router = express.Router({
  7. caseSensitive: true,
  8. strict: true,
  9. mergeParams: true
  10. });
  11. /**
  12. * /api/nginx/certificates
  13. */
  14. router
  15. .route('/')
  16. .options((req, res) => {
  17. res.sendStatus(204);
  18. })
  19. .all(jwtdecode())
  20. /**
  21. * GET /api/nginx/certificates
  22. *
  23. * Retrieve all certificates
  24. */
  25. .get((req, res, next) => {
  26. validator({
  27. additionalProperties: false,
  28. properties: {
  29. expand: {
  30. $ref: 'definitions#/definitions/expand'
  31. },
  32. query: {
  33. $ref: 'definitions#/definitions/query'
  34. }
  35. }
  36. }, {
  37. expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null),
  38. query: (typeof req.query.query === 'string' ? req.query.query : null)
  39. })
  40. .then((data) => {
  41. return internalCertificate.getAll(res.locals.access, data.expand, data.query);
  42. })
  43. .then((rows) => {
  44. res.status(200)
  45. .send(rows);
  46. })
  47. .catch(next);
  48. })
  49. /**
  50. * POST /api/nginx/certificates
  51. *
  52. * Create a new certificate
  53. */
  54. .post((req, res, next) => {
  55. apiValidator({$ref: 'endpoints/certificates#/links/1/schema'}, req.body)
  56. .then((payload) => {
  57. req.setTimeout(900000); // 15 minutes timeout
  58. return internalCertificate.create(res.locals.access, payload);
  59. })
  60. .then((result) => {
  61. res.status(201)
  62. .send(result);
  63. })
  64. .catch(next);
  65. });
  66. /**
  67. * Test HTTP challenge for domains
  68. *
  69. * /api/nginx/certificates/test-http
  70. */
  71. router
  72. .route('/test-http')
  73. .options((req, res) => {
  74. res.sendStatus(204);
  75. })
  76. .all(jwtdecode())
  77. /**
  78. * GET /api/nginx/certificates/test-http
  79. *
  80. * Test HTTP challenge for domains
  81. */
  82. .get((req, res, next) => {
  83. internalCertificate.testHttpsChallenge(res.locals.access, JSON.parse(req.query.domains))
  84. .then((result) => {
  85. res.status(200)
  86. .send(result);
  87. })
  88. .catch(next);
  89. });
  90. /**
  91. * Specific certificate
  92. *
  93. * /api/nginx/certificates/123
  94. */
  95. router
  96. .route('/:certificate_id')
  97. .options((req, res) => {
  98. res.sendStatus(204);
  99. })
  100. .all(jwtdecode())
  101. /**
  102. * GET /api/nginx/certificates/123
  103. *
  104. * Retrieve a specific certificate
  105. */
  106. .get((req, res, next) => {
  107. validator({
  108. required: ['certificate_id'],
  109. additionalProperties: false,
  110. properties: {
  111. certificate_id: {
  112. $ref: 'definitions#/definitions/id'
  113. },
  114. expand: {
  115. $ref: 'definitions#/definitions/expand'
  116. }
  117. }
  118. }, {
  119. certificate_id: req.params.certificate_id,
  120. expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null)
  121. })
  122. .then((data) => {
  123. return internalCertificate.get(res.locals.access, {
  124. id: parseInt(data.certificate_id, 10),
  125. expand: data.expand
  126. });
  127. })
  128. .then((row) => {
  129. res.status(200)
  130. .send(row);
  131. })
  132. .catch(next);
  133. })
  134. /**
  135. * PUT /api/nginx/certificates/123
  136. *
  137. * Update and existing certificate
  138. */
  139. .put((req, res, next) => {
  140. apiValidator({$ref: 'endpoints/certificates#/links/2/schema'}, req.body)
  141. .then((payload) => {
  142. payload.id = parseInt(req.params.certificate_id, 10);
  143. return internalCertificate.update(res.locals.access, payload);
  144. })
  145. .then((result) => {
  146. res.status(200)
  147. .send(result);
  148. })
  149. .catch(next);
  150. })
  151. /**
  152. * DELETE /api/nginx/certificates/123
  153. *
  154. * Update and existing certificate
  155. */
  156. .delete((req, res, next) => {
  157. internalCertificate.delete(res.locals.access, {id: parseInt(req.params.certificate_id, 10)})
  158. .then((result) => {
  159. res.status(200)
  160. .send(result);
  161. })
  162. .catch(next);
  163. });
  164. /**
  165. * Upload Certs
  166. *
  167. * /api/nginx/certificates/123/upload
  168. */
  169. router
  170. .route('/:certificate_id/upload')
  171. .options((req, res) => {
  172. res.sendStatus(204);
  173. })
  174. .all(jwtdecode())
  175. /**
  176. * POST /api/nginx/certificates/123/upload
  177. *
  178. * Upload certificates
  179. */
  180. .post((req, res, next) => {
  181. if (!req.files) {
  182. res.status(400)
  183. .send({error: 'No files were uploaded'});
  184. } else {
  185. internalCertificate.upload(res.locals.access, {
  186. id: parseInt(req.params.certificate_id, 10),
  187. files: req.files
  188. })
  189. .then((result) => {
  190. res.status(200)
  191. .send(result);
  192. })
  193. .catch(next);
  194. }
  195. });
  196. /**
  197. * Renew LE Certs
  198. *
  199. * /api/nginx/certificates/123/renew
  200. */
  201. router
  202. .route('/:certificate_id/renew')
  203. .options((req, res) => {
  204. res.sendStatus(204);
  205. })
  206. .all(jwtdecode())
  207. /**
  208. * POST /api/nginx/certificates/123/renew
  209. *
  210. * Renew certificate
  211. */
  212. .post((req, res, next) => {
  213. req.setTimeout(900000); // 15 minutes timeout
  214. internalCertificate.renew(res.locals.access, {
  215. id: parseInt(req.params.certificate_id, 10)
  216. })
  217. .then((result) => {
  218. res.status(200)
  219. .send(result);
  220. })
  221. .catch(next);
  222. });
  223. /**
  224. * Download LE Certs
  225. *
  226. * /api/nginx/certificates/123/download
  227. */
  228. router
  229. .route('/:certificate_id/download')
  230. .options((req, res) => {
  231. res.sendStatus(204);
  232. })
  233. .all(jwtdecode())
  234. /**
  235. * GET /api/nginx/certificates/123/download
  236. *
  237. * Renew certificate
  238. */
  239. .get((req, res, next) => {
  240. internalCertificate.download(res.locals.access, {
  241. id: parseInt(req.params.certificate_id, 10)
  242. })
  243. .then((result) => {
  244. res.status(200)
  245. .download(result.fileName);
  246. })
  247. .catch(next);
  248. });
  249. /**
  250. * Validate Certs before saving
  251. *
  252. * /api/nginx/certificates/validate
  253. */
  254. router
  255. .route('/validate')
  256. .options((req, res) => {
  257. res.sendStatus(204);
  258. })
  259. .all(jwtdecode())
  260. /**
  261. * POST /api/nginx/certificates/validate
  262. *
  263. * Validate certificates
  264. */
  265. .post((req, res, next) => {
  266. if (!req.files) {
  267. res.status(400)
  268. .send({error: 'No files were uploaded'});
  269. } else {
  270. internalCertificate.validate({
  271. files: req.files
  272. })
  273. .then((result) => {
  274. res.status(200)
  275. .send(result);
  276. })
  277. .catch(next);
  278. }
  279. });
  280. module.exports = router;