diff --git a/src/common/error.js b/src/common/error.js index d3547bab4df45..08e92a6dccfac 100644 --- a/src/common/error.js +++ b/src/common/error.js @@ -17,6 +17,7 @@ const SECONDARY_ERROR_MESSAGES = { GRAPHQL_ERROR: TRY_AGAIN_LATER, GITHUB_REST_API_ERROR: TRY_AGAIN_LATER, WAKATIME_USER_NOT_FOUND: "Make sure you have a public WakaTime profile", + WAKATIME_ERROR: "Check your WakaTime configuration", }; /** diff --git a/src/fetchers/stats.js b/src/fetchers/stats.js index 376a15816144e..1c88d858be225 100644 --- a/src/fetchers/stats.js +++ b/src/fetchers/stats.js @@ -199,7 +199,7 @@ const totalCommitsFetcher = async (username) => { res = await retryer(fetchTotalCommits, { login: username }); } catch (err) { logger.log(err); - throw new Error(err); + throw err; } const totalCount = res.data.total_count; diff --git a/src/fetchers/wakatime.js b/src/fetchers/wakatime.js index a081dbd2dc07d..088ba687b22b1 100644 --- a/src/fetchers/wakatime.js +++ b/src/fetchers/wakatime.js @@ -3,6 +3,8 @@ import axios from "axios"; import { CustomError, MissingParamError } from "../common/error.js"; +const ALLOWED_WAKATIME_DOMAINS = ["wakatime.com", "wakapi.dev"]; + /** * WakaTime data fetcher. * @@ -14,16 +16,25 @@ const fetchWakatimeStats = async ({ username, api_domain }) => { throw new MissingParamError(["username"]); } + const sanitizedDomain = api_domain + ? api_domain.replace(/\/$/gi, "").toLowerCase() + : "wakatime.com"; + + if (!ALLOWED_WAKATIME_DOMAINS.includes(sanitizedDomain)) { + throw new CustomError( + `Invalid api_domain. Allowed domains: ${ALLOWED_WAKATIME_DOMAINS.join(", ")}`, + CustomError.WAKATIME_ERROR, + ); + } + try { const { data } = await axios.get( - `https://${ - api_domain ? api_domain.replace(/\/$/gi, "") : "wakatime.com" - }/api/v1/users/${username}/stats?is_including_today=true`, + `https://${sanitizedDomain}/api/v1/users/${username}/stats?is_including_today=true`, ); return data.data; } catch (err) { - if (err.response.status < 200 || err.response.status > 299) { + if (err.response?.status < 200 || err.response?.status > 299) { throw new CustomError( `Could not resolve to a User with the login of '${username}'`, "WAKATIME_USER_NOT_FOUND", diff --git a/tests/calculateRank.test.js b/tests/calculateRank.test.js index 662dd2677f9ee..612f636dbb990 100644 --- a/tests/calculateRank.test.js +++ b/tests/calculateRank.test.js @@ -30,7 +30,7 @@ describe("Test calculateRank", () => { stars: 25, followers: 5, }), - ).toStrictEqual({ level: "B-", percentile: 65.02918514848255 }); + ).toStrictEqual({ level: "B-", percentile: 65.02918514848257 }); }); it("median user gets B+ rank", () => {