Exemplo n.º 1
0
        public async Task <PersonalCloud> JoinPersonalCloud(int code, string nodedisplayname)
        {
            byte[]        data  = Encoding.UTF8.GetBytes(code.ToString(CultureInfo.InvariantCulture));
            ulong         hcode = xxHash64.ComputeHash(data, data.Length);
            NodeShareInfo spc   = null;

            lock (sharedPCs)
            {
                spc = sharedPCs.FirstOrDefault(x => x.Hash == hcode);
            }

            if (spc != null)
            {
                var ts = DateTime.UtcNow.ToFileTime();
                data = BitConverter.GetBytes(ts + code);
                var newhcode = xxHash64.ComputeHash(data, data.Length);
                var pcresp   = await httpclient.GetAsync(new Uri(new Uri(spc.Url), $"clouds/{spc.PCId}?ts={ts}&hash={newhcode}")).ConfigureAwait(false);

                if (pcresp.IsSuccessStatusCode)
                {
                    var str = await pcresp.Content.ReadAsStringAsync().ConfigureAwait(false);

                    //todo: add response check(hash check).
                    var pci = JsonConvert.DeserializeObject <PersonalCloudInfo>(str);
                    if ((pci == null) || (pci.DisplayName == null))
                    {
                        throw new InviteNotAcceptedException();
                    }
                    var l  = loggerFactory.CreateLogger("PersonalCloud");
                    var pc = pci.ToPersonalCloud(l, this);
                    pc.NodeDisplayName = nodedisplayname;
                    pc.OnNodeAdded(spc, pci.NodeDisplayName, pci.TimeStamp);
                    lock (_PersonalClouds)
                    {
                        _PersonalClouds.Add(pc);
                    }
                    SavePCList();
                    lock (KnownNodes)
                    {
                        KnownNodes.Clear();
                    }
                    await nodeDiscovery.RePublish(NodeId, ServerPort).ConfigureAwait(false);

                    nodeDiscovery.StartSearch();
                    logger.LogDebug($"Join {pc.DisplayName}");
                    return(pc);
                }
                throw new InvalidDeviceResponseException();
            }
            throw new NoDeviceResponseException();
        }