test_pagure_flask_ui_oidc_login.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2020 - Copyright Red Hat Inc
  4. Authors:
  5. Aurelien Bompard <abompard@fedoraproject.org>
  6. """
  7. from __future__ import unicode_literals
  8. __requires__ = ["SQLAlchemy >= 0.8"]
  9. import pkg_resources
  10. import unittest
  11. import json
  12. import sys
  13. import os
  14. import flask
  15. from mock import patch, Mock
  16. sys.path.insert(
  17. 0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
  18. )
  19. import pagure.lib
  20. import tests
  21. from pagure.ui.oidc_login import fas_user_from_oidc, oidc
  22. CLIENT_SECRETS = {
  23. "web": {
  24. "client_id": "dummy",
  25. "client_secret": "dummy",
  26. "auth_uri": "dummy-uri://",
  27. "token_uri": "dummy-uri://",
  28. "userinfo_uri": "dummy-uri://",
  29. "redirect_uris": ["http://localhost:5000/oidc"],
  30. }
  31. }
  32. class PagureFlaskOIDCLogintests(tests.SimplePagureTest):
  33. """Tests for OIDC login in the flask app controller of pagure"""
  34. populate_db = False
  35. def setUp(self):
  36. """Create the application with PAGURE_AUTH being local."""
  37. super(PagureFlaskOIDCLogintests, self).setUp()
  38. self.app = pagure.flask_app.create_app(
  39. {"DB_URL": self.dbpath, "PAGURE_AUTH": "local"}
  40. )
  41. # Remove the log handlers for the tests
  42. self.app.logger.handlers = []
  43. secrets_path = os.path.join(self.path, "client_secrets.json")
  44. self.config_patcher = patch.dict(
  45. "pagure.config.config",
  46. {
  47. "OIDC_PAGURE_EMAIL": "email",
  48. "OIDC_PAGURE_FULLNAME": "name",
  49. "OIDC_PAGURE_USERNAME": "preferred_username",
  50. "OIDC_PAGURE_SSH_KEY": "ssh_key",
  51. "OIDC_PAGURE_GROUPS": "groups",
  52. "OIDC_CLIENT_SECRETS": secrets_path,
  53. },
  54. )
  55. self.config_patcher.start()
  56. with open(secrets_path, "w") as secrets:
  57. secrets.write(json.dumps(CLIENT_SECRETS))
  58. oidc.init_app(self.app)
  59. self.request_context = self.app.test_request_context("/")
  60. self.request_context.push()
  61. flask.session["oidc_logintime"] = "dummy-logintime"
  62. flask.g.session = Mock() # the DB session should be here
  63. flask.g.oidc_id_token = {"sub": "dummy"}
  64. self.user_info = {
  65. "email": "dummy@example.com",
  66. "name": "Dummy User",
  67. "preferred_username": "dummy",
  68. }
  69. def tearDown(self):
  70. self.request_context.pop()
  71. self.config_patcher.stop()
  72. def test_fas_user_from_oidc(self):
  73. """Test the user creation function."""
  74. user_info = self.user_info.copy()
  75. flask.g._oidc_userinfo = user_info
  76. fas_user_from_oidc()
  77. self.assertIsNotNone(getattr(flask.g, "fas_user", None))
  78. self.assertEqual(flask.g.fas_user.username, "dummy")
  79. self.assertEqual(flask.g.fas_user.fullname, "Dummy User")
  80. self.assertIsNone(flask.g.fas_user.ssh_key)
  81. self.assertEqual(flask.g.fas_user.groups, [])
  82. def test_fas_user_from_oidc_groups(self):
  83. """Test the user creation function."""
  84. user_info = self.user_info.copy()
  85. user_info["groups"] = ["group1", "group2"]
  86. flask.g._oidc_userinfo = user_info
  87. fas_user_from_oidc()
  88. self.assertEqual(flask.g.fas_user.groups, ["group1", "group2"])
  89. def test_fas_user_from_oidc_ssh(self):
  90. """Test the user creation function."""
  91. user_info = self.user_info.copy()
  92. user_info["ssh_key"] = "dummy ssh key"
  93. flask.g._oidc_userinfo = user_info
  94. fas_user_from_oidc()
  95. self.assertEqual(flask.g.fas_user.ssh_key, "dummy ssh key")
  96. def test_fas_user_from_oidc_ssh_b64(self):
  97. """The SSH key may be base64-encoded"""
  98. user_info = self.user_info.copy()
  99. user_info["ssh_key"] = "ZHVtbXkgc3NoIGtleQ=="
  100. flask.g._oidc_userinfo = user_info
  101. fas_user_from_oidc()
  102. self.assertEqual(flask.g.fas_user.ssh_key, "dummy ssh key")
  103. if __name__ == "__main__":
  104. unittest.main(verbosity=2)