-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Consume hcaptcha and pwn deps (#22610)
This PR just consumes the [hcaptcha](https://gitea.com/jolheiser/hcaptcha) and [haveibeenpwned](https://gitea.com/jolheiser/pwn) modules directly into Gitea. Also let this serve as a notice that I'm fine with transferring my license (which was already MIT) from my own name to "The Gitea Authors". Signed-off-by: jolheiser <john.olheiser@gmail.com>
- Loading branch information
Showing
10 changed files
with
530 additions
and
24 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// Copyright 2023 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
package hcaptcha | ||
|
||
const ( | ||
ErrMissingInputSecret ErrorCode = "missing-input-secret" | ||
ErrInvalidInputSecret ErrorCode = "invalid-input-secret" | ||
ErrMissingInputResponse ErrorCode = "missing-input-response" | ||
ErrInvalidInputResponse ErrorCode = "invalid-input-response" | ||
ErrBadRequest ErrorCode = "bad-request" | ||
ErrInvalidOrAlreadySeenResponse ErrorCode = "invalid-or-already-seen-response" | ||
ErrNotUsingDummyPasscode ErrorCode = "not-using-dummy-passcode" | ||
ErrSitekeySecretMismatch ErrorCode = "sitekey-secret-mismatch" | ||
) | ||
|
||
// ErrorCode is any possible error from hCaptcha | ||
type ErrorCode string | ||
|
||
// String fulfills the Stringer interface | ||
func (err ErrorCode) String() string { | ||
switch err { | ||
case ErrMissingInputSecret: | ||
return "Your secret key is missing." | ||
case ErrInvalidInputSecret: | ||
return "Your secret key is invalid or malformed." | ||
case ErrMissingInputResponse: | ||
return "The response parameter (verification token) is missing." | ||
case ErrInvalidInputResponse: | ||
return "The response parameter (verification token) is invalid or malformed." | ||
case ErrBadRequest: | ||
return "The request is invalid or malformed." | ||
case ErrInvalidOrAlreadySeenResponse: | ||
return "The response parameter has already been checked, or has another issue." | ||
case ErrNotUsingDummyPasscode: | ||
return "You have used a testing sitekey but have not used its matching secret." | ||
case ErrSitekeySecretMismatch: | ||
return "The sitekey is not registered with the provided secret." | ||
default: | ||
return "" | ||
} | ||
} | ||
|
||
// Error fulfills the error interface | ||
func (err ErrorCode) Error() string { | ||
return err.String() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
// Copyright 2023 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
package hcaptcha | ||
|
||
import ( | ||
"net/http" | ||
"os" | ||
"strings" | ||
"testing" | ||
"time" | ||
) | ||
|
||
const ( | ||
dummySiteKey = "10000000-ffff-ffff-ffff-000000000001" | ||
dummySecret = "0x0000000000000000000000000000000000000000" | ||
dummyToken = "10000000-aaaa-bbbb-cccc-000000000001" | ||
) | ||
|
||
func TestMain(m *testing.M) { | ||
os.Exit(m.Run()) | ||
} | ||
|
||
func TestCaptcha(t *testing.T) { | ||
tt := []struct { | ||
Name string | ||
Secret string | ||
Token string | ||
Error ErrorCode | ||
}{ | ||
{ | ||
Name: "Success", | ||
Secret: dummySecret, | ||
Token: dummyToken, | ||
}, | ||
{ | ||
Name: "Missing Secret", | ||
Token: dummyToken, | ||
Error: ErrMissingInputSecret, | ||
}, | ||
{ | ||
Name: "Missing Token", | ||
Secret: dummySecret, | ||
Error: ErrMissingInputResponse, | ||
}, | ||
{ | ||
Name: "Invalid Token", | ||
Secret: dummySecret, | ||
Token: "test", | ||
Error: ErrInvalidInputResponse, | ||
}, | ||
} | ||
|
||
for _, tc := range tt { | ||
t.Run(tc.Name, func(t *testing.T) { | ||
client, err := New(tc.Secret, WithHTTP(&http.Client{ | ||
Timeout: time.Second * 5, | ||
})) | ||
if err != nil { | ||
// The only error that can be returned from creating a client | ||
if tc.Error == ErrMissingInputSecret && err == ErrMissingInputSecret { | ||
return | ||
} | ||
t.Log(err) | ||
t.FailNow() | ||
} | ||
|
||
resp, err := client.Verify(tc.Token, PostOptions{ | ||
Sitekey: dummySiteKey, | ||
}) | ||
if err != nil { | ||
// The only error that can be returned prior to the request | ||
if tc.Error == ErrMissingInputResponse && err == ErrMissingInputResponse { | ||
return | ||
} | ||
t.Log(err) | ||
t.FailNow() | ||
} | ||
|
||
if tc.Error.String() != "" { | ||
if resp.Success { | ||
t.Log("Verification should fail.") | ||
t.Fail() | ||
} | ||
if len(resp.ErrorCodes) == 0 { | ||
t.Log("hCaptcha should have returned an error.") | ||
t.Fail() | ||
} | ||
var hasErr bool | ||
for _, err := range resp.ErrorCodes { | ||
if strings.EqualFold(err.String(), tc.Error.String()) { | ||
hasErr = true | ||
break | ||
} | ||
} | ||
if !hasErr { | ||
t.Log("hCaptcha did not return the error being tested") | ||
t.Fail() | ||
} | ||
} else if !resp.Success { | ||
t.Log("Verification should succeed.") | ||
t.Fail() | ||
} | ||
}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.