From 1f9e48695ba942df0d4800c5e79c7dc78b71db5b Mon Sep 17 00:00:00 2001 From: denys-gif Date: Mon, 9 Mar 2026 13:31:42 +0000 Subject: [PATCH 1/2] feature: machine-id-header --- .../openframe_machine_id_provider.go | 99 +++++++++++++++++++ server/service/orbit_client.go | 21 +++- 2 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 server/service/openframe/openframe_machine_id_provider.go diff --git a/server/service/openframe/openframe_machine_id_provider.go b/server/service/openframe/openframe_machine_id_provider.go new file mode 100644 index 00000000000..dd8855512c4 --- /dev/null +++ b/server/service/openframe/openframe_machine_id_provider.go @@ -0,0 +1,99 @@ +package openframe + +import ( + "os" + "path/filepath" + "runtime" + "strings" + "sync" + + "github.com/rs/zerolog/log" +) + +// OpenFrameMachineIdProvider reads the shared machine ID from OpenFrame's location. +// The machine ID is written by openframe-client and read by all integrated tools. +// +// File locations: +// - Windows: %ProgramData%\OpenFrame\machine_id +// - macOS: /Library/Application Support/OpenFrame/machine_id +// - Linux: /var/lib/openframe/machine_id +type OpenFrameMachineIdProvider struct { + machineId string + initialized bool + mu sync.RWMutex +} + +// NewOpenFrameMachineIdProvider creates a new OpenFrameMachineIdProvider instance +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() + + // Double-check after acquiring write lock + 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 +} diff --git a/server/service/orbit_client.go b/server/service/orbit_client.go index 1fe39109f35..04b2831a4ee 100644 --- a/server/service/orbit_client.go +++ b/server/service/orbit_client.go @@ -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 @@ -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 @@ -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, @@ -247,6 +261,7 @@ func NewOrbitClient( hostIdentityCertPath: hostIdentityCertPath, authManager: authManager, openFrameMode: openFrameMode, + machineIdProvider: machineIdProvider, }, nil } From 459af683d81d0ba3828f72df2a1e315fb32657d2 Mon Sep 17 00:00:00 2001 From: denys-gif Date: Mon, 16 Mar 2026 18:27:01 +0000 Subject: [PATCH 2/2] chore: remove comments --- .../service/openframe/openframe_machine_id_provider.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/server/service/openframe/openframe_machine_id_provider.go b/server/service/openframe/openframe_machine_id_provider.go index dd8855512c4..527e18b39de 100644 --- a/server/service/openframe/openframe_machine_id_provider.go +++ b/server/service/openframe/openframe_machine_id_provider.go @@ -10,20 +10,12 @@ import ( "github.com/rs/zerolog/log" ) -// OpenFrameMachineIdProvider reads the shared machine ID from OpenFrame's location. -// The machine ID is written by openframe-client and read by all integrated tools. -// -// File locations: -// - Windows: %ProgramData%\OpenFrame\machine_id -// - macOS: /Library/Application Support/OpenFrame/machine_id -// - Linux: /var/lib/openframe/machine_id type OpenFrameMachineIdProvider struct { machineId string initialized bool mu sync.RWMutex } -// NewOpenFrameMachineIdProvider creates a new OpenFrameMachineIdProvider instance func NewOpenFrameMachineIdProvider() *OpenFrameMachineIdProvider { return &OpenFrameMachineIdProvider{} } @@ -41,7 +33,6 @@ func (p *OpenFrameMachineIdProvider) GetMachineId() string { p.mu.Lock() defer p.mu.Unlock() - // Double-check after acquiring write lock if p.initialized { return p.machineId }