From 50f4836e44a45755ac1095023887bc2fef0e35fb Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Wed, 16 Mar 2016 12:26:48 +0100 Subject: [PATCH] Fixed TLS for ICCC Added the hostname of the public server in order to send ICCC messages over TLS and HTTP/2 --- ConfigurationDB/CheckConfiguration.go | 1 + ICCC/Init.go | 9 +++ ICCC/RegisterListener2Database.go | 92 ++++++++++++++------------- ICCC/Scheme/Listener.go | 1 + ICCC/Send.go | 2 +- ICCC/Variables.go | 1 + System/Version/Variables.go | 2 +- 7 files changed, 61 insertions(+), 47 deletions(-) diff --git a/ConfigurationDB/CheckConfiguration.go b/ConfigurationDB/CheckConfiguration.go index 203caaf..bc85c5e 100644 --- a/ConfigurationDB/CheckConfiguration.go +++ b/ConfigurationDB/CheckConfiguration.go @@ -21,6 +21,7 @@ func checkConfiguration() { CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerWriteTimeoutSeconds`, `10`) CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerMaxHeaderLenBytes`, `10485760`) CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerPort`, `50000`) + CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerHostname`, `www.my-site.domain`) CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerReadTimeoutSeconds`, `10`) CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerWriteTimeoutSeconds`, `10`) CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerMaxHeaderLenBytes`, `1048576`) diff --git a/ICCC/Init.go b/ICCC/Init.go index 2f7825d..b4f7c1e 100644 --- a/ICCC/Init.go +++ b/ICCC/Init.go @@ -2,9 +2,11 @@ package ICCC import ( "container/list" + "github.com/SommerEngineering/Ocean/ConfigurationDB" "github.com/SommerEngineering/Ocean/Log" LM "github.com/SommerEngineering/Ocean/Log/Meta" "github.com/SommerEngineering/Ocean/Tools" + "strings" ) // Init this package. @@ -22,6 +24,13 @@ func init() { // Using the local IP address: correctAddressWithPort = Tools.LocalIPAddressAndPort() + // Determine the correct protocol: + if publicTLSEnabled := ConfigurationDB.Read(`PublicWebServerUseTLS`); strings.ToLower(publicTLSEnabled) == `true` { + activeProtocol = "https://" + } else { + activeProtocol = "http://" + } + // Init the database: initDB() diff --git a/ICCC/RegisterListener2Database.go b/ICCC/RegisterListener2Database.go index 09394e7..e8dc33d 100644 --- a/ICCC/RegisterListener2Database.go +++ b/ICCC/RegisterListener2Database.go @@ -1,45 +1,47 @@ -package ICCC - -import ( - "fmt" - "github.com/SommerEngineering/Ocean/ICCC/Scheme" - "github.com/SommerEngineering/Ocean/Log" - LM "github.com/SommerEngineering/Ocean/Log/Meta" - "gopkg.in/mgo.v2/bson" -) - -// The internal function to register an listener to ICCC. -func registerListener2Database(channel, command, ipAddressPort string, isActive bool, kind byte) { - Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Register this ICCC command in to the database.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, fmt.Sprintf("isActive=%v", isActive)) - - entry := Scheme.Listener{} - entry.Channel = channel - entry.Command = command - entry.IsActive = isActive - entry.IPAddressPort = ipAddressPort - entry.Kind = kind - - // - // Case: Exists? - // - selection := bson.D{{`Channel`, channel}, {`Command`, command}, {`IPAddressPort`, ipAddressPort}} - count1, _ := collectionListener.Find(selection).Count() - if count1 == 1 { - // - // Case: Exist but maybe not active - // - collectionListener.Update(selection, entry) - Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `Updating the existing ICCC command.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort) - return - } - - // - // Case: Not exist - // - Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityCritical, LM.ImpactNone, LM.MessageNameCONFIGURATION, `This ICCC command is not known.`, `Create now a new entry!`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort) - if err := collectionListener.Insert(entry); err != nil { - Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `It was not possible to add this ICCC command!`, err.Error(), `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort) - } else { - Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `This ICCC command is now known and active.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort) - } -} +package ICCC + +import ( + "fmt" + "github.com/SommerEngineering/Ocean/ConfigurationDB" + "github.com/SommerEngineering/Ocean/ICCC/Scheme" + "github.com/SommerEngineering/Ocean/Log" + LM "github.com/SommerEngineering/Ocean/Log/Meta" + "gopkg.in/mgo.v2/bson" +) + +// The internal function to register an listener to ICCC. +func registerListener2Database(channel, command, ipAddressPort string, isActive bool, kind byte) { + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Register this ICCC command in to the database.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, fmt.Sprintf("isActive=%v", isActive), `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`)) + + entry := Scheme.Listener{} + entry.Channel = channel + entry.Command = command + entry.IsActive = isActive + entry.IPAddressPort = ipAddressPort + entry.Kind = kind + entry.Hostname = ConfigurationDB.Read(`PublicWebServerHostname`) + + // + // Case: Exists? + // + selection := bson.D{{`Channel`, channel}, {`Command`, command}, {`IPAddressPort`, ipAddressPort}, {`Hostname`, entry.Hostname}} + count1, _ := collectionListener.Find(selection).Count() + if count1 == 1 { + // + // Case: Exist but maybe not active + // + collectionListener.Update(selection, entry) + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `Updating the existing ICCC command.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`)) + return + } + + // + // Case: Not exist + // + Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityCritical, LM.ImpactNone, LM.MessageNameCONFIGURATION, `This ICCC command is not known.`, `Create now a new entry!`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`)) + if err := collectionListener.Insert(entry); err != nil { + Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `It was not possible to add this ICCC command!`, err.Error(), `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`)) + } else { + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `This ICCC command is now known and active.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`)) + } +} diff --git a/ICCC/Scheme/Listener.go b/ICCC/Scheme/Listener.go index 73d93be..3a8ab5b 100644 --- a/ICCC/Scheme/Listener.go +++ b/ICCC/Scheme/Listener.go @@ -7,4 +7,5 @@ type Listener struct { IsActive bool `bson:"IsActive"` IPAddressPort string `bson:"IPAddressPort"` Kind byte `bson:"Kind"` + Hostname string `bson:"Hostname"` } diff --git a/ICCC/Send.go b/ICCC/Send.go index ab150c1..b18d38e 100644 --- a/ICCC/Send.go +++ b/ICCC/Send.go @@ -16,7 +16,7 @@ func sendMessage(listener Scheme.Listener, data map[string][]string) (result map valuesHTTP := signMessage(data) // Try to deliver the message: - if response, err := http.PostForm(`http://`+listener.IPAddressPort+`/ICCC`, valuesHTTP); err != nil { + if response, err := http.PostForm(activeProtocol+listener.Hostname+`/ICCC`, valuesHTTP); err != nil { // Case: Was not possible to deliver. Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactUnknown, LM.MessageNameNETWORK, `Was not able to send the ICCC message.`, err.Error()) } else { diff --git a/ICCC/Variables.go b/ICCC/Variables.go index 26c1e34..7fa8e06 100644 --- a/ICCC/Variables.go +++ b/ICCC/Variables.go @@ -37,4 +37,5 @@ var ( startCacheTimerLock sync.Mutex = sync.Mutex{} // Mutex for the start timer cacheTimerRunning bool = false // Is the timer running? correctAddressWithPort string = `` // The IP address and port of the this local server + activeProtocol string = `http://` ) diff --git a/System/Version/Variables.go b/System/Version/Variables.go index 4ae4041..6168ec2 100644 --- a/System/Version/Variables.go +++ b/System/Version/Variables.go @@ -1,5 +1,5 @@ package Version var ( - oceansVersion string = `2.1.0` // Ocean's current version + oceansVersion string = `2.1.1` // Ocean's current version )