public void SaveAppInfo(string appName, ClickOnceAppInfo appInfo) { var appDir = GetApplicationDir(appName); var appInfoPath = Path.Combine(GetApplicationDir(appName), ".appinfo"); File.WriteAllText(appInfoPath, JsonConvert.SerializeObject(appInfo)); }
public ActionResult Edit(string id, ClickOnceAppInfo model, bool disclosePublisher) { var result = GetMyAppInfo(id); if (result is ActionResult) return result as ActionResult; if (ModelState.IsValid == false) return View(model); var appInfo = result as ClickOnceAppInfo; appInfo.Title = model.Title; appInfo.Description = model.Description; appInfo.ProjectURL = model.ProjectURL; SetupPublisherInformtion(disclosePublisher, appInfo); appInfo.SignedByPublisher = false; if (appInfo.HasCodeSigning == null) UpdateCertificateInfo(appInfo); else if (appInfo.HasCodeSigning == true && appInfo.PublisherName != null) { var tmpPath = Server.MapPath($"~/App_Data/{Guid.NewGuid():N}.cer"); try { var certBin = this.ClickOnceFileRepository.GetFileContent(id, ".cer"); System.IO.File.WriteAllBytes(tmpPath, certBin); var sshPubKeyStr = CertificateValidater.GetSSHPubKeyStrFromGitHubAccount(appInfo.PublisherName); appInfo.SignedByPublisher = CertificateValidater.EqualsPublicKey(sshPubKeyStr, tmpPath); } finally { System.IO.File.Delete(tmpPath); } } this.ClickOnceFileRepository.SaveAppInfo(id, appInfo); var from = Request.QueryString["from"]; return from == "detail" ? RedirectToRoute("Detail", new { appId = appInfo.Name }) : RedirectToAction("MyApps", "Home"); }
public ActionResult Edit(string id, ClickOnceAppInfo model, bool disclosePublisher) { var result = GetMyAppInfo(id); if (result is ActionResult) return result as ActionResult; if (ModelState.IsValid == false) return View(model); var appInfo = result as ClickOnceAppInfo; appInfo.Title = model.Title; appInfo.Description = model.Description; appInfo.ProjectURL = model.ProjectURL; SetupPublisherInformtion(disclosePublisher, appInfo); this.ClickOnceFileRepository.SaveAppInfo(id, appInfo); return RedirectToAction("MyApps", "Home"); }
private void SetupPublisherInformtion(bool disclosePublisher, ClickOnceAppInfo appInfo) { if (disclosePublisher) { var gitHubUserName = User.Identity.GetUserName(); appInfo.PublisherName = gitHubUserName; appInfo.PublisherURL = "https://github.com/" + gitHubUserName; appInfo.PublisherAvatorImageURL = "https://avatars.githubusercontent.com/" + gitHubUserName; } else { appInfo.PublisherName = null; appInfo.PublisherURL = null; appInfo.PublisherAvatorImageURL = null; } }
public ActionResult Register(HttpPostedFileBase zipedPackage) { var userId = User.GetHashedUserId(); if (userId == null) throw new Exception("hashed user id is null."); if (ModelState.IsValid == false) return View(); try { var tmpPath = Server.MapPath($"~/App_Data/{userId}-{Guid.NewGuid():N}.zip"); zipedPackage.SaveAs(tmpPath); using (var fs = new FileStream(tmpPath, FileMode.Open, FileAccess.Read)) using (var zip = new ZipArchive(fs)) { // Validate files structure that are included in a .zip file. var appFile = zip.Entries .Where(e => Path.GetExtension(e.FullName).ToLower() == ".application") .OrderBy(e => e.FullName.Length) .FirstOrDefault(); if (appFile == null) return Error("The .zip file you uploaded did not contain .application file."); if (Path.GetDirectoryName(appFile.FullName) != "") return Error("The .zip file you uploaded contain .application file, but it was not in root of the .zip file."); // Validate app name does not conflict. var appName = Path.GetFileNameWithoutExtension(appFile.FullName); var success = this.ClickOnceFileRepository.GetOwnerRight(userId, appName); if (success == false) return Error("Sorry, the application name \"{0}\" was already registered by somebody else.", appName); var appInfo = this.ClickOnceFileRepository.GetAppInfo(appName); if (appInfo == null) { appInfo = new ClickOnceAppInfo { Name = appName, OwnerId = userId }; } appInfo.RegisteredAt = DateTime.UtcNow; this.ClickOnceFileRepository.ClearUpFiles(appName); foreach (var item in zip.Entries.Where(_ => _.Name != "")) { var buff = new byte[item.Length]; using (var reader = item.Open()) { reader.Read(buff, 0, buff.Length); this.ClickOnceFileRepository.SaveFileContent(appName, item.FullName, buff); #if !DEBUG if (Path.GetExtension(item.FullName).ToLower() == ".application") { var error = CheckCodeBaseUrl(appName, buff); if (error != null) return error; } #endif } } // Sweep temporary file if success. try { System.IO.File.Delete(tmpPath); } catch (Exception) { } // Update certificate information. this.UpdateCertificateInfo(appInfo); this.ClickOnceFileRepository.SaveAppInfo(appName, appInfo); return RedirectToAction("Edit", new { id = appName }); } } catch (System.IO.InvalidDataException) { return Error("The file you uploaded looks like invalid Zip format."); } }
private byte[] UpdateCertificateInfo(ClickOnceAppInfo appInfo) { appInfo.SignedByPublisher = false; var certBin = default(byte[]); var tmpPath = default(string); try { tmpPath = ExtractEntryPointCommandFile(appInfo.Name); var cert = X509Certificate.CreateFromSignedFile(tmpPath); if (cert != null) { certBin = cert.GetRawCertData(); this.ClickOnceFileRepository.SaveFileContent(appInfo.Name, ".cer", certBin); if (appInfo.PublisherName != null) { var sshPubKeyStr = CertificateValidater.GetSSHPubKeyStrFromGitHubAccount(appInfo.PublisherName); appInfo.SignedByPublisher = CertificateValidater.EqualsPublicKey(sshPubKeyStr, cert); } } } catch (CryptographicException) { } finally { if (tmpPath != null) System.IO.File.Delete(tmpPath); } appInfo.HasCodeSigning = certBin != null; return certBin; }
private byte[] GetCertificateCore(ClickOnceAppInfo appInfo) { if (appInfo == null) return null; if (appInfo.HasCodeSigning == null) { var certBin = UpdateCertificateInfo(appInfo); this.ClickOnceFileRepository.SaveAppInfo(appInfo.Name, appInfo); return certBin; } return appInfo.HasCodeSigning == true ? this.ClickOnceFileRepository.GetFileContent(appInfo.Name, ".cer") : null; }
public void SaveAppInfo(string appName, ClickOnceAppInfo appInfo) { var appInfoPath = GetAppInfoPath(appName); File.WriteAllText(appInfoPath, JsonConvert.SerializeObject(appInfo)); }