trial.go 3.9 KB

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