user.go 6.0 KB

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