public void LoadAllKeysWith0()
        {
            int count = 0;

            IndicoApiKeyAccess.IndicoApiKeysUpdated.Subscribe(x => count++);
            var keys = IndicoApiKeyAccess.LoadAllKeys();

            Assert.AreEqual(0, keys.Length);
            Assert.AreEqual(0, count);
        }
        public void LoadAllKeysWith2()
        {
            var k = new IndicoApiKey()
            {
                ApiKey = "key", SecretKey = "noway", Site = "indico.cern.ch"
            };

            IndicoApiKeyAccess.UpdateKey(k);
            k.ApiKey = "key2";
            k.Site   = "indico.fnal.gov";
            IndicoApiKeyAccess.UpdateKey(k);

            var keys = IndicoApiKeyAccess.LoadAllKeys();

            Assert.AreEqual(2, keys.Length);
        }
示例#3
0
        /// <summary>
        /// Basic settings are configured on the view that is attached to this VM.
        /// </summary>
        /// <param name="screen"></param>
        public BasicSettingsViewModel(IScreen screen)
        {
            HostScreen = screen;

            // Look for a currently loaded cert and update the status...
            // We can't start this b.c. the ToProperty is lazy - and it won't
            // fire until Status is data-bound!
            LookupCertStatus = ReactiveCommand.CreateAsyncTask(a => SecurityUtils.FindCert(SecurityUtils.CERNCertName));
            LookupCertStatus
            .Select(c => c == null ? "No Cert Loaded" : string.Format("Loaded (expires {0})", c.ValidTo.ToLocalTime().ToString("yyyy-MM-dd HH:mm")))
            .ToProperty(this, x => x.Status, out _status, "", RxApp.MainThreadScheduler);

            LookupCertStatus
            .ExecuteAsync()
            .Subscribe();

            // Error and status messages...
            var errors = new Subject <string>();

            errors
            .ToProperty(this, x => x.Error, out _error, "", RxApp.MainThreadScheduler);

            // Given a file and a password, see if we can install it as a cert
            // in our internal repository.
            LoadFiles = ReactiveCommand.Create();
            LoadFiles
            .Subscribe(x => errors.OnNext(""));

            var files = LoadFiles
                        .Cast <Tuple <IReadOnlyList <StorageFile>, string> >();

            files
            .Where(finfo => finfo.Item1 == null || finfo.Item1.Count != 1)
            .Select(f => "Invalid certificate file")
            .Subscribe(errors);

            files
            .Where(finfo => finfo.Item1 != null && finfo.Item1.Count == 1)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Select(mf =>
            {
                // We use this double subscribe because the readBufferAsync and ImportPfxDataAsync often return exceptions.
                // If we let the exception bubble all the way up, it terminates the sequence. Which means if the user entered
                // the wrong password they wouldn't get a chance to try again!
                return(Observable.Return(mf)
                       .SelectMany(async f =>
                {
                    // Work around for the TplEventListener not working correctly.
                    // https://social.msdn.microsoft.com/Forums/windowsapps/en-US/3e505e04-7f30-4313-aa47-275eaef333dd/systemargumentexception-use-of-undefined-keyword-value-1-for-event-taskscheduled-in-async?forum=wpdevelop
                    await Task.Delay(1);

                    var fs = f.Item1[0] as StorageFile;
                    var buffer = await FileIO.ReadBufferAsync(fs);
                    var cert = CryptographicBuffer.EncodeToBase64String(buffer);

                    await CertificateEnrollmentManager.ImportPfxDataAsync(cert, f.Item2, ExportOption.NotExportable, KeyProtectionLevel.NoConsent, InstallOptions.DeleteExpired, SecurityUtils.CERNCertName);
                    return Unit.Default;
                }));
            })
            .Subscribe(c => c.Subscribe(
                           g => LookupCertStatus.ExecuteAsync().Subscribe(),
                           e => errors.OnNext(e.Message.TakeFirstLine())
                           ));

            // Set/Get the file expiration policy.
            CacheDecayOptions = ExpirationOptions.GetListExpirationOptions();

            // Get the list of indico api keys we are watching
            // and hook up the MV for doing the api key manipulation
            ApiKeysForIndico = new ReactiveList <IndicoApiKey>();
            ApiKeysForIndico.AddRange(IndicoApiKeyAccess.LoadAllKeys());
            IndicoApiKeyAccess.IndicoApiKeysUpdated
            .Subscribe(_ =>
            {
                using (ApiKeysForIndico.SuppressChangeNotifications())
                {
                    ApiKeysForIndico.Clear();
                    ApiKeysForIndico.AddRange(IndicoApiKeyAccess.LoadAllKeys());
                }
            });

            ShowIndicoApiKey = ReactiveCommand.Create();
            ShowIndicoApiKey
            .Cast <IndicoApiKey>()
            .Select(x => new AddOrUpdateIndicoApiKeyViewModel(x))
            .ToProperty(this, x => x.IndicoApiKey, out _indicoApiKeyVM, new AddOrUpdateIndicoApiKeyViewModel(null));
        }