public bool SyncMessages() { if (!string.IsNullOrEmpty(this.name)) { var curTime = DateTime.Now; var diff = curTime - lastSync; if (diff.TotalSeconds < 20) { return(false); } var script = NeoAPI.GenerateScript(Protocol.scriptHash, "getMailCount", new object[] { System.Text.Encoding.ASCII.GetBytes(this.name) }); var invoke = NeoAPI.TestInvokeScript(Protocol.net, script); if (invoke.result is byte[]) { var count = new BigInteger((byte[])invoke.result); var oldCount = _messages.Count; for (int i = oldCount + 1; i <= count; i++) { var msg = FetchMessage(i); if (msg != null) { _messages.Add(msg); } } lastSync = curTime; return(oldCount != count); } } return(false); }
public Mailbox(KeyPair keys) { this.name = null; this.keys = keys; var script = NeoAPI.GenerateScript(Protocol.scriptHash, "getMailboxFromAddress", new object[] { this.keys.CompressedPublicKey }); var invoke = NeoAPI.TestInvokeScript(Protocol.net, script); if (invoke.result is byte[]) { this.name = System.Text.Encoding.ASCII.GetString((byte[])invoke.result); } }
public IActionResult Upload(IFormFile formFile, UploadResultViewModel model) { if (model == null) { model = new UploadResultViewModel(); } //Check submitted file if (formFile != null && formFile.Length > 0) { using (var fileStream = formFile.OpenReadStream()) { using (Image <Rgba32> image = Image.Load(fileStream)) { //Resize and create Base64 string image.Mutate(x => x .Resize(80, 80)); model.Image = image.ToBase64String(ImageFormats.Png); } } } else if (!string.IsNullOrEmpty(model.Image) && !string.IsNullOrEmpty(model.Address)) { try { //Submit base64 image to smartcontract var script = NeoAPI.GenerateScript(_scriptHash, "add", new object[] { model.Address, model.Image }); var invoke = NeoAPI.TestInvokeScript(NeoAPI.Net.Test, script); //Check result if (invoke.result is byte[]) { var textresult = System.Text.Encoding.ASCII.GetString((byte[])invoke.result); } } catch { } //Get hash //string sha1hash = Sha1Hash(model.Address); //return RedirectToAction("Preview", new { id = sha1hash }); return(View("Preview", new PreviewViewModel() { Image = model.Image })); } return(View(model)); }
private Message FetchMessage(int index) { var script = NeoAPI.GenerateScript(Protocol.scriptHash, "getMailContent", new object[] { this.name, index }); var invoke = NeoAPI.TestInvokeScript(Protocol.net, script); if (invoke.result is byte[]) { var hash = System.Text.Encoding.ASCII.GetString((byte[])invoke.result); var msg = Message.FromHash(hash); return(msg); } return(null); }
private static void Main(string[] args) { var log = new SynkServer.Core.Logger(); var settings = ServerSettings.Parse(args); var server = new HTTPServer(log, settings); var site = new Site(server, "public"); var keys = new Dictionary <string, KeyPair>(); var lines = File.ReadAllLines(rootPath + "keys.txt"); log.Info("Loadking keys..."); foreach (var line in lines) { var temp = line.Split(','); var mail = temp[0]; var key = temp[1]; keys[mail] = new KeyPair(key.HexToBytes()); } log.Info($"Loaded {keys.Count} keys!"); log.Info("Initializing mailboxes..."); var custom_mailboxes = new ConcurrentDictionary <string, Mailbox>(); var default_mailboxes = new ConcurrentDictionary <string, Mailbox>(); foreach (var entry in keys) { var mailbox = new Mailbox(entry.Value); default_mailboxes[entry.Key] = mailbox; if (string.IsNullOrEmpty(mailbox.name)) { log.Info("Registering mail: " + entry.Key); mailbox.RegisterName(entry.Key); } } if (File.Exists(rootPath + whitelistFileName)) { var xml = File.ReadAllText(rootPath + whitelistFileName); var root = XMLReader.ReadFromString(xml); try { root = root["users"]; foreach (var node in root.Children) { if (node.Name.Equals("whitelistuser")) { var user = node.ToObject <WhitelistUser>(); if (user != null) { whitelist.Add(user); whitelistEmailMap[user.email] = user; whitelistWalletMap[user.wallet] = user; } } } } catch { Console.WriteLine("Error loading whitelist!"); } } Console.WriteLine("Initializing server..."); var cache = new FileCache(log, rootPath); Console.CancelKeyPress += delegate { Console.WriteLine("Closing service."); server.Stop(); Environment.Exit(0); }; var templateEngine = new TemplateEngine("views"); site.Get("/", (request) => { return(HTTPResponse.FromString(File.ReadAllText(rootPath + "home.html"))); }); site.Get("/terms", (request) => { return(File.ReadAllBytes(rootPath + "terms.html")); }); site.Get("/demo", (request) => { var currentMailbox = request.session.Get <Mailbox>("current", default_mailboxes.Values.FirstOrDefault()); var context = new Dictionary <string, object>(); var mailboxList = default_mailboxes.Values.ToList(); var customMailbox = request.session.Get <Mailbox>("custom"); if (customMailbox != null) { mailboxList.Add(customMailbox); } context["mailboxes"] = mailboxList; context["currentMailbox"] = currentMailbox.name; context["currentAddress"] = currentMailbox.address; var mails = new List <MailEntry>(); lock (currentMailbox) { foreach (Mail entry in currentMailbox.messages) { var mail = new MailEntry() { from = entry.fromAddress.Split('@')[0], subject = entry.subject, body = entry.body, date = "12:10 AM" }; mails.Insert(0, mail); } } context["mails"] = mails.ToArray(); context["empty"] = mails.Count == 0; var flash = request.session.Get <string>("flash"); if (flash != null) { context["flash"] = flash; request.session.Remove("flash"); } return(templateEngine.Render(site, context, new string[] { "demo" })); }); site.Get("/demo/inbox/{id}", (request) => { var id = request.args["id"]; if (default_mailboxes.ContainsKey(id)) { var mailbox = default_mailboxes[id]; request.session.Set("current", mailbox); } else if (custom_mailboxes.ContainsKey(id)) { var mailbox = custom_mailboxes[id]; request.session.Set("current", mailbox); } return(HTTPResponse.Redirect("/demo")); }); site.Post("/demo/custom", (request) => { var emailStr = request.args["email"]; var privateStr = request.args["private"]; var privateKey = privateStr.HexToBytes(); if (privateKey.Length == 32) { var customKeys = new KeyPair(privateKey); var mailbox = new Mailbox(customKeys); if (string.IsNullOrEmpty(mailbox.name)) { mailbox.RegisterName(emailStr); } else if (mailbox.name != emailStr) { request.session.Set("flash", "Wrong mail for this address"); return(HTTPResponse.Redirect("/demo")); } request.session.Set("current", mailbox); request.session.Set("custom", mailbox); if (!custom_mailboxes.ContainsKey(emailStr)) { custom_mailboxes[emailStr] = mailbox; lock (mailbox) { mailbox.SyncMessages(); } } } return(HTTPResponse.Redirect("/demo")); }); site.Post("/demo/send", (request) => { var to = request.args["to"]; var subject = request.args["subject"]; var body = request.args["body"]; var script = NeoAPI.GenerateScript(Protocol.scriptHash, "getAddressFromMailbox", new object[] { to }); var invoke = NeoAPI.TestInvokeScript(Protocol.net, script); var temp = (byte[])invoke.result; if (temp != null && temp.Length > 0) { var currentMailbox = request.session.Get <Mailbox>("current"); if (currentMailbox == null || string.IsNullOrEmpty(currentMailbox.name)) { request.session.Set("flash", "Invalid mailbox selected"); } else { var msg = Mail.Create(currentMailbox, to, subject, body); try { if (currentMailbox.SendMessage(msg)) { request.session.Set("flash", "Your message was sent to " + to); } } catch (Exception e) { request.session.Set("flash", e.Message); } } } else { request.session.Set("flash", to + " is not a valid Phantasma mailbox address"); } return(HTTPResponse.Redirect("/demo")); }); site.Post("/signup", (request) => { var fullName = request.GetVariable("whitelist_name"); var email = request.GetVariable("whitelist_email"); var wallet = request.GetVariable("whitelist_wallet"); var country = request.GetVariable("whitelist_country"); var captcha = request.GetVariable("whitelist_captcha"); var signature = request.GetVariable("whitelist_signature"); string error = null; if (string.IsNullOrEmpty(fullName) || fullName.Length <= 5) { error = "Full name is invalid"; } else if (string.IsNullOrEmpty(email) || !email.Contains("@") || !email.Contains(".")) { error = "Email is invalid"; } else if (string.IsNullOrEmpty(wallet) || !wallet.ToLower().StartsWith("a") || !WalletHelper.IsValidWallet(wallet)) { error = "Wallet does not seems to be a valid NEO address"; } else if (string.IsNullOrEmpty(country)) { error = "Country is invalid"; } else if (string.IsNullOrEmpty(captcha) || !CaptchaUtils.VerifyCatcha(captcha, signature)) { error = "Captcha is invalid"; } else if (PhantasmaSite.whitelistEmailMap.ContainsKey(email)) { error = "Email already registered"; } else if (PhantasmaSite.whitelistWalletMap.ContainsKey(wallet)) { error = "Wallet already registered"; } var root = DataNode.CreateObject("signup"); root.AddField("result", error != null ? "fail" : "success"); if (error != null) { root.AddField("error", error); } else { var user = new WhitelistUser(); user.name = fullName; user.email = email; user.wallet = wallet; user.country = country; PhantasmaSite.AddToWhitelist(user); } var json = JSONWriter.WriteToString(root); return(Encoding.UTF8.GetBytes(json)); }); site.Get("captcha/", (request) => { var content = File.ReadAllText(rootPath + "captcha.html"); string sign; string pic; CaptchaUtils.GenerateCaptcha(rootPath + "captcha.fnt", out sign, out pic); content = content.Replace("$SIGNATURE", sign).Replace("$CAPTCHA", pic); return(Encoding.UTF8.GetBytes(content)); }); #region EMAIL SYNC THREAD log.Info("Running email thread"); var emailThread = new Thread(() => { Thread.CurrentThread.IsBackground = true; do { foreach (var mailbox in default_mailboxes.Values) { try { lock (mailbox) { mailbox.SyncMessages(); } } catch { continue; } } foreach (var mailbox in custom_mailboxes.Values) { try { lock (mailbox) { mailbox.SyncMessages(); } } catch { continue; } } var delay = (int)(TimeSpan.FromSeconds(5).TotalMilliseconds); Thread.Sleep(delay); } while (true); }); emailThread.Start(); #endregion server.Run(); }