Skip to content
This repository was archived by the owner on Feb 18, 2023. It is now read-only.

Commit ce52796

Browse files
authored
Merge pull request #217 from theunkn0wn1/fix/SPARK-243
[SPARK-243] Fix vhost processing for all users
2 parents c9a6939 + 64e1cbc commit ce52796

3 files changed

Lines changed: 48 additions & 20 deletions

File tree

src/packages/user/user.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
"""
1313
from __future__ import annotations # enable forward-references
1414

15-
from dataclasses import dataclass
15+
import attr
16+
import cattr
1617
from typing import Union, Optional
1718

1819
from pydle import BasicClient
1920

2021

21-
@dataclass(frozen=True)
22+
@attr.define(frozen=True)
2223
class User:
2324
"""
2425
Represents an IRC user
@@ -50,7 +51,15 @@ async def from_pydle(cls, bot: BasicClient, nickname: str) -> Optional[User]:
5051

5152
# if we got a object back
5253
if data:
53-
return cls(**data)
54+
result = cls(**data)
55+
56+
# This needs to be an evolve as the cls is frozen.
57+
# That and wanting to avoid a converter on the class itself.
58+
59+
# Inspection false-positive. suppress.
60+
# noinspection PyDataclass
61+
result = attr.evolve(inst=result, hostname=cls.process_vhost(result.hostname))
62+
return result
5463

5564
@classmethod
5665
def process_vhost(cls, vhost: Union[str, None]) -> Optional[str]:
@@ -77,5 +86,10 @@ def process_vhost(cls, vhost: Union[str, None]) -> Optional[str]:
7786
# identify the role
7887
host = vhost.rsplit(".", 3)[-3]
7988

89+
# special case: privileged user naming scheme
90+
if '@' in host:
91+
# Split off the user from the host and return the group
92+
host = host.split('@', maxsplit=1)[-1]
93+
8094
# return the corresponding vhost
8195
return f"{host}.fuelrats.com"

tests/fixtures/mock_bot.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def __init__(self, *args, **kwargs):
3333
"some_recruit": {
3434
"nickname": "some_recruit",
3535
"username": "ident_ed_your_car_sorry_bad_pun",
36-
"hostname": "recruit.fuelrats.com",
36+
"hostname": "some-recruit@some-recruit.recruit.fuelrats.com",
3737
"away": False,
3838
"away_message": None,
3939
"account": None,
@@ -44,18 +44,28 @@ def __init__(self, *args, **kwargs):
4444
"some_ov": {
4545
"nickname": "some_ov",
4646
"username": "ill_stop",
47-
"hostname": "overseer.fuelrats.com",
47+
"hostname": "some_ov@some-ov.overseer.fuelrats.com",
4848
"away": False,
4949
"away_message": None,
5050
"account": None,
5151
"identified": True,
5252
"realname": "Stop sign",
5353

5454
},
55+
"some_rat": {
56+
"nickname": "some_rat",
57+
"username": "ratlingDelux",
58+
"hostname": "delux@delux.rat.fuelrats.com",
59+
"away": False,
60+
"away_message": None,
61+
"account": None,
62+
"identified": True,
63+
"realname": "snakeeyes",
64+
},
5565
"some_admin": {
5666
"nickname": "some_admin",
5767
"username": "SirRaymondLuxuryYacht",
58-
"hostname": "admin.fuelrats.com",
68+
"hostname": "reality@netadmin.fuelrats.com",
5969
"away": False,
6070
"away_message": None,
6171
"account": None,

tests/unit/test_user.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,28 @@
1010
"""
1111
import pytest
1212

13+
from src.packages.permissions import has_required_permission, ADMIN
1314
from src.packages.user.user import User
1415

1516
pytestmark = [pytest.mark.unit, pytest.mark.user]
1617

1718

18-
@pytest.mark.parametrize("expected_host", [
19-
"recruit.fuelrats.com",
20-
"rat.fuelrats.com",
21-
"dispatch.fuelrats.com",
22-
"overseer.fuelrats.com",
23-
"op.fuelrats.com",
24-
"techrat.fuelrats.com",
25-
"netadmin.fuelrats.com",
26-
"admin.fuelrats.com",
19+
@pytest.mark.parametrize("expected_host, payload", [
20+
("recruit.fuelrats.com", "someone@someone.recruit.fuelrats.com"),
21+
("rat.fuelrats.com", "someone@someone.rat.fuelrats.com"),
22+
("dispatch.fuelrats.com", "someone@someone.dispatch.fuelrats.com"),
23+
("overseer.fuelrats.com", "someone@someone.overseer.fuelrats.com"),
24+
("op.fuelrats.com", "someone@someone.op.fuelrats.com"),
25+
("techrat.fuelrats.com", "someone@someone.techrat.fuelrats.com"),
26+
("netadmin.fuelrats.com", "someone@someone.netadmin.fuelrats.com"),
27+
("admin.fuelrats.com", "someone@someone.admin.fuelrats.com"),
28+
("netadmin.fuelrats.com", "reality@netadmin.fuelrats.com")
2729
])
28-
@pytest.mark.parametrize("prefix", ["potato.", "Orbital.", ""])
29-
def test_process_vhost(prefix: str, expected_host: str):
30+
def test_process_vhost(payload: str, expected_host: str):
3031
"""
3132
Asserts vhost processing functions as expected
3233
"""
33-
mixed_host = f"{prefix}{expected_host}"
34-
assert User.process_vhost(mixed_host) == expected_host
34+
assert User.process_vhost(payload) == expected_host
3535

3636

3737
def test_process_vhost_orange():
@@ -110,7 +110,7 @@ async def test_user_from_whois_existing_user(bot_fx):
110110
assert data['identified'] == my_user.identified
111111
assert data['account'] == my_user.account
112112
assert "some_recruit" == my_user.nickname
113-
assert data['hostname'] == my_user.hostname
113+
assert data['hostname'].endswith(my_user.hostname)
114114
assert data['username'] == my_user.username
115115
assert data['realname'] == my_user.realname
116116

@@ -162,6 +162,10 @@ async def test_user_eq(data: dict, monkeypatch, bot_fx):
162162
assert user_alpha == user_beta
163163

164164

165+
async def test_effective_permission(bot_fx):
166+
user = await User.from_pydle(bot_fx, "some_admin")
167+
has_required_permission(user, ADMIN)
168+
165169
@pytest.mark.regressions
166170
def test_hash(user_fx):
167171
assert hash(user_fx)

0 commit comments

Comments
 (0)