Skip to content

Commit 3ddfad2

Browse files
committed
fix test
1 parent 7e509d7 commit 3ddfad2

File tree

6 files changed

+87
-31
lines changed

6 files changed

+87
-31
lines changed

web/client/codechecker_client/client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,17 @@ def login_user(protocol, host, port, username, login=False):
7777
If login is False the user will be logged out.
7878
"""
7979
session = UserCredentials()
80-
auth_client = ThriftAuthHelper(protocol, host, port,
81-
'/v' + CLIENT_API + '/Authentication')
8280

8381
if not login:
82+
auth_client = init_auth_client(protocol, host, port)
8483
logout_done = auth_client.destroySession()
8584
if logout_done:
8685
session.save_token(host, port, None, True)
8786
LOG.info("Successfully logged out.")
8887
return
8988

89+
auth_client = setup_auth_client(protocol, host, port)
90+
9091
try:
9192
handshake = auth_client.getAuthParameters()
9293

web/server/codechecker_server/api/authentication.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,8 @@ def newPersonalAccessToken(self, name, description):
751751
token = generate_session_token()
752752
user = self.getLoggedInUser()
753753
access_token = PersonalAccessTokenDB(
754-
user, name, token, description, auth_session.id)
754+
user, name, token, description,
755+
auth_session.groups, auth_session.id)
755756

756757
session.add(access_token)
757758

@@ -780,10 +781,10 @@ def removePersonalAccessToken(self, name):
780781
self.__require_privilaged_access()
781782
with DBSession(self.__config_db) as session:
782783
user = self.getLoggedInUser()
783-
personal_access_token = session.query(PersonalAccessTokenDB) \
784+
personal_access_token_q = session.query(PersonalAccessTokenDB) \
784785
.filter(PersonalAccessTokenDB.user_name == user) \
785-
.filter(PersonalAccessTokenDB.token_name == name) \
786-
.first()
786+
.filter(PersonalAccessTokenDB.token_name == name)
787+
personal_access_token = personal_access_token_q.first()
787788

788789
if not personal_access_token:
789790
raise codechecker_api_shared.ttypes.RequestFailed(
@@ -794,6 +795,7 @@ def removePersonalAccessToken(self, name):
794795
session.query(Session) \
795796
.filter(Session.id == personal_access_token.auth_session_id) \
796797
.delete(synchronize_session=False)
798+
personal_access_token_q.delete()
797799
session.commit()
798800

799801
LOG.info(

web/server/codechecker_server/database/config_db_model.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,16 @@ class PersonalAccessToken(Base):
155155
token = Column(CHAR(32), nullable=False, unique=True)
156156

157157
description = Column(String)
158+
# List of group names separated by semicolons.
159+
groups = Column(String)
158160

159161
last_access = Column(DateTime, nullable=False)
160162
expiration = Column(DateTime)
161163

162164
auth_session_id = Column(
163165
Integer,
164-
ForeignKey('auth_sessions.id', deferrable=False, ondelete='CASCADE'),
165-
nullable=False)
166+
ForeignKey('auth_sessions.id', deferrable=False, ondelete='SET NULL'),
167+
nullable=True)
166168

167169
__table_args__ = (
168170
UniqueConstraint('user_name', 'token_name'),
@@ -174,12 +176,14 @@ def __init__(
174176
token_name,
175177
token,
176178
description,
179+
groups,
177180
auth_session_id
178181
):
179182
self.user_name = user_name
180183
self.token_name = token_name
181184
self.token = token
182185
self.description = description
186+
self.groups = groups
183187
self.auth_session_id = auth_session_id
184188
self.last_access = datetime.now()
185189
self.expiration = self.last_access + timedelta(days=365)

web/server/codechecker_server/migrations/config/versions/7ed50f8b3fb8_new_table_for_personal_access_tokens.py

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import sqlalchemy as sa
1414

1515

16-
1716
# Revision identifiers, used by Alembic.
1817
revision = '7ed50f8b3fb8'
1918
down_revision = '04cd4df82fb5'
@@ -24,19 +23,32 @@
2423
def upgrade():
2524
LOG = getLogger("migration/config")
2625
# ### commands auto generated by Alembic - please adjust! ###
27-
op.create_table('personal_access_tokens',
28-
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
29-
sa.Column('user_name', sa.String(), nullable=True),
30-
sa.Column('token_name', sa.String(), nullable=True),
31-
sa.Column('token', sa.CHAR(length=32), nullable=False),
32-
sa.Column('description', sa.String(), nullable=True),
33-
sa.Column('last_access', sa.DateTime(), nullable=False),
34-
sa.Column('expiration', sa.DateTime(), nullable=True),
35-
sa.Column('auth_session_id', sa.Integer(), nullable=False),
36-
sa.ForeignKeyConstraint(['auth_session_id'], ['auth_sessions.id'], name=op.f('fk_personal_access_tokens_auth_session_id_auth_sessions'), ondelete='CASCADE'),
37-
sa.PrimaryKeyConstraint('id', name=op.f('pk_personal_access_tokens')),
38-
sa.UniqueConstraint('token', name=op.f('uq_personal_access_tokens_token')),
39-
sa.UniqueConstraint('user_name', 'token_name', name=op.f('uq_personal_access_tokens_user_name'))
26+
op.create_table(
27+
'personal_access_tokens',
28+
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
29+
sa.Column('user_name', sa.String(), nullable=True),
30+
sa.Column('token_name', sa.String(), nullable=True),
31+
sa.Column('token', sa.CHAR(length=32), nullable=False),
32+
sa.Column('description', sa.String(), nullable=True),
33+
sa.Column('groups', sa.String(), nullable=True),
34+
sa.Column('last_access', sa.DateTime(), nullable=False),
35+
sa.Column('expiration', sa.DateTime(), nullable=True),
36+
sa.Column('auth_session_id', sa.Integer(), nullable=True),
37+
sa.ForeignKeyConstraint(
38+
['auth_session_id'],
39+
['auth_sessions.id'],
40+
name=op.f(
41+
'fk_personal_access_tokens_auth_session_id_auth_sessions'),
42+
ondelete='SET NULL'),
43+
sa.PrimaryKeyConstraint(
44+
'id',
45+
name=op.f('pk_personal_access_tokens')),
46+
sa.UniqueConstraint(
47+
'token',
48+
name=op.f('uq_personal_access_tokens_token')),
49+
sa.UniqueConstraint(
50+
'user_name',
51+
'token_name', name=op.f('uq_personal_access_tokens_user_name'))
4052
)
4153

4254
one_year_later = datetime.now() + timedelta(days=365)
@@ -50,8 +62,10 @@ def upgrade():
5062

5163
op.execute(
5264
f"""
53-
INSERT INTO personal_access_tokens (user_name, token_name, token, description, last_access, expiration, auth_session_id)
54-
SELECT user_name, {random_string}, token, description, last_access, '{one_year_later}', id
65+
INSERT INTO personal_access_tokens (user_name, token_name, token,
66+
description, last_access, expiration, auth_session_id)
67+
SELECT user_name, {random_string}, token, description, last_access,
68+
'{one_year_later}', id
5569
FROM auth_sessions
5670
WHERE can_expire = false
5771
""")

web/server/codechecker_server/session_manager.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,8 @@ def __handle_validation(self, auth_string):
421421
"""
422422
validation = self.__try_auth_dictionary(auth_string) \
423423
or self.__try_auth_pam(auth_string) \
424-
or self.__try_auth_ldap(auth_string)
424+
or self.__try_auth_ldap(auth_string) \
425+
or self.__try_personal_access_token(auth_string)
425426
if not validation:
426427
return False
427428

@@ -471,6 +472,34 @@ def __try_auth_token(self, auth_string):
471472

472473
return None
473474

475+
def __try_personal_access_token(self, auth_string):
476+
if not self.__database_connection:
477+
return None
478+
479+
user_name, token = auth_string.split(':', 1)
480+
481+
transaction = None
482+
try:
483+
transaction = self.__database_connection()
484+
personal_access_token = transaction.query(PersonalAccessToken) \
485+
.filter(PersonalAccessToken.user_name == user_name) \
486+
.filter(PersonalAccessToken.token == token) \
487+
.limit(1).one_or_none()
488+
except Exception as e:
489+
LOG.error("Couldn't check login in the database:")
490+
LOG.error(str(e))
491+
finally:
492+
if transaction:
493+
transaction.close()
494+
495+
if not personal_access_token:
496+
return False
497+
498+
return {
499+
'username': personal_access_token.user_name,
500+
'groups': personal_access_token.groups
501+
}
502+
474503
def __try_auth_dictionary(self, auth_string):
475504
"""
476505
Try to authenticate the user against the hardcoded credential list.

web/tests/functional/authentication/test_authentication.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,22 @@ def test_privileged_access(self):
9898
self.assertEqual(user, "cc")
9999

100100
# No personal token in the database.
101-
personal_tokens = authd_auth_client.getTokens()
101+
personal_tokens = authd_auth_client.getPersonalAccessTokens()
102102
self.assertEqual(len(personal_tokens), 0)
103103

104104
# Create a new personal token.
105105
description = "description"
106-
personal_token = authd_auth_client.newToken(description)
106+
name = "name"
107+
personal_token = authd_auth_client.newPersonalAccessToken(
108+
name, description)
107109
token = personal_token.token
108110
self.assertEqual(personal_token.description, description)
109111

110112
# Check whether the new token has been added.
111-
personal_tokens = authd_auth_client.getTokens()
113+
personal_tokens = authd_auth_client.getPersonalAccessTokens()
112114
self.assertEqual(len(personal_tokens), 1)
113-
self.assertEqual(personal_tokens[0].token, token)
115+
self.assertEqual(personal_tokens[0].token, "")
116+
self.assertEqual(personal_tokens[0].name, name)
114117
self.assertEqual(personal_tokens[0].description, description)
115118

116119
auth_client = env.setup_auth_client(self._test_workspace,
@@ -143,6 +146,9 @@ def test_privileged_access(self):
143146
self.assertIsNotNone(self.session_token,
144147
"Valid credentials didn't give us a token!")
145148

149+
auth_token_client = \
150+
env.setup_auth_client(self._test_workspace,
151+
session_token=self.session_token)
146152
user = auth_token_client.getLoggedInUser()
147153
self.assertEqual(user, "cc")
148154

@@ -161,11 +167,11 @@ def test_privileged_access(self):
161167
auth_client = env.setup_auth_client(self._test_workspace,
162168
session_token=self.session_token)
163169
# Remove the generated personal token.
164-
ret = auth_client.removeToken(token)
170+
ret = auth_client.removePersonalAccessToken(name)
165171
self.assertTrue(ret)
166172

167173
# Check whether no more personal token in the database.
168-
personal_tokens = auth_client.getTokens()
174+
personal_tokens = auth_client.getPersonalAccessTokens()
169175
self.assertEqual(len(personal_tokens), 0)
170176

171177
result = auth_client.destroySession()

0 commit comments

Comments
 (0)