From 052891d7932b21d4a468348ce2b347132835c175 Mon Sep 17 00:00:00 2001 From: Lukasz Gryglicki Date: Thu, 5 Mar 2026 09:57:22 +0100 Subject: [PATCH 1/3] Address vulns, add DDog env/stage filtering, collapse more API URLs into single templates, add branch sync script Signed-off-by: Lukasz Gryglicki Assisted by [OpenAI](https://platform.openai.com/) Assisted by [GitHub Copilot](https://github.com/features/copilot) --- cla-backend-go/events/repository.go | 5 +- cla-backend-go/swagger/.python-version | 1 + cla-backend-go/telemetry/datadog_otlp.go | 1 + cla-backend/cla/auth.py | 19 +- .../cla/controllers/github_application.py | 13 +- cla-backend/cla/models/github_models.py | 75 ++-- cla-backend/cla/routes.py | 1 + cla-backend/cla/tests/unit/test_jwt_auth.py | 184 ++++++++ cla-backend/cla/user.py | 20 +- cla-backend/cla/user_service.py | 2 +- cla-backend/cla/utils.py | 18 +- cla-backend/package.json | 14 +- cla-backend/requirements.txt | 21 +- cla-backend/serverless.yml | 7 + cla-backend/yarn.lock | 69 +-- .../cypress/e2e/v3/organization.cy.ts | 4 +- tests/functional/cypress/e2e/v3/project.cy.ts | 8 +- tests/functional/cypress/e2e/v4/company.cy.ts | 14 +- tests/functional/cypress/e2e/v4/events.cy.ts | 14 +- .../cypress/e2e/v4/foundation.cy.ts | 14 +- .../cypress/e2e/v4/github-organizations.cy.ts | 14 +- .../cypress/e2e/v4/github-repositories.cy.ts | 14 +- .../cypress/e2e/v4/gitlab-organizations.cy.ts | 16 +- .../cypress/e2e/v4/gitlab-repositories.cy.ts | 16 +- tests/functional/cypress/e2e/v4/health.cy.ts | 14 +- tests/functional/cypress/e2e/v4/metrics.cy.ts | 14 +- .../functional/cypress/e2e/v4/projects.cy.ts | 14 +- .../cypress/e2e/v4/signatures.cy.ts | 4 +- tests/functional/cypress/e2e/v4/version.cy.ts | 14 +- tests/functional/package-lock.json | 410 ++++++++---------- tests/functional/package.json | 23 +- tests/functional/yarn.lock | 313 ++++++------- tests/rest/package.json | 11 +- tests/rest/requirements.freeze.txt | 10 +- tests/rest/yarn.lock | 183 ++++++-- utils/git_sync_to_branch.sh | 20 + utils/otel_dd/api_usage_stats_ddog.py | 14 +- utils/otel_dd/check_spans_in_ddog.sh | 73 +++- 38 files changed, 1009 insertions(+), 672 deletions(-) create mode 100644 cla-backend-go/swagger/.python-version create mode 100644 cla-backend/cla/tests/unit/test_jwt_auth.py create mode 100755 utils/git_sync_to_branch.sh diff --git a/cla-backend-go/events/repository.go b/cla-backend-go/events/repository.go index 071500124..23cff6e5a 100644 --- a/cla-backend-go/events/repository.go +++ b/cla-backend-go/events/repository.go @@ -477,7 +477,10 @@ func (repo *repository) SearchEvents(params *eventOps.SearchEventsParams, pageSi case params.ProjectSFID != nil: // search by projectSFID indexName = EventProjectSFIDEventTypeIndex - condition = expression.Key("event_project_sfid").Equal(expression.Value(params.ProjectSFID)).And(expression.Key("event_type").Equal(expression.Value(params.EventType))) + condition = expression.Key("event_project_sfid").Equal(expression.Value(params.ProjectSFID)) + if params.EventType != nil { + condition = condition.And(expression.Key("event_type").Equal(expression.Value(params.EventType))) + } pk = "event_project_sfid" sk = "event_type" } diff --git a/cla-backend-go/swagger/.python-version b/cla-backend-go/swagger/.python-version new file mode 100644 index 000000000..2c0733315 --- /dev/null +++ b/cla-backend-go/swagger/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/cla-backend-go/telemetry/datadog_otlp.go b/cla-backend-go/telemetry/datadog_otlp.go index a1b37127a..8b176fd06 100644 --- a/cla-backend-go/telemetry/datadog_otlp.go +++ b/cla-backend-go/telemetry/datadog_otlp.go @@ -191,6 +191,7 @@ func WrapHTTPHandler(next http.Handler) http.Handler { p = reUUIDLike.ReplaceAllString(p, "/{invalid-uuid}$1") p = reUUIDHexDash36.ReplaceAllString(p, "/{invalid-uuid}$1") p = reNumericID.ReplaceAllString(p, "/{id}$1") + p = reNumericID.ReplaceAllString(p, "/{id}$1") // Salesforce IDs: valid vs invalid p = reSFIDValid.ReplaceAllString(p, "/{sfid}$1") p = reSFIDLike.ReplaceAllString(p, "/{invalid-sfid}$1") diff --git a/cla-backend/cla/auth.py b/cla-backend/cla/auth.py index fb43a5a79..956453211 100644 --- a/cla-backend/cla/auth.py +++ b/cla-backend/cla/auth.py @@ -7,7 +7,11 @@ import os import requests -from jose import jwt +import json + +import jwt +from jwt.algorithms import RSAAlgorithm +from jwt.exceptions import ExpiredSignatureError, InvalidTokenError, PyJWTError import cla @@ -81,7 +85,7 @@ def authenticate_user(headers): try: unverified_header = jwt.get_unverified_header(token) - except jwt.JWTError as e: + except PyJWTError as e: cla.log.error(e) raise AuthError('unable to decode claims') @@ -99,19 +103,20 @@ def authenticate_user(headers): # print("JWKS kids:", [key["kid"] for key in jwks["keys"]]) if rsa_key: try: + public_key = RSAAlgorithm.from_jwk(json.dumps(rsa_key)) + jwt_algorithms = algorithms if isinstance(algorithms, (list, tuple, set)) else [algorithms] payload = jwt.decode( token, - rsa_key, - algorithms=algorithms, + public_key, + algorithms=list(jwt_algorithms), options={ - 'verify_at_hash': False, 'verify_aud': False } ) - except jwt.ExpiredSignatureError as e: + except ExpiredSignatureError as e: cla.log.error(e) raise AuthError('token is expired') - except jwt.JWTClaimsError as e: + except InvalidTokenError as e: cla.log.error(e) raise AuthError('incorrect claims') except Exception as e: diff --git a/cla-backend/cla/controllers/github_application.py b/cla-backend/cla/controllers/github_application.py index 4f3b9ec28..8892d65d4 100644 --- a/cla-backend/cla/controllers/github_application.py +++ b/cla-backend/cla/controllers/github_application.py @@ -6,7 +6,7 @@ import requests from github import BadCredentialsException, UnknownObjectException, GithubException, GithubIntegration, Github -from jose import jwt +import jwt from requests.exceptions import RequestException import cla @@ -30,9 +30,7 @@ def repos(self): def __init__(self, installation_id): self.installation_id = installation_id - cla.log.debug('Initializing github application - installation_id: {}, app id: {}, private key' - ' (minus header): {}...'. - format(self.installation_id, self.app_id, self.private_key[32:38])) + cla.log.debug('Initializing github application - installation_id: {}, app id: {}'.format(self.installation_id, self.app_id)) try: integration = GithubCLAIntegration(self.app_id, self.private_key) @@ -77,15 +75,8 @@ def create_check_run(self, repository_name, data): class GithubCLAIntegration(GithubIntegration): - """ - Custom GithubIntegration using python-jose instead of pyjwt for token creation. - """ def create_jwt(self): - """ - Overloaded to use python-jose instead of pyjwt. - Couldn't get it working with pyjwt. - """ now = int(time.time()) payload = { "iat": now, diff --git a/cla-backend/cla/models/github_models.py b/cla-backend/cla/models/github_models.py index d24e9ee87..a448a19ed 100644 --- a/cla-backend/cla/models/github_models.py +++ b/cla-backend/cla/models/github_models.py @@ -14,6 +14,7 @@ import time import uuid from typing import List, Optional, Union, Tuple, Iterable +from collections.abc import MutableMapping import cla import falcon @@ -207,7 +208,7 @@ def user_from_session(self, request, get_redirect_url): fn = "github_models.user_from_session" cla.log.debug(f"{fn} - loading session from request: {request}...") session = self._get_request_session(request) - cla.log.debug(f"{fn} - session: {session}") + cla.log.debug(f"{fn} - session loaded (keys={list(session.keys())})") # We can already have token in the session if "github_oauth2_token" in session: @@ -222,7 +223,7 @@ def user_from_session(self, request, get_redirect_url): authorization_url, csrf_token = self.get_authorization_url_and_state(None, None, None, ["user:email"], state='user-from-session') cla.log.debug(f"{fn} - obtained GitHub OAuth2 state from authorization - storing CSRF token in the session...") session["github_oauth2_state"] = csrf_token - cla.log.debug(f"{fn} - GitHub OAuth2 request with CSRF token {csrf_token} - sending user to {authorization_url}") + cla.log.debug(f"{fn} - redirecting user to GitHub OAuth2 authorization URL") # We must redirect to GitHub OAuth app for authentication, it will return you to /v2/github/installation which will handle returning user data if get_redirect_url: cla.log.debug(f"{fn} - sending redirect_url via 202 HTTP status JSON payload") @@ -246,7 +247,7 @@ def sign_request(self, installation_id, github_repository_id, change_request_id, # Not sure if we need a different token for each installation ID... cla.log.debug(f"{fn} - Loading session from request: {request}...") session = self._get_request_session(request) - cla.log.debug(f"{fn} - Adding github details to session: {session} which is type: {type(session)}...") + cla.log.debug(f"{fn} - Adding github details to session: {list(session.keys())} which is type: {type(session)}...") session["github_installation_id"] = installation_id session["github_repository_id"] = github_repository_id session["github_change_request_id"] = change_request_id @@ -267,7 +268,7 @@ def sign_request(self, installation_id, github_repository_id, change_request_id, ) cla.log.debug(f"{fn} - Obtained GitHub OAuth2 state from authorization - storing state in the session...") session["github_oauth2_state"] = state - cla.log.debug(f"{fn} - GitHub OAuth2 request with state {state} - sending user to {authorization_url}") + cla.log.debug(f"{fn} - redirecting user to GitHub OAuth2 authorization URL") raise falcon.HTTPFound(authorization_url) def _get_request_session(self, request) -> dict: # pylint: disable=no-self-use @@ -277,17 +278,31 @@ def _get_request_session(self, request) -> dict: # pylint: disable=no-self-use fn = "cla.models.github_models._get_request_session" session = request.context.get("session") if session is None: - cla.log.warning(f"Session is empty for request: {request}") - cla.log.debug(f"{fn} - loaded session: {session}") + cla.log.warning(f"{fn} - Session is empty for request: {request}") + session = {} + request.context["session"] = session # Ensure session is a dict - getting issue where session is a string if isinstance(session, str): # convert string to a dict - cla.log.debug(f"{fn} - session is type: {type(session)} - converting to dict...") - session = json.loads(session) - # Reset the session now that we have converted it to a dict + cla.log.warning(f"{fn} - session context is a string; attempting to parse JSON") + try: + session = json.loads(session) + except (ValueError, json.JSONDecodeError) as e: + cla.log.warning(f"{fn} - unable to parse session string as JSON: {e}") + session = {} + + request.context["session"] = session + + if not isinstance(session, MutableMapping): + try: + session = dict(session) + except Exception: + cla.log.warning(f"{fn} - session context has unsupported type {type(session)}; resetting to empty dict") + session = {} request.context["session"] = session - cla.log.debug(f"{fn} - session: {session} which is now type: {type(session)}...") + + cla.log.debug(f"{fn} - loaded session (keys={list(session.keys())})") return session @@ -342,7 +357,6 @@ def oauth2_redirect(self, state, code, request): # pylint: disable=too-many-arg fn = "github_models.oauth2_redirect" cla.log.debug(f"{fn} - handling GitHub OAuth2 redirect with request: {dir(request)}") session = self._get_request_session(request) # request.context['session'] - cla.log.debug(f"{fn} - state: {state}, code: {code}, session: {session}") if "github_oauth2_state" in session: session_state = session["github_oauth2_state"] @@ -353,29 +367,35 @@ def oauth2_redirect(self, state, code, request): # pylint: disable=too-many-arg if state != session_state: # Eventually handle user-from-session API callback try: - state_data = json.loads(base64.urlsafe_b64decode(state.encode()).decode()) + padded_state = state + "=" * (-len(state) % 4) + state_data = json.loads(base64.urlsafe_b64decode(padded_state.encode()).decode()) except (ValueError, json.JSONDecodeError, binascii.Error) as err: - cla.log.warning(f"{fn} - failed to decode state: {state}, error: {err}") - raise falcon.HTTPBadRequest("Invalid OAuth2 state", state) - state_token = state_data["csrf"] - value = state_data["state"] + cla.log.warning(f"{fn} - failed to decode state, error: {err}") + raise falcon.HTTPBadRequest("Invalid OAuth2 state", "Invalid OAuth2 state") + + state_token = state_data.get("csrf") + value = state_data.get("state") + if not state_token or not value: + cla.log.warning(f"{fn} - invalid OAuth2 state payload while handling callback") + raise falcon.HTTPBadRequest("Invalid OAuth2 state", "Invalid OAuth2 state") + if value != "user-from-session": - cla.log.warning(f"{fn} - invalid GitHub OAuth2 state {session_state} expecting {state}, value: {value}") - raise falcon.HTTPBadRequest("Invalid OAuth2 state", state) + cla.log.warning(f"{fn} - invalid GitHub OAuth2 state while handling callback") + raise falcon.HTTPBadRequest("Invalid OAuth2 state", "Invalid OAuth2 state") if state_token != session_state: - cla.log.warning(f"{fn} - invalid GitHub OAuth2 state {session_state} expecting {state_token} while handling user-from-session callback") - raise falcon.HTTPBadRequest(f"Invalid OAuth2 state") + cla.log.warning(f"{fn} - invalid GitHub OAuth2 state while handling callback") + raise falcon.HTTPBadRequest(f"Invalid OAuth2 state", "Invalid OAuth2 state") cla.log.debug(f"handling user-from-session callback") token_url = cla.conf["GITHUB_OAUTH_TOKEN_URL"] client_id = os.environ["GH_OAUTH_CLIENT_ID"] - cla.log.debug(f"{fn} - using client ID {client_id}") + cla.log.debug(f"{fn} - using client ID {client_id[0:5]}...") client_secret = os.environ["GH_OAUTH_SECRET"] try: token = self._fetch_token(client_id, state, token_url, client_secret, code) except Exception as err: cla.log.warning(f"{fn} - GitHub OAuth2 error: {err}. Likely bad or expired code, returning HTTP 404 state.") raise falcon.HTTPBadRequest("OAuth2 code is invalid or expired") - cla.log.debug(f"{fn} - oauth2 token received for state {state}: {token} - storing token in session") + cla.log.debug(f"{fn} - oauth2 token received - storing token in session") session["github_oauth2_token"] = token user = self.get_or_create_user(request) if user is None: @@ -385,7 +405,7 @@ def oauth2_redirect(self, state, code, request): # pylint: disable=too-many-arg return user.to_dict() # Get session information for this request. - cla.log.debug(f"{fn} - attempting to fetch OAuth2 token for state {state}") + cla.log.debug(f"{fn} - attempting to fetch OAuth2 token") installation_id = session.get("github_installation_id", None) github_repository_id = session.get("github_repository_id", None) change_request_id = session.get("github_change_request_id", None) @@ -394,12 +414,9 @@ def oauth2_redirect(self, state, code, request): # pylint: disable=too-many-arg token_url = cla.conf["GITHUB_OAUTH_TOKEN_URL"] client_id = os.environ["GH_OAUTH_CLIENT_ID"] client_secret = os.environ["GH_OAUTH_SECRET"] - cla.log.debug( - f"{fn} - fetching token using {client_id[0:5]}... with state={state}, token_url={token_url}, " - f"client_secret={client_secret[0:5]}, with code={code}" - ) + cla.log.debug(f"{fn} - fetching oauth2 token with client ID: {client_id[0:5]}..., token_url: {token_url}") token = self._fetch_token(client_id, state, token_url, client_secret, code) - cla.log.debug(f"{fn} - oauth2 token received for state {state}: {token} - storing token in session") + cla.log.debug(f"{fn} - oauth2 token received - storing token in session") session["github_oauth2_token"] = token cla.log.debug(f"{fn} - redirecting the user back to the console: {origin_url}") return self.redirect_to_console(installation_id, github_repository_id, change_request_id, origin_url, request) @@ -1498,7 +1515,7 @@ def get_user_data(self, session, client_id): # pylint: disable=no-self-use fn = "cla.models.github_models.get_user_data" token = session.get("github_oauth2_token") if token is None: - cla.log.error(f"{fn} - unable to load github_oauth2_token from session, session is: {session}") + cla.log.error(f"{fn} - unable to load github_oauth2_token from session (keys={list(session.keys())})") return {"error": "could not get user data from session"} oauth2 = OAuth2Session(client_id, token=token) diff --git a/cla-backend/cla/routes.py b/cla-backend/cla/routes.py index f3fb2bcd9..8e7908c85 100755 --- a/cla-backend/cla/routes.py +++ b/cla-backend/cla/routes.py @@ -108,6 +108,7 @@ def _sanitize_api_path(path: str) -> str: p = _RE_UUID_LIKE.sub(r"/{invalid-uuid}\1", p) p = _RE_UUID_HEXDASH_36.sub(r"/{invalid-uuid}\1", p) p = _RE_NUMERIC_ID.sub(r"/{id}\1", p) + p = _RE_NUMERIC_ID.sub(r"/{id}\1", p) p = _RE_SFID_VALID.sub(r"/{sfid}\1", p) p = _RE_SFID_LIKE.sub(r"/{invalid-sfid}\1", p) p = _RE_LFXID_VALID.sub(r"/{lfxid}\1", p) diff --git a/cla-backend/cla/tests/unit/test_jwt_auth.py b/cla-backend/cla/tests/unit/test_jwt_auth.py new file mode 100644 index 000000000..4d04fe26d --- /dev/null +++ b/cla-backend/cla/tests/unit/test_jwt_auth.py @@ -0,0 +1,184 @@ +"""Unit tests validating the PyJWT migration does not break JWT/auth processing. + +These tests are intentionally offline: +- The Auth0 JWKS fetch in `cla.auth` is mocked. +- RSA keys are generated on the fly. + +Run: + cd cla-backend + python -m unittest cla.tests.unit.test_jwt_auth +""" + +import base64 +import importlib +import os +import time +import unittest +from types import SimpleNamespace +from unittest.mock import patch + +import jwt +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import rsa + + +def _b64url_uint(val: int) -> str: + """Base64url encode an integer without padding (RFC7517-compatible).""" + raw = val.to_bytes((val.bit_length() + 7) // 8, "big") + return base64.urlsafe_b64encode(raw).decode("ascii").rstrip("=") + + +def _generate_rsa_jwks(kid: str = "test-kid"): + key = rsa.generate_private_key(public_exponent=65537, key_size=2048) + public_numbers = key.public_key().public_numbers() + + jwk = { + "kty": "RSA", + "kid": kid, + "use": "sig", + "n": _b64url_uint(public_numbers.n), + "e": _b64url_uint(public_numbers.e), + } + jwks = {"keys": [jwk]} + + private_pem = key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.PKCS8, + encryption_algorithm=serialization.NoEncryption(), + ) + public_pem = key.public_key().public_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PublicFormat.SubjectPublicKeyInfo, + ) + return private_pem, public_pem, jwks + + +class _MockResponse: # pylint: disable=too-few-public-methods + def __init__(self, jwks, status_code: int = 200): + self._jwks = jwks + self.status_code = status_code + + def json(self): + return self._jwks + + def raise_for_status(self): # pragma: no cover + return None + + +class TestPyJwtMigration(unittest.TestCase): + def setUp(self): + # Preserve environment; cla.auth reads env vars at import time. + self._orig_env = os.environ.copy() + + os.environ["AUTH0_DOMAIN"] = "example.invalid" + os.environ["AUTH0_USERNAME_CLAIM"] = "nickname" + os.environ["AUTH0_EMAIL_CLAIM"] = "email" + os.environ["AUTH0_ALGORITHM"] = "RS256" + + import cla.auth # pylint: disable=import-outside-toplevel + + # Reload to pick up env vars configured above. + self.auth = importlib.reload(cla.auth) + + def tearDown(self): + os.environ.clear() + os.environ.update(self._orig_env) + + def test_authenticate_user_valid_rs256(self): + private_pem, _public_pem, jwks = _generate_rsa_jwks() + now = int(time.time()) + + token = jwt.encode( + { + "sub": "user|123", + "nickname": "nick", + "email": "a@example.com", + "iat": now, + "exp": now + 3600, + }, + private_pem, + algorithm="RS256", + headers={"kid": "test-kid"}, + ) + + with patch.object(self.auth.requests, "get", return_value=_MockResponse(jwks)): + user = self.auth.authenticate_user({"Authorization": f"Bearer {token}"}) + + self.assertEqual(user.sub, "user|123") + self.assertEqual(user.username, "nick") + self.assertEqual(user.email, "a@example.com") + + def test_authenticate_user_expired_token(self): + private_pem, _public_pem, jwks = _generate_rsa_jwks() + now = int(time.time()) + + token = jwt.encode( + { + "sub": "user|123", + "nickname": "nick", + "email": "a@example.com", + "iat": now - 60, + "exp": now - 1, + }, + private_pem, + algorithm="RS256", + headers={"kid": "test-kid"}, + ) + + with patch.object(self.auth.requests, "get", return_value=_MockResponse(jwks)): + with self.assertRaises(self.auth.AuthError) as ctx: + self.auth.authenticate_user({"Authorization": f"Bearer {token}"}) + + self.assertEqual(ctx.exception.response, "token is expired") + + def test_authenticate_user_invalid_signature(self): + # JWKS uses key A, token signed with key B but same kid. + _priv_a, _pub_a, jwks = _generate_rsa_jwks(kid="test-kid") + priv_b, _pub_b, _jwks_b = _generate_rsa_jwks(kid="test-kid") + now = int(time.time()) + + token = jwt.encode( + { + "sub": "user|123", + "nickname": "nick", + "email": "a@example.com", + "iat": now, + "exp": now + 3600, + }, + priv_b, + algorithm="RS256", + headers={"kid": "test-kid"}, + ) + + with patch.object(self.auth.requests, "get", return_value=_MockResponse(jwks)): + with self.assertRaises(self.auth.AuthError): + self.auth.authenticate_user({"Authorization": f"Bearer {token}"}) + + def test_cla_user_unverified_claims(self): + # cla.user depends on hug; skip if not installed in the test env. + try: + import hug # noqa: F401 pylint: disable=unused-import,import-outside-toplevel + except ModuleNotFoundError: + self.skipTest("hug is not installed") + + import cla.user # pylint: disable=import-outside-toplevel + + importlib.reload(cla.user) + + token = jwt.encode( + { + "sub": "user|456", + "preferred_username": "nick2", + "email": "b@example.com", + }, + "secret", + algorithm="HS256", + ) + + req = SimpleNamespace(headers={"Authorization": f"Bearer {token}"}) + user = cla.user.cla_user(request=req) + + self.assertIsNotNone(user) + self.assertEqual(user.user_id, "user|456") + self.assertEqual(user.preferred_username, "nick2") + self.assertEqual(user.email, "b@example.com") diff --git a/cla-backend/cla/user.py b/cla-backend/cla/user.py index 93ff2df50..8c26ffc03 100644 --- a/cla-backend/cla/user.py +++ b/cla-backend/cla/user.py @@ -10,7 +10,8 @@ from typing import Optional from hug.directives import _built_in_directive -from jose import jwt +import jwt +from jwt.exceptions import PyJWTError import cla @@ -32,7 +33,22 @@ def cla_user(default=None, request=None, **kwargs): bearer_token = bearer_token.replace('Bearer ', '') try: - token_params = jwt.get_unverified_claims(bearer_token) + token_params = jwt.decode( + bearer_token, + options={ + 'verify_signature': False, + 'verify_exp': False, + 'verify_nbf': False, + 'verify_iat': False, + 'verify_aud': False, + 'verify_iss': False, + 'verify_sub': False, + 'verify_jti': False, + }, + ) + except PyJWTError as e: + cla.log.error('JWT Error parsing Bearer token: {}'.format(e)) + return default except Exception as e: cla.log.error('Error parsing Bearer token: {}'.format(e)) return default diff --git a/cla-backend/cla/user_service.py b/cla-backend/cla/user_service.py index 6cbc0397f..be6555b53 100644 --- a/cla-backend/cla/user_service.py +++ b/cla-backend/cla/user_service.py @@ -207,7 +207,7 @@ def get_access_token(self): fn = 'cla.user_service.get_access_token' # Use previously cached value, if not expired if self.access_token and datetime.datetime.now() < self.access_token_expires: - cla.log.debug(f'{fn} - using cached access token: {self.access_token[0:10]}...') + cla.log.debug(f'{fn} - using cached access token') return self.access_token auth0_url = cla.config.AUTH0_PLATFORM_URL diff --git a/cla-backend/cla/utils.py b/cla-backend/cla/utils.py index 6786ecf60..85e0663e2 100644 --- a/cla-backend/cla/utils.py +++ b/cla-backend/cla/utils.py @@ -1241,12 +1241,8 @@ def get_authorization_url_and_state(client_id, redirect_uri, scope, authorize_ur oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope) authorization_url, state = oauth.authorization_url(authorize_url) cla.log.debug( - f"{fn} - initialized a new oauth session " - f"using the github oauth client id: {client_id[0:5]}... " - f"with the redirect_uri: {redirect_uri} " - f"using scope of: {scope}. Obtained the " - f"state: {state} and the " - f"generated authorization_url: {authorize_url}" + f"{fn} - initialized oauth session using the github oauth client id: {client_id[0:5]}... " + f"with the redirect_uri: {redirect_uri} and scope: {scope}" ) return authorization_url, state else: @@ -1259,14 +1255,8 @@ def get_authorization_url_and_state(client_id, redirect_uri, scope, authorize_ur # Logging cla.log.debug( - f"{fn} - initialized a new oauth session " - f"using the github oauth client id: {client_id[0:5]}... " - f"with the redirect_uri: {redirect_uri}. " - f"using scope of: {scope}. " - f"CSRF token: {csrf_token}. " - f"custom value: {state}. " - f"encoded state: {encoded_state}." - f"Generated authorization_url: {authorization_url}" + f"{fn} - initialized oauth session using the github oauth client id: {client_id[0:5]}... " + f"with the redirect_uri: {redirect_uri} and scope: {scope}" ) return authorization_url, csrf_token diff --git a/cla-backend/package.json b/cla-backend/package.json index 992df2fac..b9ab940ad 100644 --- a/cla-backend/package.json +++ b/cla-backend/package.json @@ -49,7 +49,7 @@ "serverless-python-requirements": "^6.0.0", "serverless-wsgi": "^3.0.1", "shell-quote": "^1.7.3", - "simple-git": "^3.16.0", + "simple-git": "^3.32.3", "xml2js": "^0.6.0", "yarn-audit-fix": "^10.0.0" }, @@ -68,16 +68,20 @@ "json-schema": "^0.4.0", "lodash.set": "^4.3.2", "node-fetch": "^2.6.7", - "minimatch": "^10.2.1", + "minimatch": "^10.2.3", "minimist": "^1.2.6", "normalize-url": "^4.5.1", - "qs": "^6.14.2", + "qs": "6.14.2", "set-value": "^4.0.1", "shell-quote": "^1.7.3", - "simple-git": "^3.16.0", + "simple-git": "^3.32.3", "ws": ">=7.5.10", "tar": "^7.5.8", "xmlhttprequest-ssl": "^1.6.2", - "fast-xml-parser": "^5.3.6" + "fast-xml-parser": "^5.3.6", + "ajv": "8.18.0", + "validator": "13.15.22", + "serialize-javascript": "7.0.3", + "tmp": "0.2.4" } } diff --git a/cla-backend/requirements.txt b/cla-backend/requirements.txt index 0afe6b431..eaeaf15a9 100644 --- a/cla-backend/requirements.txt +++ b/cla-backend/requirements.txt @@ -3,8 +3,8 @@ atomicwrites==1.3.0 attrs==19.3.0 beautifulsoup4==4.8.1 -boto3==1.22.1 -botocore==1.25.11 +boto3==1.42.59 +botocore==1.42.59 certifi==2024.7.4 chardet==3.0.4 colorama==0.4.3 @@ -12,7 +12,6 @@ coverage==4.5.4 Deprecated==1.2.7 docraptor==1.2.0 docutils==0.15.2 -ecdsa==0.14.1 falcon==2.0.0 future==0.18.3 gossip==2.3.1 @@ -20,7 +19,7 @@ hug==2.6.0 idna==3.7 importlib-metadata==1.6.1 Jinja2==3.1.4 -jmespath==0.9.4 +jmespath==1.1.0 lazy-object-proxy==1.4.3 Logbook==1.5.3 lxml==4.9.2 @@ -32,25 +31,25 @@ py==1.10.0 pyasn1==0.4.8 pydocusign==2.2 PyGithub==1.55 -PyJWT==2.7.0 pyparsing==2.4.5 +PyJWT==2.11.0 +cryptography==41.0.7 python-dateutil==2.8.1 requests==2.31.0 requests-oauthlib==1.2.0 rsa==4.7 -s3transfer==0.5.0 +s3transfer==0.16.0 sentinels==1.0.0 six==1.13.0 soupsieve==1.9.5 termcolor==1.1.0 -urllib3==1.26.18 +urllib3==2.6.3 vintage==0.4.1 wcwidth==0.1.7 -Werkzeug==0.15.5 -zipp==3.15.0 -markupsafe==2.0.1 +werkzeug==3.1.6 +zipp==3.19.1 +markupsafe==2.1.5 # LG: -python-jose==3.4.0 pynamodb==6.0.2 wrapt==1.17.2 astroid==3.3.8 diff --git a/cla-backend/serverless.yml b/cla-backend/serverless.yml index dfae5c39b..5f1a3b89e 100644 --- a/cla-backend/serverless.yml +++ b/cla-backend/serverless.yml @@ -41,6 +41,13 @@ custom: app: cla.routes.__hug_wsgi__ pythonBin: python pythonRequirements: false + pythonRequirements: + dockerizePip: true + dockerImage: public.ecr.aws/sam/build-python3.11:latest + slim: false + strip: false + useDownloadCache: true + useStaticCache: true # Config for serverless-prune-plugin - remove all but the 10 most recent # versions to avoid the "Code storage limit exceeded" error prune: diff --git a/cla-backend/yarn.lock b/cla-backend/yarn.lock index f2a5efb28..9de907d16 100644 --- a/cla-backend/yarn.lock +++ b/cla-backend/yarn.lock @@ -2133,10 +2133,10 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv@^8.0.0, ajv@^8.12.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== +ajv@8.18.0, ajv@^8.0.0, ajv@^8.12.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" + integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== dependencies: fast-deep-equal "^3.1.3" fast-uri "^3.0.1" @@ -2876,13 +2876,20 @@ dayjs@^1.11.8: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@4, debug@^4.1.1, debug@^4.3.4, debug@^4.3.5: +debug@4, debug@^4.1.1, debug@^4.3.4: version "4.4.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" +debug@^4.4.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4518,10 +4525,10 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^10.2.1, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^5.0.1, minimatch@^5.1.0, minimatch@~3.0.4: - version "10.2.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.3.tgz#c0ef582f21071b0123a5bbf275252ebda921fbf6" - integrity sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg== +minimatch@^10.2.3, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^5.0.1, minimatch@^5.1.0, minimatch@~3.0.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" + integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== dependencies: brace-expansion "^5.0.2" @@ -4723,11 +4730,6 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - own-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" @@ -4949,7 +4951,14 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.10.3, qs@^6.11.0, qs@^6.14.2: +qs@6.14.2, qs@^6.10.3, qs@^6.11.0: + version "6.14.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" + integrity sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q== + dependencies: + side-channel "^1.1.0" + +qs@^6.14.2: version "6.15.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== @@ -5193,6 +5202,11 @@ semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semve resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +serialize-javascript@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.3.tgz#c92008d8a21bc7b2307c2e885a4bd0f03b2aee6c" + integrity sha512-h+cZ/XXarqDgCjo+YSyQU/ulDEESGGf8AMK9pPNmhNSl/FzPl6L8pMp1leca5z6NuG6tvV/auC8/43tmovowww== + serverless-domain-manager@^7.0.4: version "7.4.0" resolved "https://registry.yarnpkg.com/serverless-domain-manager/-/serverless-domain-manager-7.4.0.tgz#f67be9f39abeb258c72b54d88bb043b33c290a9a" @@ -5480,14 +5494,14 @@ signal-exit@^3.0.2, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-git@^3.16.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.27.0.tgz#f4b09e807bda56a4a3968f635c0e4888d3decbd5" - integrity sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA== +simple-git@^3.16.0, simple-git@^3.23.3, simple-git@^3.32.3: + version "3.32.3" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.32.3.tgz#1dd6030fd03df4533a9e5a941314335e6265055d" + integrity sha512-56a5oxFdWlsGygOXHWrG+xjj5w9ZIt2uQbzqiIGdR/6i5iococ7WQ/bNPzWxCJdEUGUCmyMH0t9zMpRJTaKxmw== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" - debug "^4.3.5" + debug "^4.4.0" slash@^3.0.0: version "3.0.0" @@ -5785,12 +5799,10 @@ timers-ext@^0.1.7: es5-ext "^0.10.64" next-tick "^1.1.0" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" +tmp@0.2.4, tmp@^0.0.33: + version "0.2.4" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.4.tgz#c6db987a2ccc97f812f17137b36af2b6521b0d13" + integrity sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ== to-buffer@^1.1.1: version "1.1.1" @@ -6005,6 +6017,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +validator@13.15.22: + version "13.15.22" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.22.tgz#5f847cf4a799107e5716fc87e5cf2a337a71eb14" + integrity sha512-uT/YQjiyLJP7HSrv/dPZqK9L28xf8hsNca01HSz1dfmI0DgMfjopp1rO/z13NeGF1tVystF0Ejx3y4rUKPw+bQ== + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" diff --git a/tests/functional/cypress/e2e/v3/organization.cy.ts b/tests/functional/cypress/e2e/v3/organization.cy.ts index d1c5f1ef7..5d4bb0c9c 100644 --- a/tests/functional/cypress/e2e/v3/organization.cy.ts +++ b/tests/functional/cypress/e2e/v3/organization.cy.ts @@ -55,7 +55,9 @@ describe('To Validate & test Organization APIs via API call (V3)', function () { const websiteName = 'linuxfoundation.org'; cy.request({ method: 'GET', - url: `${claEndpoint}organization/search?companyName=${encodeURIComponent(companyName)}&websiteName=${encodeURIComponent(websiteName)}`, + url: `${claEndpoint}organization/search?companyName=${encodeURIComponent( + companyName, + )}&websiteName=${encodeURIComponent(websiteName)}`, timeout: timeout, failOnStatusCode: allowFail, }).then((response) => { diff --git a/tests/functional/cypress/e2e/v3/project.cy.ts b/tests/functional/cypress/e2e/v3/project.cy.ts index deec21f18..e9ccdd855 100644 --- a/tests/functional/cypress/e2e/v3/project.cy.ts +++ b/tests/functional/cypress/e2e/v3/project.cy.ts @@ -110,7 +110,7 @@ describe('To Validate & test Project APIs via API call (V3)', function () { // Skip if no test project ID available if (!testProjectID) { cy.task('log', 'Skipping GET /project/{projectID} - no test project available'); - return cy.skip(); + this.skip(); } cy.request({ @@ -136,7 +136,7 @@ describe('To Validate & test Project APIs via API call (V3)', function () { // Skip if no test project SFID available if (!testProjectSFID) { cy.task('log', 'Skipping GET /project/external/{projectSFID} - no test project SFID available'); - return cy.skip(); + this.skip(); } cy.request({ @@ -161,7 +161,7 @@ describe('To Validate & test Project APIs via API call (V3)', function () { // Skip if no test project name available if (!testProjectName) { cy.task('log', 'Skipping GET /project/name/{projectName} - no test project name available'); - return cy.skip(); + this.skip(); } cy.request({ @@ -231,7 +231,7 @@ describe('To Validate & test Project APIs via API call (V3)', function () { // Skip if no test project to update if (!testProjectID) { cy.task('log', 'Skipping PUT /project - no project available to update'); - return cy.skip(); + this.skip(); } const updateData = { diff --git a/tests/functional/cypress/e2e/v4/company.cy.ts b/tests/functional/cypress/e2e/v4/company.cy.ts index 8c0dc4ce2..1759b31d8 100644 --- a/tests/functional/cypress/e2e/v4/company.cy.ts +++ b/tests/functional/cypress/e2e/v4/company.cy.ts @@ -744,19 +744,17 @@ describe('To Validate & get Company Activity Callback via API call', function () cy.request(opts).then((response) => { return cy.logJson('response', response).then(() => { - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/events.cy.ts b/tests/functional/cypress/e2e/v4/events.cy.ts index 5fc31d54f..cb567a6eb 100644 --- a/tests/functional/cypress/e2e/v4/events.cy.ts +++ b/tests/functional/cypress/e2e/v4/events.cy.ts @@ -296,16 +296,14 @@ describe('To Validate events are properly capture via API call', function () { cy.request(opts).then((response) => { return cy.logJson('response', response).then(() => { - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/foundation.cy.ts b/tests/functional/cypress/e2e/v4/foundation.cy.ts index 207065a69..f8b2ce4ae 100644 --- a/tests/functional/cypress/e2e/v4/foundation.cy.ts +++ b/tests/functional/cypress/e2e/v4/foundation.cy.ts @@ -192,16 +192,14 @@ describe('To Validate & get list of Foundation ClaGroups via API call', function cy.request(opts).then((response) => { return cy.logJson('response', response).then(() => { - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/github-organizations.cy.ts b/tests/functional/cypress/e2e/v4/github-organizations.cy.ts index 50e7f5ac2..234d2c283 100644 --- a/tests/functional/cypress/e2e/v4/github-organizations.cy.ts +++ b/tests/functional/cypress/e2e/v4/github-organizations.cy.ts @@ -275,16 +275,14 @@ describe('To Validate github-organizations API call', function () { cy.request(opts).then((response) => { return cy.logJson('response', response).then(() => { - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/github-repositories.cy.ts b/tests/functional/cypress/e2e/v4/github-repositories.cy.ts index 8a8c2a6c4..f9b9a343a 100644 --- a/tests/functional/cypress/e2e/v4/github-repositories.cy.ts +++ b/tests/functional/cypress/e2e/v4/github-repositories.cy.ts @@ -449,16 +449,14 @@ describe('To Validate github-repositories API call', function () { cy.request(opts).then((response) => { return cy.logJson('response', response).then(() => { - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/gitlab-organizations.cy.ts b/tests/functional/cypress/e2e/v4/gitlab-organizations.cy.ts index 0b73f0efa..32963d0ba 100644 --- a/tests/functional/cypress/e2e/v4/gitlab-organizations.cy.ts +++ b/tests/functional/cypress/e2e/v4/gitlab-organizations.cy.ts @@ -353,17 +353,17 @@ describe('To Validate & get list of gitlab-organizations via API call', function failOnStatusCode: false, }).then((response) => { const es = local - ? (testCase.expectedStatusLocal ?? testCase.expectedStatus) - : (testCase.expectedStatusRemote ?? testCase.expectedStatus); + ? testCase.expectedStatusLocal ?? testCase.expectedStatus + : testCase.expectedStatusRemote ?? testCase.expectedStatus; const ec = local - ? (testCase.expectedCodeLocal ?? testCase.expectedCode) - : (testCase.expectedCodeRemote ?? testCase.expectedCode); + ? testCase.expectedCodeLocal ?? testCase.expectedCode + : testCase.expectedCodeRemote ?? testCase.expectedCode; const em = local - ? (testCase.expectedMessageLocal ?? testCase.expectedMessage) - : (testCase.expectedMessageRemote ?? testCase.expectedMessage); + ? testCase.expectedMessageLocal ?? testCase.expectedMessage + : testCase.expectedMessageRemote ?? testCase.expectedMessage; const emc = local - ? (testCase.expectedMessageContainsLocal ?? testCase.expectedMessageContains) - : (testCase.expectedMessageContainsRemote ?? testCase.expectedMessageContains); + ? testCase.expectedMessageContainsLocal ?? testCase.expectedMessageContains + : testCase.expectedMessageContainsRemote ?? testCase.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/gitlab-repositories.cy.ts b/tests/functional/cypress/e2e/v4/gitlab-repositories.cy.ts index cd8cb8c04..6b7ed32a8 100644 --- a/tests/functional/cypress/e2e/v4/gitlab-repositories.cy.ts +++ b/tests/functional/cypress/e2e/v4/gitlab-repositories.cy.ts @@ -309,17 +309,17 @@ describe('To Validate & Get the GitLab repositories of the project via API call' failOnStatusCode: false, }).then((response) => { const es = local - ? (testCase.expectedStatusLocal ?? testCase.expectedStatus) - : (testCase.expectedStatusRemote ?? testCase.expectedStatus); + ? testCase.expectedStatusLocal ?? testCase.expectedStatus + : testCase.expectedStatusRemote ?? testCase.expectedStatus; const ec = local - ? (testCase.expectedCodeLocal ?? testCase.expectedCode) - : (testCase.expectedCodeRemote ?? testCase.expectedCode); + ? testCase.expectedCodeLocal ?? testCase.expectedCode + : testCase.expectedCodeRemote ?? testCase.expectedCode; const em = local - ? (testCase.expectedMessageLocal ?? testCase.expectedMessage) - : (testCase.expectedMessageRemote ?? testCase.expectedMessage); + ? testCase.expectedMessageLocal ?? testCase.expectedMessage + : testCase.expectedMessageRemote ?? testCase.expectedMessage; const emc = local - ? (testCase.expectedMessageContainsLocal ?? testCase.expectedMessageContains) - : (testCase.expectedMessageContainsRemote ?? testCase.expectedMessageContains); + ? testCase.expectedMessageContainsLocal ?? testCase.expectedMessageContains + : testCase.expectedMessageContainsRemote ?? testCase.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/health.cy.ts b/tests/functional/cypress/e2e/v4/health.cy.ts index fa380f1a2..faae96439 100644 --- a/tests/functional/cypress/e2e/v4/health.cy.ts +++ b/tests/functional/cypress/e2e/v4/health.cy.ts @@ -142,16 +142,14 @@ describe('To Validate & get health status via API call', function () { .then((response) => { cy.task('log', `Testing: ${c.title}`); - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/metrics.cy.ts b/tests/functional/cypress/e2e/v4/metrics.cy.ts index 500cae06e..1caff6903 100644 --- a/tests/functional/cypress/e2e/v4/metrics.cy.ts +++ b/tests/functional/cypress/e2e/v4/metrics.cy.ts @@ -352,16 +352,14 @@ describe('To Validate cla-manager API call', function () { .then((response) => { cy.task('log', `Testing: ${c.title}`); - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/projects.cy.ts b/tests/functional/cypress/e2e/v4/projects.cy.ts index e0e98746a..d8197619f 100644 --- a/tests/functional/cypress/e2e/v4/projects.cy.ts +++ b/tests/functional/cypress/e2e/v4/projects.cy.ts @@ -416,16 +416,14 @@ describe('To Validate & get projects Activity Callback via API call', function ( cy.request(opts).then((response) => { cy.task('log', `title: ${c.title}`); return cy.logJson('response', response).then(() => { - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/cypress/e2e/v4/signatures.cy.ts b/tests/functional/cypress/e2e/v4/signatures.cy.ts index 2285239f9..88924ff4b 100644 --- a/tests/functional/cypress/e2e/v4/signatures.cy.ts +++ b/tests/functional/cypress/e2e/v4/signatures.cy.ts @@ -604,7 +604,9 @@ describe('To Validate & get list of signatures of ClaGroups via API call', funct if (!isIncluded) { cy.task( 'log', - `GitHub username '${gitUsernameApprovalList}' was not added to the list. Current list: ${JSON.stringify(list)}`, + `GitHub username '${gitUsernameApprovalList}' was not added to the list. Current list: ${JSON.stringify( + list, + )}`, ); cy.task('log', 'This may be due to duplicate prevention, list limits, or approval requirements'); // Accept this as a known behavior - the API may prevent adding duplicates or have other business rules diff --git a/tests/functional/cypress/e2e/v4/version.cy.ts b/tests/functional/cypress/e2e/v4/version.cy.ts index 84c250c68..9478aa335 100644 --- a/tests/functional/cypress/e2e/v4/version.cy.ts +++ b/tests/functional/cypress/e2e/v4/version.cy.ts @@ -142,16 +142,14 @@ describe('To Validate & check cla version via API call', function () { .then((response) => { cy.task('log', `Testing: ${c.title}`); - const es = local - ? (c.expectedStatusLocal ?? c.expectedStatus) - : (c.expectedStatusRemote ?? c.expectedStatus); - const ec = local ? (c.expectedCodeLocal ?? c.expectedCode) : (c.expectedCodeRemote ?? c.expectedCode); + const es = local ? c.expectedStatusLocal ?? c.expectedStatus : c.expectedStatusRemote ?? c.expectedStatus; + const ec = local ? c.expectedCodeLocal ?? c.expectedCode : c.expectedCodeRemote ?? c.expectedCode; const em = local - ? (c.expectedMessageLocal ?? c.expectedMessage) - : (c.expectedMessageRemote ?? c.expectedMessage); + ? c.expectedMessageLocal ?? c.expectedMessage + : c.expectedMessageRemote ?? c.expectedMessage; const emc = local - ? (c.expectedMessageContainsLocal ?? c.expectedMessageContains) - : (c.expectedMessageContainsRemote ?? c.expectedMessageContains); + ? c.expectedMessageContainsLocal ?? c.expectedMessageContains + : c.expectedMessageContainsRemote ?? c.expectedMessageContains; cy.task('log', ` --> expected ${es}, ${ec}, '${em}' (contains? ${emc})`); validate_expected_status(response, es, ec, em, emc); diff --git a/tests/functional/package-lock.json b/tests/functional/package-lock.json index 7b89dffd1..8943a15a5 100644 --- a/tests/functional/package-lock.json +++ b/tests/functional/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "ajv": "^8.12.0", + "ajv": "^8.18.0", "cypress-mochawesome-reporter": "^3.5.1", "mochawesome-merge": "^4.3.0", "mochawesome-report-generator": "^6.2.0" @@ -348,9 +348,9 @@ } }, "node_modules/@cypress/request": { - "version": "2.88.12", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz", - "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", + "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", @@ -359,16 +359,16 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", + "form-data": "~4.0.4", + "http-signature": "~1.4.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.10.3", + "qs": "~6.14.1", "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", + "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -465,13 +465,13 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -671,9 +671,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -835,14 +835,10 @@ "license": "MIT" }, "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "peer": true, - "engines": { - "node": "18 || 20 || >=22" - } + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -900,16 +896,13 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -1009,19 +1002,6 @@ "node": ">=6" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1035,6 +1015,22 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -1048,9 +1044,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001774", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", - "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==", "dev": true, "funding": [ { @@ -1577,9 +1573,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.302", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", - "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", "dev": true, "license": "ISC", "peer": true @@ -1930,20 +1926,19 @@ } }, "node_modules/form-data": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", - "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", - "mime-types": "^2.1.35", - "safe-buffer": "^5.2.1" + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/fs-extra": { @@ -2220,14 +2215,14 @@ } }, "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "sshpk": "^1.18.0" }, "engines": { "node": ">=0.10" @@ -2825,13 +2820,13 @@ } }, "node_modules/minimatch": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.8.tgz", - "integrity": "sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "peer": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -2947,16 +2942,10 @@ "node": ">=10.0.0" } }, - "node_modules/mochawesome-merge/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, "node_modules/mochawesome-merge/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3062,9 +3051,9 @@ } }, "node_modules/mochawesome-merge/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3246,10 +3235,13 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3487,12 +3479,6 @@ "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", "license": "MIT" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT" - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -3503,23 +3489,13 @@ "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/qs": { - "version": "6.10.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", - "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", - "deprecated": "when using stringify with arrayFormat comma, `[]` is appended on single-item arrays. Upgrade to v6.11.0 or downgrade to v6.10.4 to fix.", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -3528,12 +3504,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3555,16 +3525,6 @@ ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -3618,12 +3578,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "license": "ISC" }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -3654,71 +3608,6 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "license": "MIT" }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3812,13 +3701,13 @@ "license": "ISC" }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.3.tgz", + "integrity": "sha512-h+cZ/XXarqDgCjo+YSyQU/ulDEESGGf8AMK9pPNmhNSl/FzPl6L8pMp1leca5z6NuG6tvV/auC8/43tmovowww==", "license": "BSD-3-Clause", "peer": true, - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=20.0.0" } }, "node_modules/set-blocking": { @@ -3849,14 +3738,72 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3903,9 +3850,9 @@ } }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "license": "MIT", "dependencies": { "asn1": "~0.2.3", @@ -4047,16 +3994,31 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "license": "MIT", "dependencies": { - "rimraf": "^3.0.0" + "tldts-core": "^6.1.86" }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz", + "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==", + "license": "MIT", "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/to-regex-range": { @@ -4073,27 +4035,15 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node": ">=16" } }, "node_modules/tslib": { @@ -4196,16 +4146,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -4216,9 +4156,9 @@ } }, "node_modules/validator": { - "version": "13.15.15", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", - "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", + "version": "13.15.22", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.22.tgz", + "integrity": "sha512-uT/YQjiyLJP7HSrv/dPZqK9L28xf8hsNca01HSz1dfmI0DgMfjopp1rO/z13NeGF1tVystF0Ejx3y4rUKPw+bQ==", "license": "MIT", "engines": { "node": ">= 0.10" diff --git a/tests/functional/package.json b/tests/functional/package.json index e4f81b30e..6755d6231 100644 --- a/tests/functional/package.json +++ b/tests/functional/package.json @@ -29,15 +29,32 @@ "typescript": "^5.1.6" }, "dependencies": { - "ajv": "^8.12.0", + "ajv": "^8.18.0", "cypress-mochawesome-reporter": "^3.5.1", "mochawesome-merge": "^4.3.0", "mochawesome-report-generator": "^6.2.0" }, "resolutions": { - "form-data": "2.5.5" + "form-data": "4.0.4" }, "overrides": { - "form-data": "2.5.5" + "form-data": "4.0.4", + "validator": "13.15.22", + "qs": "6.14.1", + "tmp": "0.2.4", + "serialize-javascript": "7.0.3", + "@cypress/request": "3.0.10", + "mochawesome-merge": { + "minimatch": { + ".": "3.1.5", + "brace-expansion": "1.1.12" + } + }, + "rimraf": { + "minimatch": { + ".": "3.1.5", + "brace-expansion": "1.1.12" + } + } } } diff --git a/tests/functional/yarn.lock b/tests/functional/yarn.lock index cdd164458..0d1dcfb0a 100644 --- a/tests/functional/yarn.lock +++ b/tests/functional/yarn.lock @@ -167,10 +167,10 @@ find-test-names "^1.28.18" globby "^11.0.4" -"@cypress/request@^2.88.11": - version "2.88.12" - resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz" - integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== +"@cypress/request@3.0.10": + version "3.0.10" + resolved "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz" + integrity sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -178,16 +178,16 @@ combined-stream "~1.0.6" extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" + form-data "~4.0.4" + http-signature "~1.4.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.10.3" + qs "~6.14.1" safe-buffer "^5.1.2" - tough-cookie "^4.1.3" + tough-cookie "^5.0.0" tunnel-agent "^0.6.0" uuid "^8.3.2" @@ -318,10 +318,10 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^8.12.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== +ajv@^8.18.0: + version "8.18.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz" + integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== dependencies: fast-deep-equal "^3.1.3" fast-uri "^3.0.1" @@ -345,7 +345,7 @@ ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: +ansi-regex@^6.2.2: version "6.2.2" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== @@ -424,11 +424,6 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -balanced-match@^4.0.2: - version "4.0.4" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" - integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== - base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" @@ -456,20 +451,20 @@ bluebird@^3.7.2: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== +brace-expansion@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" - concat-map "0.0.1" -brace-expansion@^5.0.2: - version "5.0.3" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz" - integrity sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA== +brace-expansion@1.1.12: + version "1.1.12" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: - balanced-match "^4.0.2" + balanced-match "^1.0.0" + concat-map "0.0.1" braces@^3.0.3: version "3.0.3" @@ -520,13 +515,13 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" camelcase@^5.0.0: version "5.3.1" @@ -539,9 +534,9 @@ camelcase@^6.0.0, camelcase@^6.3.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001759: - version "1.0.30001774" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz" - integrity sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA== + version "1.0.30001776" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz" + integrity sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw== caseless@~0.12.0: version "0.12.0" @@ -850,9 +845,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.5.263: - version "1.5.302" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz" - integrity sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg== + version "1.5.307" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz" + integrity sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg== emoji-regex@^8.0.0: version "8.0.0" @@ -1069,17 +1064,16 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data@2.5.5: - version "2.5.5" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz" - integrity sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A== +form-data@4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" + integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" es-set-tostringtag "^2.1.0" hasown "^2.0.2" - mime-types "^2.1.35" - safe-buffer "^5.2.1" + mime-types "^2.1.12" fs-extra@^10.0.0: version "10.1.0" @@ -1128,7 +1122,7 @@ fsu@^1.1.1: resolved "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz" integrity sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A== -function-bind@^1.1.1, function-bind@^1.1.2: +function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== @@ -1143,7 +1137,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.2.6: +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -1207,18 +1201,6 @@ glob@^10.4.5: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.1.6: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -1289,14 +1271,14 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== +http-signature@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz" + integrity sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg== dependencies: assert-plus "^1.0.0" jsprim "^2.0.2" - sshpk "^1.14.1" + sshpk "^1.18.0" human-signals@^1.1.1: version "1.1.1" @@ -1637,7 +1619,7 @@ mime-db@1.52.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.35, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -1649,19 +1631,19 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.9" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.2" -minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.8" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.8.tgz" - integrity sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw== +minimatch@3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: - brace-expansion "^5.0.2" + brace-expansion "^1.1.7" minimist@^1.2.8: version "1.2.8" @@ -1765,10 +1747,10 @@ object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -1911,11 +1893,6 @@ proxy-from-env@1.0.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - pump@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" @@ -1924,35 +1901,18 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -qs@~6.10.3: - version "6.10.5" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== +qs@6.14.1: + version "6.14.1" + resolved "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz" + integrity sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ== dependencies: - side-channel "^1.0.4" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + side-channel "^1.1.0" queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" @@ -1985,11 +1945,6 @@ require-main-filename@^2.0.0: resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" @@ -2008,13 +1963,6 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -2029,7 +1977,7 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2051,12 +1999,10 @@ semver@^7.5.3: dependencies: lru-cache "^6.0.0" -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" +serialize-javascript@7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.3.tgz" + integrity sha512-h+cZ/XXarqDgCjo+YSyQU/ulDEESGGf8AMK9pPNmhNSl/FzPl6L8pMp1leca5z6NuG6tvV/auC8/43tmovowww== set-blocking@^2.0.0: version "2.0.0" @@ -2075,14 +2021,45 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" signal-exit@^3.0.2: version "3.0.7" @@ -2122,10 +2099,10 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -sshpk@^1.14.1: - version "1.17.0" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== +sshpk@^1.18.0: + version "1.18.0" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -2179,11 +2156,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + version "7.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: - ansi-regex "^6.0.1" + ansi-regex "^6.2.2" strip-final-newline@^2.0.0: version "2.0.0" @@ -2231,12 +2208,22 @@ through@^2.3.8: resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== +tldts-core@^6.1.86: + version "6.1.86" + resolved "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz" + integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== + +tldts@^6.1.32: + version "6.1.86" + resolved "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz" + integrity sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ== dependencies: - rimraf "^3.0.0" + tldts-core "^6.1.86" + +tmp@0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz" + integrity sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ== to-regex-range@^5.0.1: version "5.0.1" @@ -2245,15 +2232,12 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@^4.1.3: - version "4.1.3" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== +tough-cookie@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz" + integrity sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A== dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" + tldts "^6.1.32" tslib@^2.1.0: version "2.6.1" @@ -2287,11 +2271,6 @@ universalify@^0.1.0: resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" @@ -2310,23 +2289,15 @@ update-browserslist-db@^1.2.0: escalade "^3.2.0" picocolors "^1.1.1" -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -validator@^13.6.0: - version "13.15.15" - resolved "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz" - integrity sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A== +validator@13.15.22: + version "13.15.22" + resolved "https://registry.npmjs.org/validator/-/validator-13.15.22.tgz" + integrity sha512-uT/YQjiyLJP7HSrv/dPZqK9L28xf8hsNca01HSz1dfmI0DgMfjopp1rO/z13NeGF1tVystF0Ejx3y4rUKPw+bQ== verror@1.10.0: version "1.10.0" diff --git a/tests/rest/package.json b/tests/rest/package.json index 4fdc265ac..a81e9862c 100644 --- a/tests/rest/package.json +++ b/tests/rest/package.json @@ -9,6 +9,15 @@ "newman": "^4.6.0" }, "resolutions": { - "form-data": "^4.0.4" + "form-data": "^4.0.4", + "ajv": "6.14.0", + "tough-cookie": "4.1.3", + "lodash": "4.17.21", + "qs": "6.14.1", + "serialize-javascript": "7.0.3", + "validator": "13.15.22", + "minimatch": "3.1.5", + "brace-expansion": "1.1.12", + "tmp": "0.2.4" } } diff --git a/tests/rest/requirements.freeze.txt b/tests/rest/requirements.freeze.txt index 98f36ccc1..647fda676 100644 --- a/tests/rest/requirements.freeze.txt +++ b/tests/rest/requirements.freeze.txt @@ -3,12 +3,12 @@ allure-python-commons==2.8.6 atomicwrites==1.3.0 attrs==19.3.0 backports.functools-lru-cache==1.5 -certifi==2022.12.7 +certifi==2024.7.4 chardet==3.0.4 contextlib2==0.6.0.post1 docopt==0.6.2 future==0.18.3 -idna==2.8 +idna==3.7 importlib-metadata==0.23 jmespath==0.9.4 more-itertools==7.2.0 @@ -26,11 +26,11 @@ pytest-tldr==0.2.1 python-box==3.4.5 python-dateutil==2.8.0 PyYAML==5.3.1 -requests==2.22.0 +requests==2.31.0 six==1.12.0 stevedore==1.31.0 tavern==0.30.3 termcolor==1.1.0 -urllib3==1.26.5 +urllib3==2.6.3 wcwidth==0.1.7 -zipp==0.6.0 +zipp==3.19.1 diff --git a/tests/rest/yarn.lock b/tests/rest/yarn.lock index a7b658c53..7a5aa5dc2 100644 --- a/tests/rest/yarn.lock +++ b/tests/rest/yarn.lock @@ -23,10 +23,10 @@ dependencies: safe-buffer "^5.0.1" -ajv@^6.5.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +ajv@6.14.0, ajv@^6.5.5: + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -104,6 +104,11 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + base64-js@^1.1.2: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" @@ -121,6 +126,14 @@ bluebird@^2.6.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= +brace-expansion@1.1.12, brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brotli@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.2.tgz#525a9cad4fcba96475d7d388f6aecb13eed52f46" @@ -136,6 +149,14 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -228,6 +249,11 @@ commander@~2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -423,7 +449,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -get-intrinsic@^1.2.6: +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -577,11 +603,6 @@ intel@1.2.0: symbol "~0.3.1" utcstring "~0.1.0" -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -657,10 +678,10 @@ lodash.mergewith@^4.6.1: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash@4.17.15, lodash@^4.17.11: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@4.17.15, lodash@4.17.21, lodash@^4.17.11: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== marked@0.7.0: version "0.7.0" @@ -703,6 +724,13 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.43.0" +minimatch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -778,6 +806,11 @@ object-hash@^1.1.2: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -952,20 +985,34 @@ pretty-ms@5.1.0: dependencies: parse-ms "^2.1.0" -psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== +psl@^1.1.33: + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@6.14.1, qs@~6.5.2: + version "6.14.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.1.tgz#a41d85b9d3902f31d27861790506294881871159" + integrity sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ== + dependencies: + side-channel "^1.1.0" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== readable-stream@^3.1.1: version "3.6.0" @@ -976,6 +1023,11 @@ readable-stream@^3.1.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -1026,6 +1078,51 @@ serialised-error@1.1.3: stack-trace "0.0.9" uuid "^3.0.0" +serialize-javascript@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.3.tgz#c92008d8a21bc7b2307c2e885a4bd0f03b2aee6c" + integrity sha512-h+cZ/XXarqDgCjo+YSyQU/ulDEESGGf8AMK9pPNmhNSl/FzPl6L8pMp1leca5z6NuG6tvV/auC8/43tmovowww== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -1132,22 +1229,20 @@ teleport-javascript@1.0.0: resolved "https://registry.yarnpkg.com/teleport-javascript/-/teleport-javascript-1.0.0.tgz#c9397fad598d662027e4d3a5fa7e7da1c8361547" integrity sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg== -tough-cookie@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" +tmp@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.4.tgz#c6db987a2ccc97f812f17137b36af2b6521b0d13" + integrity sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ== -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tough-cookie@3.0.1, tough-cookie@4.1.3, tough-cookie@~2.5.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" @@ -1167,6 +1262,11 @@ underscore@~1.7.0: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -1174,6 +1274,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + utcstring@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/utcstring/-/utcstring-0.1.0.tgz#430fd510ab7fc95b5d5910c902d79880c208436b" @@ -1209,6 +1317,11 @@ uvm@1.7.8: lodash "4.17.15" uuid "3.3.2" +validator@13.15.22: + version "13.15.22" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.22.tgz#5f847cf4a799107e5716fc87e5cf2a337a71eb14" + integrity sha512-uT/YQjiyLJP7HSrv/dPZqK9L28xf8hsNca01HSz1dfmI0DgMfjopp1rO/z13NeGF1tVystF0Ejx3y4rUKPw+bQ== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" diff --git a/utils/git_sync_to_branch.sh b/utils/git_sync_to_branch.sh new file mode 100755 index 000000000..257ebbb51 --- /dev/null +++ b/utils/git_sync_to_branch.sh @@ -0,0 +1,20 @@ +#!/bin/bash +if [ -z "$1" ] +then + echo "Usage: $0 " + exit 1 +fi +echo "To be used when you are on a feature branch based on main and want to sync it with current $1 branch, so after merging current branch to main it will be the same as $1 but you can commit this once" + +git fetch origin +git branch +git status +echo -n 'proceed (ctrl+c to stop)? ' +read + +git rm -r --cached . +# git checkout origin/$1 -- . +git checkout $1 -- . +git add -A + +echo "Now you can do: git commit -S -asm 'msg'; git push" diff --git a/utils/otel_dd/api_usage_stats_ddog.py b/utils/otel_dd/api_usage_stats_ddog.py index 003d6232c..6b8086765 100755 --- a/utils/otel_dd/api_usage_stats_ddog.py +++ b/utils/otel_dd/api_usage_stats_ddog.py @@ -26,12 +26,18 @@ import datetime as dt import json import os +import re import sys import urllib.error import urllib.request from typing import Any, Dict, List, Optional, Tuple +_ENV_RE = re.compile(r"(^|\s)env\s*:") + +def has_env_filter(query: str) -> bool: + return bool(_ENV_RE.search(query)) + def eprint(*args: Any) -> None: print(*args, file=sys.stderr) @@ -193,11 +199,15 @@ def main() -> int: p.add_argument("--from", dest="time_from", default="now-60m", help='Time range start (Datadog format), default "now-60m"') p.add_argument("--to", dest="time_to", default="now", help='Time range end (Datadog format), default "now"') - p.add_argument("--query", default="service:easycla-backend env:dev", help='Datadog query string (default: "service:easycla-backend env:dev")') p.add_argument("--limit", type=int, default=5000, help="Page limit per request (default: 5000)") p.add_argument("--verbose", action="store_true", help="Log progress to stderr") + p.add_argument("--env", "--environment", "--stage", dest="env", default=os.getenv("DD_ENV") or os.getenv("ENV") or os.getenv("STAGE") or "dev", help='Datadog env tag value (default: DD_ENV/ENV/STAGE or "dev")') + p.add_argument("--query", default="service:easycla-backend", help='Datadog query string WITHOUT env (env is appended unless query already contains env:...) (default: "service:easycla-backend")') args = p.parse_args() + query = (args.query or "").strip() + if args.env and not has_env_filter(query): + query = f"{query} env:{args.env}".strip() if query else f"env:{args.env}" # Default skip-e2e unless explicitly --no-skip-e2e skip_e2e = True @@ -217,7 +227,7 @@ def main() -> int: dd_site=dd_site, # type: ignore[arg-type] dd_api_key=dd_api_key, # type: ignore[arg-type] dd_app_key=dd_app_key, # type: ignore[arg-type] - query=args.query, + query=query, time_from=args.time_from, time_to=args.time_to, limit=args.limit, diff --git a/utils/otel_dd/check_spans_in_ddog.sh b/utils/otel_dd/check_spans_in_ddog.sh index 4d0e4658f..9fd421902 100755 --- a/utils/otel_dd/check_spans_in_ddog.sh +++ b/utils/otel_dd/check_spans_in_ddog.sh @@ -1,32 +1,67 @@ #!/bin/bash +set -euo pipefail + # Example: -# ./utils/otel_dd/check_spans_in_ddog.sh --skip-e2e | jq -r '.data[].attributes.custom.http.route' | sort | uniq +# ./utils/otel_dd/check_spans_in_ddog.sh --env prod --skip-e2e \ +# | jq -r '.data[].attributes.custom.http.route' | sort | uniq + +usage() { + cat <<'EOF' >&2 +Usage: + check_spans_in_ddog.sh [--env ] [--stage ] [--skip-e2e|--no-skip-e2e] + +Env vars: + DD_SITE, DD_API_KEY, DD_APP_KEY (required) + DD_ENV / ENV / STAGE (optional; default "dev") + DD_SERVICE (optional; default "easycla-backend") + +Notes: + - Filters Datadog span events by: service: env: + - Skips spans where attributes.custom.easycla.e2e == "true" when --skip-e2e +EOF +} SKIP_E2E=0 -for arg in "$@"; do - case "$arg" in - --skip-e2e) SKIP_E2E=1 ;; - --no-skip-e2e) SKIP_E2E=0 ;; - *) ;; +DD_ENV="${DD_ENV:-${ENV:-${STAGE:-dev}}}" +DD_SERVICE="${DD_SERVICE:-easycla-backend}" + +while [[ $# -gt 0 ]]; do + case "$1" in + --skip-e2e) SKIP_E2E=1; shift ;; + --no-skip-e2e) SKIP_E2E=0; shift ;; + --env|--environment|--stage) + [[ $# -ge 2 ]] || { echo "ERROR: $1 requires a value" >&2; usage; exit 2; } + DD_ENV="$2" + shift 2 + ;; + --service) + [[ $# -ge 2 ]] || { echo "ERROR: --service requires a value" >&2; usage; exit 2; } + DD_SERVICE="$2" + shift 2 + ;; + -h|--help) usage; exit 0 ;; + *) + echo "ERROR: unknown arg: $1" >&2 + usage + exit 2 + ;; esac done -payload='{ - "data": { - "type": "search_request", - "attributes": { - "filter": { - "from": "now-60m", - "to": "now", - "query": "service:easycla-backend env:dev" - }, - "sort": "timestamp", - "page": { "limit": 5000 } +QUERY="service:${DD_SERVICE} env:${DD_ENV}" + +# Build request JSON safely with jq (avoids quoting bugs) +payload="$(jq -n --arg query "$QUERY" '{ + data: { + type: "search_request", + attributes: { + filter: { from: "now-60m", to: "now", query: $query }, + sort: "timestamp", + page: { limit: 5000 } } } -}' +}')" -# jq helper: treat missing as false; accept "true"/true jq_filter=' def is_e2e: (.attributes.custom.easycla.e2e // false) From 96546ee92cbfeb4c01185d8843a4f7d8f9caafd9 Mon Sep 17 00:00:00 2001 From: Lukasz Gryglicki Date: Thu, 5 Mar 2026 09:59:51 +0100 Subject: [PATCH 2/3] Add license header Signed-off-by: Lukasz Gryglicki Assisted by [OpenAI](https://platform.openai.com/) Assisted by [GitHub Copilot](https://github.com/features/copilot) --- cla-backend/cla/tests/unit/test_jwt_auth.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cla-backend/cla/tests/unit/test_jwt_auth.py b/cla-backend/cla/tests/unit/test_jwt_auth.py index 4d04fe26d..df1441a3e 100644 --- a/cla-backend/cla/tests/unit/test_jwt_auth.py +++ b/cla-backend/cla/tests/unit/test_jwt_auth.py @@ -1,3 +1,6 @@ +# Copyright The Linux Foundation and each contributor to CommunityBridge. +# SPDX-License-Identifier: MIT + """Unit tests validating the PyJWT migration does not break JWT/auth processing. These tests are intentionally offline: From da99c560dbfb6013de0226282b878f6b99217ccf Mon Sep 17 00:00:00 2001 From: Lukasz Gryglicki Date: Thu, 5 Mar 2026 10:26:25 +0100 Subject: [PATCH 3/3] Add missing license header 2 Signed-off-by: Lukasz Gryglicki Assisted by [OpenAI](https://platform.openai.com/) Assisted by [GitHub Copilot](https://github.com/features/copilot) --- utils/otel_dd/api_usage_stats_ddog.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/utils/otel_dd/api_usage_stats_ddog.py b/utils/otel_dd/api_usage_stats_ddog.py index 6b8086765..0a22df79e 100755 --- a/utils/otel_dd/api_usage_stats_ddog.py +++ b/utils/otel_dd/api_usage_stats_ddog.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 + +# Copyright The Linux Foundation and each contributor to CommunityBridge. +# SPDX-License-Identifier: MIT + """ Query Datadog span events and output per-route API usage statistics as CSV.