示例#1
0
        public async Task <IActionResult> CreateVouchers(
            [FromRoute] int count
            )
        {
            if (!Hosting.IsDevelopment())
            {
                return(Unauthorized());
            }

            if (count <= 0 || count > 100)
            {
                throw new ArgumentOutOfRangeException(nameof(count), "Voucher count out of range");
            }

            Logger.LogInformation("Creating {0} test vouchers", count);

            var testSource = await Mongo.GetSourceById(_testSourceId);

            var rnd = new Random();
            var aim = (await Mongo.GetAims()).OrderBy(a => rnd.NextDouble()).First();

            Logger.LogTrace("Test source: {0}, random aim '{1}'", testSource.Name, aim.Code);

            var now          = DateTime.UtcNow;
            var voucherInfos = new VoucherCreatePayload.VoucherInfo[] {
                new VoucherCreatePayload.VoucherInfo {
                    Aim       = aim.Code,
                    Latitude  = rnd.NextBetween(5, 40),
                    Longitude = rnd.NextBetween(5, 50),
                    Timestamp = DateTime.UtcNow,
                    Count     = count
                }
            };

            (var otcGen, var pwd) = await Operator.CreateGenerationRequest(testSource, new VoucherCreatePayload.Content {
                Nonce    = Guid.NewGuid().ToString("N"),
                SourceId = testSource.Id.ToString(),
                Vouchers = voucherInfos
            }, isPreVerified : true);

            Logger.LogDebug("New voucher generation request created with code {0}", otcGen);

            return(Ok(new {
                OtcGen = UrlGenerator.GenerateRedeemUrl(otcGen),
                Pin = pwd
            }));
        }
示例#2
0
        public async Task CreateAndRedeemMultipleVouchers()
        {
            var now = DateTime.UtcNow;

            var voucherInfos = new VoucherCreatePayload.VoucherInfo[] {
                new VoucherCreatePayload.VoucherInfo {
                    Aim       = "I",
                    Latitude  = 12.34,
                    Longitude = 23.45,
                    Timestamp = now
                },
                new VoucherCreatePayload.VoucherInfo {
                    Aim       = "I",
                    Latitude  = 23.45,
                    Longitude = 34.56,
                    Timestamp = now,
                    Count     = 2
                }
            };

            var p = _womClient.CreatePocket();

            await Collect(p, voucherInfos);

            Assert.AreEqual(3, p.VoucherCount);
            foreach (var v in p.Vouchers)
            {
                Assert.AreEqual("I", v.Aim);
                Assert.AreEqual(now.ToSecondPrecision(), v.Timestamp.ToSecondPrecision());
            }

            Assert.AreEqual(voucherInfos[0].Latitude, p.Vouchers[0].Latitude);
            Assert.AreEqual(voucherInfos[0].Longitude, p.Vouchers[0].Longitude);
            Assert.AreEqual(voucherInfos[1].Latitude, p.Vouchers[1].Latitude);
            Assert.AreEqual(voucherInfos[1].Longitude, p.Vouchers[1].Longitude);
            Assert.AreEqual(voucherInfos[1].Latitude, p.Vouchers[2].Latitude);
            Assert.AreEqual(voucherInfos[1].Longitude, p.Vouchers[2].Longitude);
        }
示例#3
0
        public async Task <IActionResult> GenerateVouchers(
            [FromForm] string sourceId,
            [FromForm] int genCount,
            [FromForm] int voucherCount,
            [FromForm] double latitude,
            [FromForm] double longitude,
            [FromForm] string date,
            [FromForm] string time,
            [FromForm] string aimCode
            )
        {
            if (sourceId == null)
            {
                _logger.LogError("SourceID not set");
                return(RedirectToAction(nameof(ShowInstruments)));
            }
            if (genCount <= 0)
            {
                ErrorMessage = "Generation count cannot be 0 or negative";
                return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId }));
            }
            if (voucherCount <= 0)
            {
                ErrorMessage = "Number of vouchers cannot be 0 or negative";
                return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId }));
            }

            var tsString = $"{date}T{time}";

            if (!DateTime.TryParseExact(tsString, "yyyy-MM-ddTHH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var timestamp))
            {
                _logger.LogError("Timestamp string {0} not parsable", tsString);

                ErrorMessage = "Date or time not set correctly";
                return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId }));
            }

            var session = HttpContext.Session.GetObject <SessionInfo>(Program.SessionKeyLogin);
            var login   = await _client.LoginAsSource(session.Username, session.Password);

            string key = GetKey(login, sourceId);

            if (key == null)
            {
                _logger.LogError("SourceID does not match logged-in user's authorized sources");
                return(RedirectToAction(nameof(ShowInstruments)));
            }

            using var keyStream = new MemoryStream(Encoding.ASCII.GetBytes(key));
            var instrument = _client.CreateInstrument(sourceId, keyStream);

            _logger.LogInformation("Requesting {0} vouchers for aim {1}, in {2:F3}x{3:F3} at {4} ({5} reps)",
                                   voucherCount, aimCode, latitude, longitude, timestamp, genCount);

            var voucherInfo = new VoucherCreatePayload.VoucherInfo {
                Aim       = aimCode,
                Count     = voucherCount,
                Latitude  = latitude,
                Longitude = longitude,
                Timestamp = timestamp
            };

            try {
                var result = await instrument.RequestVouchers(new VoucherCreatePayload.VoucherInfo[] {
                    voucherInfo
                });

                return(Content($"{result.Link} {result.Password}"));
            }
            catch (Exception ex) {
                _logger.LogError(ex, "Failed to request vouchers");

                ErrorMessage = "Failed to request vouchers";
                return(RedirectToAction(nameof(ShowGenerationForm), new { sourceId }));
            }
        }