internal PublicationManifest(string packageFolder, string registry)
        {
            CreateTarball(packageFolder);

            JObject manifest = LoadManifest(packageFolder);

            name = manifest["name"].ToString();
            string version     = manifest["version"].ToString();
            string description = manifest["description"].ToString();

            string tarballName = name + "-" + version + ".tgz";
            string tarballPath = name + "/-/" + tarballName;


            string tarballUri = NPMLogin.UrlCombine(registry, tarballPath);

            tarballUri = Regex.Replace(tarballUri, @"^https:\/\/", "http://");


            string readmeFile = GetReadmeFilename(packageFolder);
            string readme     = null;

            if (readmeFile != null)
            {
                readme = GetReadme(readmeFile);
            }



            j["_id"]         = name;
            j["name"]        = name;
            j["description"] = description;



            j["dist-tags"]           = new JObject();
            j["dist-tags"]["latest"] = version;


            j["versions"]          = new JObject();
            j["versions"][version] = manifest;

            if (!string.IsNullOrEmpty(readmeFile))
            {
                j["versions"][version]["readme"]         = readme;
                j["versions"][version]["readmeFilename"] = readmeFile;
            }

            j["versions"][version]["_id"] = name + "@" + version;


            // Extra options set by the NPM client. Will not set here as they do not seem neccessary.

            // j["versions"][version]["_npmUser"] = new JObject();
            // j["versions"][version]["_npmUser"]["name"] = "";
            // j["versions"][version]["_npmUser"]["email"] = "";
            // j["versions"][version]["_npmVersion"] = "6.14.4";
            // j["versions"][version]["_nodeVersion"] = "12.16.2";

            j["versions"][version]["dist"] = new JObject();
            j["versions"][version]["dist"]["integrity"] = sha512;
            j["versions"][version]["dist"]["shasum"]    = sha1;
            j["versions"][version]["dist"]["tarball"]   = tarballUri.ToString();

            if (!string.IsNullOrEmpty(readme))
            {
                j["readme"] = readme;
            }

            j["_attachments"] = new JObject();
            j["_attachments"][tarballName] = new JObject();
            j["_attachments"][tarballName]["content_type"] = "application/octet-stream";
            j["_attachments"][tarballName]["length"]       = new JValue(size);
            j["_attachments"][tarballName]["data"]         = base64Data;
        }
Exemple #2
0
        public static void Publish(string packageFolder, string registry)
        {
            CredentialManager manager = new CredentialManager();

            if (!manager.HasRegistry(registry))
            {
                throw new System.IO.IOException("Credentials not set for registry " + registry);
            }

            string token = manager.GetCredential(registry).token;

            PublicationManifest manifest = new PublicationManifest(packageFolder, registry);;



            using (var client = new ExpectContinueAware())
            {
                string upload = NPMLogin.UrlCombine(registry, manifest.name);


                client.Encoding = Encoding.UTF8;
                client.Headers.Add(HttpRequestHeader.Accept, "application/json");
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
                client.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);


                // Headers set by the NPM client, but not by us. Option to try with compatibility issues.

                // client.Headers.Add("npm-in-ci", "false");
                // client.Headers.Add("npm-scope", "");
                // client.Headers.Add(HttpRequestHeader.UserAgent, "npm/6.14.4 node/v12.16.2 linux x64");
                // var random = new Random();
                // string a = String.Format("{0:X8}", random.Next(0x10000000, int.MaxValue)).ToLower();
                // string b = String.Format("{0:X8}", random.Next(0x10000000, int.MaxValue)).ToLower();

                // client.Headers.Add("npm-session", a + b);
                // client.Headers.Add("referer", "publish");


                try
                {
                    string responseString = client.UploadString(upload, WebRequestMethods.Http.Put, manifest.Request);

                    try
                    {
                        NPMResponse response = JsonUtility.FromJson <NPMResponse>(responseString);
                        if (string.IsNullOrEmpty(response.ok))
                        {
                            throw new System.IO.IOException(responseString);
                        }
                    }
                    catch (Exception)
                    {
                        throw new System.IO.IOException(responseString);
                    }
                }
                catch (WebException e)
                {
                    if (e.Response != null)
                    {
                        Stream receiveStream = e.Response.GetResponseStream();
                        // Pipes the stream to a higher level stream reader with the required encoding format.
                        StreamReader readStream     = new StreamReader(receiveStream, Encoding.UTF8);
                        string       responseString = readStream.ReadToEnd();
                        e.Response.Close();
                        readStream.Close();


                        try
                        {
                            NPMResponse response = JsonUtility.FromJson <NPMResponse>(responseString);

                            if (string.IsNullOrEmpty(response.error))
                            {
                                throw new System.IO.IOException(responseString);
                            }
                            else
                            {
                                string reason = string.IsNullOrEmpty(response.reason) ? "" : Environment.NewLine + response.reason;

                                throw new System.IO.IOException(response.error + reason);
                            }
                        }
                        catch (Exception)
                        {
                            throw new System.IO.IOException(responseString);
                        }
                    }
                    else
                    {
                        if (e.InnerException != null)
                        {
                            throw new System.IO.IOException(e.InnerException.Message);
                        }
                        else
                        {
                            throw new System.IO.IOException(e.Message);
                        }
                    }
                }
            }
        }
Exemple #3
0
        public static void Publish(string packageFolder, string registry)
        {
            CredentialManager manager = new CredentialManager();

            if (!manager.HasRegistry(registry))
            {
                throw new System.IO.IOException("Credentials not set for registry " + registry);
            }

            string token = manager.GetCredential(registry).token;

            PublicationManifest manifest = new PublicationManifest(packageFolder, registry);;



            using (var client = new ExpectContinueAware())
            {
                string upload = NPMLogin.UrlCombine(registry, manifest.name);


                client.Encoding = Encoding.UTF8;
                client.Headers.Add(HttpRequestHeader.Accept, "application/json");
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
                client.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);


                // Headers set by the NPM client, but not by us. Option to try with compatibility issues.

                // client.Headers.Add("npm-in-ci", "false");
                // client.Headers.Add("npm-scope", "");
                // client.Headers.Add(HttpRequestHeader.UserAgent, "npm/6.14.4 node/v12.16.2 linux x64");
                // var random = new Random();
                // string a = String.Format("{0:X8}", random.Next(0x10000000, int.MaxValue)).ToLower();
                // string b = String.Format("{0:X8}", random.Next(0x10000000, int.MaxValue)).ToLower();

                // client.Headers.Add("npm-session", a + b);
                // client.Headers.Add("referer", "publish");


                try
                {
                    string responseString = client.UploadString(upload, WebRequestMethods.Http.Put, manifest.Request);

                    try
                    {
                        NPMResponse response = JsonUtility.FromJson <NPMResponse>(responseString);
                        if (!response.success && string.IsNullOrEmpty(response.ok))
                        {
                            throw new System.IO.IOException(responseString);
                        }
                    }
                    catch (Exception)
                    {
                        throw new System.IO.IOException(responseString);
                    }
                }
                catch (WebException e)
                {
                    throw new System.IO.IOException(WebExceptionParser.ParseWebException(e));
                }
            }
        }