trial.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //go:build ee
  2. // +build ee
  3. package pro
  4. import (
  5. "crypto/rand"
  6. "encoding/json"
  7. "errors"
  8. "time"
  9. "github.com/gravitl/netmaker/database"
  10. "github.com/gravitl/netmaker/logger"
  11. "github.com/gravitl/netmaker/logic"
  12. "github.com/gravitl/netmaker/models"
  13. "github.com/gravitl/netmaker/netclient/ncutils"
  14. "github.com/gravitl/netmaker/servercfg"
  15. "golang.org/x/crypto/nacl/box"
  16. )
  17. type TrialInfo struct {
  18. PrivKey []byte `json:"priv_key"`
  19. PubKey []byte `json:"pub_key"`
  20. Secret []byte `json:"secret"`
  21. }
  22. func addTrialLicenseHook() {
  23. logic.HookManagerCh <- models.HookDetails{
  24. Hook: TrialLicenseHook,
  25. Interval: time.Hour,
  26. }
  27. }
  28. type TrialDates struct {
  29. TrialStartedAt time.Time `json:"trial_started_at"`
  30. TrialEndsAt time.Time `json:"trial_ends_at"`
  31. }
  32. const trial_table_name = "trial"
  33. const trial_data_key = "trialdata"
  34. // stores trial end date
  35. func initTrial() error {
  36. telData := logic.FetchTelemetryData()
  37. if telData.Hosts > 0 || telData.Networks > 0 || telData.Users > 0 {
  38. return nil // database is already populated, so skip creating trial
  39. }
  40. database.CreateTable(trial_table_name)
  41. records, err := database.FetchRecords(trial_table_name)
  42. if err != nil && !database.IsEmptyRecord(err) {
  43. return err
  44. }
  45. if len(records) > 0 {
  46. return nil
  47. }
  48. // setup encryption keys
  49. trafficPubKey, trafficPrivKey, err := box.GenerateKey(rand.Reader) // generate traffic keys
  50. if err != nil {
  51. return err
  52. }
  53. tPriv, err := ncutils.ConvertKeyToBytes(trafficPrivKey)
  54. if err != nil {
  55. return err
  56. }
  57. tPub, err := ncutils.ConvertKeyToBytes(trafficPubKey)
  58. if err != nil {
  59. return err
  60. }
  61. trialDates := TrialDates{
  62. TrialStartedAt: time.Now(),
  63. TrialEndsAt: time.Now().Add(time.Hour * 24 * 14),
  64. }
  65. t := TrialInfo{
  66. PrivKey: tPriv,
  67. PubKey: tPub,
  68. }
  69. tel, err := logic.FetchTelemetryRecord()
  70. if err != nil {
  71. return err
  72. }
  73. trialDatesData, err := json.Marshal(trialDates)
  74. if err != nil {
  75. return err
  76. }
  77. telePubKey, err := ncutils.ConvertBytesToKey(tel.TrafficKeyPub)
  78. if err != nil {
  79. return err
  80. }
  81. trialDatesSecret, err := ncutils.BoxEncrypt(trialDatesData, telePubKey, trafficPrivKey)
  82. if err != nil {
  83. return err
  84. }
  85. t.Secret = trialDatesSecret
  86. trialData, err := json.Marshal(t)
  87. if err != nil {
  88. return err
  89. }
  90. err = database.Insert(trial_data_key, string(trialData), trial_table_name)
  91. if err != nil {
  92. return err
  93. }
  94. return nil
  95. }
  96. // TrialLicenseHook - hook func to check if pro trial has ended
  97. func TrialLicenseHook() error {
  98. endDate, err := getTrialEndDate()
  99. if err != nil {
  100. logger.FatalLog0("failed to trial end date", err.Error())
  101. }
  102. if time.Now().After(endDate) {
  103. logger.Log(0, "***IMPORTANT: Your Trial Has Ended, to continue using pro version, please visit https://app.netmaker.io/ and create on-prem tenant to obtain a license***\nIf you wish to downgrade to community version, please run this command `/root/nm-quick.sh -d`")
  104. err = errors.New("your trial has ended")
  105. servercfg.ErrLicenseValidation = err
  106. return err
  107. }
  108. return nil
  109. }
  110. // get trial date
  111. func getTrialEndDate() (time.Time, error) {
  112. record, err := database.FetchRecord(trial_table_name, trial_data_key)
  113. if err != nil {
  114. return logic.DefaultTrialEndDate, err
  115. }
  116. var trialInfo TrialInfo
  117. err = json.Unmarshal([]byte(record), &trialInfo)
  118. if err != nil {
  119. return logic.DefaultTrialEndDate, err
  120. }
  121. tel, err := logic.FetchTelemetryRecord()
  122. if err != nil {
  123. return logic.DefaultTrialEndDate, err
  124. }
  125. telePrivKey, err := ncutils.ConvertBytesToKey(tel.TrafficKeyPriv)
  126. if err != nil {
  127. return logic.DefaultTrialEndDate, err
  128. }
  129. trialPubKey, err := ncutils.ConvertBytesToKey(trialInfo.PubKey)
  130. if err != nil {
  131. return logic.DefaultTrialEndDate, err
  132. }
  133. // decrypt secret
  134. secretDecrypt, err := ncutils.BoxDecrypt(trialInfo.Secret, trialPubKey, telePrivKey)
  135. if err != nil {
  136. return logic.DefaultTrialEndDate, err
  137. }
  138. trialDates := TrialDates{}
  139. err = json.Unmarshal(secretDecrypt, &trialDates)
  140. if err != nil {
  141. return logic.DefaultTrialEndDate, err
  142. }
  143. if trialDates.TrialEndsAt.IsZero() {
  144. return logic.DefaultTrialEndDate, errors.New("invalid date")
  145. }
  146. return trialDates.TrialEndsAt, nil
  147. }