user.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package ovpm
  2. import (
  3. "fmt"
  4. "net"
  5. "time"
  6. "github.com/Sirupsen/logrus"
  7. "github.com/asaskevich/govalidator"
  8. "github.com/cad/ovpm/pki"
  9. "github.com/jinzhu/gorm"
  10. )
  11. // User represents the interface that is being used within the public api.
  12. type User interface {
  13. GetUsername() string
  14. GetServerSerialNumber() string
  15. GetCert() string
  16. }
  17. // DBUser is database model for VPN users.
  18. type DBUser struct {
  19. gorm.Model
  20. ServerID uint
  21. Server DBServer
  22. Username string `gorm:"unique_index"`
  23. Cert string
  24. ServerSerialNumber string
  25. Password string
  26. Key string
  27. }
  28. // DBRevoked is a database model for revoked VPN users.
  29. type DBRevoked struct {
  30. gorm.Model
  31. SerialNumber string
  32. }
  33. func (u *DBUser) setPassword(password string) error {
  34. // TODO(cad): Use a proper password hashing algorithm here.
  35. u.Password = password
  36. return nil
  37. }
  38. // CheckPassword returns wether the given password is correct for the user.
  39. func (u *DBUser) CheckPassword(password string) bool {
  40. return u.Password == password
  41. }
  42. // GetUser finds and returns the user with the given username from database.
  43. func GetUser(username string) (*DBUser, error) {
  44. user := DBUser{}
  45. db.Where(&DBUser{Username: username}).First(&user)
  46. if db.NewRecord(&user) {
  47. // user is not found
  48. return nil, fmt.Errorf("user not found: %s", username)
  49. }
  50. return &user, nil
  51. }
  52. // GetAllUsers returns all recorded users in the database.
  53. func GetAllUsers() ([]*DBUser, error) {
  54. var users []*DBUser
  55. db.Find(&users)
  56. return users, nil
  57. }
  58. // CreateNewUser creates a new user with the given username and password in the database.
  59. // It also generates the necessary client keys and signs certificates with the current
  60. // server's CA.
  61. func CreateNewUser(username, password string) (*DBUser, error) {
  62. if !IsInitialized() {
  63. return nil, fmt.Errorf("you first need to create server")
  64. }
  65. // Validate user input.
  66. if govalidator.IsNull(username) {
  67. return nil, fmt.Errorf("validation error: %s can not be null", username)
  68. }
  69. if !govalidator.IsAlphanumeric(username) {
  70. return nil, fmt.Errorf("validation error: `%s` can only contain letters and numbers", username)
  71. }
  72. ca, err := GetSystemCA()
  73. if err != nil {
  74. return nil, err
  75. }
  76. clientCert, err := pki.NewClientCertHolder(ca, username)
  77. if err != nil {
  78. return nil, fmt.Errorf("can not create client cert %s: %v", username, err)
  79. }
  80. server, err := GetServerInstance()
  81. if err != nil {
  82. return nil, fmt.Errorf("can not get server: %v", err)
  83. }
  84. user := DBUser{
  85. Username: username,
  86. Password: password,
  87. Cert: clientCert.Cert,
  88. Key: clientCert.Key,
  89. ServerSerialNumber: server.SerialNumber,
  90. }
  91. db.Create(&user)
  92. if db.NewRecord(&user) {
  93. // user is still not created
  94. return nil, fmt.Errorf("can not create user in database: %s", user.Username)
  95. }
  96. logrus.Infof("user created: %s", username)
  97. // Emit server config
  98. err = Emit()
  99. if err != nil {
  100. return nil, err
  101. }
  102. return &user, nil
  103. }
  104. // Delete deletes a user by the given username from the database.
  105. func (u *DBUser) Delete() error {
  106. if db.NewRecord(&u) {
  107. // user is not found
  108. return fmt.Errorf("user is not initialized: %s", u.Username)
  109. }
  110. crt, err := pki.ReadCertFromPEM(u.Cert)
  111. if err != nil {
  112. return fmt.Errorf("can not get user's certificate: %v", err)
  113. }
  114. db.Create(&DBRevoked{
  115. SerialNumber: crt.SerialNumber.Text(16),
  116. })
  117. db.Unscoped().Delete(&u)
  118. logrus.Infof("user deleted: %s", u.GetUsername())
  119. err = Emit()
  120. if err != nil {
  121. return err
  122. }
  123. u = nil // delete the existing user struct
  124. return nil
  125. }
  126. // ResetPassword resets the users password into the provided password.
  127. func (u *DBUser) ResetPassword(password string) error {
  128. err := u.setPassword(password)
  129. if err != nil {
  130. // user password can not be updated
  131. return fmt.Errorf("user password can not be updated %s: %v", u.Username, err)
  132. }
  133. db.Save(u)
  134. err = Emit()
  135. if err != nil {
  136. return err
  137. }
  138. logrus.Infof("user password reset: %s", u.GetUsername())
  139. return nil
  140. }
  141. // Renew creates a key and a ceritificate signed by the current server's CA.
  142. //
  143. // This is often used to sign users when the current CA is changed while there are
  144. // still existing users in the database.
  145. func (u *DBUser) Renew() error {
  146. if !IsInitialized() {
  147. return fmt.Errorf("you first need to create server")
  148. }
  149. ca, err := GetSystemCA()
  150. if err != nil {
  151. return err
  152. }
  153. clientCert, err := pki.NewClientCertHolder(ca, u.Username)
  154. if err != nil {
  155. return fmt.Errorf("can not create client cert %s: %v", u.Username, err)
  156. }
  157. server, err := GetServerInstance()
  158. if err != nil {
  159. return err
  160. }
  161. u.Cert = clientCert.Cert
  162. u.Key = clientCert.Key
  163. u.ServerSerialNumber = server.SerialNumber
  164. db.Save(&u)
  165. err = Emit()
  166. if err != nil {
  167. return err
  168. }
  169. logrus.Infof("user renewed cert: %s", u.GetUsername())
  170. return nil
  171. }
  172. // GetUsername returns user's username.
  173. func (u *DBUser) GetUsername() string {
  174. return u.Username
  175. }
  176. // GetCert returns user's public certificate.
  177. func (u *DBUser) GetCert() string {
  178. return u.Cert
  179. }
  180. // GetServerSerialNumber returns user's server serial number.
  181. func (u *DBUser) GetServerSerialNumber() string {
  182. return u.ServerSerialNumber
  183. }
  184. // GetCreatedAt returns user's creation time.
  185. func (u *DBUser) GetCreatedAt() string {
  186. return u.CreatedAt.Format(time.UnixDate)
  187. }
  188. // getIP returns user's vpn ip addr.
  189. func (u *DBUser) getIP() net.IP {
  190. clientsNetMask := net.IPMask(net.ParseIP(_DefaultServerNetMask))
  191. clientsNetPrefix := net.ParseIP(_DefaultServerNetwork)
  192. clientNet := clientsNetPrefix.Mask(clientsNetMask).To4()
  193. clientNet[3] = byte(u.ID)
  194. return clientNet
  195. }
  196. // GetIPNet returns user's vpn ip network. (e.g. 192.168.0.1/24)
  197. func (u *DBUser) GetIPNet() string {
  198. mask := net.IPMask(net.ParseIP(_DefaultServerNetMask))
  199. ipn := net.IPNet{
  200. IP: u.getIP(),
  201. Mask: mask,
  202. }
  203. return ipn.String()
  204. }