You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.5 KiB

11 months ago
  1. const { User } = require("../../../models/user");
  2. const { TemporaryAuthToken } = require("../../../models/temporaryAuthToken");
  3. const { multiUserMode } = require("../../../utils/http");
  4. const {
  5. simpleSSOEnabled,
  6. } = require("../../../utils/middleware/simpleSSOEnabled");
  7. const { validApiKey } = require("../../../utils/middleware/validApiKey");
  8. function apiUserManagementEndpoints(app) {
  9. if (!app) return;
  10. app.get("/v1/users", [validApiKey], async (request, response) => {
  11. /*
  12. #swagger.tags = ['User Management']
  13. #swagger.description = 'List all users'
  14. #swagger.responses[200] = {
  15. content: {
  16. "application/json": {
  17. schema: {
  18. type: 'object',
  19. example: {
  20. users: [
  21. {
  22. "id": 1,
  23. "username": "john_doe",
  24. "role": "admin"
  25. },
  26. {
  27. "id": 2,
  28. "username": "jane_smith",
  29. "role": "default"
  30. }
  31. ]
  32. }
  33. }
  34. }
  35. }
  36. }
  37. #swagger.responses[403] = {
  38. schema: {
  39. "$ref": "#/definitions/InvalidAPIKey"
  40. }
  41. }
  42. #swagger.responses[401] = {
  43. description: "Instance is not in Multi-User mode. Permission denied.",
  44. }
  45. */
  46. try {
  47. if (!multiUserMode(response))
  48. return response
  49. .status(401)
  50. .send("Instance is not in Multi-User mode. Permission denied.");
  51. const users = await User.where();
  52. const filteredUsers = users.map((user) => ({
  53. id: user.id,
  54. username: user.username,
  55. role: user.role,
  56. }));
  57. response.status(200).json({ users: filteredUsers });
  58. } catch (e) {
  59. console.error(e.message, e);
  60. response.sendStatus(500).end();
  61. }
  62. });
  63. app.get(
  64. "/v1/users/:id/issue-auth-token",
  65. [validApiKey, simpleSSOEnabled],
  66. async (request, response) => {
  67. /*
  68. #swagger.tags = ['User Management']
  69. #swagger.description = 'Issue a temporary auth token for a user'
  70. #swagger.parameters['id'] = {
  71. in: 'path',
  72. description: 'The ID of the user to issue a temporary auth token for',
  73. required: true,
  74. type: 'string'
  75. }
  76. #swagger.responses[200] = {
  77. content: {
  78. "application/json": {
  79. schema: {
  80. type: 'object',
  81. example: {
  82. token: "1234567890",
  83. loginPath: "/sso/simple?token=1234567890"
  84. }
  85. }
  86. }
  87. }
  88. }
  89. }
  90. #swagger.responses[403] = {
  91. schema: {
  92. "$ref": "#/definitions/InvalidAPIKey"
  93. }
  94. }
  95. #swagger.responses[401] = {
  96. description: "Instance is not in Multi-User mode. Permission denied.",
  97. }
  98. */
  99. try {
  100. const { id: userId } = request.params;
  101. const user = await User.get({ id: Number(userId) });
  102. if (!user)
  103. return response.status(404).json({ error: "User not found" });
  104. const { token, error } = await TemporaryAuthToken.issue(userId);
  105. if (error) return response.status(500).json({ error: error });
  106. response.status(200).json({
  107. token: String(token),
  108. loginPath: `/sso/simple?token=${token}`,
  109. });
  110. } catch (e) {
  111. console.error(e.message, e);
  112. response.sendStatus(500).end();
  113. }
  114. }
  115. );
  116. }
  117. module.exports = { apiUserManagementEndpoints };