예제 #1
0
        public async Task <IActionResult> InicioDeSesionAdmin(Administrador ad)
        {
            celularesContext context = new celularesContext();
            UsuarioRepository <Administrador> directorRepos = new UsuarioRepository <Administrador>(context);
            var director = context.Administrador.FirstOrDefault(x => x.Clave == ad.Clave);

            try
            {
                if (director != null && director.Contrasena == HashHelp.GetHelper(ad.Contrasena))
                {
                    List <Claim> info = new List <Claim>();
                    info.Add(new Claim(ClaimTypes.Name, "Usuario" + director.Nombre));
                    info.Add(new Claim(ClaimTypes.Role, "Admin"));
                    info.Add(new Claim("Clave", director.Nombre.ToString()));
                    info.Add(new Claim("Nombre", director.Nombre));

                    var claimsidentity  = new ClaimsIdentity(info, CookieAuthenticationDefaults.AuthenticationScheme);
                    var claimsprincipal = new ClaimsPrincipal(claimsidentity);
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimsprincipal,
                                                  new AuthenticationProperties { IsPersistent = true });

                    return(RedirectToAction("Index"));
                }
                else
                {
                    ModelState.AddModelError("", "La clave o la contraseña del administrador son incorrectas.");
                    return(View(ad));
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
                return(View(ad));
            }
        }
예제 #2
0
        public static async ValueTask <CQCode> Image(string url, CQFileType type = default, IHttpClientFactory httpClientFactory = default)
        {
            HttpClient client;

            byte[] data;
            switch (type)
            {
            case CQFileType.Url:
                return(CQCode.CQImage(url));

            case CQFileType.Base64:
                client = httpClientFactory == default ? new HttpClient() : httpClientFactory.CreateClient("default");
                data   = await client.GetByteArrayAsync(url);

                return(CQCode.CQImage("base64://" + Convert.ToBase64String(data)));

            case CQFileType.File:
                Uri uri = new(url);
                client = httpClientFactory == default ? new HttpClient() : httpClientFactory.CreateClient("default");
                data   = await client.GetByteArrayAsync(uri);

                var filePath = ImageCachePath + HashHelp.MD5Encrypt(data) + Path.GetExtension(uri.Segments.Last());
                await File.WriteAllBytesAsync(filePath, data);

                return(CQCode.CQImage(new Uri(filePath).AbsoluteUri));

            default:
                return(null);
            }
        }
예제 #3
0
 [HttpPost] // TODO - is this password validation location?
 public IActionResult LogOn(LogOnViewModel logOnViewModel)
 {
     if (ModelState.IsValid)
     {
         string email    = logOnViewModel.Email;
         string password = logOnViewModel.Password;
         // TODO - if (chkUser == null) {} ....
         //var getUser = (from s in context.ObjRegisterUser where s.UserName == userName || s.EmailId == userName select s).FirstOrDefault(); (((( Just an example for ideas that I copied))
         var getUser = (from s in context.Users where s.Email == email || s.PasswordHash == email select s).FirstOrDefault();
         if (getUser != null)
         {
             var hashCode = getUser.HashCode;
             //Password Hasing Process Call Helper Class Method
             var encodingPasswordString = HashHelp.EncodePassword(password, hashCode);
             //Check Login Detail User Name Or Password
             var query = (from s in context.Users where (s.Email == email || s.PasswordHash == email) && s.PasswordHash.Equals(encodingPasswordString) select s).FirstOrDefault();
             if (query != null)
             {
                 string screenName = getUser.ScreenName;
                 HttpContext.Session.Clear();
                 HttpContext.Session.SetString("_Email", email); // TODO - added as per session guide.
                 HttpContext.Session.SetString("_ScreenName", screenName);
                 return(Redirect("/Welcome"));
             }
             ViewBag.ErrorMessage = "Invalid User Name and/or Password ";
             return(View());
         }
         ViewBag.ErrorMessage = "Invalid User Name and/or Password ";
         return(View());
     }
     return(View(logOnViewModel));
 }
        public async Task <bool> Login(HttpContext httpContext, UserLoginModel model)
        {
            // Hash login password.
            string plainPassword  = model.Password;
            string hashedPassword = HashHelp.GetSha512Hash(plainPassword);

            // Find user.
            var users     = _database.GetCollection <User>(User.CollectionName);
            var foundUser = users.Where(u => u.UserName.Equals(model.UserName) && u.Password.Equals(hashedPassword)).FirstOrDefault();

            if (foundUser != null)
            {
                var claims = new List <Claim>
                {
                    new Claim(ClaimTypes.NameIdentifier, foundUser.Id.ToString()),
                    new Claim(ClaimTypes.Name, foundUser.UserName),
                    new Claim(ClaimTypes.Email, foundUser.Email)
                };

                var claimsIdentity = new ClaimsIdentity(
                    claims, CookieAuthenticationDefaults.AuthenticationScheme);

                var authProperties = new AuthenticationProperties
                {
                    // Refreshing the authentication session should be allowed.
                    AllowRefresh = true,

                    // Set login cookie duration the same as sliding login configuration in start up.
                    ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),

                    IsPersistent = true,
                    IssuedUtc    = DateTimeOffset.UtcNow
                };

                await httpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    new ClaimsPrincipal(claimsIdentity),
                    authProperties);

                return(true);
            }
            return(false);
        }
        public bool Register(UserRegistrationModel model)
        {
            var filterBuilder = Builders <User> .Filter;
            var filter        = filterBuilder.Eq(x => x.UserName, model.Username)
                                | filterBuilder.Eq(x => x.Email, model.Email);
            var duplicateEntity = _database.FindOneByFilter(User.CollectionName, filter);

            // TODO: Return message that there is a duplicate and which one is duplicate.
            if (duplicateEntity != null)
            {
                return(false);
            }

            string plainPassword  = model.Password;
            string hashedPassword = HashHelp.GetSha512Hash(plainPassword);

            var user = new User(model.Username, hashedPassword, model.Email);

            _database.Create(user, User.CollectionName);

            return(true);
        }
예제 #6
0
        public static async ValueTask <CQCode> Video(string url, CQFileType type = default, string cover = default, IHttpClientFactory httpClientFactory = default)
        {
            switch (type)
            {
            case CQFileType.Url:
                return(CQCode.CQVideo(url, cover));

            case CQFileType.Base64:
                throw new NotSupportedException("Video不支持Base64发送");

            case CQFileType.File:
                Uri uri    = new(url);
                var client = httpClientFactory == default ? new HttpClient() : httpClientFactory.CreateClient("default");
                var data   = await client.GetByteArrayAsync(uri);

                var filePath = VideoCachePath + HashHelp.MD5Encrypt(data) + Path.GetExtension(uri.Segments.Last());
                await File.WriteAllBytesAsync(filePath, data);

                return(CQCode.CQVideo(new Uri(filePath).AbsoluteUri, cover));

            default:
                return(null);
            }
        }
예제 #7
0
        [HttpPost] // TODO - Need Better validation on all entry Fields!!.
        public IActionResult Register(RegisterUserViewModel registerUserViewModel)
        {
            if (ModelState.IsValid)
            {
                int errorCount = 0;

                //Check if "password" and "confirm password" match:
                if (registerUserViewModel.Password != registerUserViewModel.ConfirmPassword)
                {
                    errorCount++;
                    ViewBag.PasswordMatchError = "Passwords do not match";
                }

                // Check if Email is already used in DB.
                IList <User> usersMatchingEmail = context.Users
                                                  .Where(u => u.Email == registerUserViewModel.Email)
                                                  .ToList();
                if (usersMatchingEmail.Count > 0)
                {
                    ViewBag.EmailInUse = "Email is already in use.";
                    errorCount++;
                }
                // Check if Screen Name is already used in DB.
                IList <User> usersMatchingScreenName = context.Users
                                                       .Where(u => u.ScreenName == registerUserViewModel.ScreenName)
                                                       .ToList();
                if (usersMatchingScreenName.Count > 0)
                {
                    ViewBag.ScreenNameInUse = "Screen Name is already in use.";
                    errorCount++;
                }


                //// stackoverflow.com/questions/5342375/regex-email-validation
                try
                {
                    MailAddress m = new MailAddress(registerUserViewModel.Email);
                }
                catch (FormatException)
                {
                    ViewBag.EmailError = "Invalid Email address.";
                    errorCount++;
                    //return View(registerUserViewModel);
                }
                ////

                if (registerUserViewModel.PhoneNumber != null)
                {
                    ////www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s02.html
                    Regex phoneRegex = new Regex(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$");

                    if (phoneRegex.IsMatch(registerUserViewModel.PhoneNumber))
                    {
                        formattedPhoneNumber = phoneRegex.Replace(registerUserViewModel.PhoneNumber, "($1) $2-$3");
                    }
                    else
                    {
                        // TODO - Invalid phone number ViewBag.error
                        errorCount++;
                        ViewBag.PhoneNumberError = "Invalid Phone Number";
                        //return View(registerUserViewModel);
                    }
                    ////
                }

                if (errorCount > 0)
                {
                    return(View(registerUserViewModel));
                }

                var  newSalt      = HashHelp.GeneratePassword(10);
                var  passwordHash = HashHelp.EncodePassword(registerUserViewModel.Password, newSalt);
                User newUser      = new User
                {
                    ScreenName       = registerUserViewModel.ScreenName,
                    Email            = registerUserViewModel.Email,
                    PasswordHash     = passwordHash,
                    HashCode         = newSalt,
                    CreationTime     = DateTime.Now,
                    ModificationTime = DateTime.Now,
                    PhoneNumber      = formattedPhoneNumber
                };// TODO - Why would I need to "Clear a ModelState"?
                context.Users.Add(newUser);
                context.SaveChanges();
                HttpContext.Session.Clear();
                HttpContext.Session.SetString("_Email", registerUserViewModel.Email); // TODO - added as per session guide.
                HttpContext.Session.SetString("_ScreenName", registerUserViewModel.ScreenName);
                return(Redirect("/User"));
            }
            return(View(registerUserViewModel));
        }
예제 #8
0
        /// <summary>
        /// 发送一个消息包
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="needencrypt">是否加密</param>
        /// <returns></returns>
        public override void SendPacket(Packet packet, bool encrypt_if_need)
        {
            if (m_sendlock == null)
            {
                UnityEngine.Debug.Log("m_sendlock == null");
                return;
            }

            lock (this)
            {
                packet.SerialNumber = m_lastSendPacketSerialNumber;
                m_lastSendPacketSerialNumber++;

                byte[]     data       = packet.ToArray();
                int        datalength = packet.Length;
                PacketFlag packetflag = packet.PacketFlag;
                //加密,压缩消息包
                if (m_secure_connection && m_connectionState == ConnectionState.Connected)
                {
                    if (tls_sendSecureBuffer == null)
                    {
                        tls_sendSecureBuffer = new byte[Packet.MaxLength];
                    }
                    //压缩
                    bool compressed = false;
#if _NC_Compress
                    if (data.Length > Packet.NeedCompressMinLength)
                    {
                        int outlen = Compress.LZO.Compress(data, Packet.NoCryptHeaderLength, data.Length - Packet.NoCryptHeaderLength,
                                                           tls_sendSecureBuffer, Packet.NoCryptHeaderLength);
                        if (outlen <= (data.Length - 20))                        //压缩有实际效果
                        {
                            //Buffer.BlockCopy(m_sendSecureBuffer, 0, data, Packet.NoCryptHeaderLength, outlen);
                            datalength = outlen + Packet.NoCryptHeaderLength;
                            Buffer.BlockCopy(data, 0, tls_sendSecureBuffer, 0, Packet.NoCryptHeaderLength);
                            if (m_compressneedchecksum)
                            {
                                uint crccheck = HashHelp.CRC32hash(tls_sendSecureBuffer, Packet.NoCryptHeaderLength, outlen);
                                ArrayUtility.SetInt(tls_sendSecureBuffer, (int)crccheck, datalength);
                                datalength += 4;
                            }
                            packetflag |= PacketFlag.Compressed;
                            data        = tls_sendSecureBuffer;
                            compressed  = true;
                        }
                    }
                    if (encrypt_if_need && m_encrypt != null)
                    {
                        if (!compressed)
                        {
                            Buffer.BlockCopy(data, 0, tls_sendSecureBuffer, 0, datalength);
                            data = tls_sendSecureBuffer;
                        }
                        m_encrypt.Encrypt(data, Packet.NoCryptHeaderLength, datalength - Packet.NoCryptHeaderLength);
                        packetflag |= PacketFlag.Encrypted;
                    }
#endif
                }

                //设置消息长度
                ArrayUtility.SetByte(data, (byte)packetflag, Packet.OffsetFlag);
                ArrayUtility.SetShort(data, (short)datalength, Packet.OffsetLength);
                this.Send(data, datalength);
            }
        }
예제 #9
0
        //把底层传来的数据分多次提交给使用者。
        //每次提交的数据称为包,其大小记录在包头,所有的包顺序排列。
        //如果现存的数据不足包长,则等待后续数据。
        protected override void OnReceivedDataCallBack(byte[] data /*整个包的起始地址,已在下层进行拼接*/, int length)
        {
            if (m_connectionState == ConnectionState.Uninitialised || length <= 0)
            {
                return;
            }
            m_iSegmentSize += length;       //合并收到的包
            int startOffset     = 0;        //amount for the submits to user.
            int rawpacketlength = 0;        //user packet size

            while (m_iSegmentSize >= Packet.HeaderSize)
            {
                //从消息头中读出包长度
                m_lengthOfCurrentPacket = Util.ArrayUtility.GetShort(data, startOffset + Packet.OffsetLength);
                //包长错误,忽略此包
                if (m_lengthOfCurrentPacket < Packet.HeaderSize || m_lengthOfCurrentPacket > Packet.MaxLength)
                {
                    m_iSegmentSize = 0;
                    return;
                }
                //数据不够组成一个消息包,等待后续数据
                if (m_iSegmentSize < m_lengthOfCurrentPacket)
                {
                    break;
                }
                rawpacketlength = m_lengthOfCurrentPacket;

                //按顺序读出包ID,DispatcherID,和标记位
                m_packetIDOfCurrentPacket     = ArrayUtility.GetShort(data, startOffset + Packet.OffsetPacketID);
                m_dispatcherIDOfCurrentPacket = ArrayUtility.GetInt(data, Packet.OffsetDispatcherID + startOffset);
                m_magicnumOfCurrentPacket     = Util.ArrayUtility.GetByte(data, startOffset + Packet.OffsetFlag);

                //HandleOneRawPacket();
                //处理明文数据(不加密也不压缩)
                if ((m_magicnumOfCurrentPacket & (short)PacketFlag.Encrypted) == 0 &&
                    (m_magicnumOfCurrentPacket & (short)PacketFlag.Compressed) == 0)
                {
                    //int packetserialnum = ArrayUtility.GetInt(data, 8 + startOffset);
                    //包的序列号错误
                    //if (packetserialnum != m_lastRecvPacketSerialNumber)
                    //{
                    //    packetserialnum = m_lastRecvPacketSerialNumber;//why?
                    //    if (m_encrypt != null)//非加密连接,出错就不管了,警告一下
                    //    {
                    //        CloseConnection();
                    //        return;
                    //    }
                    //    Console.WriteLine("Error:TcpConnection packetserialnum != m_lastRecvPacketSerialNumber!");
                    //}
                    m_lastRecvPacketSerialNumber++;
                    ProcessPacket(m_packetIDOfCurrentPacket, data, m_lengthOfCurrentPacket, startOffset);
                }
                else                //解密解压消息
                {
                    int securedatalength = m_lengthOfCurrentPacket - Packet.NoCryptHeaderLength;
                    if (securedatalength <= 0 || m_encrypt == null)
                    {
                        CloseConnection();
                        return;
                    }
                    System.Buffer.BlockCopy(data, startOffset,
                                            m_lastPacketData, 0, m_lengthOfCurrentPacket);
#if _NC_Compress
                    //解密
                    if ((m_magicnumOfCurrentPacket & (short)PacketFlag.Encrypted) == (short)PacketFlag.Encrypted)
                    {
                        m_encrypt.Decrypt(m_lastPacketData, Packet.NoCryptHeaderLength, securedatalength);
                        m_magicnumOfCurrentPacket &= ~(short)PacketFlag.Encrypted;
                    }
                    //解压
                    if ((m_magicnumOfCurrentPacket & (short)PacketFlag.Compressed) == (short)PacketFlag.Compressed)
                    {
                        if (m_compressneedchecksum)
                        {                        //check src32
                            uint crccheck = (uint)ArrayUtility.GetInt(m_lastPacketData, securedatalength);
                            securedatalength -= 4;
                            uint crccomp = HashHelp.CRC32hash(m_lastPacketData, Packet.NoCryptHeaderLength, securedatalength);
                            if (crccheck != crccomp)
                            {
                                CloseConnection();
                                return;
                            }
                        }
                        if (tls_decompressbuffer == null)
                        {
                            tls_decompressbuffer = new byte[Packet.MaxLength];
                        }
                        int outlen = Compress.LZO.Decompress(m_lastPacketData, Packet.NoCryptHeaderLength, securedatalength, tls_decompressbuffer, 0);
                        if (outlen <= Packet.HeaderSize - Packet.NoCryptHeaderLength || outlen >= Packet.MaxLength - Packet.NoCryptHeaderLength)                        //解压失败
                        {
                            CloseConnection();
                            return;
                        }
                        m_magicnumOfCurrentPacket &= ~(short)PacketFlag.Compressed;
                        Buffer.BlockCopy(tls_decompressbuffer, 0, m_lastPacketData, Packet.NoCryptHeaderLength, outlen);
                        m_lengthOfCurrentPacket = (short)(Packet.NoCryptHeaderLength + outlen);
                    }
#endif
                    m_packetIDOfCurrentPacket = ArrayUtility.GetInt(m_lastPacketData, 4);
                    int packetserialnum = ArrayUtility.GetInt(m_lastPacketData, 8);
                    if (packetserialnum != m_lastRecvPacketSerialNumber)
                    {
                        packetserialnum = m_lastRecvPacketSerialNumber;                        //why?
                        CloseConnection();
                        return;
                    }
                    m_lastRecvPacketSerialNumber++;
                    ArrayUtility.SetShort(m_lastPacketData, m_magicnumOfCurrentPacket, 0);
                    m_dispatcherIDOfCurrentPacket = ArrayUtility.GetInt(m_lastPacketData, 12);
                    ProcessPacket(m_packetIDOfCurrentPacket, m_lastPacketData, m_lengthOfCurrentPacket, 0);
                }

                if (m_connectionState == ConnectionState.Uninitialised)
                {
                    return;
                }

                m_iSegmentSize -= rawpacketlength;
                startOffset    += rawpacketlength;
            }
            if (startOffset > 0 && m_iSegmentSize > 0)
            {
                System.Buffer.BlockCopy(data, startOffset, m_RecvBuffer, 0, m_iSegmentSize);
            }
        }
예제 #10
0
        private List <CQCode> GetTweetContent(Tweet tweet)
        {
            var temp = new List <CQCode> {
                CQCode.CQText(tweet.Content)
            };
            var img = new List <CQCode>();

            if (tweet.Media != null)
            {
                foreach (var item in tweet.Media)
                {
                    try
                    {
                        var data = HttpNet.Get(item["media_url_https"].ToString(), proxy: _config.Proxy);
                        img.Add(CQCode.CQImage("base64://" + Convert.ToBase64String(data), useCache: true));
                    }
                    catch (Exception e)
                    {
                        img.Add(CQCode.CQText($"Error: {e.Message}"));
                    }

                    switch (item["type"].ToString())
                    {
                    case "photo":
                    {
                        break;
                    }

                    case "video":
                    {
                        var mp4 = item["video_info"]["variants"]
                                  .FirstOrDefault(video => video["content_type"].ToString() == "video/mp4");

                        if (mp4 != null)
                        {
                            img.Add(CQCode.CQText(mp4["url"].ToString()));
                            var data     = HttpNet.Get(mp4["url"].ToString(), proxy: _config.Proxy);
                            var tempPath = AppDomain.CurrentDomain.BaseDirectory + "cache\\" + HashHelp.MD5Encrypt(data);
                            File.WriteAllBytes(tempPath, data);
                            img.Add(CQCode.CQVideo(tempPath, useCache: true));
                        }
                        else
                        {
                            img.Add(CQCode.CQText(item["video_info"]["variants"][0]["url"].ToString()));
                        }
                        break;
                    }

                    case "animated_gif":
                    {
                        var mp4 = item["video_info"]["variants"]
                                  .FirstOrDefault(video => video["content_type"].ToString() == "video/mp4");
                        if (mp4 != null)
                        {
                            img.Add(CQCode.CQText(mp4["url"].ToString()));
                            var data     = HttpNet.Get(mp4["url"].ToString(), proxy: _config.Proxy);
                            var tempPath = AppDomain.CurrentDomain.BaseDirectory + "cache\\" + HashHelp.MD5Encrypt(data);
                            File.WriteAllBytes(tempPath, data);
                            img.Add(CQCode.CQVideo(tempPath, useCache: true));
                        }
                        else
                        {
                            img.Add(CQCode.CQText(item["video_info"]["variants"][0]["url"].ToString()));
                        }
                        break;
                    }
                    }
                }
            }

            if (tweet.IsOnlyRetweet)
            {
                if (tweet.Retweet == null)
                {
                    return(new List <CQCode> {
                        CQCode.CQText("error")
                    });
                }
                else
                {
                    var a = new List <CQCode> {
                        CQCode.CQText(tweet.Retweet.UserName + ":\n")
                    };
                    a.AddRange(GetTweetContent(tweet.Retweet));
                    return(a);
                }
            }
            else
            {
                var time = CQCode.CQText("\n发送时间:" + tweet.CreatTime.ToString("yyyy-MM-dd HH:mm"));
                if (tweet.Retweet == null)
                {
                    temp.AddRange(img);
                    temp.Add(time);
                    return(temp);
                }
                else
                {
                    temp.AddRange(img);
                    temp.Add(time);
                    temp.Add(CQCode.CQText("\n" + tweet.Retweet.UserName + ":\n"));
                    temp.AddRange(GetTweetContent(tweet.Retweet));
                    return(temp);
                }
            }
        }