mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	* Initial commit for 2FA support Signed-off-by: Andrew <write@imaginarycode.com> * Add vendored files * Add missing depends * A few clean ups * Added improvements, proper encryption * Better encryption key * Simplify "key" generation * Make 2FA enrollment page more robust * Fix typo * Rename twofa/2FA to TwoFactor * UNIQUE INDEX -> UNIQUE
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package qr
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/boombuler/barcode/utils"
 | 
						|
)
 | 
						|
 | 
						|
const charSet string = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"
 | 
						|
 | 
						|
func stringToAlphaIdx(content string) <-chan int {
 | 
						|
	result := make(chan int)
 | 
						|
	go func() {
 | 
						|
		for _, r := range content {
 | 
						|
			idx := strings.IndexRune(charSet, r)
 | 
						|
			result <- idx
 | 
						|
			if idx < 0 {
 | 
						|
				break
 | 
						|
			}
 | 
						|
		}
 | 
						|
		close(result)
 | 
						|
	}()
 | 
						|
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
func encodeAlphaNumeric(content string, ecl ErrorCorrectionLevel) (*utils.BitList, *versionInfo, error) {
 | 
						|
 | 
						|
	contentLenIsOdd := len(content)%2 == 1
 | 
						|
	contentBitCount := (len(content) / 2) * 11
 | 
						|
	if contentLenIsOdd {
 | 
						|
		contentBitCount += 6
 | 
						|
	}
 | 
						|
	vi := findSmallestVersionInfo(ecl, alphaNumericMode, contentBitCount)
 | 
						|
	if vi == nil {
 | 
						|
		return nil, nil, errors.New("To much data to encode")
 | 
						|
	}
 | 
						|
 | 
						|
	res := new(utils.BitList)
 | 
						|
	res.AddBits(int(alphaNumericMode), 4)
 | 
						|
	res.AddBits(len(content), vi.charCountBits(alphaNumericMode))
 | 
						|
 | 
						|
	encoder := stringToAlphaIdx(content)
 | 
						|
 | 
						|
	for idx := 0; idx < len(content)/2; idx++ {
 | 
						|
		c1 := <-encoder
 | 
						|
		c2 := <-encoder
 | 
						|
		if c1 < 0 || c2 < 0 {
 | 
						|
			return nil, nil, fmt.Errorf("\"%s\" can not be encoded as %s", content, AlphaNumeric)
 | 
						|
		}
 | 
						|
		res.AddBits(c1*45+c2, 11)
 | 
						|
	}
 | 
						|
	if contentLenIsOdd {
 | 
						|
		c := <-encoder
 | 
						|
		if c < 0 {
 | 
						|
			return nil, nil, fmt.Errorf("\"%s\" can not be encoded as %s", content, AlphaNumeric)
 | 
						|
		}
 | 
						|
		res.AddBits(c, 6)
 | 
						|
	}
 | 
						|
 | 
						|
	addPaddingAndTerminator(res, vi)
 | 
						|
 | 
						|
	return res, vi, nil
 | 
						|
}
 |