コード例 #1
0
        public void SaveAppInfo(string appName, ClickOnceAppInfo appInfo)
        {
            var appDir      = GetApplicationDir(appName);
            var appInfoPath = Path.Combine(GetApplicationDir(appName), ".appinfo");

            File.WriteAllText(appInfoPath, JsonConvert.SerializeObject(appInfo));
        }
コード例 #2
0
        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");
        }
コード例 #3
0
        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");
        }
コード例 #4
0
 public void SaveAppInfo(string appName, ClickOnceAppInfo appInfo)
 {
     var appDir = GetApplicationDir(appName);
     var appInfoPath = Path.Combine(GetApplicationDir(appName), ".appinfo");
     File.WriteAllText(appInfoPath, JsonConvert.SerializeObject(appInfo));
 }
コード例 #5
0
 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;
     }
 }
コード例 #6
0
        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.");
            }
        }
コード例 #7
0
        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;
        }
コード例 #8
0
        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;
        }
コード例 #9
0
        public void SaveAppInfo(string appName, ClickOnceAppInfo appInfo)
        {
            var appInfoPath = GetAppInfoPath(appName);

            File.WriteAllText(appInfoPath, JsonConvert.SerializeObject(appInfo));
        }
コード例 #10
0
 public void SaveAppInfo(string appName, ClickOnceAppInfo appInfo)
 {
     var appInfoPath = GetAppInfoPath(appName);
     File.WriteAllText(appInfoPath, JsonConvert.SerializeObject(appInfo));
 }