Skip to content
Snippets Groups Projects
Select Git revision
  • e6cf660056001771562ecad919346742b1367e51
  • without_tipselection default
  • develop protected
  • fix/grafana-local-dashboard
  • wasp
  • fix/dashboard-explorer-freeze
  • master
  • feat/timerqueue
  • test/sync_debug_and_650
  • feat/sync_revamp_inv
  • wip/sync
  • tool/db-recovery
  • portcheck/fix
  • fix/synchronization
  • feat/new-dashboard-analysis
  • feat/refactored-analysis-dashboard
  • feat/new-analysis-dashboard
  • test/demo-prometheus-fpc
  • prometheus_metrics
  • wip/analysis-server
  • merge/fpc-test-value-transfer
  • v0.2.2
  • v0.2.1
  • v0.2.0
  • v0.1.3
  • v0.1.2
  • v0.1.1
  • v0.1.0
28 results

message.go

Blame
  • saltmanager.go 2.32 KiB
    package saltmanager
    
    import (
    	"time"
    
    	"github.com/dgraph-io/badger"
    	"github.com/iotaledger/goshimmer/packages/daemon"
    	"github.com/iotaledger/goshimmer/packages/node"
    	"github.com/iotaledger/goshimmer/packages/settings"
    	"github.com/iotaledger/goshimmer/plugins/autopeering/types/salt"
    )
    
    var (
    	PRIVATE_SALT *salt.Salt
    	PUBLIC_SALT  *salt.Salt
    )
    
    func Configure(plugin *node.Plugin) {
    	PRIVATE_SALT = createSalt(PRIVATE_SALT_SETTINGS_KEY, PRIVATE_SALT_LIFETIME, Events.UpdatePrivateSalt.Trigger)
    	PUBLIC_SALT = createSalt(PUBLIC_SALT_SETTINGS_KEY, PUBLIC_SALT_LIFETIME, Events.UpdatePublicSalt.Trigger)
    }
    
    func generateNewSalt(key []byte, lifetime time.Duration) *salt.Salt {
    	newSalt := salt.New(lifetime)
    
    	if err := settings.Set(key, newSalt.Marshal()); err != nil {
    		panic(err)
    	}
    
    	return newSalt
    }
    
    func getSalt(key []byte, lifetime time.Duration) *salt.Salt {
    	saltBytes, err := settings.Get(key)
    	if err != nil {
    		if err == badger.ErrKeyNotFound {
    			return generateNewSalt(key, lifetime)
    		} else {
    			panic(err)
    		}
    	}
    
    	if resultingSalt, err := salt.Unmarshal(saltBytes); err != nil {
    		panic(err)
    	} else {
    		return resultingSalt
    	}
    }
    
    func updatePublicSalt(saltToUpdate *salt.Salt, settingsKey []byte, lifeSpan time.Duration, updateCallback func(params ...interface{})) {
    	newSalt := salt.New(lifeSpan)
    
    	saltToUpdate.Bytes = newSalt.Bytes
    	saltToUpdate.ExpirationTime = newSalt.ExpirationTime
    
    	if err := settings.Set(settingsKey, saltToUpdate.Marshal()); err != nil {
    		panic(err)
    	}
    
    	updateCallback(saltToUpdate)
    
    	scheduleUpdateForSalt(saltToUpdate, settingsKey, lifeSpan, updateCallback)
    }
    
    func scheduleUpdateForSalt(saltToUpdate *salt.Salt, settingsKey []byte, lifeSpan time.Duration, callback func(params ...interface{})) {
    	now := time.Now()
    
    	if saltToUpdate.ExpirationTime.Before(now) {
    		updatePublicSalt(saltToUpdate, settingsKey, lifeSpan, callback)
    	} else {
    		daemon.BackgroundWorker(func() {
    			select {
    			case <-time.After(saltToUpdate.ExpirationTime.Sub(now)):
    				updatePublicSalt(saltToUpdate, settingsKey, lifeSpan, callback)
    			case <-daemon.ShutdownSignal:
    				return
    			}
    		})
    	}
    }
    
    func createSalt(settingsKey []byte, lifeSpan time.Duration, updateCallback func(params ...interface{})) *salt.Salt {
    	newSalt := getSalt(settingsKey, lifeSpan)
    
    	scheduleUpdateForSalt(newSalt, settingsKey, lifeSpan, updateCallback)
    
    	return newSalt
    }