Use single shared random string generation function (#15741)
* Use single shared random string generation function - Replace 3 functions that do the same with 1 shared one - Use crypto/rand over math/rand for a stronger RNG - Output only alphanumerical for URL compatibilty Fixes: #15536 * use const string method * Update modules/avatar/avatar.go Co-authored-by: a1012112796 <1012112796@qq.com> Co-authored-by: a1012112796 <1012112796@qq.com>release/v1.15
parent
270aab429e
commit
1e6fa57acb
|
@ -8,8 +8,8 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/generate"
|
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
|
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
|
@ -53,7 +53,7 @@ func addScratchHash(x *xorm.Engine) error {
|
||||||
|
|
||||||
for _, tfa := range tfas {
|
for _, tfa := range tfas {
|
||||||
// generate salt
|
// generate salt
|
||||||
salt, err := generate.GetRandomString(10)
|
salt, err := util.RandomString(10)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,9 @@ package migrations
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/generate"
|
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
|
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
)
|
)
|
||||||
|
@ -65,7 +65,7 @@ func hashAppToken(x *xorm.Engine) error {
|
||||||
|
|
||||||
for _, token := range tokens {
|
for _, token := range tokens {
|
||||||
// generate salt
|
// generate salt
|
||||||
salt, err := generate.GetRandomString(10)
|
salt, err := util.RandomString(10)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,8 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/base"
|
"code.gitea.io/gitea/modules/base"
|
||||||
"code.gitea.io/gitea/modules/generate"
|
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
|
|
||||||
gouuid "github.com/google/uuid"
|
gouuid "github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
@ -40,7 +40,7 @@ func (t *AccessToken) AfterLoad() {
|
||||||
|
|
||||||
// NewAccessToken creates new access token.
|
// NewAccessToken creates new access token.
|
||||||
func NewAccessToken(t *AccessToken) error {
|
func NewAccessToken(t *AccessToken) error {
|
||||||
salt, err := generate.GetRandomString(10)
|
salt, err := util.RandomString(10)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,10 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/generate"
|
|
||||||
"code.gitea.io/gitea/modules/secret"
|
"code.gitea.io/gitea/modules/secret"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
|
|
||||||
"github.com/pquerna/otp/totp"
|
"github.com/pquerna/otp/totp"
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
|
@ -34,11 +34,11 @@ type TwoFactor struct {
|
||||||
|
|
||||||
// GenerateScratchToken recreates the scratch token the user is using.
|
// GenerateScratchToken recreates the scratch token the user is using.
|
||||||
func (t *TwoFactor) GenerateScratchToken() (string, error) {
|
func (t *TwoFactor) GenerateScratchToken() (string, error) {
|
||||||
token, err := generate.GetRandomString(8)
|
token, err := util.RandomString(8)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
t.ScratchSalt, _ = generate.GetRandomString(10)
|
t.ScratchSalt, _ = util.RandomString(10)
|
||||||
t.ScratchHash = hashToken(token, t.ScratchSalt)
|
t.ScratchHash = hashToken(token, t.ScratchSalt)
|
||||||
return token, nil
|
return token, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ import (
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/base"
|
"code.gitea.io/gitea/modules/base"
|
||||||
"code.gitea.io/gitea/modules/generate"
|
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
@ -746,7 +745,7 @@ func IsUserExist(uid int64, name string) (bool, error) {
|
||||||
|
|
||||||
// GetUserSalt returns a random user salt token.
|
// GetUserSalt returns a random user salt token.
|
||||||
func GetUserSalt() (string, error) {
|
func GetUserSalt() (string, error) {
|
||||||
return generate.GetRandomString(10)
|
return util.RandomString(10)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGhostUser creates and returns a fake user for someone has deleted his/her account.
|
// NewGhostUser creates and returns a fake user for someone has deleted his/her account.
|
||||||
|
|
|
@ -12,10 +12,9 @@ import (
|
||||||
|
|
||||||
// Enable PNG support:
|
// Enable PNG support:
|
||||||
_ "image/png"
|
_ "image/png"
|
||||||
"math/rand"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
|
|
||||||
"github.com/issue9/identicon"
|
"github.com/issue9/identicon"
|
||||||
"github.com/nfnt/resize"
|
"github.com/nfnt/resize"
|
||||||
|
@ -29,8 +28,11 @@ const AvatarSize = 290
|
||||||
// in custom size (height and width).
|
// in custom size (height and width).
|
||||||
func RandomImageSize(size int, data []byte) (image.Image, error) {
|
func RandomImageSize(size int, data []byte) (image.Image, error) {
|
||||||
randExtent := len(palette.WebSafe) - 32
|
randExtent := len(palette.WebSafe) - 32
|
||||||
rand.Seed(time.Now().UnixNano())
|
integer, err := util.RandomInt(int64(randExtent))
|
||||||
colorIndex := rand.Intn(randExtent)
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("util.RandomInt: %v", err)
|
||||||
|
}
|
||||||
|
colorIndex := int(integer)
|
||||||
backColorIndex := colorIndex - 1
|
backColorIndex := colorIndex - 1
|
||||||
if backColorIndex < 0 {
|
if backColorIndex < 0 {
|
||||||
backColorIndex = randExtent - 1
|
backColorIndex = randExtent - 1
|
||||||
|
|
|
@ -13,12 +13,17 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_RandomImage(t *testing.T) {
|
func Test_RandomImageSize(t *testing.T) {
|
||||||
_, err := RandomImage([]byte("gogs@local"))
|
_, err := RandomImageSize(0, []byte("gitea@local"))
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
_, err = RandomImageSize(0, []byte("gogs@local"))
|
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
|
|
||||||
|
_, err = RandomImageSize(64, []byte("gitea@local"))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_RandomImage(t *testing.T) {
|
||||||
|
_, err := RandomImage([]byte("gitea@local"))
|
||||||
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_PrepareWithPNG(t *testing.T) {
|
func Test_PrepareWithPNG(t *testing.T) {
|
||||||
|
|
|
@ -1,100 +0,0 @@
|
||||||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a MIT-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package context
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/aes"
|
|
||||||
"crypto/cipher"
|
|
||||||
"crypto/rand"
|
|
||||||
"crypto/sha256"
|
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewSecret creates a new secret
|
|
||||||
func NewSecret() (string, error) {
|
|
||||||
return NewSecretWithLength(32)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewSecretWithLength creates a new secret for a given length
|
|
||||||
func NewSecretWithLength(length int64) (string, error) {
|
|
||||||
return randomString(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func randomBytes(len int64) ([]byte, error) {
|
|
||||||
b := make([]byte, len)
|
|
||||||
if _, err := rand.Read(b); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return b, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func randomString(len int64) (string, error) {
|
|
||||||
b, err := randomBytes(len)
|
|
||||||
return base64.URLEncoding.EncodeToString(b), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// AesEncrypt encrypts text and given key with AES.
|
|
||||||
func AesEncrypt(key, text []byte) ([]byte, error) {
|
|
||||||
block, err := aes.NewCipher(key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b := base64.StdEncoding.EncodeToString(text)
|
|
||||||
ciphertext := make([]byte, aes.BlockSize+len(b))
|
|
||||||
iv := ciphertext[:aes.BlockSize]
|
|
||||||
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
cfb := cipher.NewCFBEncrypter(block, iv)
|
|
||||||
cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b))
|
|
||||||
return ciphertext, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AesDecrypt decrypts text and given key with AES.
|
|
||||||
func AesDecrypt(key, text []byte) ([]byte, error) {
|
|
||||||
block, err := aes.NewCipher(key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(text) < aes.BlockSize {
|
|
||||||
return nil, errors.New("ciphertext too short")
|
|
||||||
}
|
|
||||||
iv := text[:aes.BlockSize]
|
|
||||||
text = text[aes.BlockSize:]
|
|
||||||
cfb := cipher.NewCFBDecrypter(block, iv)
|
|
||||||
cfb.XORKeyStream(text, text)
|
|
||||||
data, err := base64.StdEncoding.DecodeString(string(text))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return data, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EncryptSecret encrypts a string with given key into a hex string
|
|
||||||
func EncryptSecret(key string, str string) (string, error) {
|
|
||||||
keyHash := sha256.Sum256([]byte(key))
|
|
||||||
plaintext := []byte(str)
|
|
||||||
ciphertext, err := AesEncrypt(keyHash[:], plaintext)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return base64.StdEncoding.EncodeToString(ciphertext), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DecryptSecret decrypts a previously encrypted hex string
|
|
||||||
func DecryptSecret(key string, cipherhex string) (string, error) {
|
|
||||||
keyHash := sha256.Sum256([]byte(key))
|
|
||||||
ciphertext, err := base64.StdEncoding.DecodeString(cipherhex)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
plaintext, err := AesDecrypt(keyHash[:], ciphertext)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(plaintext), nil
|
|
||||||
}
|
|
|
@ -9,31 +9,12 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"io"
|
"io"
|
||||||
"math/big"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
"github.com/dgrijalva/jwt-go"
|
"github.com/dgrijalva/jwt-go"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetRandomString generate random string by specify chars.
|
|
||||||
func GetRandomString(n int) (string, error) {
|
|
||||||
const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
|
||||||
|
|
||||||
buffer := make([]byte, n)
|
|
||||||
max := big.NewInt(int64(len(alphanum)))
|
|
||||||
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
index, err := randomInt(max)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer[i] = alphanum[index]
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(buffer), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInternalToken generate a new value intended to be used by INTERNAL_TOKEN.
|
// NewInternalToken generate a new value intended to be used by INTERNAL_TOKEN.
|
||||||
func NewInternalToken() (string, error) {
|
func NewInternalToken() (string, error) {
|
||||||
secretBytes := make([]byte, 32)
|
secretBytes := make([]byte, 32)
|
||||||
|
@ -69,19 +50,10 @@ func NewJwtSecret() (string, error) {
|
||||||
|
|
||||||
// NewSecretKey generate a new value intended to be used by SECRET_KEY.
|
// NewSecretKey generate a new value intended to be used by SECRET_KEY.
|
||||||
func NewSecretKey() (string, error) {
|
func NewSecretKey() (string, error) {
|
||||||
secretKey, err := GetRandomString(64)
|
secretKey, err := util.RandomString(64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return secretKey, nil
|
return secretKey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func randomInt(max *big.Int) (int, error) {
|
|
||||||
rand, err := rand.Int(rand.Reader, max)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return int(rand.Int64()), nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a MIT-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package generate
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
|
||||||
retVal := m.Run()
|
|
||||||
|
|
||||||
os.Exit(retVal)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetRandomString(t *testing.T) {
|
|
||||||
randomString, err := GetRandomString(4)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Len(t, randomString, 4)
|
|
||||||
}
|
|
|
@ -13,29 +13,18 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New creats a new secret
|
// New creats a new secret
|
||||||
func New() (string, error) {
|
func New() (string, error) {
|
||||||
return NewWithLength(32)
|
return NewWithLength(44)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWithLength creates a new secret for a given length
|
// NewWithLength creates a new secret for a given length
|
||||||
func NewWithLength(length int64) (string, error) {
|
func NewWithLength(length int64) (string, error) {
|
||||||
return randomString(length)
|
return util.RandomString(length)
|
||||||
}
|
|
||||||
|
|
||||||
func randomBytes(len int64) ([]byte, error) {
|
|
||||||
b := make([]byte, len)
|
|
||||||
if _, err := rand.Read(b); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return b, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func randomString(len int64) (string, error) {
|
|
||||||
b, err := randomBytes(len)
|
|
||||||
return base64.URLEncoding.EncodeToString(b), err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AesEncrypt encrypts text and given key with AES.
|
// AesEncrypt encrypts text and given key with AES.
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
func TestNew(t *testing.T) {
|
func TestNew(t *testing.T) {
|
||||||
result, err := New()
|
result, err := New()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, len(result) > 32)
|
assert.True(t, len(result) == 44)
|
||||||
|
|
||||||
result2, err := New()
|
result2, err := New()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
|
@ -6,7 +6,9 @@ package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/rand"
|
||||||
"errors"
|
"errors"
|
||||||
|
"math/big"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -124,3 +126,28 @@ func MergeInto(dict map[string]interface{}, values ...interface{}) (map[string]i
|
||||||
|
|
||||||
return dict, nil
|
return dict, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RandomInt returns a random integer between 0 and limit, inclusive
|
||||||
|
func RandomInt(limit int64) (int64, error) {
|
||||||
|
int, err := rand.Int(rand.Reader, big.NewInt(limit))
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return int.Int64(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||||
|
|
||||||
|
// RandomString generates a random alphanumerical string
|
||||||
|
func RandomString(length int64) (string, error) {
|
||||||
|
bytes := make([]byte, length)
|
||||||
|
limit := int64(len(letters))
|
||||||
|
for i := range bytes {
|
||||||
|
num, err := RandomInt(limit)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
bytes[i] = letters[num]
|
||||||
|
}
|
||||||
|
return string(bytes), nil
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
@ -118,3 +119,40 @@ func Test_NormalizeEOL(t *testing.T) {
|
||||||
|
|
||||||
assert.Equal(t, []byte("mix\nand\nmatch\n."), NormalizeEOL([]byte("mix\r\nand\rmatch\n.")))
|
assert.Equal(t, []byte("mix\nand\nmatch\n."), NormalizeEOL([]byte("mix\r\nand\rmatch\n.")))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_RandomInt(t *testing.T) {
|
||||||
|
int, err := RandomInt(255)
|
||||||
|
assert.True(t, int >= 0)
|
||||||
|
assert.True(t, int <= 255)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_RandomString(t *testing.T) {
|
||||||
|
str1, err := RandomString(32)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
matches, err := regexp.MatchString(`^[a-zA-Z0-9]{32}$`, str1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, matches)
|
||||||
|
|
||||||
|
str2, err := RandomString(32)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
matches, err = regexp.MatchString(`^[a-zA-Z0-9]{32}$`, str1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, matches)
|
||||||
|
|
||||||
|
assert.NotEqual(t, str1, str2)
|
||||||
|
|
||||||
|
str3, err := RandomString(256)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
matches, err = regexp.MatchString(`^[a-zA-Z0-9]{256}$`, str3)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, matches)
|
||||||
|
|
||||||
|
str4, err := RandomString(256)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
matches, err = regexp.MatchString(`^[a-zA-Z0-9]{256}$`, str4)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, matches)
|
||||||
|
|
||||||
|
assert.NotEqual(t, str3, str4)
|
||||||
|
}
|
||||||
|
|
|
@ -13,11 +13,11 @@ import (
|
||||||
"code.gitea.io/gitea/modules/auth/openid"
|
"code.gitea.io/gitea/modules/auth/openid"
|
||||||
"code.gitea.io/gitea/modules/base"
|
"code.gitea.io/gitea/modules/base"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
"code.gitea.io/gitea/modules/generate"
|
|
||||||
"code.gitea.io/gitea/modules/hcaptcha"
|
"code.gitea.io/gitea/modules/hcaptcha"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/recaptcha"
|
"code.gitea.io/gitea/modules/recaptcha"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
"code.gitea.io/gitea/modules/web"
|
"code.gitea.io/gitea/modules/web"
|
||||||
"code.gitea.io/gitea/modules/web/middleware"
|
"code.gitea.io/gitea/modules/web/middleware"
|
||||||
"code.gitea.io/gitea/services/forms"
|
"code.gitea.io/gitea/services/forms"
|
||||||
|
@ -411,7 +411,7 @@ func RegisterOpenIDPost(ctx *context.Context) {
|
||||||
if length < 256 {
|
if length < 256 {
|
||||||
length = 256
|
length = 256
|
||||||
}
|
}
|
||||||
password, err := generate.GetRandomString(length)
|
password, err := util.RandomString(int64(length))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.RenderWithErr(err.Error(), tplSignUpOID, form)
|
ctx.RenderWithErr(err.Error(), tplSignUpOID, form)
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue