Skip to content
Merged
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
52 changes: 51 additions & 1 deletion assets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,11 @@ func TestVersionReportsHotDays(t *testing.T) {
}
defer s.Close()
h := newMux(&Config{HotDays: 3, RetentionDays: 300}, s, NewRunner(ProbeCfg{}, s, NewDetector(s)))
cookie := versionTestSession(t, h)
req := httptest.NewRequest("GET", "/api/version", nil)
req.Header.Set("Cookie", sessionCookie+"="+cookie)
rec := httptest.NewRecorder()
h.ServeHTTP(rec, httptest.NewRequest("GET", "/api/version", nil))
h.ServeHTTP(rec, req)
if rec.Code != 200 {
t.Fatalf("GET /api/version: status %d", rec.Code)
}
Expand All @@ -203,3 +206,50 @@ func TestVersionReportsHotDays(t *testing.T) {
t.Errorf("hot_days=%d retention_days=%d, want 3 and 300", v.HotDays, v.RetentionDays)
}
}

// Before sign-in /api/version says which version this is and nothing about the
// instance: retention, hot days, logo and setup state are for signed-in users.
func TestVersionAnonymousShowsOnlyVersion(t *testing.T) {
s, err := NewStore(t.TempDir(), nil)
if err != nil {
t.Fatal(err)
}
defer s.Close()
h := newMux(&Config{HotDays: 3, RetentionDays: 300}, s, NewRunner(ProbeCfg{}, s, NewDetector(s)))
check := func(label string) {
t.Helper()
rec := httptest.NewRecorder()
h.ServeHTTP(rec, httptest.NewRequest("GET", "/api/version", nil))
if rec.Code != 200 {
t.Fatalf("%s: GET /api/version: status %d", label, rec.Code)
}
var v map[string]any
if err := json.Unmarshal(rec.Body.Bytes(), &v); err != nil {
t.Fatal(err)
}
if _, ok := v["version"]; !ok || len(v) != 1 {
t.Errorf("%s: anonymous /api/version = %s, want only the version", label, rec.Body)
}
}
check("before setup")
versionTestSession(t, h)
check("after setup")
}

// versionTestSession creates the first admin through /api/setup and returns its
// session cookie value.
func versionTestSession(t *testing.T, h http.Handler) string {
t.Helper()
req := httptest.NewRequest("POST", "http://st.local/api/setup", strings.NewReader(`{"User":"admin","Pass":"correct horse battery"}`))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Origin", "http://st.local")
rec := httptest.NewRecorder()
h.ServeHTTP(rec, req)
for _, c := range rec.Result().Cookies() {
if c.Name == sessionCookie {
return c.Value
}
}
t.Fatalf("setup gave no session: %d %s", rec.Code, rec.Body)
return ""
}
192 changes: 192 additions & 0 deletions i18n/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -1607,6 +1607,198 @@
"de": "Lauscht derzeit auf {now}; {next} gilt nach einem Neustart.",
"ja": "現在は {now} で待ち受けています。{next} は再起動後に有効になります。",
"ko": "현재 {now}에서 수신 중입니다. {next}는 재시작 후 적용됩니다."
},
"console.skip": {
"en": "Skip to chart",
"zh": "跳到图表",
"es": "Saltar al gráfico",
"fr": "Aller au graphique",
"pt": "Pular para o gráfico",
"ru": "Перейти к графику",
"id": "Lewati ke grafik",
"de": "Zum Diagramm springen",
"ja": "グラフへ移動",
"ko": "차트로 건너뛰기"
},
"console.hTargets": {
"en": "Targets",
"zh": "目标",
"es": "Destinos",
"fr": "Cibles",
"pt": "Alvos",
"ru": "Цели",
"id": "Target",
"de": "Ziele",
"ja": "ターゲット",
"ko": "대상"
},
"console.hChart": {
"en": "Latency and packet loss",
"zh": "延迟与丢包",
"es": "Latencia y pérdida de paquetes",
"fr": "Latence et perte de paquets",
"pt": "Latência e perda de pacotes",
"ru": "Задержка и потеря пакетов",
"id": "Latensi dan kehilangan paket",
"de": "Latenz und Paketverlust",
"ja": "遅延とパケットロス",
"ko": "지연 시간과 패킷 손실"
},
"console.fType": {
"en": "Type",
"zh": "类型",
"es": "Tipo",
"fr": "Type",
"pt": "Tipo",
"ru": "Тип",
"id": "Jenis",
"de": "Typ",
"ja": "種類",
"ko": "유형"
},
"console.fHost": {
"en": "Host or IP",
"zh": "主机或 IP",
"es": "Host o IP",
"fr": "Hôte ou IP",
"pt": "Host ou IP",
"ru": "Хост или IP",
"id": "Host atau IP",
"de": "Host oder IP",
"ja": "ホストまたは IP",
"ko": "호스트 또는 IP"
},
"console.fPort": {
"en": "Port",
"zh": "端口",
"es": "Puerto",
"fr": "Port",
"pt": "Porta",
"ru": "Порт",
"id": "Port",
"de": "Port",
"ja": "ポート",
"ko": "포트"
},
"console.fName": {
"en": "Name (optional)",
"zh": "名称(可选)",
"es": "Nombre (opcional)",
"fr": "Nom (facultatif)",
"pt": "Nome (opcional)",
"ru": "Имя (необязательно)",
"id": "Nama (opsional)",
"de": "Name (optional)",
"ja": "名前(任意)",
"ko": "이름 (선택)"
},
"console.fPace": {
"en": "Pace",
"zh": "节奏",
"es": "Ritmo",
"fr": "Rythme",
"pt": "Ritmo",
"ru": "Темп",
"id": "Tempo",
"de": "Takt",
"ja": "ペース",
"ko": "주기"
},
"console.fInterval": {
"en": "Interval in seconds (overrides pace)",
"zh": "间隔秒数(覆盖节奏)",
"es": "Intervalo en segundos (anula el ritmo)",
"fr": "Intervalle en secondes (remplace le rythme)",
"pt": "Intervalo em segundos (substitui o ritmo)",
"ru": "Интервал в секундах (вместо темпа)",
"id": "Interval dalam detik (menggantikan tempo)",
"de": "Intervall in Sekunden (ersetzt den Takt)",
"ja": "間隔(秒、ペースより優先)",
"ko": "간격(초, 주기보다 우선)"
},
"console.from": {
"en": "From",
"zh": "开始",
"es": "Desde",
"fr": "Du",
"pt": "De",
"ru": "С",
"id": "Dari",
"de": "Von",
"ja": "開始",
"ko": "시작"
},
"console.to": {
"en": "To",
"zh": "结束",
"es": "Hasta",
"fr": "Au",
"pt": "Até",
"ru": "По",
"id": "Sampai",
"de": "Bis",
"ja": "終了",
"ko": "끝"
},
"console.chartCaption": {
"en": "Chart data, oldest first",
"zh": "图表数据(从旧到新)",
"es": "Datos del gráfico, del más antiguo al más reciente",
"fr": "Données du graphique, des plus anciennes aux plus récentes",
"pt": "Dados do gráfico, do mais antigo ao mais recente",
"ru": "Данные графика, от старых к новым",
"id": "Data grafik, dari yang terlama",
"de": "Diagrammdaten, älteste zuerst",
"ja": "グラフのデータ(古い順)",
"ko": "차트 데이터(오래된 순)"
},
"console.colTime": {
"en": "Time",
"zh": "时间",
"es": "Hora",
"fr": "Heure",
"pt": "Hora",
"ru": "Время",
"id": "Waktu",
"de": "Zeit",
"ja": "時刻",
"ko": "시간"
},
"console.colMedian": {
"en": "Median RTT (ms)",
"zh": "RTT 中位数(ms)",
"es": "RTT mediano (ms)",
"fr": "RTT médian (ms)",
"pt": "RTT mediano (ms)",
"ru": "Медиана RTT (мс)",
"id": "RTT median (ms)",
"de": "Median-RTT (ms)",
"ja": "RTT 中央値 (ms)",
"ko": "RTT 중앙값 (ms)"
},
"console.colWorstLoss": {
"en": "Worst loss (%)",
"zh": "最高丢包(%)",
"es": "Pérdida máxima (%)",
"fr": "Perte maximale (%)",
"pt": "Perda máxima (%)",
"ru": "Макс. потери (%)",
"id": "Kehilangan terburuk (%)",
"de": "Höchster Verlust (%)",
"ja": "最大ロス (%)",
"ko": "최대 손실 (%)"
},
"console.colBursts": {
"en": "Bursts",
"zh": "突发",
"es": "Ráfagas",
"fr": "Rafales",
"pt": "Rajadas",
"ru": "Всплески",
"id": "Lonjakan",
"de": "Bursts",
"ja": "バースト",
"ko": "버스트"
}
}
}
Loading
Loading