mattermost-community-enterp.../vendor/github.com/icrowley/fake/credit_cards.go
Claude ec1f89217a Merge: Complete Mattermost Server with Community Enterprise
Full Mattermost server source with integrated Community Enterprise features.
Includes vendor directory for offline/air-gapped builds.

Structure:
- enterprise-impl/: Enterprise feature implementations
- enterprise-community/: Init files that register implementations
- enterprise/: Bridge imports (community_imports.go)
- vendor/: All dependencies for offline builds

Build (online):
  go build ./cmd/mattermost

Build (offline/air-gapped):
  go build -mod=vendor ./cmd/mattermost

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 23:59:07 +09:00

93 lines
2.0 KiB
Go

package fake
import (
"fmt"
"sort"
"strconv"
"strings"
)
type creditCard struct {
vendor string
length int
prefixes []int
}
func (c creditCard) RandomPrefix() int {
return c.prefixes[r.Intn(len(c.prefixes))]
}
var (
creditCards = map[string]creditCard{
"visa": {"VISA", 16, []int{4539, 4556, 4916, 4532, 4929, 40240071, 4485, 4716, 4}},
"mastercard": {"MasterCard", 16, []int{51, 52, 53, 54, 55}},
"amex": {"American Express", 15, []int{34, 37}},
"discover": {"Discover", 16, []int{6011}},
}
creditCardsKeys = make([]string, len(creditCards))
)
func init() {
n := 0
for key := range creditCards {
creditCardsKeys[n] = key
n++
}
sort.Strings(creditCardsKeys)
}
// CreditCardType returns one of the following credit values:
// VISA, MasterCard, American Express and Discover
func CreditCardType() string {
n := len(creditCards)
var vendors []string
for _, cc := range creditCards {
vendors = append(vendors, cc.vendor)
}
return vendors[r.Intn(n)]
}
// CreditCardNum generated credit card number according to the card number rules
func CreditCardNum(vendor string) string {
if vendor != "" {
vendor = strings.ToLower(vendor)
} else {
vendor = creditCardsKeys[r.Intn(len(creditCardsKeys))]
}
card, ok := creditCards[vendor]
if !ok {
panic(fmt.Sprintf("unsupported vendor %q", vendor))
}
prefix := strconv.Itoa(card.RandomPrefix())
num := []rune(prefix)
for i := 0; i < card.length-len(prefix)-1; i++ {
num = append(num, rune(strconv.Itoa(r.Intn(10))[0]))
}
num = append(num, creditCardNumChecksum(num))
return string(num)
}
func creditCardNumChecksum(num []rune) rune {
// See: https://en.wikipedia.org/wiki/Luhn_algorithm
sum := 0
pos := 0
for i := len(num) - 1; i >= 0; i-- {
n := int(num[i] - '0')
if pos%2 == 0 {
n *= 2
if n > 9 {
n -= 9
}
}
sum += n
pos++
}
// https://en.wikipedia.org/wiki/Talk:Luhn_algorithm#Formula_error
checksum := 10 - (sum%10)%10
return rune(strconv.Itoa(checksum)[0])
}