コード例 #1
0
        public async Task UpgradeAsync(IpfsEngine ipfs, CancellationToken cancel = default(CancellationToken))
        {
            var path   = Path.Combine(ipfs.Options.Repository.Folder, "pins");
            var folder = new DirectoryInfo(path);

            if (!folder.Exists)
            {
                return;
            }

            var store = new FileStore <Cid, Pin1>
            {
                Folder    = path,
                NameToKey = (cid) => cid.Hash.ToBase32(),
                KeyToName = (key) => new MultiHash(key.FromBase32())
            };

            var files = folder.EnumerateFiles()
                        .Where(fi => fi.Length == 0);

            foreach (var fi in files)
            {
                try
                {
                    var cid = Cid.Decode(fi.Name);
                    await store.PutAsync(cid, new Pin1 { Id = cid }, cancel).ConfigureAwait(false);

                    File.Delete(fi.FullName);
                }
                catch
                {
                }
            }
        }
コード例 #2
0
ファイル: DagApi.cs プロジェクト: thulyacloud/net-ipfs-engine
        public async Task <JToken> GetAsync(
            string path,
            CancellationToken cancel = default(CancellationToken))
        {
            if (path.StartsWith("/ipfs/"))
            {
                path = path.Remove(0, 6);
            }

            var parts = path.Split('/').Where(p => p.Length > 0).ToArray();

            if (parts.Length == 0)
            {
                throw new ArgumentException($"Cannot resolve '{path}'.");
            }

            JToken token = await GetAsync(Cid.Decode(parts[0]), cancel).ConfigureAwait(false);

            foreach (var child in parts.Skip(1))
            {
                token = ((JObject)token)[child];
                if (token == null)
                {
                    throw new Exception($"Missing component '{child}'.");
                }
            }

            return(token);
        }
コード例 #3
0
ファイル: UnixFsApi.cs プロジェクト: jakubbober/Catalyst
        public async Task <Stream> ReadFileAsync(string path, CancellationToken cancel = default)
        {
            var r = await _nameApi.ResolveAsync(path, true, false, cancel).ConfigureAwait(false);

            var cid = Cid.Decode(r.Remove(0, 6));

            return(await UnixFs.UnixFs.CreateReadStreamAsync(cid, _blockApi, _keyApi, cancel).ConfigureAwait(false));
        }
コード例 #4
0
        public void TestV0Handling()
        {
            var old = "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n";
            var cid = Cid.Decode(old);

            Assert.Equal((ulong)0, cid.Prefix.Version);
            Assert.Equal(old, cid.Hash.ToString(Multibase.Base58));
            Assert.Equal(old, cid.ToString());
        }
コード例 #5
0
        public async Task <IActionResult> Data(string arg)
        {
            var r = await IpfsCore.Generic.ResolveAsync(arg, true, Cancel);

            var cid    = Cid.Decode(r.Remove(0, 6)); // strip '/ipfs/'.
            var stream = await IpfsCore.Object.DataAsync(cid, Cancel);

            return(File(stream, "text/plain"));
        }
コード例 #6
0
        private async Task <IActionResult> Data(string arg)
        {
            var r = await DfsService.NameApi.ResolveAsync(arg, true, false, Cancel);

            var cid    = Cid.Decode(r.Remove(0, 6)); // strip '/ipfs/'.
            var stream = await DfsService.ObjectApi.DataAsync(cid, Cancel);

            return(File(stream, "text/plain"));
        }
コード例 #7
0
        public void Decode_V0()
        {
            var hash = "QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V";
            var cid  = Cid.Decode(hash);

            Assert.AreEqual(0, cid.Version);
            Assert.AreEqual("dag-pb", cid.ContentType);
            Assert.AreEqual("base58btc", cid.Encoding);
            Assert.AreEqual(hash, cid.Encode());
        }
コード例 #8
0
        public void Decode_V1()
        {
            var id   = "zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn";
            var hash = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4";
            var cid  = Cid.Decode(id);

            Assert.AreEqual(1, cid.Version);
            Assert.AreEqual("base58btc", cid.Encoding);
            Assert.AreEqual("raw", cid.ContentType);
            Assert.AreEqual(hash, cid.Hash);
        }
コード例 #9
0
        public void Decode_V1_Unknown_ContentType()
        {
            var id   = "zJAFhtPN28kqMxDkZawWCCL52BzaiymqFgX3LA7XzkNRMNAN1T1J";
            var hash = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4";
            var cid  = Cid.Decode(id);

            Assert.AreEqual(1, cid.Version);
            Assert.AreEqual("base58btc", cid.Encoding);
            Assert.AreEqual("codec-32767", cid.ContentType);
            Assert.AreEqual(hash, cid.Hash);
        }
コード例 #10
0
        public void Decode_Invalid_Version()
        {
            var cid = new Cid
            {
                Version     = 32767,
                ContentType = "raw",
                Encoding    = "base58btc",
                Hash        = "QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4"
            };
            var s = cid.Encode();

            Assert.ThrowsException <FormatException>(() => Cid.Decode(s));
        }
コード例 #11
0
ファイル: UnixFsApi.cs プロジェクト: jakubbober/Catalyst
        public async Task <IFileSystemNode> ListFileAsync(string path,
                                                          CancellationToken cancel = default)
        {
            var r = await _nameApi.ResolveAsync(path, true, false, cancel).ConfigureAwait(false);

            var cid = Cid.Decode(r.Remove(0, 6));

            var block = await _blockApi.GetAsync(cid, cancel).ConfigureAwait(false);

            switch (cid.ContentType)
            {
            // TODO: A content-type registry should be used.
            case "dag-pb":
                // fall thru
                break;

            case "raw":
                return(new UnixFsNode
                {
                    Id = cid,
                    Size = block.Size
                });

            case "cms":
                return(new UnixFsNode
                {
                    Id = cid,
                    Size = block.Size
                });

            default:
                throw new NotSupportedException($"Cannot read content type '{cid.ContentType}'.");
            }

            var dag = new DagNode(block.DataStream);
            var dm  = Serializer.Deserialize <DataMessage>(dag.DataStream);
            var fsn = new UnixFsNode
            {
                Id    = cid,
                Links = dag.Links.Select(l => new UnixFsLink
                {
                    Id   = l.Id,
                    Name = l.Name,
                    Size = l.Size
                }).ToArray(),
                IsDirectory = dm.Type == DataType.Directory,
                Size        = (long)(dm.FileSize ?? 0)
            };

            return(fsn);
        }
コード例 #12
0
        protected override async Task <int> OnExecute(CommandLineApplication app)
        {
            var Program = Parent.Parent;

            var peers = await Program.CoreApi.Dht.FindProvidersAsync(Cid.Decode(Key), Limit);

            return(Program.Output(app, peers, (data, writer) =>
            {
                foreach (var peer in peers)
                {
                    writer.WriteLine(peer.Id.ToString());
                }
            }));
        }
コード例 #13
0
ファイル: MerkleNode.cs プロジェクト: ruo2012/net-ipfs-api
        /// <summary>
        ///   Creates a new instance of the <see cref="MerkleNode"/> with the specified
        ///   <see cref="Id">cid</see> and optional <see cref="Name"/>.
        /// </summary>
        /// <param name="path">
        ///   The string representation of a <see cref="Cid"/> of the node or "/ipfs/cid".
        /// </param>
        /// <param name="name">A name for the node.</param>
        public MerkleNode(string path, string name = null)
        {
            if (string.IsNullOrWhiteSpace(path))
            {
                throw new ArgumentNullException("path");
            }

            if (path.StartsWith("/ipfs/"))
            {
                path = path.Substring(6);
            }

            Id   = Cid.Decode(path);
            Name = name;
        }
コード例 #14
0
        public void TestBasicMarshaling()
        {
            var h   = Multihash.Sum <SHA3_512>(Encoding.UTF8.GetBytes("TEST"), 4);
            var cid = new Cid(MulticodecCode.MerkleDAGCBOR, h);

            var data   = cid.ToBytes();
            var output = Cid.Cast(data);

            Assert.Equal(cid, output);

            var s = cid.ToString();

            output = Cid.Decode(s);
            Assert.Equal(cid, output);
        }
コード例 #15
0
        /// <inheritdoc />
        public byte[] Serialize(CBORObject data)
        {
            var links = data["links"].Values
                        .Select(link => new DagLink(
                                    link["Name"].AsString(),
                                    Cid.Decode(link["Cid"]["/"].AsString()),
                                    link["Size"].AsInt64()));
            var node = new DagNode(data["data"].GetByteString(), links);

            using (var ms = new MemoryStream())
            {
                node.Write(ms);
                return(ms.ToArray());
            }
        }
コード例 #16
0
        /// <summary>
        /// </summary>
        /// <param name="getFileFromDfsRequest"></param>
        /// <param name="channelHandlerContext"></param>
        /// <param name="senderPeerId"></param>
        /// <param name="correlationId"></param>
        /// <returns></returns>
        protected override GetFileFromDfsResponse HandleRequest(GetFileFromDfsRequest getFileFromDfsRequest,
                                                                IChannelHandlerContext channelHandlerContext,
                                                                PeerId senderPeerId,
                                                                ICorrelationId correlationId)
        {
            Guard.Argument(getFileFromDfsRequest, nameof(getFileFromDfsRequest)).NotNull();
            Guard.Argument(channelHandlerContext, nameof(channelHandlerContext)).NotNull();
            Guard.Argument(senderPeerId, nameof(senderPeerId)).NotNull();

            long fileLen = 0;

            FileTransferResponseCodeTypes responseCodeType;

            var response = Task.Run(async() =>
            {
                try
                {
                    responseCodeType = await Task.Run(async() =>
                    {
                        var stream = await _dfsService.UnixFsApi.ReadFileAsync(Cid.Decode(getFileFromDfsRequest.DfsHash))
                                     .ConfigureAwait(false);
                        fileLen = stream.Length;
                        using (var fileTransferInformation = new UploadFileTransferInformation(
                                   stream,
                                   senderPeerId,
                                   PeerSettings.PeerId,
                                   channelHandlerContext.Channel,
                                   correlationId
                                   ))
                        {
                            return(_fileTransferFactory.RegisterTransfer(fileTransferInformation));
                        }
                    }).ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    Logger.Error(e,
                                 "Failed to handle GetFileFromDfsRequestHandler after receiving message {0}",
                                 getFileFromDfsRequest);
                    responseCodeType = FileTransferResponseCodeTypes.Error;
                }

                return(ReturnResponse(responseCodeType, fileLen));
            }).ConfigureAwait(false).GetAwaiter().GetResult();

            return(response);
        }
コード例 #17
0
        public async Task <IEnumerable <Cid> > AddAsync(string path,
                                                        bool recursive           = true,
                                                        CancellationToken cancel = default)
        {
            var r = await _nameApi.ResolveAsync(path, cancel : cancel).ConfigureAwait(false);

            var id    = Cid.Decode(r.Remove(0, 6));
            var todos = new Stack <Cid>();

            todos.Push(id);
            var dones = new List <Cid>();

            // The pin is added before the content is fetched, so that
            // garbage collection will not delete the newly pinned
            // content.

            while (todos.Count > 0)
            {
                var current = todos.Pop();

                // Add CID to PIN database.
                await Store.PutAsync(current, new Pin
                {
                    Id = current
                }, cancel).ConfigureAwait(false);

                // Make sure that the content is stored locally.
                await BlockApi.GetAsync(current, cancel).ConfigureAwait(false);

                // Recursively pin the links?
                if (recursive && current.ContentType == "dag-pb")
                {
                    var links = await _objectApi.LinksAsync(current, cancel);

                    foreach (var link in links)
                    {
                        todos.Push(link.Id);
                    }
                }

                dones.Add(current);
            }

            return(dones);
        }
コード例 #18
0
ファイル: BitswapApi.cs プロジェクト: avanaur/net-ipfs-api
        public async Task <IEnumerable <Cid> > WantsAsync(MultiHash peer = null, CancellationToken cancel = default(CancellationToken))
        {
            var json = await ipfs.DoCommandAsync("bitswap/wantlist", cancel, peer?.ToString());

            var keys = (JArray)(JObject.Parse(json)["Keys"]);

            // https://github.com/ipfs/go-ipfs/issues/5077
            return(keys
                   .Select(k =>
            {
                if (k.Type == JTokenType.String)
                {
                    return Cid.Decode(k.ToString());
                }
                var obj = (JObject)k;
                return Cid.Decode(obj["/"].ToString());
            }));
        }
コード例 #19
0
        public async Task <BitswapData> BitswapAsync(CancellationToken cancel = default(CancellationToken))
        {
            var json = await ipfs.DoCommandAsync("stats/bitswap", cancel);

            var stat = JObject.Parse(json);

            return(new BitswapData
            {
                BlocksReceived = (ulong)stat["BlocksReceived"],
                DataReceived = (ulong)stat["DataReceived"],
                BlocksSent = (ulong)stat["BlocksSent"],
                DataSent = (ulong)stat["DataSent"],
                DupBlksReceived = (ulong)stat["DupBlksReceived"],
                DupDataReceived = (ulong)stat["DupDataReceived"],
                ProvideBufLen = (int)stat["ProvideBufLen"],
                Peers = ((JArray)stat["Peers"]).Select(s => new MultiHash((string)s)),
                Wantlist = ((JArray)stat["Wantlist"]).Select(o => Cid.Decode(o["/"].ToString()))
            });
        }
コード例 #20
0
        public async Task <string> ResolveAsync(string name, bool recursive = false, CancellationToken cancel = default(CancellationToken))
        {
            var path = name;

            if (path.StartsWith("/ipns/"))
            {
                path = await ipfs.Name.ResolveAsync(path, recursive, false, cancel).ConfigureAwait(false);

                if (!recursive)
                {
                    return(path);
                }
            }

            if (path.StartsWith("/ipfs/"))
            {
                path = path.Remove(0, 6);
            }

            var parts = path.Split('/').Where(p => p.Length > 0).ToArray();

            if (parts.Length == 0)
            {
                throw new ArgumentException($"Cannot resolve '{name}'.");
            }

            var id = Cid.Decode(parts[0]);

            foreach (var child in parts.Skip(1))
            {
                var container = await ipfs.Object.GetAsync(id, cancel).ConfigureAwait(false);

                var link = container.Links.FirstOrDefault(l => l.Name == child);
                if (link == null)
                {
                    throw new ArgumentException($"Cannot resolve '{child}' in '{name}'.");
                }
                id = link.Id;
            }

            return("/ipfs/" + id.Encode());
        }
コード例 #21
0
        public void Value_Equality()
        {
            var a0 = Cid.Decode("zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn");
            var a1 = Cid.Decode("zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn");
            var b  = Cid.Decode("QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L5");
            Cid c  = null;
            Cid d  = null;

            Assert.IsTrue(c == d);
            Assert.IsFalse(c == b);
            Assert.IsFalse(b == c);

            Assert.IsFalse(c != d);
            Assert.IsTrue(c != b);
            Assert.IsTrue(b != c);

#pragma warning disable 1718
            Assert.IsTrue(a0 == a0);
            Assert.IsTrue(a0 == a1);
            Assert.IsFalse(a0 == b);

            Assert.IsFalse(a0 != a0);
            Assert.IsFalse(a0 != a1);
            Assert.IsTrue(a0 != b);

            Assert.IsTrue(a0.Equals(a0));
            Assert.IsTrue(a0.Equals(a1));
            Assert.IsFalse(a0.Equals(b));

            Assert.AreEqual(a0, a0);
            Assert.AreEqual(a0, a1);
            Assert.AreNotEqual(a0, b);

            Assert.AreEqual(a0, a0);
            Assert.AreEqual(a0, a1);
            Assert.AreNotEqual(a0, b);

            Assert.AreEqual(a0.GetHashCode(), a0.GetHashCode());
            Assert.AreEqual(a0.GetHashCode(), a1.GetHashCode());
            Assert.AreNotEqual(a0.GetHashCode(), b.GetHashCode());
        }
コード例 #22
0
ファイル: UnixFsApi.cs プロジェクト: jakubbober/Catalyst
        public async Task <Stream> GetAsync(string path,
                                            bool compress            = false,
                                            CancellationToken cancel = default)
        {
            var r = await _nameApi.ResolveAsync(path, true, false, cancel).ConfigureAwait(false);

            var cid = Cid.Decode(r.Remove(0, 6));
            var ms  = new MemoryStream();

            await using (var tarStream = new TarOutputStream(ms, 1))
            {
                using (var archive = TarArchive.CreateOutputTarArchive(tarStream))
                {
                    archive.IsStreamOwner = false;
                    await AddTarNodeAsync(cid, cid.Encode(), tarStream, cancel).ConfigureAwait(false);
                }
            }

            ms.Position = 0;
            return(ms);
        }
コード例 #23
0
        public async Task <IActionResult> Cat(string arg,
                                              long offset = 0,
                                              long length = 0)
        {
            EntityTagHeaderValue etag = null;
            var path = await DfsService.NameApi.ResolveAsync(arg, true, false, Cancel);

            var cid = Cid.Decode(path.Substring(6)); // remove leading "/ipfs/"

            // Use an etag if the path is IPFS or CID.
            if (arg.StartsWith("/ipfs/") || arg[0] != '/')
            {
                etag = ETag(cid);
                Immutable();
            }

            // Use the last part of the path as the download filename
            var filename = arg.Split('/').Last();
            var stream   = await DfsService.UnixFsApi.ReadFileAsync(cid, offset, length, Cancel);

            return(File(stream, "application/octet-stream", filename, null, etag));
        }
コード例 #24
0
 public void TestEmptyString()
 {
     Assert.Throws <ArgumentException>(() => Cid.Decode(""));
 }
コード例 #25
0
        public void Decode_V1_Invalid_MultiBase_String()
        {
            var id = "zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDX?";

            Assert.ThrowsException <FormatException>(() => Cid.Decode(id));
        }
コード例 #26
0
        public void Decode_V1_Invalid_MultiBase_Code()
        {
            var id = "?";

            Assert.ThrowsException <FormatException>(() => Cid.Decode(id));
        }
コード例 #27
0
        /// <summary>
        ///   Resolve an "IPFS path" to a content ID.
        /// </summary>
        /// <param name="path">
        ///   A IPFS path, such as "Qm...", "Qm.../a/b/c" or "/ipfs/QM..."
        /// </param>
        /// <param name="cancel">
        ///   Is used to stop the task.  When cancelled, the <see cref="TaskCanceledException"/> is raised.
        /// </param>
        /// <returns>
        ///   The content ID of <paramref name="path"/>.
        /// </returns>
        /// <exception cref="ArgumentException">
        ///   The <paramref name="path"/> cannot be resolved.
        /// </exception>
        public async Task <Cid> ResolveIpfsPathToCidAsync(string path, CancellationToken cancel = default(CancellationToken))
        {
            var r = await Generic.ResolveAsync(path, true, cancel).ConfigureAwait(false);

            return(Cid.Decode(r.Remove(0, 6)));  // strip '/ipfs/'.
        }
コード例 #28
0
        public void Decode_V0_Invalid()
        {
            var hash = "QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39?";

            Assert.ThrowsException <FormatException>(() => Cid.Decode(hash));
        }
コード例 #29
0
ファイル: CidExtensions.cs プロジェクト: jakubbober/Catalyst
 public static Cid ToCid(this string cid)
 {
     //MultiBase.Encode(cid.ToUtf8Bytes(), Encoding)
     return(Cid.Decode(cid));
 }
コード例 #30
0
ファイル: CidExtensions.cs プロジェクト: umlspec/Catalyst
 public static Cid ToCid(this byte[] cid)
 {
     return(Cid.Decode(MultiBase.Encode(cid, Encoding)));
 }