package console import "testing" // 分发桶是公共读、直接挂在 dl.ymaikj.com 上的,key 拼错就等于把它变成公开网盘, // 所以每条边界都钉在测试里。 func TestBuildDistObjectKey(t *testing.T) { ok := map[string][3]string{ "正常": {"EAIMAR", "android", "eaimar-release-1.0.2-20260923.apk"}, "目录带斜杠": {"EAIMAR", "/android/", "a.apk"}, "文件名夹带目录": {"EAIMAR", "android", "../../etc/passwd"}, "另一个应用": {"deepGlass", "android", "a.apk"}, "应用名带斜杠": {"a/../b", "android", "a.apk"}, } want := map[string]string{ "正常": "android/EAIMAR/eaimar-release-1.0.2-20260923.apk", "目录带斜杠": "android/EAIMAR/a.apk", "文件名夹带目录": "android/EAIMAR/passwd", "另一个应用": "android/deepGlass/a.apk", "应用名带斜杠": "android/a____b/a.apk", } for name, in := range ok { got, err := buildDistObjectKey(in[0], in[1], in[2]) if err != nil { t.Errorf("%s: 本该通过,却报错 %v", name, err) continue } if got != want[name] { t.Errorf("%s: 期望 %q,得到 %q", name, want[name], got) } } bad := map[string][3]string{ "没选应用": {"", "android", "a.apk"}, "应用名全是非法字符": {"//", "android", "a.apk"}, "目录为空": {"EAIMAR", "", "a.apk"}, "目录不在白名单": {"EAIMAR", "anything", "a.apk"}, "用 .. 跳出去": {"EAIMAR", "android/../secret", "a.apk"}, "绝对路径跳根": {"EAIMAR", "/../../", "a.apk"}, "文件名为空": {"EAIMAR", "android", " "}, } for name, in := range bad { if got, err := buildDistObjectKey(in[0], in[1], in[2]); err == nil { t.Errorf("%s: 本该被拒,却得到 %q", name, got) } } } // apk 的 Content-Type 必须由服务端强制:它计入预签名,签错了要等真机装包才发现。 func TestDistContentTypeForced(t *testing.T) { if distContentTypes[".apk"] != "application/vnd.android.package-archive" { t.Fatalf("apk 的 Content-Type 不对: %q", distContentTypes[".apk"]) } }