maddy
maddy copied to clipboard
Dear maddy author, please tell me about the function of batch creating users.
Dear maddy author, please tell me about the function of batch creating users. I currently have a requirement to have the golang program automatically create users. I tried to directly insert the database credentials.db, but the inserted database user could not log in normally. I would like to ask for guidance on how I should do this so that I can automatically generate users without having to manually go to the terminal to create new users.
I inserted this picture using the program, but I can't log in normally
about code: `package main
import ( "crypto/rand" "database/sql" "fmt" "log" "math/big"
_ "github.com/mattn/go-sqlite3"
"golang.org/x/crypto/bcrypt"
)
const ( emailDomain = "@xxxx.org" // 邮箱后缀 numAccounts = 10 // 要生成的账号数量 password = "123456" // 统一密码 dbPath = "credentials.db" // 数据库路径 )
// 生成随机的5位数字用户名 func generateRandomUsername() (string, error) { const digits = "0123456789" length := 5 username := make([]byte, length)
for i := 0; i < length; i++ {
num, err := rand.Int(rand.Reader, big.NewInt(int64(len(digits))))
if err != nil {
return "", err
}
username[i] = digits[num.Int64()]
}
return string(username), nil
}
// 生成 bcrypt 哈希密码并添加前缀 func hashPassword(password string) (string, error) { hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { return "", err } // 添加 "bcrypt:" 前缀 return "bcrypt:" + string(hashedPassword), nil }
// 添加用户到数据库
func addUser(db *sql.DB, key, value string) error {
query := INSERT INTO passwords (key, value) VALUES (?, ?)
_, err := db.Exec(query, key, value)
return err
}
func main() { // 打开数据库连接 db, err := sql.Open("sqlite3", dbPath) if err != nil { log.Fatalf("Failed to open database: %v", err) } defer db.Close()
// 开始生成用户
for i := 0; i < numAccounts; i++ {
username, err := generateRandomUsername()
if err != nil {
log.Printf("Failed to generate username: %v\n", err)
continue
}
email := username + emailDomain // 构造邮箱账号
hashedPassword, err := hashPassword(password)
if err != nil {
log.Printf("Failed to hash password for %s: %v\n", email, err)
continue
}
err = addUser(db, email, hashedPassword)
if err != nil {
log.Printf("Failed to add user %s: %v\n", email, err)
} else {
fmt.Printf("User %s added successfully\n", email)
}
}
} `
You can do something what I did with the password reset for Maddy specifically: https://github.com/hugmouse/maddy-password-reset/blob/master/main.go#L269
Instead of handling SQL yourself - use CLI that Maddy provides: https://maddy.email/tutorials/setting-up/#user-accounts-and-maddy-command
Created a minimal config to test it:
imap tcp://127.0.0.1:4444 {
auth pass_table sql_table {
driver sqlite3
dsn credentials.db
table_name passwords
}
storage imapsql sqlite3 test.db
}
$ sqlite3 credentials.db
sqlite>insert into passwords values ('[email protected]', 'bcrypt:$2a$10$HKhtEhpiroRvtJzcLicGAuRh8pEz6mux4qu6SRHIRsVtM7WgFk/9y');
bcrypt value is of "12345", generated using https://www.bcryptcalculator.com/encode I am able to login to IMAP using [email protected]:12345.