public IHttpActionResult Latest(string app, Version @for, [FromUri(Name = "user")] string user)
{
var appName = app;
var currentVersion = @for;
// user は適用可能なバージョンを絞るために使用するが、ベータ版を一般公開しないなどが目的のため認証まではしない(詐称を許可)
// トラバーサル防止
if (appName.Contains(Path.DirectorySeparatorChar) ||
appName.Contains(Path.AltDirectorySeparatorChar))
{
return NotFound();
}
var appDir = Path.Combine(PhysicalPackageRoot, appName);
var jsonPath = Path.Combine(appDir, UpdateDefinitionFileName);
if (!File.Exists(jsonPath))
{
// 更新が存在しない間は null を返す(application.json に掲載したアプリでも、更新が用意されるまでは update.json を用意しなくていいようにするため)
return Json((object)null);
}
var json = File.ReadAllText(jsonPath);
var updateInfo = JsonConvert.DeserializeObject<UpdateInfo>(json);
var summaries = updateInfo.UpdateSummaries;
// 適用可能な最新バージョンを取得
var latest = summaries.Where(x => x.AllowedUserIds.Contains("Any") || x.AllowedUserIds.Contains(user))
.Where(x => x.SupportedVersion <= currentVersion && currentVersion < x.Version)
.OrderByDescending(x => x.Version)
.FirstOrDefault();
if (latest != null)
{
latest.PackagePath = PackageRoot + appName + "/update/" + latest.PackagePath;
}
return Json(latest, JsonConvert.DefaultSettings());
}