| 182 | } |
| 183 | |
| 184 | func renderInstall(c echo.Context, app storage.App) error { |
| 185 | usingManifestProxy := false |
| 186 | baseUrl := getBaseUrl(c) |
| 187 | manifestUrl := "" |
| 188 | var err error |
| 189 | if strings.HasPrefix(baseUrl, "https") { |
| 190 | // must be a full URL |
| 191 | manifestUrl, err = util.JoinUrls(baseUrl, "/apps", app.GetId(), "manifest") |
| 192 | if err != nil { |
| 193 | return errors.WithMessage(err, "build manifest url") |
| 194 | } |
| 195 | } else { |
| 196 | usingManifestProxy = true |
| 197 | downloadFullUrl, err := util.JoinUrls(baseUrl, "/apps", app.GetId(), "signed") |
| 198 | if err != nil { |
| 199 | return errors.WithMessage(err, "build download url") |
| 200 | } |
| 201 | proxyUrl := url.URL{ |
| 202 | Scheme: "https", |
| 203 | Host: "ota.signtools.workers.dev", |
| 204 | Path: "/v1", |
| 205 | } |
| 206 | name, err := app.GetString(storage.AppName) |
| 207 | if err != nil { |
| 208 | logErrApp(err, app).Msg("get name") |
| 209 | } |
| 210 | bundleId, _ := app.GetString(storage.AppBundleId) |
| 211 | |
| 212 | query := url.Values{ |
| 213 | "ipa": []string{downloadFullUrl}, |
| 214 | "title": []string{name}, |
| 215 | "id": []string{bundleId}, |
| 216 | } |
| 217 | proxyUrl.RawQuery = query.Encode() |
| 218 | manifestUrl = proxyUrl.String() |
| 219 | } |
| 220 | if usingManifestProxy { |
| 221 | log.Warn().Str("base_url", getBaseUrl(c)).Msg("using OTA manifest proxy, installation may not work") |
| 222 | } |
| 223 | appName, err := app.GetString(storage.AppName) |
| 224 | if err != nil { |
| 225 | return err |
| 226 | } |
| 227 | data := assets.InstallData{ |
| 228 | ManifestUrl: manifestUrl, |
| 229 | AppName: appName, |
| 230 | } |
| 231 | t, err := htmlTemplate.New("").Parse(assets.InstallHtml) |
| 232 | if err != nil { |
| 233 | return err |
| 234 | } |
| 235 | var result bytes.Buffer |
| 236 | if err := t.Execute(&result, data); err != nil { |
| 237 | return err |
| 238 | } |
| 239 | return c.HTMLBlob(200, result.Bytes()) |
| 240 | } |
| 241 | |