package constant import "testing" // Allowlist существует ровно для того, чтобы забытый ключ был закрыт, а не // открыт. Тест закрепляет обе стороны этого утверждения поимённо. func TestInternalKeysAreNeitherReadableNorWritable(t *testing.T) { for _, key := range InternalConfigKeys() { if IsPublicReadableConfigKey(key) { t.Errorf("внутренний ключ %s доступен на чтение через API", key) } if IsPublicWritableConfigKey(key) { t.Errorf("внутренний ключ %s доступен на запись через API", key) } } } func TestSecretKeysAreListedAsInternal(t *testing.T) { required := []string{ JwtSecret, PeerSecretKey, PeerSecretEncryptionKey, Hysteria2TrafficStatsSecret, } internal := make(map[string]struct{}, len(InternalConfigKeys())) for _, key := range InternalConfigKeys() { internal[key] = struct{}{} } for _, key := range required { if _, ok := internal[key]; !ok { t.Errorf("секрет %s не объявлен внутренним ключом", key) } } } func TestOperatorSettingsRemainAvailable(t *testing.T) { for _, key := range []string{Hysteria2TrafficTime, ResetTrafficCron, Hysteria2ConfigRemark} { if !IsPublicReadableConfigKey(key) { t.Errorf("пользовательская настройка %s недоступна на чтение", key) } } for _, key := range []string{Hysteria2TrafficTime, ResetTrafficCron} { if !IsPublicWritableConfigKey(key) { t.Errorf("пользовательская настройка %s недоступна на запись", key) } } } // Право записи без потребителя — это attack surface без пользователя. // HYSTERIA2_CONFIG_REMARK панель только показывает. func TestWritableIsSubsetOfReadable(t *testing.T) { for _, key := range PublicWritableConfigKeys() { if !IsPublicReadableConfigKey(key) { t.Errorf("ключ %s можно записать, но нельзя прочитать", key) } } if IsPublicWritableConfigKey(Hysteria2ConfigRemark) { t.Error("HYSTERIA2_CONFIG_REMARK не редактируется в панели и не должен быть записываемым") } } func TestUnknownKeyIsClosedByDefault(t *testing.T) { if IsPublicReadableConfigKey("SOME_FUTURE_KEY") || IsPublicWritableConfigKey("SOME_FUTURE_KEY") { t.Fatal("неизвестный ключ обязан быть закрыт по умолчанию") } }