Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions server/service/openframe/openframe_machine_id_provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package openframe

import (
"os"
"path/filepath"
"runtime"
"strings"
"sync"

"github.com/rs/zerolog/log"
)

type OpenFrameMachineIdProvider struct {
machineId string
initialized bool
mu sync.RWMutex
}

func NewOpenFrameMachineIdProvider() *OpenFrameMachineIdProvider {
return &OpenFrameMachineIdProvider{}
}

// GetMachineId returns the machine ID, reading from file if not cached
func (p *OpenFrameMachineIdProvider) GetMachineId() string {
p.mu.RLock()
if p.initialized {
machineId := p.machineId
p.mu.RUnlock()
return machineId
}
p.mu.RUnlock()

p.mu.Lock()
defer p.mu.Unlock()

if p.initialized {
return p.machineId
}

p.machineId = p.readFromFile()
p.initialized = true
return p.machineId
}

// Refresh forces a re-read of machine ID from file
func (p *OpenFrameMachineIdProvider) Refresh() {
p.mu.Lock()
defer p.mu.Unlock()

p.machineId = p.readFromFile()
p.initialized = true
}

func (p *OpenFrameMachineIdProvider) getFilePath() string {
switch runtime.GOOS {
case "windows":
programData := os.Getenv("ProgramData")
if programData == "" {
return ""
}
return filepath.Join(programData, "OpenFrame", "machine_id")
case "darwin":
return "/Library/Application Support/OpenFrame/machine_id"
default:
return "/var/lib/openframe/machine_id"
}
}

func (p *OpenFrameMachineIdProvider) readFromFile() string {
path := p.getFilePath()
if path == "" {
log.Warn().Msg("Could not determine machine_id file path")
return ""
}

data, err := os.ReadFile(path)
if err != nil {
log.Debug().Str("path", path).Err(err).Msg("Could not read machine_id file")
return ""
}

machineId := strings.TrimSpace(string(data))
if machineId == "" {
log.Warn().Str("path", path).Msg("Machine ID file is empty")
return ""
}

log.Debug().Str("path", path).Msg("Read machine ID from file")
return machineId
}
21 changes: 18 additions & 3 deletions server/service/orbit_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,9 @@ type OrbitClient struct {
openSSOWindow func() error

// openframe mode
openFrameMode bool
authManager *openframe.OpenFrameAuthorizationManager
openFrameMode bool
authManager *openframe.OpenFrameAuthorizationManager
machineIdProvider *openframe.OpenFrameMachineIdProvider
}

// time-to-live for config cache
Expand Down Expand Up @@ -155,10 +156,18 @@ func (oc *OrbitClient) requestWithExternal(verb string, pathOrURL string, params
// Add custom header for all requests
authToken := oc.authManager.GetToken()
if authToken != "" {
request.Header.Add("Authorization", "Bearer " + authToken)
request.Header.Add("Authorization", "Bearer "+authToken)
} else {
log.Warn().Msg("authToken is empty, not adding Authorization header")
}

// Add x-machine-id header for rate limiting
if oc.machineIdProvider != nil {
machineId := oc.machineIdProvider.GetMachineId()
if machineId != "" {
request.Header.Add("x-machine-id", machineId)
}
}
}

// Log the request details for debugging
Expand Down Expand Up @@ -233,6 +242,11 @@ func NewOrbitClient(
nodeKeyFilePath := filepath.Join(rootDir, constant.OrbitNodeKeyFileName)
ctx, cancelFunc := context.WithCancel(context.Background())

var machineIdProvider *openframe.OpenFrameMachineIdProvider
if openFrameMode {
machineIdProvider = openframe.NewOpenFrameMachineIdProvider()
}

return &OrbitClient{
nodeKeyFilePath: nodeKeyFilePath,
baseClient: bc,
Expand All @@ -247,6 +261,7 @@ func NewOrbitClient(
hostIdentityCertPath: hostIdentityCertPath,
authManager: authManager,
openFrameMode: openFrameMode,
machineIdProvider: machineIdProvider,
}, nil
}

Expand Down
Loading