mysql.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package dataprovider
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "time"
  6. "github.com/drakkan/sftpgo/logger"
  7. )
  8. // MySQLProvider auth provider for MySQL/MariaDB database
  9. type MySQLProvider struct {
  10. dbHandle *sql.DB
  11. }
  12. func initializeMySQLProvider() error {
  13. var err error
  14. logSender = MySQLDataProviderName
  15. dbHandle, err := sql.Open("mysql", getMySQLConnectionString(false))
  16. if err == nil {
  17. providerLog(logger.LevelDebug, "mysql database handle created, connection string: %#v, pool size: %v",
  18. getMySQLConnectionString(true), config.PoolSize)
  19. dbHandle.SetMaxOpenConns(config.PoolSize)
  20. dbHandle.SetConnMaxLifetime(1800 * time.Second)
  21. provider = MySQLProvider{dbHandle: dbHandle}
  22. } else {
  23. providerLog(logger.LevelWarn, "error creating mysql database handler, connection string: %#v, error: %v",
  24. getMySQLConnectionString(true), err)
  25. }
  26. return err
  27. }
  28. func getMySQLConnectionString(redactedPwd bool) string {
  29. var connectionString string
  30. if len(config.ConnectionString) == 0 {
  31. password := config.Password
  32. if redactedPwd {
  33. password = "[redacted]"
  34. }
  35. connectionString = fmt.Sprintf("%v:%v@tcp([%v]:%v)/%v?charset=utf8&interpolateParams=true&timeout=10s&tls=%v&writeTimeout=10s&readTimeout=10s",
  36. config.Username, password, config.Host, config.Port, config.Name, getSSLMode())
  37. } else {
  38. connectionString = config.ConnectionString
  39. }
  40. return connectionString
  41. }
  42. func (p MySQLProvider) checkAvailability() error {
  43. return sqlCommonCheckAvailability(p.dbHandle)
  44. }
  45. func (p MySQLProvider) validateUserAndPass(username string, password string) (User, error) {
  46. return sqlCommonValidateUserAndPass(username, password, p.dbHandle)
  47. }
  48. func (p MySQLProvider) validateUserAndPubKey(username string, publicKey string) (User, string, error) {
  49. return sqlCommonValidateUserAndPubKey(username, publicKey, p.dbHandle)
  50. }
  51. func (p MySQLProvider) getUserByID(ID int64) (User, error) {
  52. return sqlCommonGetUserByID(ID, p.dbHandle)
  53. }
  54. func (p MySQLProvider) updateQuota(username string, filesAdd int, sizeAdd int64, reset bool) error {
  55. return sqlCommonUpdateQuota(username, filesAdd, sizeAdd, reset, p.dbHandle)
  56. }
  57. func (p MySQLProvider) updateLastLogin(username string) error {
  58. return sqlCommonUpdateLastLogin(username, p.dbHandle)
  59. }
  60. func (p MySQLProvider) getUsedQuota(username string) (int, int64, error) {
  61. return sqlCommonGetUsedQuota(username, p.dbHandle)
  62. }
  63. func (p MySQLProvider) userExists(username string) (User, error) {
  64. return sqlCommonCheckUserExists(username, p.dbHandle)
  65. }
  66. func (p MySQLProvider) addUser(user User) error {
  67. return sqlCommonAddUser(user, p.dbHandle)
  68. }
  69. func (p MySQLProvider) updateUser(user User) error {
  70. return sqlCommonUpdateUser(user, p.dbHandle)
  71. }
  72. func (p MySQLProvider) deleteUser(user User) error {
  73. return sqlCommonDeleteUser(user, p.dbHandle)
  74. }
  75. func (p MySQLProvider) dumpUsers() ([]User, error) {
  76. return sqlCommonDumpUsers(p.dbHandle)
  77. }
  78. func (p MySQLProvider) getUsers(limit int, offset int, order string, username string) ([]User, error) {
  79. return sqlCommonGetUsers(limit, offset, order, username, p.dbHandle)
  80. }
  81. func (p MySQLProvider) close() error {
  82. return p.dbHandle.Close()
  83. }