Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: rate limit auth #3820

Merged
merged 117 commits into from
Aug 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
d6464e8
fix: rate limit auth
Aug 12, 2022
01714e9
Merge branch 'main' into fix/rate-limit-auth
zomars Aug 12, 2022
9d04d74
fix: replace lru-cache w memory-cache
Aug 12, 2022
faad0f6
remove comments
Aug 12, 2022
00ac9ef
fix: yarn.lock
Aug 12, 2022
7e4d532
fix: remove changes yarn lock
Aug 12, 2022
9d45ff9
fix: add missing EOL empty liune
Aug 12, 2022
bc881f5
Merge branch 'main' into fix/rate-limit-auth
zomars Aug 12, 2022
f0083db
Merge branch 'main' into fix/rate-limit-auth
zomars Aug 12, 2022
25d1981
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 12, 2022
49de58c
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 12, 2022
c6d424b
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 12, 2022
0d65214
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 12, 2022
a0efe69
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 12, 2022
5f5b2e1
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 13, 2022
54a79b1
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 13, 2022
fd4a3b3
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 13, 2022
3cf28c3
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
71b9b25
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
669ce61
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
c46ca8b
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
4a43a02
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
330c883
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
bd27676
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
bd28d9f
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
4017e9b
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
6cb76e6
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 15, 2022
b240086
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 16, 2022
7328292
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 16, 2022
36fb15d
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 16, 2022
de737cd
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 16, 2022
206efcd
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 16, 2022
00f0017
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 16, 2022
a64a311
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 17, 2022
203e659
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 17, 2022
238603d
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 17, 2022
69c4c47
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 17, 2022
055f7c4
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 17, 2022
0a7620b
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 17, 2022
a1b7bfc
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 18, 2022
4260d32
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 18, 2022
d230e1a
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 18, 2022
47ce190
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 19, 2022
a5fe57c
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 22, 2022
6c84e70
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 22, 2022
8148fbf
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 22, 2022
8f90f18
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 22, 2022
bdc0cc0
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 22, 2022
dd578b7
fix: move rate limiter so it kicks the last, limit to 10 tries per mi…
Aug 22, 2022
4676a90
fix: move limiter w rest of code
Aug 22, 2022
5a0c974
test: trying fix onboardong
Aug 22, 2022
82ebef3
fix: undo changes in globalSetup.ts
Aug 22, 2022
86b2c14
test: fix disable login for onboarding
Aug 22, 2022
ccf26c2
fix: use username instead of email for token check
Aug 22, 2022
92c0f8e
fix: tests
Aug 22, 2022
397d2a3
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 22, 2022
3486369
fix: don't run on test
Aug 22, 2022
72d9663
Merge branch 'main' into fix/rate-limit-auth
agustif Aug 22, 2022
e782de1
fix: add missing comma
Aug 22, 2022
d901948
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 22, 2022
6d980dd
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 23, 2022
b38b09f
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 24, 2022
44759e7
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 24, 2022
e1aeedd
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 24, 2022
1551218
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 24, 2022
c03e922
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 24, 2022
8ea4ca3
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 24, 2022
e9d05b0
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
5f6a484
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
a33146c
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
0a4b8b2
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
8018d5c
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
4cf4347
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
5ebc1e3
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
d2915d9
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
cc1d6c9
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 25, 2022
8a9dc75
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
7d7e0a1
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
dec0f6c
Merge branch 'main' into fix/rate-limit-auth
PeerRich Aug 26, 2022
71c7214
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
7893ff4
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
3823ca6
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
837f0b8
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
d7f8d29
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
2d475c5
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
b0c5bbe
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
76ad2e7
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
8e58ee7
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
7e12f45
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
2a234d7
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 26, 2022
1880f6f
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 27, 2022
305be58
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 28, 2022
6968dbd
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 29, 2022
8820429
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 29, 2022
82ff26c
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 29, 2022
78bfcb0
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 29, 2022
f23090f
fix: remove uniqueTokenPerInterval
Aug 29, 2022
f03eaff
fix: add errorcode to packages lib auth
Aug 29, 2022
e44d65b
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 29, 2022
6c09c53
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 29, 2022
fa2187a
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 29, 2022
f3f93b6
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
ed978ec
Update packages/lib/rateLimit.ts
agustif Aug 30, 2022
fc376b6
Update packages/lib/rateLimit.ts
agustif Aug 30, 2022
1969935
Update packages/lib/rateLimit.ts
agustif Aug 30, 2022
0704bdf
fix: rename interval -> intervalInMs
Aug 30, 2022
6799f63
fix: check user.email not username which could be empty
Aug 30, 2022
c68cb36
fix: rateLimit update all naming
Aug 30, 2022
958bc8f
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
60a8d4a
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
f9c6ca8
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
ba1d9c9
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
9d3630a
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
2eed192
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
21093d4
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
6094159
Merge branch 'main' into fix/rate-limit-auth
kodiakhq[bot] Aug 30, 2022
4164b37
Merge branch 'main' into fix/rate-limit-auth
agustif Aug 30, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/web/lib/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export enum ErrorCode {
InternalServerError = "internal-server-error",
NewPasswordMatchesOld = "new-password-matches-old",
ThirdPartyIdentityProviderEnabled = "third-party-identity-provider-enabled",
RateLimitExceeded = "rate-limit-exceeded",
InvalidPassword = "invalid-password",
}

Expand Down
6 changes: 6 additions & 0 deletions apps/web/pages/api/auth/[...nextauth].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import ImpersonationProvider from "@calcom/features/ee/impersonation/lib/Imperso
import { WEBAPP_URL } from "@calcom/lib/constants";
import { symmetricDecrypt } from "@calcom/lib/crypto";
import { defaultCookies } from "@calcom/lib/default-cookies";
import rateLimit from "@calcom/lib/rateLimit";
import { serverConfig } from "@calcom/lib/serverConfig";
import prisma from "@calcom/prisma";

Expand Down Expand Up @@ -100,6 +101,11 @@ const providers: Provider[] = [
}
}

const limiter = rateLimit({
intervalInMs: 60 * 1000, // 1 minute
});
await limiter.check(10, user.email); // 10 requests per minute

return {
id: user.id,
username: user.username,
Expand Down
3 changes: 2 additions & 1 deletion apps/web/pages/auth/login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ export default function Login({
const [errorMessage, setErrorMessage] = useState<string | null>(null);

const errorMessages: { [key: string]: string } = {
// [ErrorCode.SecondFactorRequired]: t("2fa_enabled_instructions"),
[ErrorCode.RateLimitExceeded]: t("rate_limit_exceeded"),
[ErrorCode.SecondFactorRequired]: t("2fa_enabled_instructions"),
[ErrorCode.IncorrectPassword]: `${t("incorrect_password")} ${t("please_try_again")}`,
[ErrorCode.UserNotFound]: t("no_account_exists"),
[ErrorCode.IncorrectTwoFactorCode]: `${t("incorrect_2fa_code")} ${t("please_try_again")}`,
Expand Down
1 change: 1 addition & 0 deletions apps/web/public/static/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -1044,6 +1044,7 @@
"using_additional_inputs_as_variables": "How to use additional inputs as variables?",
"download_desktop_app": "Download desktop app",
"set_ping_link": "Set Ping link",
"rate_limit_exceeded": "Rate limit exceeded",
"when_something_happens": "When something happens",
"action_is_performed": "An action is performed",
"test_action": "Test action",
Expand Down
22 changes: 22 additions & 0 deletions packages/lib/auth.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { IdentityProvider } from "@prisma/client";
import { compare, hash } from "bcryptjs";
import type { NextApiRequest } from "next";
import type { Session } from "next-auth";
Expand Down Expand Up @@ -60,3 +61,24 @@ export const ensureSession = async (ctxOrReq: CtxOrReq) => {
if (!session?.user.id) throw new HttpError({ statusCode: 401, message: "Unauthorized" });
return session;
};

export enum ErrorCode {
UserNotFound = "user-not-found",
IncorrectPassword = "incorrect-password",
UserMissingPassword = "missing-password",
TwoFactorDisabled = "two-factor-disabled",
TwoFactorAlreadyEnabled = "two-factor-already-enabled",
TwoFactorSetupRequired = "two-factor-setup-required",
SecondFactorRequired = "second-factor-required",
IncorrectTwoFactorCode = "incorrect-two-factor-code",
InternalServerError = "internal-server-error",
NewPasswordMatchesOld = "new-password-matches-old",
ThirdPartyIdentityProviderEnabled = "third-party-identity-provider-enabled",
RateLimitExceeded = "rate-limit-exceeded",
}

export const identityProviderNameMap: { [key in IdentityProvider]: string } = {
[IdentityProvider.CAL]: "Cal",
[IdentityProvider.GOOGLE]: "Google",
[IdentityProvider.SAML]: "SAML",
};
27 changes: 27 additions & 0 deletions packages/lib/rateLimit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import cache from "memory-cache";

import { ErrorCode } from "./auth";

const rateLimit = (options: { intervalInMs: number }) => {
return {
check: (requestLimit: number, uniqueIdentifier: string) => {
const count = cache.get(uniqueIdentifier) || [0];
if (count[0] === 0) {
cache.put(uniqueIdentifier, count, options.intervalInMs);
}
count[0] += 1;

const currentUsage = count[0];
const isRateLimited = currentUsage >= requestLimit;

if (isRateLimited) {
throw new Error(ErrorCode.RateLimitExceeded);
}

return { isRateLimited, requestLimit, remaining: isRateLimited ? 0 : requestLimit - currentUsage };
},
};
};

export default rateLimit;