public void Execute(Fileset fileset)
        {
            _activityLogService.Log(fileset.Id, "Executing manual copy");

            foreach (var item in fileset.Includes)
            {
                var fileName = Path.GetFileName(item.RelativePath);
                var filePath = FilesetItem.GetFullPath(fileset.SourcePath, item.RelativePath);

                var replicationItem = new ReplicationItem
                {
                    Fileset             = fileset,
                    FileName            = fileName,
                    FullSourcePath      = filePath,
                    FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                };
                replicationItem.Data.LockingProcesses = new string[0];
                _replicationQueue.TryAdd(replicationItem);
            }

            if (fileset.Excludes.Any())
            {
                var relativePath  = fileset.Excludes.FirstOrDefault().RelativePath;
                var fullPath      = FilesetItem.GetFullPath(fileset.SourcePath, relativePath);
                var directoryName = Path.GetDirectoryName(fullPath);

                if (!string.IsNullOrEmpty(directoryName))
                {
                    IEnumerable <string> files = Directory.GetFiles(directoryName);
                    files = files.Except(fileset.Excludes.Select(f =>
                    {
                        return(FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath));
                    }));

                    foreach (var file in files)
                    {
                        var fileName        = Path.GetFileName(file);
                        var replicationItem = new ReplicationItem
                        {
                            Fileset             = fileset,
                            FileName            = fileName,
                            FullSourcePath      = file,
                            FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                        };
                        replicationItem.Data.LockingProcesses = new string[0];
                        _replicationQueue.TryAdd(replicationItem);
                    }
                }
            }
        }
        private void OnItemCopied(ReplicationItem item)
        {
            var title = GetBalloonTipTitle(item.Fileset);

            _taskbarIcon.HideBalloonTip();
            _taskbarIcon.ShowBalloonTip(
                title,
                item.FileName + " copied",
                BalloonIcon.Info);

            _lastActiveFilesets.Remove(item.Fileset);
            _lastActiveFilesets.Insert(0, item.Fileset);

            if (_lastActiveFilesets.Count > 5)
            {
                _lastActiveFilesets.RemoveAt(_lastActiveFilesets.Count - 1);
            }
        }
Exemplo n.º 3
0
        public NewCardResults RequestNewCard(string password)
        {
            if (!Thread.CurrentPrincipal.IsInRole("Clients"))
            {
                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     ExtractUsernameFromFullName(Thread.CurrentPrincipal.Identity.Name),
                                                                     "Request for new card failed client isn't in client's role.",
                                                                     EventLogEntryType.FailureAudit));
                });
                throw new SecurityException("Principal isn't part of Clients role.");
            }

            try
            {
                var clientName = ExtractUsernameFromFullName(Thread.CurrentPrincipal.Identity.Name);

                Console.WriteLine($"Client {clientName} requested new card.");

                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     clientName,
                                                                     "Request for new card!",
                                                                     EventLogEntryType.Information));
                });

                if (CertificateManager.Instance.GetCertificateFromStore(
                        StoreLocation.LocalMachine,
                        StoreName.My,
                        clientName) != null)
                {
                    throw new InvalidOperationException("You already have issued card.");
                }

                RevokeCertificate(clientName);

                var CACertificate = CertificateManager.Instance.GetCACertificate();
                CertificateManager.Instance.CreateAndStoreNewCertificate(
                    clientName,
                    password,
                    CACertificate,
                    BankAppConfig.BankTransactionServiceCertificatePath);

                var cert = CertificateManager.Instance.GetCertificateFromStore(
                    StoreLocation.LocalMachine,
                    StoreName.My,
                    clientName);

                if (cert == null)
                {
                    throw new ArgumentNullException(nameof(cert));
                }

                var resultData = new NewCardResults
                {
                    PinCode = GenerateRandomPin()
                };

                var client = BankCache.GetClientFromCache(_bankCache, clientName);
                client.ResetPin(null, resultData.PinCode);

                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     clientName,
                                                                     "Successfully created a card!",
                                                                     EventLogEntryType.Information));
                });

                _bankCache.StoreData();

                var replicationData = new ReplicationItem(
                    client,
                    ReplicationType.UserData | ReplicationType.CertificateData,
                    cert);
                _replicatorProxy.ReplicateData(replicationData);


                return(resultData);
            }
            catch (ArgumentNullException ane)
            {
                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     Thread.CurrentPrincipal.Identity.Name,
                                                                     ane.Message,
                                                                     EventLogEntryType.Error));
                });

                throw new FaultException <CustomServiceException>(new CustomServiceException(ane.Message + "was null!"));
            }
        }
Exemplo n.º 4
0
        public bool ExtendCard(string password)
        {
            var clientName = ExtractUsernameFromFullName(Thread.CurrentPrincipal.Identity.Name);

            if (!Thread.CurrentPrincipal.IsInRole("Clients"))
            {
                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     clientName,
                                                                     $"({nameof(BankServiceApp)}) [BankMasterCardService] Client isn't part of Clients group.",
                                                                     EventLogEntryType.FailureAudit));
                });
                throw new SecurityException("Principal isn't part of Clients role.");
            }

            try
            {
                Console.WriteLine($"Client {clientName} requested extension.");

                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     clientName,
                                                                     "Requested extension.",
                                                                     EventLogEntryType.Information));
                });

                RevokeCertificate(clientName);

                var CACertificate = CertificateManager.Instance.GetCACertificate();
                CertificateManager.Instance.CreateAndStoreNewCertificate(
                    clientName,
                    password,
                    CACertificate,
                    BankAppConfig.BankTransactionServiceCertificatePath);

                var newCert = CertificateManager.Instance.GetCertificateFromStore(
                    StoreLocation.LocalMachine,
                    StoreName.My,
                    clientName);

                if (newCert == null)
                {
                    return(false);
                }

                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     clientName,
                                                                     "Successfully extended the card.",
                                                                     EventLogEntryType.Information));
                });

                var replicationItem = new ReplicationItem(null, ReplicationType.CertificateData, newCert);
                _replicatorProxy.ReplicateData(replicationItem);

                return(true);
            }
            catch (ArgumentNullException ane)
            {
                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     Thread.CurrentPrincipal.Identity.Name,
                                                                     ane.Message,
                                                                     EventLogEntryType.Error));
                });

                throw new FaultException <CustomServiceException>(new CustomServiceException(ane.Message + "was null!"),
                                                                  $"{ane.Message} was null!");
            }
        }
Exemplo n.º 5
0
        public bool RevokeExistingCard(string pin)
        {
            if (!Thread.CurrentPrincipal.IsInRole("Clients"))
            {
                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     ExtractUsernameFromFullName(Thread.CurrentPrincipal.Identity.Name),
                                                                     "Request for new card failed client isn't in client's role.",
                                                                     EventLogEntryType.FailureAudit));
                });
                throw new SecurityException("Client isn't in required role.");
            }

            try
            {
                // Check if client exists
                var clientName = ExtractUsernameFromFullName(Thread.CurrentPrincipal.Identity.Name);
                var client     = default(IClient);
                client = BankCache.GetClientFromCache(_bankCache, clientName);

                if (client == null)
                {
                    return(false);
                }

                // if he exists in the system, authorize him
                if (client.CheckPin(pin))
                {
                    Console.WriteLine($"Client {clientName} requested card revocation.");
                    Task.Run(() =>
                    {
                        ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                         _applicationName,
                                                                         clientName,
                                                                         "Requested card revocation.",
                                                                         EventLogEntryType.Information));
                    });

                    var cert = CertificateManager.Instance.GetCertificateFromStore(
                        StoreLocation.LocalMachine,
                        StoreName.My,
                        clientName);

                    if (cert == null)
                    {
                        return(false);
                    }

                    var revoked = RevokeCertificate(clientName);

                    if (revoked)
                    {
                        Task.Run(() =>
                        {
                            ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                             _applicationName,
                                                                             clientName,
                                                                             "Successfully revoked the card.",
                                                                             EventLogEntryType.Information));
                        });

                        client.Pin = null;
                        _bankCache.StoreData();

                        // We also replicate client data since pin wa removed
                        var replicationData = new ReplicationItem(
                            client,
                            ReplicationType.UserData | ReplicationType.CertificateData |
                            ReplicationType.RevokeCertificate,
                            cert);
                        _replicatorProxy.ReplicateData(replicationData);
                    }

                    return(revoked);
                }

                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     clientName,
                                                                     "Invalid pin.",
                                                                     EventLogEntryType.FailureAudit));
                });

                throw new SecurityException("Invalid pin.");
            }
            catch (ArgumentNullException ane)
            {
                Task.Run(() =>
                {
                    ProxyPool.GetProxy <IBankAuditService>().Log(new EventLogData(
                                                                     _applicationName,
                                                                     Thread.CurrentPrincipal.Identity.Name,
                                                                     ane.Message,
                                                                     EventLogEntryType.Error));
                });

                throw;
            }
        }
        private void ReplicationRun()
        {
            try
            {
                foreach (var item in _replicationQueue.GetConsumingEnumerable(_cts.Token))
                {
                    ReplicationItem currentItem = item;

                    ScriptScope scope = _scriptEngine.CreateScope();
                    scope.SetVariable("fileInfo", currentItem);
                    scope.SetVariable("fileset", currentItem.Fileset);
                    scope.SetVariable("retryCopy", new Action(() =>
                    {
                        currentItem.IncrementRetries();
                        _replicationQueue.Add(currentItem);
                    }));
                    scope.SetVariable("log", new Action <string>(message =>
                    {
                        _activityLogService.Log(currentItem.Fileset.Id, message);
                    }));

                    if (File.Exists(_copyEventScriptFile))
                    {
                        try
                        {
                            ExecuteScripts(_scriptEngine, scope, currentItem.Fileset.OnCopyScripts);
                            ExecuteScripts(_scriptEngine, scope, currentItem.Fileset.OnCopySuccessScripts);

                            _eventAggregator.GetEvent <CopiedEvent>().Publish(currentItem);
                        }
                        catch (Exception e)
                        {
                            try
                            {
                                scope.SetVariable("exception", e);
                                ExecuteScripts(_scriptEngine, scope, currentItem.Fileset.OnCopyErrorScripts);
                            }
                            catch (Exception exception)
                            {
                                Trace.WriteLine(exception);
                            }

                            _eventAggregator.GetEvent <CopyErrorEvent>().Publish(Tuple.Create(currentItem, e));
                        }
                        finally
                        {
                            try
                            {
                                ExecuteScripts(_scriptEngine, scope, currentItem.Fileset.OnCopyFinallyScripts);
                            }
                            catch (Exception e)
                            {
                                Trace.WriteLine(e);
                            }
                        }
                    }
                }
            }
            catch (OperationCanceledException oce)
            {
                Trace.WriteLine(oce);
            }
        }
        private void ActivateFileset(Fileset fileset)
        {
            List <IDisposable> watchers;

            if (!_watchers.TryGetValue(fileset, out watchers))
            {
                watchers = new List <IDisposable>();
                _watchers.TryAdd(fileset, watchers);
            }

            DeactivateFileset(fileset);

            var distinctIncludeFolders = fileset.Includes.Select(f =>
            {
                var fullPath = FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath);
                return(new FileInfo(fullPath).DirectoryName);
            }).Distinct();

            var distinctExcludeFolders = fileset.Excludes.Select(f =>
            {
                var fullPath = FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath);
                return(new FileInfo(fullPath).DirectoryName);
            }).Distinct();

            var foldersToWatch = distinctIncludeFolders.Union(distinctExcludeFolders);

            foreach (var folderToWatch in foldersToWatch)
            {
                if (Directory.Exists(folderToWatch))
                {
                    IDisposable observable = GetObservable(folderToWatch)
                                             .Buffer(TimeSpan.FromSeconds(2))
                                             .Subscribe(t =>
                    {
                        if (t.Any())
                        {
                            var fileNames = t.Distinct();

                            foreach (var filePath in fileNames)
                            {
                                var relativePath = FilesetItem.GetRelativePath(fileset.SourcePath, filePath);

                                if (fileset.Includes.Any(f => f.RelativePath == relativePath))
                                {
                                    var fileName        = Path.GetFileName(filePath);
                                    var replicationItem = new ReplicationItem
                                    {
                                        Fileset             = fileset,
                                        FileName            = fileName,
                                        FullSourcePath      = filePath,
                                        FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                                    };
                                    replicationItem.Data.LockingProcesses = new string[0];
                                    _replicationQueue.TryAdd(replicationItem);
                                }

                                if (fileset.Excludes.Any())
                                {
                                    string directoryName = Path.GetDirectoryName(filePath);

                                    if (!string.IsNullOrEmpty(directoryName))
                                    {
                                        IEnumerable <string> files = Directory.GetFiles(directoryName);
                                        files = files.Except(fileset.Excludes.Select(f =>
                                        {
                                            return(FilesetItem.GetFullPath(fileset.SourcePath, f.RelativePath));
                                        }));

                                        foreach (var file in files)
                                        {
                                            var fileName        = Path.GetFileName(file);
                                            var replicationItem = new ReplicationItem
                                            {
                                                Fileset             = fileset,
                                                FileName            = fileName,
                                                FullSourcePath      = filePath,
                                                FullDestinationPath = Path.Combine(fileset.DestinationPath, fileName)
                                            };
                                            replicationItem.Data.LockingProcesses = new string[0];

                                            _replicationQueue.TryAdd(replicationItem);
                                        }
                                    }
                                }
                            }
                        }
                    });

                    watchers.Add(observable);
                }
            }
        }