From de44d07f0ea2d9a22f01a2522b5fd16208dcad94 Mon Sep 17 00:00:00 2001
From: Pea Nut <peanut2@systemli.org>
Date: Wed, 16 Oct 2024 10:55:29 +0200
Subject: [PATCH] Add introducer to storage before using it when supplied via
 env

---
 pkg/vpn/menshen/init.go | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/pkg/vpn/menshen/init.go b/pkg/vpn/menshen/init.go
index 6d727cb9..f7354fea 100644
--- a/pkg/vpn/menshen/init.go
+++ b/pkg/vpn/menshen/init.go
@@ -7,6 +7,7 @@ import (
 
 	"0xacab.org/leap/bitmask-core/models"
 	"0xacab.org/leap/bitmask-core/pkg/bootstrap"
+	"0xacab.org/leap/bitmask-core/pkg/storage"
 	"0xacab.org/leap/bitmask-vpn/pkg/config"
 	"0xacab.org/leap/bitmask-vpn/pkg/snowflake"
 
@@ -49,6 +50,34 @@ func New() (*Menshen, error) {
 
 	// experimental introducer
 	if introURL := os.Getenv("LEAP_INTRODUCER_URL"); introURL != "" {
+
+		log.Info().
+			Str("introducerURL", introURL).
+			Msg("Using introducer from env LEAP_INTRODUCER_URL")
+
+		store, err := storage.GetStorage()
+		if err != nil {
+			log.Fatal().
+				Err(err).
+				Str("introducerURL", introURL).
+				Msg("Could to get storage")
+		}
+
+		// check if introducer exists in database, if not add it
+		_, err = store.GetIntroducerByURL(introURL)
+		if err != nil {
+			err = store.AddIntroducer(introURL)
+			if err != nil {
+				log.Fatal().
+					Err(err).
+					Str("introducerURL", introURL).
+					Msg("Failed to add introducer to storage")
+			} else {
+				log.Info().Msg("Added introducer to database")
+			}
+		} else {
+			log.Info().Msg("Found introducer in database")
+		}
 		cfg.Introducer = introURL
 	}
 
@@ -75,7 +104,7 @@ func New() (*Menshen, error) {
 // "--persisst-key" without additional value
 // Currently, there is no caching implemented
 func (m *Menshen) GetOpenvpnArgs() ([]string, error) {
-	log.Trace().Msg("Getting OpenVPN arguments")
+	log.Trace().Msg("Getting OpenVPN arguments from menshen")
 
 	service, err := m.api.GetService()
 	if err != nil {
@@ -118,7 +147,7 @@ func (m *Menshen) GetOpenvpnArgs() ([]string, error) {
 // Asks menshen for valid client credentials (certificate + key)
 // Currently, there is no caching implemented
 func (m *Menshen) GetPemCertificate() ([]byte, error) {
-	log.Trace().Msg("Getting OpenVPN client certificate")
+	log.Trace().Msg("Getting OpenVPN client certificate from menshen")
 	cert, err := m.api.GetOpenVPNCert()
 	if err != nil {
 		return []byte{}, err
-- 
GitLab