예제 #1
0
        private async Task EncodeFolder(IEnumerable <string> plainfolder, string rootpath = null)
        {
            foreach (var folder in plainfolder)
            {
                if (!Directory.Exists(folder))
                {
                    Log("folder not found : {0}", folder);
                    continue;
                }
                var encparent = rootpath;
                if (encparent == null)
                {
                    encparent = Directory.GetParent(folder).FullName;
                }

                string encfolder = null;
                if (radioButton_NameEncryption.Checked)
                {
                    var plainfoldername = (folder.EndsWith("\\")) ? Path.GetDirectoryName(folder) : folder;
                    var i = plainfoldername.LastIndexOf('\\');
                    if (i >= 0)
                    {
                        plainfoldername = plainfoldername.Substring(i + 1);
                    }

                    var encfoldername = CryptRclone.EncryptName(plainfoldername);

                    encfolder = Path.Combine(encparent, encfoldername);
                    if (Directory.Exists(encfolder))
                    {
                        Log("Exists : {0}", encfolder);
                        continue;
                    }

                    try
                    {
                        Directory.CreateDirectory(encfolder);
                    }
                    catch (Exception ex)
                    {
                        Log("CreateDirectory failed : {0} {1}", encfolder, ex.Message);
                        continue;
                    }

                    Log("OK : {0}->{1}", folder, encfolder);
                }
                else
                {
                    encfolder = folder;
                }

                // subitems
                var subfiles = Directory.GetFiles(folder);
                var subdirs  = Directory.GetDirectories(folder);

                await EncodeFile(subfiles, encfolder);
                await EncodeFolder(subdirs, encfolder);
            }
        }
예제 #2
0
        private async Task DecodeFile(IEnumerable <string> encfiles, string rootpath = null)
        {
            foreach (var file in encfiles)
            {
                if (!File.Exists(file))
                {
                    Log("file not found : {0}", file);
                    continue;
                }
                var decfilepath = rootpath;
                if (decfilepath == null)
                {
                    decfilepath = Path.GetDirectoryName(file);
                }

                var    encfilename = Path.GetFileName(file);
                string decfilename = null;
                if (encfilename.EndsWith(CryptRclone.encryptedSuffix))
                {
                    decfilename = Path.GetFileNameWithoutExtension(encfilename);
                }
                else
                {
                    if (CryptRclone.IsNameEncrypted(encfilename))
                    {
                        decfilename = CryptRclone.DecryptName(encfilename);
                    }
                    if (string.IsNullOrEmpty(decfilename))
                    {
                        Log("filename decode error : {0}", file);
                        continue;
                    }
                }

                var decfile = Path.Combine(decfilepath, decfilename);
                if (File.Exists(decfile))
                {
                    Log("Exists : {0}", decfile);
                    continue;
                }

                try
                {
                    using (var efile = File.OpenRead(file))
                        using (var dfile = File.OpenWrite(decfile))
                            using (var cfile = new CryptRclone.CryptRclone_DeryptStream(efile))
                            {
                                await cfile.CopyToAsync(dfile, 81920, cts.Token);
                            }
                }
                catch (Exception ex)
                {
                    Log("Decode Error : {0}->{1} {2}", file, decfile, ex.Message);
                    continue;
                }
                Log("OK : {0}->{1}", file, decfile);
            }
        }
예제 #3
0
        private async Task DecodeFolder(IEnumerable <string> encfolder, string rootpath = null)
        {
            foreach (var folder in encfolder)
            {
                if (!Directory.Exists(folder))
                {
                    Log("folder not found : {0}", folder);
                    continue;
                }
                var decparent = rootpath;
                if (decparent == null)
                {
                    decparent = Directory.GetParent(folder).FullName;
                }

                var encfoldername = (folder.EndsWith("\\")) ? Path.GetDirectoryName(folder) : folder;
                var i             = encfoldername.LastIndexOf('\\');
                if (i >= 0)
                {
                    encfoldername = encfoldername.Substring(i + 1);
                }

                string decfoldername = null;
                if (CryptRclone.IsNameEncrypted(encfoldername))
                {
                    decfoldername = CryptRclone.DecryptName(encfoldername);
                }
                string decfolder = Path.Combine(decparent, encfoldername);
                if (!string.IsNullOrEmpty(decfoldername))
                {
                    decfolder = Path.Combine(decparent, decfoldername);
                    if (Directory.Exists(decfolder))
                    {
                        Log("Exists : {0}", decfolder);
                        continue;
                    }

                    try
                    {
                        Directory.CreateDirectory(decfolder);
                    }
                    catch (Exception ex)
                    {
                        Log("CreateDirectory failed : {0} {1}", decfolder, ex.Message);
                        continue;
                    }
                    Log("OK : {0}->{1}", folder, decfolder);
                }

                // subitems
                var subfiles = Directory.GetFiles(folder);
                var subdirs  = Directory.GetDirectories(folder);

                await DecodeFile(subfiles, decfolder);
                await DecodeFolder(subdirs, decfolder);
            }
        }
예제 #4
0
        private async void Form1_DragDrop(object sender, DragEventArgs e)
        {
            string[] fileNames = (string[])e.Data.GetData(DataFormats.FileDrop, false);

            var decodes = fileNames.Where(item => CryptRclone.IsNameEncrypted(Path.GetFileName(item)));
            var encodes = fileNames.Except(decodes);

            await DecodeFile(decodes.Where(item => File.Exists(item)));
            await DecodeFolder(decodes.Where(item => Directory.Exists(item)));
            await EncodeFile(encodes.Where(item => File.Exists(item)));
            await EncodeFolder(encodes.Where(item => Directory.Exists(item)));

            Log("Done.");
        }
예제 #5
0
        public RcloneCryptSystemItem(IRemoteServer server, IRemoteItem orgItem, params IRemoteItem[] parent) : base(server, parent)
        {
            if (!(parent?.Length > 0))
            {
                isRoot = true;
            }

            orgpath      = orgItem.FullPath;
            itemtype     = orgItem.ItemType;
            size         = ((orgItem.Size == null) ? orgItem.Size : CryptRclone.CalcDecryptedSize(orgItem.Size.Value));
            modifiedDate = orgItem.ModifiedDate;
            createdDate  = orgItem.CreatedDate;
            accessDate   = orgItem.AccessDate;

            var encryptor = (_server as RcloneCryptSystem).Encrypter;

            if (encryptor.IsEncryptedName)
            {
                decryptedName = encryptor.DecryptName(orgItem.Name) ?? "";
                if (decryptedName == "" && !isRoot)
                {
                    throw new FileNotFoundException("filename dedoce error");
                }
            }
            else
            {
                if (itemtype == RemoteItemType.Folder)
                {
                    decryptedName = orgItem.Name;
                }
                else
                {
                    if (orgItem.Name.EndsWith(CryptRclone.encryptedSuffix))
                    {
                        decryptedName = orgItem.Name.Substring(0, orgItem.Name.Length - CryptRclone.encryptedSuffix.Length);
                    }
                    else
                    {
                        throw new FileNotFoundException("filename dedoce error");
                    }
                }
            }
            decryptedPath = OrgPathToPath(orgItem as RemoteItemBase);

            if (isRoot)
            {
                SetParent(this);
            }
        }
예제 #6
0
        public async override Task <bool> Add()
        {
            var picker = new TSviewCloud.FormTreeSelect
            {
                Text = "Select encrypt root folder"
            };

            if (picker.ShowDialog() != DialogResult.OK)
            {
                return(false);
            }
            if (picker.SelectedItem == null)
            {
                return(false);
            }
            if (picker.SelectedItem.ItemType == RemoteItemType.File)
            {
                return(false);
            }

            var pass = new FormInputPass();

            if (pass.ShowDialog() != DialogResult.OK)
            {
                return(false);
            }
            Encrypter = new CryptRclone(pass.Password, pass.Salt)
            {
                IsEncryptedName = pass.FilenameEncryption,
            };
            DrivePassword      = pass.Password;
            DriveSalt          = pass.Salt;
            FilenameEncryption = pass.FilenameEncryption;

            cryptRootPath  = picker.SelectedItem.FullPath;
            _dependService = picker.SelectedItem.Server;
            var root = new RcloneCryptSystemItem(this, picker.SelectedItem, null);

            pathlist.AddOrUpdate("", (k) => root, (k, v) => root);
            await EnsureItem("", 1).ConfigureAwait(false);

            _IsReady = true;
            TSviewCloudConfig.Config.Log.LogOut("[Add] RcloneCryptSystem {0} as {1}", cryptRootPath, Name);
            return(true);
        }
예제 #7
0
        private async Task EncodeFile(IEnumerable <string> plainfiles, string rootpath = null)
        {
            foreach (var file in plainfiles)
            {
                if (!File.Exists(file))
                {
                    Log("file not found : {0}", file);
                    continue;
                }
                var encfilepath = rootpath;
                if (encfilepath == null)
                {
                    encfilepath = Path.GetDirectoryName(file);
                }

                var plainfilename = Path.GetFileName(file);
                var encfilename   = (radioButton_NamePlain.Checked)? plainfilename + CryptRclone.encryptedSuffix: CryptRclone.EncryptName(plainfilename);

                var encfile = Path.Combine(encfilepath, encfilename);
                if (File.Exists(encfile))
                {
                    Log("Exists : {0}", encfile);
                    continue;
                }

                using (var pfile = File.OpenRead(file))
                    using (var efile = File.OpenWrite(encfile))
                        using (var cfile = new CryptRclone.CryptRclone_CryptStream(pfile))
                        {
                            try
                            {
                                await cfile.CopyToAsync(efile, 81920, cts.Token);
                            }
                            catch (Exception ex)
                            {
                                Log("Encode Error : {0}->{1} {2}", file, encfile, ex.Message);
                                continue;
                            }
                        }
                Log("OK : {0}->{1}", file, encfile);
            }
        }
예제 #8
0
        public void OnDeserialized(StreamingContext c)
        {
            TSviewCloudConfig.Config.Log.LogOut("[Restore] RcloneCryptSystem {0} as {1}", cryptRootPath, Name);
            Encrypter = new CryptRclone(DrivePassword, DriveSalt)
            {
                IsEncryptedName = FilenameEncryption,
            };
            loadinglist = new ConcurrentDictionary <string, ManualResetEventSlim>();

            var job = JobControler.CreateNewJob();

            job.DisplayName = "CryptRclone";
            job.ProgressStr = "waiting parent";

            JobControler.Run(job, async(j) =>
            {
                j.ProgressStr = "Loading...";
                j.Progress    = -1;

                try
                {
                    int waitcount = 500;
                    while (!(RemoteServerFactory.ServerList.Keys.Contains(_dependService) && RemoteServerFactory.ServerList[_dependService].IsReady))
                    {
                        if (RemoteServerFactory.ServerList.Keys.Contains(_dependService))
                        {
                            await Task.Delay(1, j.Ct).ConfigureAwait(false);
                        }
                        else
                        {
                            await Task.Delay(1000, j.Ct).ConfigureAwait(false);
                        }

                        if (waitcount-- == 0)
                        {
                            throw new FileNotFoundException("Depend Service is not ready.", _dependService);
                        }
                    }
                }
                catch
                {
                    RemoteServerFactory.Delete(this);
                    return;
                }

                if (pathlist == null)
                {
                    pathlist = new ConcurrentDictionary <string, RcloneCryptSystemItem>();
                    var root = new RcloneCryptSystemItem(this, await RemoteServerFactory.PathToItem(cryptRootPath).ConfigureAwait(false), null);
                    pathlist.AddOrUpdate("", (k) => root, (k, v) => root);
                    await EnsureItem("", 1).ConfigureAwait(false);
                }
                else
                {
                    Parallel.ForEach(pathlist.Values.ToArray(),
                                     new ParallelOptions {
                        MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0))
                    },
                                     (x) => x.FixChain(this));
                }

                j.ProgressStr = "Done";
                j.Progress    = 1;

                _IsReady = true;
            });
        }