Exemplo n.º 1
0
        public ActionResult Index()
        {
            var nutData = new NutData
            {
                Timestamp = DateTime.Now,
                Address   = IPAddress.Parse(Request.ServerVariables["REMOTE_ADDR"]),
                Counter   = ++Globals.Counter,
                Entropy   = new byte[4]
            };

            // just to keep the database size down, delete all nuts older than 2 minutes, but only every 10 page requests
            if (Globals.Counter % 10 == 0)
            {
                var deleted = _nutRepository.DeleteOlderThan(DateTime.Now.AddMinutes(-2));
                Console.WriteLine("{0} nuts deleted", deleted);
            }

            var rng = new RNGCryptoServiceProvider();

            rng.GetBytes(nutData.Entropy);

            var nut = HttpServerUtility.UrlTokenEncode(_sqrlServer.GenerateNut(Globals.AesKey, Globals.AesIV, nutData));
            var url = string.Format("{0}/{1}",
                                    Url.Action("Sqrl",
                                               "Login",
                                               null,
                                               "sqrl",
                                               Request.Url.Host + ":" + Request.Url.Port),
                                    nut);

            _nutRepository.Create(nut);

            var barcodeWriter = new BarcodeWriter
            {
                Format  = BarcodeFormat.QR_CODE,
                Options = new EncodingOptions
                {
                    Width  = 400,
                    Height = 400
                }
            };

            var          image  = barcodeWriter.Write(url);
            MemoryStream stream = new System.IO.MemoryStream();

            image.Save(stream, ImageFormat.Png);
            byte[] imageBytes = stream.ToArray();

            var model = new SqrlLoginModel
            {
                Url    = url,
                QrCode = Convert.ToBase64String(imageBytes),
                Nut    = nut
            };

            return(View(model));
        }