diff --git a/controllers/home.ctrl.go b/controllers/home.ctrl.go index c68bac4c..53fe8f5c 100644 --- a/controllers/home.ctrl.go +++ b/controllers/home.ctrl.go @@ -40,6 +40,12 @@ type HomepageContent struct { BlockHeight int Uris []string Channels []Channel + BrandingTitle string + BrandingDesc string + BrandingUrl string + BrandingLogo string + BrandingFavicon string + BrandingFooter map[string]string } type Channel struct { @@ -111,6 +117,12 @@ func (controller *HomeController) Home(c echo.Context) error { BlockHeight: int(info.BlockHeight), Channels: channelSlice, Uris: info.Uris, + BrandingTitle: controller.svc.Config.BrandingTitle, + BrandingDesc: controller.svc.Config.BrandingDesc, + BrandingUrl: controller.svc.Config.BrandingUrl, + BrandingLogo: controller.svc.Config.BrandingLogo, + BrandingFavicon: controller.svc.Config.BrandingFavicon, + BrandingFooter: controller.svc.Config.BrandingFooter, } var buf bytes.Buffer err = tmpl.Execute(&buf, content) diff --git a/lib/service/config.go b/lib/service/config.go index 9fdbb5a8..d6091b4f 100644 --- a/lib/service/config.go +++ b/lib/service/config.go @@ -1,27 +1,56 @@ package service +import ( + "fmt" + "strings" +) + type Config struct { - DatabaseUri string `envconfig:"DATABASE_URI" required:"true"` - SentryDSN string `envconfig:"SENTRY_DSN"` - LogFilePath string `envconfig:"LOG_FILE_PATH"` - JWTSecret []byte `envconfig:"JWT_SECRET" required:"true"` - JWTRefreshTokenExpiry int `envconfig:"JWT_REFRESH_EXPIRY" default:"604800"` // in seconds, default 7 days - JWTAccessTokenExpiry int `envconfig:"JWT_ACCESS_EXPIRY" default:"172800"` // in seconds, default 2 days - LNDAddress string `envconfig:"LND_ADDRESS" required:"true"` - LNDMacaroonHex string `envconfig:"LND_MACAROON_HEX" required:"true"` - LNDCertHex string `envconfig:"LND_CERT_HEX"` - CustomName string `envconfig:"CUSTOM_NAME"` - Host string `envconfig:"HOST" default:"localhost:3000"` - Port int `envconfig:"PORT" default:"3000"` - DefaultRateLimit int `envconfig:"DEFAULT_RATE_LIMIT" default:"10"` - StrictRateLimit int `envconfig:"STRICT_RATE_LIMIT" default:"10"` - BurstRateLimit int `envconfig:"BURST_RATE_LIMIT" default:"1"` - EnablePrometheus bool `envconfig:"ENABLE_PROMETHEUS" default:"false"` - PrometheusPort int `envconfig:"PROMETHEUS_PORT" default:"9092"` - WebhookUrl string `envconfig:"WEBHOOK_URL"` - FeeReserve bool `envconfig:"FEE_RESERVE" default:"false"` - AllowAccountCreation bool `envconfig:"ALLOW_ACCOUNT_CREATION" default:"true"` - MaxReceiveAmount int64 `envconfig:"MAX_RECEIVE_AMOUNT" default:"0"` - MaxSendAmount int64 `envconfig:"MAX_SEND_AMOUNT" default:"0"` - MaxAccountBalance int64 `envconfig:"MAX_ACCOUNT_BALANCE" default:"0"` + DatabaseUri string `envconfig:"DATABASE_URI" required:"true"` + SentryDSN string `envconfig:"SENTRY_DSN"` + LogFilePath string `envconfig:"LOG_FILE_PATH"` + JWTSecret []byte `envconfig:"JWT_SECRET" required:"true"` + JWTRefreshTokenExpiry int `envconfig:"JWT_REFRESH_EXPIRY" default:"604800"` // in seconds, default 7 days + JWTAccessTokenExpiry int `envconfig:"JWT_ACCESS_EXPIRY" default:"172800"` // in seconds, default 2 days + LNDAddress string `envconfig:"LND_ADDRESS" required:"true"` + LNDMacaroonHex string `envconfig:"LND_MACAROON_HEX" required:"true"` + LNDCertHex string `envconfig:"LND_CERT_HEX"` + CustomName string `envconfig:"CUSTOM_NAME"` + Host string `envconfig:"HOST" default:"localhost:3000"` + Port int `envconfig:"PORT" default:"3000"` + DefaultRateLimit int `envconfig:"DEFAULT_RATE_LIMIT" default:"10"` + StrictRateLimit int `envconfig:"STRICT_RATE_LIMIT" default:"10"` + BurstRateLimit int `envconfig:"BURST_RATE_LIMIT" default:"1"` + EnablePrometheus bool `envconfig:"ENABLE_PROMETHEUS" default:"false"` + PrometheusPort int `envconfig:"PROMETHEUS_PORT" default:"9092"` + WebhookUrl string `envconfig:"WEBHOOK_URL"` + FeeReserve bool `envconfig:"FEE_RESERVE" default:"false"` + AllowAccountCreation bool `envconfig:"ALLOW_ACCOUNT_CREATION" default:"true"` + MaxReceiveAmount int64 `envconfig:"MAX_RECEIVE_AMOUNT" default:"0"` + MaxSendAmount int64 `envconfig:"MAX_SEND_AMOUNT" default:"0"` + MaxAccountBalance int64 `envconfig:"MAX_ACCOUNT_BALANCE" default:"0"` + BrandingTitle string `envconfig:"BRANDING_TITLE" default:"LndHub - Alby Lightning"` + BrandingDesc string `envconfig:"BRANDING_DESC" default:"Alby server for the Lightning Network"` + BrandingUrl string `envconfig:"BRANDING_URL" default:"https://ln.getalby.com"` + BrandingLogo string `envconfig:"BRANDING_LOGO" default:""` + BrandingFavicon string `envconfig:"BRANDING_FAVICON" default:"../static/img/favicon.png"` + BrandingFooter FooterLinkMap `envconfig:"BRANDING_FOOTER" default:"about=https://getalby.com;community=https://t.me/getAlby"` +} + +// envconfig map decoder uses colon (:) as the default separator +// we have to override the decoder so we can use colon for the protocol prefix (e.g. "https:") + +type FooterLinkMap map[string]string + +func (flm *FooterLinkMap) Decode(value string) error { + m := map[string]string{} + for _, pair := range strings.Split(value, ";") { + kvpair := strings.Split(pair, "=") + if len(kvpair) != 2 { + return fmt.Errorf("invalid map item: %q", pair) + } + m[kvpair[0]] = kvpair[1] + } + *flm = m + return nil } diff --git a/static/css/style.css b/static/css/style.css index 4ed49e75..a99beb2f 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -107,7 +107,6 @@ body { top: 24px; right: 24px; } - #progressbar { appearance: none; margin: 0; @@ -186,6 +185,9 @@ footer a { body { padding-right: 300px; } + .logo { + width: 200px; + } .sidebar { position: fixed; top: 0; @@ -249,5 +251,3 @@ footer a { } } - - diff --git a/templates/index.html b/templates/index.html index bae82a95..ae677635 100644 --- a/templates/index.html +++ b/templates/index.html @@ -6,18 +6,19 @@ @charset "UTF-8"; - - - + + + - - LndHub - Alby Lightning + + {{.BrandingTitle}}
@@ -102,8 +106,12 @@

{{.RemotePubkey}}

{{end}}