Skip to content

Commit

Permalink
fix: add on_token_refresh in owner.py
Browse files Browse the repository at this point in the history
* Updates shared to a newer version
* Adds a on_token_refresh callback if the torngit adapter comes from owner.py

context codecov/engineering-team#162
  • Loading branch information
giovanni-guidini committed Aug 30, 2023
1 parent 221ccd5 commit 38b864e
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 33 deletions.
35 changes: 35 additions & 0 deletions helpers/token_refresh.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import logging
from typing import Callable, Dict

from shared.encryption.token import encode_token

from database.models.core import Owner
from services.encryption import encryptor

log = logging.getLogger(__name__)


def get_token_refresh_callback(owner: Owner) -> Callable[[Dict], None]:
"""
Produces a callback function that will encode and update the oauth token of a user.
This callback is passed to the TorngitAdapter for the service.
"""
# Some tokens don't have to be refreshed (GH integration, default bots)
# They don't belong to any owners.
if owner is None:
return None

service = owner.service
if service == "bitbucket" or service == "bitbucket_server":
return None

async def callback(new_token: Dict) -> None:
log.info(
"Saving new token after refresh",
extra=dict(owner=owner.username, ownerid=owner.ownerid),
)
string_to_save = encode_token(new_token)
oauth_token = encryptor.encode(string_to_save).decode()
owner.oauth_token = oauth_token

return callback
2 changes: 1 addition & 1 deletion requirements.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
git+ssh://[email protected]/codecov/shared.git@680951c4849074db131353b251581ee03029a72a#egg=shared
git+ssh://[email protected]/codecov/shared.git@96376263de4d4684d7b7d06c2d612f340eab5611#egg=shared
git+ssh://[email protected]/codecov/[email protected]#egg=codecovopentelem
boto3
celery
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ s3transfer==0.3.4
# via boto3
sentry-sdk==1.19.1
# via -r requirements.in
shared @ git+ssh://[email protected]/codecov/shared.git@680951c4849074db131353b251581ee03029a72a
shared @ git+ssh://[email protected]/codecov/shared.git@96376263de4d4684d7b7d06c2d612f340eab5611
# via -r requirements.in
six==1.15.0
# via
Expand Down
7 changes: 6 additions & 1 deletion services/owner.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import shared.torngit as torngit
from shared.config import get_config, get_verify_ssl

from database.models import Owner
from helpers.token_refresh import get_token_refresh_callback
from services.bots import get_owner_appropriate_bot_token

log = logging.getLogger(__name__)
Expand All @@ -27,6 +27,11 @@ def get_owner_provider_service(owner, using_integration=False):
key=get_config(service, "client_id"),
secret=get_config(service, "client_secret"),
),
# if using integration we will use the integration token
# not the owner's token
on_token_refresh=(
get_token_refresh_callback(owner) if not using_integration else None
),
)
return _get_owner_provider_service_instance(service, **adapter_params)

Expand Down
32 changes: 2 additions & 30 deletions services/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,56 +2,28 @@
import re
from dataclasses import dataclass
from datetime import datetime
from typing import Any, Callable, Dict, Mapping, Optional, Tuple
from typing import Any, Mapping, Optional, Tuple

import shared.torngit as torngit
from shared.config import get_config, get_verify_ssl
from shared.encryption.token import encode_token
from shared.torngit.exceptions import (
TorngitClientError,
TorngitError,
TorngitObjectNotFoundError,
)
from sqlalchemy.dialects.postgresql import insert
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session

from database.models import Commit, Owner, Pull, Repository
from helpers.token_refresh import get_token_refresh_callback
from services.bots import get_repo_appropriate_bot_token, get_token_type_mapping
from services.encryption import encryptor
from services.yaml import read_yaml_field

log = logging.getLogger(__name__)

merged_pull = re.compile(r".*Merged in [^\s]+ \(pull request \#(\d+)\).*").match


def get_token_refresh_callback(owner: Owner) -> Callable[[Dict], None]:
"""
Produces a callback function that will encode and update the oauth token of a user.
This callback is passed to the TorngitAdapter for the service.
"""
# Some tokens don't have to be refreshed (GH integration, default bots)
# They don't belong to any owners.
if owner is None:
return None

service = owner.service
if service == "bitbucket" or service == "bitbucket_server":
return None

async def callback(new_token: Dict) -> None:
log.info(
"Saving new token after refresh",
extra=dict(owner=owner.username, ownerid=owner.ownerid),
)
string_to_save = encode_token(new_token)
oauth_token = encryptor.encode(string_to_save).decode()
owner.oauth_token = oauth_token

return callback


def get_repo_provider_service(
repository, commit=None
) -> torngit.base.TorngitBaseAdapter:
Expand Down

0 comments on commit 38b864e

Please sign in to comment.