diracx-db 0.0.1a10__py3-none-any.whl → 0.0.1a12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- diracx/db/os/utils.py +1 -2
- diracx/db/sql/auth/db.py +19 -12
- diracx/db/sql/auth/schema.py +2 -4
- {diracx_db-0.0.1a10.dist-info → diracx_db-0.0.1a12.dist-info}/METADATA +1 -1
- {diracx_db-0.0.1a10.dist-info → diracx_db-0.0.1a12.dist-info}/RECORD +8 -8
- {diracx_db-0.0.1a10.dist-info → diracx_db-0.0.1a12.dist-info}/WHEEL +1 -1
- {diracx_db-0.0.1a10.dist-info → diracx_db-0.0.1a12.dist-info}/entry_points.txt +0 -0
- {diracx_db-0.0.1a10.dist-info → diracx_db-0.0.1a12.dist-info}/top_level.txt +0 -0
    
        diracx/db/os/utils.py
    CHANGED
    
    | @@ -34,8 +34,7 @@ class BaseOSDB(metaclass=ABCMeta): | |
| 34 34 | 
             
                index_prefix: str
         | 
| 35 35 |  | 
| 36 36 | 
             
                @abstractmethod
         | 
| 37 | 
            -
                def index_name(self, doc_id: int) -> str:
         | 
| 38 | 
            -
                    ...
         | 
| 37 | 
            +
                def index_name(self, doc_id: int) -> str: ...
         | 
| 39 38 |  | 
| 40 39 | 
             
                def __init__(self, connection_kwargs: dict[str, Any]) -> None:
         | 
| 41 40 | 
             
                    self._client: AsyncOpenSearch | None = None
         | 
    
        diracx/db/sql/auth/db.py
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            from __future__ import annotations
         | 
| 2 2 |  | 
| 3 | 
            +
            import hashlib
         | 
| 3 4 | 
             
            import secrets
         | 
| 4 5 | 
             
            from datetime import datetime
         | 
| 5 6 | 
             
            from uuid import uuid4
         | 
| @@ -63,7 +64,7 @@ class AuthDB(BaseSQLDB): | |
| 63 64 | 
             
                        ),
         | 
| 64 65 | 
             
                    ).with_for_update()
         | 
| 65 66 | 
             
                    stmt = stmt.where(
         | 
| 66 | 
            -
                        DeviceFlows.device_code == device_code,
         | 
| 67 | 
            +
                        DeviceFlows.device_code == hashlib.sha256(device_code.encode()).hexdigest(),
         | 
| 67 68 | 
             
                    )
         | 
| 68 69 | 
             
                    res = dict((await self.conn.execute(stmt)).one()._mapping)
         | 
| 69 70 |  | 
| @@ -74,7 +75,10 @@ class AuthDB(BaseSQLDB): | |
| 74 75 | 
             
                        # Update the status to Done before returning
         | 
| 75 76 | 
             
                        await self.conn.execute(
         | 
| 76 77 | 
             
                            update(DeviceFlows)
         | 
| 77 | 
            -
                            .where( | 
| 78 | 
            +
                            .where(
         | 
| 79 | 
            +
                                DeviceFlows.device_code
         | 
| 80 | 
            +
                                == hashlib.sha256(device_code.encode()).hexdigest()
         | 
| 81 | 
            +
                            )
         | 
| 78 82 | 
             
                            .values(status=FlowStatus.DONE)
         | 
| 79 83 | 
             
                        )
         | 
| 80 84 | 
             
                        return res
         | 
| @@ -110,7 +114,6 @@ class AuthDB(BaseSQLDB): | |
| 110 114 | 
             
                    self,
         | 
| 111 115 | 
             
                    client_id: str,
         | 
| 112 116 | 
             
                    scope: str,
         | 
| 113 | 
            -
                    audience: str,
         | 
| 114 117 | 
             
                ) -> tuple[str, str]:
         | 
| 115 118 | 
             
                    # Because the user_code might be short, there is a risk of conflicts
         | 
| 116 119 | 
             
                    # This is why we retry multiple times
         | 
| @@ -119,14 +122,16 @@ class AuthDB(BaseSQLDB): | |
| 119 122 | 
             
                            secrets.choice(USER_CODE_ALPHABET)
         | 
| 120 123 | 
             
                            for _ in range(DeviceFlows.user_code.type.length)  # type: ignore
         | 
| 121 124 | 
             
                        )
         | 
| 122 | 
            -
                        # user_code = "2QRKPY"
         | 
| 123 125 | 
             
                        device_code = secrets.token_urlsafe()
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                        # Hash the the device_code to avoid leaking information
         | 
| 128 | 
            +
                        hashed_device_code = hashlib.sha256(device_code.encode()).hexdigest()
         | 
| 129 | 
            +
             | 
| 124 130 | 
             
                        stmt = insert(DeviceFlows).values(
         | 
| 125 131 | 
             
                            client_id=client_id,
         | 
| 126 132 | 
             
                            scope=scope,
         | 
| 127 | 
            -
                            audience=audience,
         | 
| 128 133 | 
             
                            user_code=user_code,
         | 
| 129 | 
            -
                            device_code= | 
| 134 | 
            +
                            device_code=hashed_device_code,
         | 
| 130 135 | 
             
                        )
         | 
| 131 136 | 
             
                        try:
         | 
| 132 137 | 
             
                            await self.conn.execute(stmt)
         | 
| @@ -143,7 +148,6 @@ class AuthDB(BaseSQLDB): | |
| 143 148 | 
             
                    self,
         | 
| 144 149 | 
             
                    client_id: str,
         | 
| 145 150 | 
             
                    scope: str,
         | 
| 146 | 
            -
                    audience: str,
         | 
| 147 151 | 
             
                    code_challenge: str,
         | 
| 148 152 | 
             
                    code_challenge_method: str,
         | 
| 149 153 | 
             
                    redirect_uri: str,
         | 
| @@ -154,7 +158,6 @@ class AuthDB(BaseSQLDB): | |
| 154 158 | 
             
                        uuid=uuid,
         | 
| 155 159 | 
             
                        client_id=client_id,
         | 
| 156 160 | 
             
                        scope=scope,
         | 
| 157 | 
            -
                        audience=audience,
         | 
| 158 161 | 
             
                        code_challenge=code_challenge,
         | 
| 159 162 | 
             
                        code_challenge_method=code_challenge_method,
         | 
| 160 163 | 
             
                        redirect_uri=redirect_uri,
         | 
| @@ -172,7 +175,10 @@ class AuthDB(BaseSQLDB): | |
| 172 175 | 
             
                    :raises: AuthorizationError if no such uuid or status not pending
         | 
| 173 176 | 
             
                    """
         | 
| 174 177 |  | 
| 178 | 
            +
                    # Hash the code to avoid leaking information
         | 
| 175 179 | 
             
                    code = secrets.token_urlsafe()
         | 
| 180 | 
            +
                    hashed_code = hashlib.sha256(code.encode()).hexdigest()
         | 
| 181 | 
            +
             | 
| 176 182 | 
             
                    stmt = update(AuthorizationFlows)
         | 
| 177 183 |  | 
| 178 184 | 
             
                    stmt = stmt.where(
         | 
| @@ -181,7 +187,7 @@ class AuthDB(BaseSQLDB): | |
| 181 187 | 
             
                        AuthorizationFlows.creation_time > substract_date(seconds=max_validity),
         | 
| 182 188 | 
             
                    )
         | 
| 183 189 |  | 
| 184 | 
            -
                    stmt = stmt.values(id_token=id_token, code= | 
| 190 | 
            +
                    stmt = stmt.values(id_token=id_token, code=hashed_code, status=FlowStatus.READY)
         | 
| 185 191 | 
             
                    res = await self.conn.execute(stmt)
         | 
| 186 192 |  | 
| 187 193 | 
             
                    if res.rowcount != 1:
         | 
| @@ -190,15 +196,16 @@ class AuthDB(BaseSQLDB): | |
| 190 196 | 
             
                    stmt = select(AuthorizationFlows.code, AuthorizationFlows.redirect_uri)
         | 
| 191 197 | 
             
                    stmt = stmt.where(AuthorizationFlows.uuid == uuid)
         | 
| 192 198 | 
             
                    row = (await self.conn.execute(stmt)).one()
         | 
| 193 | 
            -
                    return  | 
| 199 | 
            +
                    return code, row.redirect_uri
         | 
| 194 200 |  | 
| 195 201 | 
             
                async def get_authorization_flow(self, code: str, max_validity: int):
         | 
| 202 | 
            +
                    hashed_code = hashlib.sha256(code.encode()).hexdigest()
         | 
| 196 203 | 
             
                    # The with_for_update
         | 
| 197 204 | 
             
                    # prevents that the token is retrieved
         | 
| 198 205 | 
             
                    # multiple time concurrently
         | 
| 199 206 | 
             
                    stmt = select(AuthorizationFlows).with_for_update()
         | 
| 200 207 | 
             
                    stmt = stmt.where(
         | 
| 201 | 
            -
                        AuthorizationFlows.code ==  | 
| 208 | 
            +
                        AuthorizationFlows.code == hashed_code,
         | 
| 202 209 | 
             
                        AuthorizationFlows.creation_time > substract_date(seconds=max_validity),
         | 
| 203 210 | 
             
                    )
         | 
| 204 211 |  | 
| @@ -208,7 +215,7 @@ class AuthDB(BaseSQLDB): | |
| 208 215 | 
             
                        # Update the status to Done before returning
         | 
| 209 216 | 
             
                        await self.conn.execute(
         | 
| 210 217 | 
             
                            update(AuthorizationFlows)
         | 
| 211 | 
            -
                            .where(AuthorizationFlows.code ==  | 
| 218 | 
            +
                            .where(AuthorizationFlows.code == hashed_code)
         | 
| 212 219 | 
             
                            .values(status=FlowStatus.DONE)
         | 
| 213 220 | 
             
                        )
         | 
| 214 221 |  | 
    
        diracx/db/sql/auth/schema.py
    CHANGED
    
    | @@ -45,8 +45,7 @@ class DeviceFlows(Base): | |
| 45 45 | 
             
                creation_time = DateNowColumn()
         | 
| 46 46 | 
             
                client_id = Column(String(255))
         | 
| 47 47 | 
             
                scope = Column(String(1024))
         | 
| 48 | 
            -
                 | 
| 49 | 
            -
                device_code = Column(String(128), unique=True)  # hash it ?
         | 
| 48 | 
            +
                device_code = Column(String(128), unique=True)  # Should be a hash
         | 
| 50 49 | 
             
                id_token = NullColumn(JSON())
         | 
| 51 50 |  | 
| 52 51 |  | 
| @@ -57,11 +56,10 @@ class AuthorizationFlows(Base): | |
| 57 56 | 
             
                client_id = Column(String(255))
         | 
| 58 57 | 
             
                creation_time = DateNowColumn()
         | 
| 59 58 | 
             
                scope = Column(String(1024))
         | 
| 60 | 
            -
                audience = Column(String(255))
         | 
| 61 59 | 
             
                code_challenge = Column(String(255))
         | 
| 62 60 | 
             
                code_challenge_method = Column(String(8))
         | 
| 63 61 | 
             
                redirect_uri = Column(String(255))
         | 
| 64 | 
            -
                code = NullColumn(String(255))  #  | 
| 62 | 
            +
                code = NullColumn(String(255))  # Should be a hash
         | 
| 65 63 | 
             
                id_token = NullColumn(JSON())
         | 
| 66 64 |  | 
| 67 65 |  | 
| @@ -4,12 +4,12 @@ diracx/db/exceptions.py,sha256=-LSkEwsvjwU7vXqx-xeLvLKInTRAhjwB7K_AKfQcIH8,41 | |
| 4 4 | 
             
            diracx/db/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 5 5 | 
             
            diracx/db/os/__init__.py,sha256=IZr6z6SefrRvuC8sTC4RmB3_wwOyEt1GzpDuwSMH8O4,112
         | 
| 6 6 | 
             
            diracx/db/os/job_parameters.py,sha256=Knca19uT2G-5FI7MOFlaOAXeHn4ecPVLIH30TiwhaTw,858
         | 
| 7 | 
            -
            diracx/db/os/utils.py,sha256= | 
| 7 | 
            +
            diracx/db/os/utils.py,sha256=mau0_2uRi-I3geefmKQRWFKo4JcIkIUADvnwBiQX700,9129
         | 
| 8 8 | 
             
            diracx/db/sql/__init__.py,sha256=R6tk5lo1EHbt8joGDesesYHcc1swIq9T4AaSixhh7lA,252
         | 
| 9 9 | 
             
            diracx/db/sql/utils.py,sha256=BuXjIuXN-_v8YkCoMoMhw2tHVUqG6lTBx-e4VEYWE8o,7857
         | 
| 10 10 | 
             
            diracx/db/sql/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 11 | 
            -
            diracx/db/sql/auth/db.py,sha256= | 
| 12 | 
            -
            diracx/db/sql/auth/schema.py,sha256= | 
| 11 | 
            +
            diracx/db/sql/auth/db.py,sha256=mKjy5B8orw0yu6nOwxyzbBqyeE-J9iYq6fKjuELmr9g,10273
         | 
| 12 | 
            +
            diracx/db/sql/auth/schema.py,sha256=JCkSa2IRzqMHTpaSc9aB9h33XsFyEM_Ohsenex6xagY,2835
         | 
| 13 13 | 
             
            diracx/db/sql/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 14 14 | 
             
            diracx/db/sql/dummy/db.py,sha256=5PIPv6aKY7CGIwmvnGKowjVr9ZQWpbjFSd2PIX7YOUw,1627
         | 
| 15 15 | 
             
            diracx/db/sql/dummy/schema.py,sha256=uEkGDNVZbmJecytkHY1CO-M1MiKxe5w1_h0joJMPC9E,680
         | 
| @@ -20,8 +20,8 @@ diracx/db/sql/jobs/status_utility.py,sha256=0kAt623nh1O5wgsgktctdCmHEynO1nU0vn-7 | |
| 20 20 | 
             
            diracx/db/sql/sandbox_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 21 21 | 
             
            diracx/db/sql/sandbox_metadata/db.py,sha256=HjlbnsT4cRMuFAcTL_sK3IqCehA7zISzR_d7xIGZoNk,3498
         | 
| 22 22 | 
             
            diracx/db/sql/sandbox_metadata/schema.py,sha256=rngYYkJxBhjETBHGLD1CTipDGe44mRYR0wdaFoAJwp0,1400
         | 
| 23 | 
            -
            diracx_db-0.0. | 
| 24 | 
            -
            diracx_db-0.0. | 
| 25 | 
            -
            diracx_db-0.0. | 
| 26 | 
            -
            diracx_db-0.0. | 
| 27 | 
            -
            diracx_db-0.0. | 
| 23 | 
            +
            diracx_db-0.0.1a12.dist-info/METADATA,sha256=zVDM2BmbmonHESmP5ICvCqVWgp29TKYABvH7oqfWXSo,681
         | 
| 24 | 
            +
            diracx_db-0.0.1a12.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
         | 
| 25 | 
            +
            diracx_db-0.0.1a12.dist-info/entry_points.txt,sha256=xEFGu_zgmPgQPlUeFtdahQfQIboJ1ugFOK8eMio9gtw,271
         | 
| 26 | 
            +
            diracx_db-0.0.1a12.dist-info/top_level.txt,sha256=vJx10tdRlBX3rF2Psgk5jlwVGZNcL3m_7iQWwgPXt-U,7
         | 
| 27 | 
            +
            diracx_db-0.0.1a12.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         |