mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-30 10:58:27 +00:00 
			
		
		
		
	Fix #27541 The INI package has a quirk: by default, the keys are inherited. When maintaining the keys, the newly added sub key should not be affected by the parent key.
		
			
				
	
	
		
			144 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2023 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package setting
 | |
| 
 | |
| import (
 | |
| 	"os"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| )
 | |
| 
 | |
| func TestDecodeEnvSectionKey(t *testing.T) {
 | |
| 	ok, section, key := decodeEnvSectionKey("SEC__KEY")
 | |
| 	assert.True(t, ok)
 | |
| 	assert.Equal(t, "sec", section)
 | |
| 	assert.Equal(t, "KEY", key)
 | |
| 
 | |
| 	ok, section, key = decodeEnvSectionKey("sec__key")
 | |
| 	assert.True(t, ok)
 | |
| 	assert.Equal(t, "sec", section)
 | |
| 	assert.Equal(t, "key", key)
 | |
| 
 | |
| 	ok, section, key = decodeEnvSectionKey("LOG_0x2E_CONSOLE__STDERR")
 | |
| 	assert.True(t, ok)
 | |
| 	assert.Equal(t, "log.console", section)
 | |
| 	assert.Equal(t, "STDERR", key)
 | |
| 
 | |
| 	ok, section, key = decodeEnvSectionKey("SEC")
 | |
| 	assert.False(t, ok)
 | |
| 	assert.Equal(t, "", section)
 | |
| 	assert.Equal(t, "", key)
 | |
| }
 | |
| 
 | |
| func TestDecodeEnvironmentKey(t *testing.T) {
 | |
| 	prefix := "GITEA__"
 | |
| 	suffix := "__FILE"
 | |
| 
 | |
| 	ok, section, key, file := decodeEnvironmentKey(prefix, suffix, "SEC__KEY")
 | |
| 	assert.False(t, ok)
 | |
| 	assert.Equal(t, "", section)
 | |
| 	assert.Equal(t, "", key)
 | |
| 	assert.False(t, file)
 | |
| 
 | |
| 	ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC")
 | |
| 	assert.False(t, ok)
 | |
| 	assert.Equal(t, "", section)
 | |
| 	assert.Equal(t, "", key)
 | |
| 	assert.False(t, file)
 | |
| 
 | |
| 	ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA____KEY")
 | |
| 	assert.True(t, ok)
 | |
| 	assert.Equal(t, "", section)
 | |
| 	assert.Equal(t, "KEY", key)
 | |
| 	assert.False(t, file)
 | |
| 
 | |
| 	ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__KEY")
 | |
| 	assert.True(t, ok)
 | |
| 	assert.Equal(t, "sec", section)
 | |
| 	assert.Equal(t, "KEY", key)
 | |
| 	assert.False(t, file)
 | |
| 
 | |
| 	// with "__FILE" suffix, it doesn't support to write "[sec].FILE" to config (no such key FILE is used in Gitea)
 | |
| 	// but it could be fixed in the future by adding a new suffix like "__VALUE" (no such key VALUE is used in Gitea either)
 | |
| 	ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__FILE")
 | |
| 	assert.False(t, ok)
 | |
| 	assert.Equal(t, "", section)
 | |
| 	assert.Equal(t, "", key)
 | |
| 	assert.True(t, file)
 | |
| 
 | |
| 	ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__KEY__FILE")
 | |
| 	assert.True(t, ok)
 | |
| 	assert.Equal(t, "sec", section)
 | |
| 	assert.Equal(t, "KEY", key)
 | |
| 	assert.True(t, file)
 | |
| }
 | |
| 
 | |
| func TestEnvironmentToConfig(t *testing.T) {
 | |
| 	cfg, _ := NewConfigProviderFromData("")
 | |
| 
 | |
| 	changed := EnvironmentToConfig(cfg, nil)
 | |
| 	assert.False(t, changed)
 | |
| 
 | |
| 	cfg, err := NewConfigProviderFromData(`
 | |
| [sec]
 | |
| key = old
 | |
| `)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key=new"})
 | |
| 	assert.True(t, changed)
 | |
| 	assert.Equal(t, "new", cfg.Section("sec").Key("key").String())
 | |
| 
 | |
| 	changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key=new"})
 | |
| 	assert.False(t, changed)
 | |
| 
 | |
| 	tmpFile := t.TempDir() + "/the-file"
 | |
| 	_ = os.WriteFile(tmpFile, []byte("value-from-file"), 0o644)
 | |
| 	changed = EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
 | |
| 	assert.True(t, changed)
 | |
| 	assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
 | |
| 
 | |
| 	cfg, _ = NewConfigProviderFromData("")
 | |
| 	_ = os.WriteFile(tmpFile, []byte("value-from-file\n"), 0o644)
 | |
| 	EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
 | |
| 	assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
 | |
| 
 | |
| 	cfg, _ = NewConfigProviderFromData("")
 | |
| 	_ = os.WriteFile(tmpFile, []byte("value-from-file\r\n"), 0o644)
 | |
| 	EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
 | |
| 	assert.Equal(t, "value-from-file", cfg.Section("sec").Key("key").String())
 | |
| 
 | |
| 	cfg, _ = NewConfigProviderFromData("")
 | |
| 	_ = os.WriteFile(tmpFile, []byte("value-from-file\n\n"), 0o644)
 | |
| 	EnvironmentToConfig(cfg, []string{"GITEA__sec__key__FILE=" + tmpFile})
 | |
| 	assert.Equal(t, "value-from-file\n", cfg.Section("sec").Key("key").String())
 | |
| }
 | |
| 
 | |
| func TestEnvironmentToConfigSubSecKey(t *testing.T) {
 | |
| 	// the INI package has a quirk: by default, the keys are inherited.
 | |
| 	// when maintaining the keys, the newly added sub key should not be affected by the parent key.
 | |
| 	cfg, err := NewConfigProviderFromData(`
 | |
| [sec]
 | |
| key = some
 | |
| `)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	changed := EnvironmentToConfig(cfg, []string{"GITEA__sec_0X2E_sub__key=some"})
 | |
| 	assert.True(t, changed)
 | |
| 
 | |
| 	tmpFile := t.TempDir() + "/test-sub-sec-key.ini"
 | |
| 	defer os.Remove(tmpFile)
 | |
| 	err = cfg.SaveTo(tmpFile)
 | |
| 	assert.NoError(t, err)
 | |
| 	bs, err := os.ReadFile(tmpFile)
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Equal(t, `[sec]
 | |
| key = some
 | |
| 
 | |
| [sec.sub]
 | |
| key = some
 | |
| `, string(bs))
 | |
| }
 |