bool TryGetThumb(WebData webData, MDBImage img, string fileName) { try { //try to load thumb var hash = Base32.Safe.Encode(Hash.FromString(Hash.Type.SHA256, fileName)); string thumbFileName = FileSystem.Combine(mdb.CacheFolder, "Thumbs", hash + ".jpg"); var mime = MimeTypes.FromExtension(".jpg"); if (File.Exists(thumbFileName)) { try { webData.Answer = WebAnswer.Raw(webData.Request, WebMessage.Create(webData.Method, thumbFileName), File.ReadAllBytes(thumbFileName), mime); webData.Answer.SetCacheTime(TimeSpan.FromDays(1)); return(true); } catch { /*file access error, writing in progress ?, wait for lock and retry*/ } } //wait until last thumb generation is finished byte[] data; lock (ThumbCreateSyncRoot) { //do a second check after lock is released... if (File.Exists(thumbFileName)) { try { webData.Answer = WebAnswer.Raw(webData.Request, WebMessage.Create(webData.Method, thumbFileName), File.ReadAllBytes(thumbFileName), mime); webData.Answer.SetCacheTime(TimeSpan.FromDays(1)); return(true); } catch { /*file access error, recreate thumb*/ } } //generate thumb using (var bmp = Bitmap32.FromFile(fileName)) { data = WebImage.RenderThumb(bmp, thumbFileName); } } webData.Answer = WebAnswer.Raw(webData.Request, WebMessage.Create(webData.Method, thumbFileName), data, mime); webData.Answer.AllowCompression = false; webData.Answer.SetCacheTime(TimeSpan.FromDays(1)); return(true); } catch (Exception ex) { this.LogError(ex, "Could not load / create thumb for {0}", fileName); } return(false); }
public void GetTestStructMaxXML() { var request = XmlRequest.Prepare("http://localhost:8080", "testdata", "structtype=max"); WebMessage message = request.Get(); Assert.AreEqual(HttpStatusCode.OK, message.Code); ITable <TestData> dataTable = request.Result.GetTable <TestData>(); Assert.AreEqual(1, dataTable.RowCount); TestData data = dataTable.GetStruct(dataTable.IDs[0]); TestData mindata = TestDataMax(); Assert.True(data.Equals(mindata)); }
private void btnLeave_Click(object sender, EventArgs e) { if (gbChatRoom.Enabled && btnSend.Enabled && m_Client != null && m_Client.GetState() > 0 && m_UserName.Length > 0 && m_UserToken.Length > 0 && m_RoomName.Length > 0) { ExitRoomRequest request = new ExitRoomRequest(); request.UserName = m_UserName; request.UserToken = m_UserToken; request.RoomName = m_RoomName; m_Client.SendString("room/exit/" + WebMessage.ToJsonString <ExitRoomRequest>(request)); } }
public void Enqueue(Route route, WebMessage message) { if (!Table.ContainsKey(route)) { lock (sync) { if (!Table.ContainsKey(route)) { Table.Add(route, new Queue <WebMessage>()); } } } Table[route].Enqueue(message); }
protected void Button1_Click(object sender, EventArgs e) { ConnSql con = new ConnSql(); string sqltext = ""; sqltext = "delete student where sno='" + TextBox1.Text.Trim() + "'"; if (con.RunSql(sqltext) == 1) { WebMessage.Show("删除成功"); } else { WebMessage.Show("删除失败"); } }
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack == false) { if (Session["username"] == null) { WebMessage.Show("请登录", "Default.aspx"); } else { Label1.Text = "欢迎你" + Session["sname"].ToString().Trim() + "同学!"; } } }
public string Send(string to, MessageType type, params object[] data) { var from = DateTime.Now.Ticks.ToString(); WebMessage message = new WebMessage() { from = from, to = to, type = type.ToString(), data = data, }; this.websocket.SendToAsync(message.ToString(), to).Wait(); return(string.Empty); }
protected void ImageButton1_Click(object sender, ImageClickEventArgs e) { string user_ip = Request.UserHostAddress;//获取用户IP地址信息 sqltext = "select * from users where username='******'"; table = con.RunSqlReturnTable(sqltext); if (TextBox3.Text.Trim().ToUpper() != Button1.Text.Trim().ToUpper()) { WebMessage.Show("验证码错误!"); } else if (table.Rows.Count <= 0) { WebMessage.Show("用户名错误!"); } else if (table.Rows[0][1].ToString() != TextBox2.Text.Trim()) { WebMessage.Show("密码错误!"); } else if (Session["username"] == null || Session["username"].ToString().Trim() == "") { UserLogin(TextBox1.Text.Trim(), user_ip); table = con.RunSqlReturnTable(sqltext); Session["username"] = TextBox1.Text.Trim(); Session["password"] = TextBox2.Text.Trim(); Session["nc"] = table.Rows[0]["nc"].ToString().Trim(); Session["jf"] = table.Rows[0]["jf"].ToString().Trim().ToString(); Session["realname"] = table.Rows[0]["realname"].ToString().Trim(); Session["lb"] = table.Rows[0]["lb"].ToString().Trim(); Session["pic"] = table.Rows[0]["pic"].ToString().Trim(); Session["sex"] = table.Rows[0]["sex"].ToString().Trim(); if (table.Rows[0]["last_time"].ToString().Length > 5) { Session["last_time"] = table.Rows[0]["last_time"].ToString().Trim().Substring(0, 10); } if (Session["url"] == null || Session["url"].ToString().Trim() == "") { Response.Redirect("Default.aspx"); } else { Response.Redirect(Session["url"].ToString()); } } else { WebMessage.Shows("请退出当前登录的用户!"); } }
protected void Button_Confirm(object sender, EventArgs e) { if (Username.Text == "") { WebMessage.Show("请输入用户名"); } else if (name.Text == "") { WebMessage.Show("请输入姓名"); } else if (xueyuan.Text == "") { WebMessage.Show("请输入学院"); } else if (banji.Text == "") { WebMessage.Show("请输入班级"); } else if (Password.Text == "") { WebMessage.Show("请输入密码"); } else if (Check.Text == "") { WebMessage.Show("请再次输入密码"); } else if (Password.Text != Check.Text) { WebMessage.Show("密码不一致!"); } else { string sql = "INSERT INTO bookuser (id,pwd,name,class,xueyuan,status,sex,admin,times1) VALUES ('" + Username.Text.Trim() + "','" + Password.Text.Trim() + "','" + name.Text.Trim() + "','" + banji.Text.Trim() + "','" + xueyuan.Text.Trim() + "','1','" + RadioButtonList1.SelectedValue + "','0','0')"; ConnSql conn = new ConnSql(); int s = conn.RunSql(sql); if (s > 0) { WebMessage.Show("添加成功", "Index.aspx"); } else { WebMessage.Show("添加失败"); } } }
private void btnCreateRoom_Click(object sender, EventArgs e) { string newRoomName = ""; if (InputBox("Create New Chat Room", "New Room Name", ref newRoomName) == DialogResult.OK) { if (m_UserName.Length > 0 && m_UserToken.Length > 0) { CreateRoomRequest request = new CreateRoomRequest(); request.UserName = m_UserName; request.UserToken = m_UserToken; request.RoomName = newRoomName; m_Client.SendString("room/create/" + WebMessage.ToJsonString <CreateRoomRequest>(request)); } } }
public static void DecodeMessage(Session session, WebMessage msg) { // do some complex decode actions here ... Byte[] bytes = msg.RawContent; if (bytes == null || bytes.Length <= 0) return; // nothing needs to decode if (msg.IsString()) { Encoding encode = Encoding.UTF8; if (msg.MessageContent.Length == 0) msg.MessageContent = encode.GetString(bytes, 0, bytes.Length); else msg.MessageContent += encode.GetString(bytes, 0, bytes.Length); } else { msg.RawContent = bytes; } }
void FilterList(WebData webData, ITable table, string nameField, string guidField, string text) { var ids = new Set <long>(); if (text == null) { ids.IncludeRange(table.FindRows(Search.None, ResultOption.Limit(20))); } else { ids.AddRange(table.FindRows(Search.FieldLike(nameField, MDBSearch.Text(text + "%")) & Search.FieldNotEquals(guidField, null), ResultOption.SortAscending(nameField) + ResultOption.Group(nameField) + ResultOption.Group(guidField) + ResultOption.Limit(20))); if (ids.Count < 20) { ids.IncludeRange(table.FindRows(Search.FieldLike(nameField, MDBSearch.Text("% " + text + "%")) & Search.FieldNotEquals(guidField, null), ResultOption.SortAscending(nameField) + ResultOption.Group(nameField) + ResultOption.Group(guidField) + ResultOption.Limit(20))); } if (ids.Count < 20) { ids.IncludeRange(table.FindRows(Search.FieldLike(nameField, MDBSearch.Text(text + "%")) & Search.FieldEquals(guidField, null), ResultOption.SortAscending(nameField) + ResultOption.Group(nameField) + ResultOption.Limit(20 - ids.Count))); } if (ids.Count < 20) { ids.IncludeRange(table.FindRows(Search.FieldLike(nameField, MDBSearch.Text("% " + text + "%")) & Search.FieldEquals(guidField, null), ResultOption.SortAscending(nameField) + ResultOption.Group(nameField) + ResultOption.Limit(20 - ids.Count))); } } var json = new JsonWriter(); json.BeginArray("results"); if (ids.Count > 0) { //get items var values = table.GetValues <string>(nameField, false, ids.SubRange(0, Math.Min(20, ids.Count))); foreach (var value in values) { json.BeginObject(); json.String("id", value); json.String("text", value); json.EndObject(); } } json.EndArray(); var message = WebMessage.Create(webData.Method, $"Filter {nameField} {text}"); webData.Answer = WebAnswer.Json(webData.Request, message, json.ToString()); }
public void OnClick() { meshRender = this.gameObject.GetComponent <MeshRenderer>(); if (meshRender != null) { DataManager.Instance.str += "OnClick: " + this.name; meshRender.material.color = selectedColor; } try { IOSMessage.ClickMap(this.gameObject.name); AndroidMessage.ClickMap(this.gameObject.name); WebMessage.ClickMap(this.gameObject.name); } catch (Exception ex) { Debug.LogError("errr:" + ex.ToString()); } }
protected void bSend_Click(object sender, EventArgs e) { //!Error 学生姓名过长会 截断字符串 ConnSql con = new ConnSql(); int sex_tmp = rb_girl.Checked ? 1 : 0; // 暂存性别信息 女true 男false sex_tmp = con.RunSql("update student set sname = '" + tb_sname.Text.Trim() + "', sex=" + sex_tmp + ", birthday = '" + tb_birth.Text.Trim() + "' where sno = '" + tb_sno.Text.Trim() + "'"); if (sex_tmp.Equals(1)) { WebMessage.Show("执行成功"); } else { WebMessage.Show("执行失败"); } }
protected override Task OnMessageReceivedAsync(IWebSocketContext context, byte[] buffer, IWebSocketReceiveResult result) { if (this.eventCallback != null) { var data = Encoding.GetString(buffer); var message = WebMessage.Parse(data); var gm = new GlobalMessage() { From = message.from, To = message.to, Type = Enum.Parse <GlobalMessageType>(message.type, true), Data = message.data, }; this.eventCallback(gm); } return(Task.Run(() => { })); }
protected void btn_edit_Click(object sender, EventArgs e) { ConnSql con = new ConnSql(); string sql = "update course set " + "cname = '" + tb_cname.Text + "'," + "xs = " + int.Parse(tb_lt.Text.Trim()) + "," + "skdd = '" + tb_addr.Text + "'," + "tno = '" + ddl_tch.SelectedValue + "'" + " where cno = '" + tb_cno.Text + "'"; try { con.RunSql(sql); } catch (Exception ex) { WebMessage.Show(ex.ToString()); throw; } }
protected void Button2_Click(object sender, EventArgs e) { if (TextBox1.Text.Trim() == "") { WebMessage.Show("请输入用户名"); } else if (TextBox2.Text.Trim() == "") { WebMessage.Show("请输入密码"); } else if (TextBox3.Text.Trim() == "") { WebMessage.Show("请输入验证码"); } else { string sqltext = "select * from student where sno='" + TextBox1.Text.Trim() + "'"; DataTable table = new DataTable(); ConnSql cn = new ConnSql(); table = cn.RunSqlReturnTable(sqltext); if (table.Rows.Count <= 0) { WebMessage.Show("用户名错误!"); } else if (table.Rows[0]["pwd"].ToString().Trim() != TextBox2.Text) { WebMessage.Show("密码错误!"); } else if (TextBox3.Text.Trim().ToUpper() != Button1.Text.Trim().ToUpper()) { WebMessage.Show("验证码错误!"); } else { Session["username"] = TextBox1.Text.Trim(); Session["password"] = TextBox2.Text.Trim(); Session["sname"] = table.Rows[0]["sname"].ToString().Trim(); WebMessage.Show("全部正确", "StudentMain.aspx"); } } }
public void EnterLobby(string result) { LogMsg(result); Invoke((Action)(() => { if (result.ToLower() == "ok") { gbLogin.Enabled = false; if (m_RoomName == null || m_RoomName.Length <= 0) { gbLobby.Enabled = true; m_UserList.Clear(); UpdateUserList(); richChatBox.Clear(); } if (m_UserName.Length > 0 && m_UserToken.Length > 0 && m_RoomName.Length > 0) { gbChatRoom.Enabled = true; ShowText("Re-enter lobby/chat-room successfully"); } if (m_UserName.Length > 0 && m_UserToken.Length > 0) { GetRoomListRequest request = new GetRoomListRequest(); request.UserName = m_UserName; request.UserToken = m_UserToken; m_Client.SendString("lobby/list/" + WebMessage.ToJsonString <GetRoomListRequest>(request)); } } else { ShowText("ERROR: " + "Failed to enter lobby: " + result); } })); }
public static void EncodeMessage(Session session, WebMessage msg) { // do some complex encode actions here ... Encoding encode = Encoding.UTF8; Byte[] bytes = null; if (msg.IsBinary()) bytes = msg.RawContent; else if (msg.MessageContent.Length > 0) { bytes = encode.GetBytes(msg.MessageContent); msg.ContentSize = bytes.Length; } if (bytes == null) bytes = new byte[0]; if (msg.ContentSize <= 0) msg.ContentSize = bytes.Length; // refresh size if (msg.RawContent == null) msg.RawContent = bytes; // refresh content if (msg.RawContent != null && msg.ContentSize > msg.RawContent.Length) msg.ContentSize = msg.RawContent.Length; }
//public override int OnSend(Session session, object data) //{ // int result = base.OnSend(session, data); // m_WebSocketServer.Logger.Info("On Send - " + data.ToString()); // return result; //} protected override void ProcessMessage(SessionContext ctx) { if (ctx == null) { return; } WebMessage msg = ctx.Data as WebMessage; if (msg == null || !msg.IsString()) { ctx.Session.Close(); return; } else { var reqctx = new RequestContext(new WebSocketSession(ctx.Session), msg.MessageContent, m_WebSocketServer.Flags); reqctx.RequestPath = WebMessage.GetSessionData(ctx.Session, "Path").ToString(); reqctx.Headers = new Dictionary <string, string>(msg.Headers); m_WebSocketServer.RequestHandler.HandleRequest(reqctx); } }
private void Ws_OnMessage(object sender, MessageEventArgs e) { connected = true; WebMessage message = JsonUtility.FromJson <WebMessage>(e.Data); last = e.Data; if (message.type == "ff" || message.type == "FF") { FFQueue.Enqueue(message.body); } if (message.type == "bn" || message.type == "BN") { BNQueue.Enqueue(message.body); } if (message.type == "terminal") { TMQueue.Enqueue(message.body); } }
protected void bCheck_Click(object sender, EventArgs e) { if (tb_sno.Text.Length == 0) { WebMessage.Show("请输入学号!"); } else { ConnSql con = new ConnSql(); DataTable table = new DataTable(); table = con.RunSqlReturnTable("select * from student where sno = " + "'" + tb_sno.Text.Trim() + "'"); if (table.Rows.Count.Equals(0)) { WebMessage.Show("学号不存在"); return; } else { tb_sname.Text = table.Rows[0][1].ToString(); //获取出生年月日 string s = table.Rows[0]["birthday"].ToString(); tb_birth.Text = s.Substring(0, s.LastIndexOf(' ')); //获取性别 if (table.Rows[0]["sex"].Equals(true)) { rb_girl.Checked = true; } else { rb_man.Checked = true; } tb_sno.BackColor = System.Drawing.Color.DarkGray; tb_sno.ReadOnly = true; } } }
public static WebMessage GenerateMessage(string Sender, object message, RSACryptoServiceProvider receiver_rsa, string token) { IFormatter formatter = new BinaryFormatter(); RijndaelManaged RMCrypto = new RijndaelManaged(); RMCrypto.GenerateIV(); RMCrypto.GenerateKey(); MemoryStream ms = new MemoryStream(); formatter.Serialize(ms, message); byte[] result_message = ms.ToArray(); ms = new MemoryStream(); CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateEncryptor(RMCrypto.Key, RMCrypto.IV), CryptoStreamMode.Write); CryptStream.Write(result_message, 0, result_message.Length); CryptStream.FlushFinalBlock(); byte[] message_id_bytes = Guid.NewGuid().ToString().getBytes(); RSACryptoServiceProvider my_rsa = CryptStream.getGlobalObject <IMyRsaProvider>().getMySra(); WebMessage answer = new WebMessage { Sender = Sender, IV = receiver_rsa.Encrypt(RMCrypto.IV, false), Key = receiver_rsa.Encrypt(RMCrypto.Key, false), Message = ms.ToArray(), Signature = my_rsa.SignData(result_message, new SHA1CryptoServiceProvider()), Token = receiver_rsa.Encrypt(token.getBytes(), false), MessageID = receiver_rsa.Encrypt(message_id_bytes, false), MessageIDSignaure = my_rsa.SignData(message_id_bytes, new SHA1CryptoServiceProvider()) }; return(answer); }
public override async Task <Message> HandleMessage(Message msg) { // Find the original HTTP request, it'll have the context to respond on. WebMessage entry = msg.FirstAncestor <WebMessage>(); if (entry == null || entry.Context == null || !entry.Context.Response.OutputStream.CanWrite) { return(msg); } try { await Task.Run(() => { int status = int.Parse(Smart.Format(StatusCode, msg)); var contentType = Smart.Format(ContentType, msg); var payload = Smart.Format(Body, msg); var payloadBytes = Encoding.UTF8.GetBytes(payload); var context = entry.Context; context.Response.StatusCode = status; context.Response.ContentType = contentType; context.Response.ContentLength64 = payloadBytes.Length; context.Response.OutputStream.Write(payloadBytes, 0, payloadBytes.Length); context.Response.Close(); }, _cancelSource.Token); } catch (Exception ex) { logger.Warn(ex, "Error sending HTTP response"); } return(msg); }
protected void btn_login_Click(object sender, EventArgs e) { string sqltext = "select * from admini where username = '******' and pwd = '" + tb_password.Text + "'"; ConnSql conn = new ConnSql(); System.Data.DataTable table = conn.RunSqlReturnTable(sqltext); if (tb_checkcode.Text == btn_img.Text) { if (table.Rows.Count != 1) { WebMessage.Show("用户名或密码错误。"); } else { Session["username"] = table.Rows[0]["username"]; Response.Redirect("Index_Admin.aspx"); } //return; } else { WebMessage.Show("验证码错误。"); } }
void Draw(WebData data, int color, int nose, int eyes, int mouth, int face, int rotate) { using (var stream = new MemoryStream()) using (var bmp = new Bitmap32(AvatarSize, AvatarSize)) { var faceColor = ARGB.FromHSI(color / 256.0f, 1, 1); DrawFace(face, faceColor, faces, bmp); DrawEyes(eyes, this.eyes, bmp); DrawMouth(mouth, mouths, bmp); DrawNose(nose, noses, bmp); using (var result = new Bitmap32(AvatarSize, AvatarSize)) { result.Draw(bmp, 0, 0, new Translation() { Rotation = ((rotate % 16) - 7) * 0.02f }); result.Save(stream); } var msg = WebMessage.Create(data.Method, "Avatar created"); data.Answer = WebAnswer.Raw(data.Request, msg, stream.GetBuffer(), "image/png"); data.Answer.AllowCompression = false; data.Answer.SetCacheTime(TimeSpan.FromDays(1)); } }
void Check(IPAddress ip, int port, int streamBasePort) { try { this.LogDebug("Test mdb server <cyan>{0}<default> at <cyan>{1}:{2}", Host, ip, port); string server = (ip.AddressFamily == AddressFamily.InterNetworkV6) ? $"[{ip}]" : ip.ToString(); var con = new HttpConnection(); { con.Timeout = TimeSpan.FromSeconds(2); Image = con.Download($"http://{server}:{port}/avatar/get?text={Host}"); } var req = new XmlRequest(new Uri($"http://{server}:{port}/mdb/player/state.xml")); WebMessage msg = req.Get(); if (msg.Error == WebError.None) { lock (this) { if (Checked) { return; } this.LogNotice("Selected mdb server <green>{0}<default> at <green>{1}:{2}", Host, ip, port); Address = ip; Port = port; StreamBasePort = streamBasePort; Checked = true; return; } } } catch (Exception ex) { this.LogVerbose(ex, "Could not reach mdb server <red>{0}<default> at <red>{1}:{2}", Host, ip, port); } }
// please know that function Decode() should be called in single thread public bool Decode(Session session, MemoryStream stream, List<Object> output) { bool isNew = false; WebMessage netMsg = null; bool hasKey = false; Stack<Object> stack = WebMessage.GetSessionBuffer(session); if (stack.Count > 0) { hasKey = true; netMsg = (WebMessage)stack.Peek(); } if (netMsg == null) { isNew = true; netMsg = new WebMessage(); if (hasKey) stack.Pop(); stack.Push(netMsg); } if (isNew) { if (netMsg != null) { netMsg.ReceivingState = WebMessage.STATE_WAIT_FOR_BODY; netMsg.MessageType = WebMessage.MSG_TYPE_HANDSHAKE; } } int total = 0; if (netMsg.ReceivingState == WebMessage.STATE_WAIT_FOR_BODY) { if (netMsg.MessageType == WebMessage.MSG_TYPE_HANDSHAKE) { long orgpos = stream.Position; long msglen = stream.Length - stream.Position; Byte[] bytes = new Byte[msglen]; stream.Read(bytes, 0, bytes.Length); bool found = false; int curpos = 0; int maxpos = bytes.Length - 1; int checkedlen = 0; while (curpos <= maxpos && !found) { if (bytes[curpos] == '\r') { if (curpos + 1 <= maxpos && bytes[curpos + 1] == '\n') { if (curpos + 2 <= maxpos && bytes[curpos + 2] == '\r') { if (curpos + 3 <= maxpos && bytes[curpos + 3] == '\n') { found = true; checkedlen = curpos + 3 + 1; } } } } curpos++; } if (found) { Encoding encode = Encoding.UTF8; string headerContent = encode.GetString(bytes, 0, checkedlen); string[] rawClientHandshakeLines = headerContent.Split(new string[] { "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries); string acceptKey = ""; bool foundKey = false; bool foundUrl = false; bool foundServerSign = false; string handshakeMsg = ""; foreach (string oneline in rawClientHandshakeLines) { if (!foundUrl && oneline.Contains(HTTP_HEADER_SIGN)) { if (oneline.Contains(HTTP_SERVER_HEADER_SIGN)) { foundServerSign = true; } else { string reqline = oneline.Trim(); int beginPos = reqline.IndexOf(' ') + 1; int endPos = reqline.LastIndexOf(' '); if (beginPos > 0 && endPos > beginPos) { WebMessage.SetSessionData(session, "Path", reqline.Substring(beginPos, endPos - beginPos).Trim()); } } foundUrl = true; } if (!foundKey && !foundServerSign && oneline.Contains(WEBSOCK_CLIENT_HEADER_SIGN + ":")) { acceptKey = ComputeWebSocketHandshakeSecurityHash09(oneline.Substring(oneline.IndexOf(":") + 2)); foundKey = true; } } if (acceptKey != null && acceptKey.Length > 0) handshakeMsg = String.Format(WEBSOCK_HANDSHAKE_REPLY_MSG, acceptKey); stream.Position = orgpos + checkedlen; netMsg.ReceivingState = WebMessage.STATE_READY; if (stack.Count > 0) stack.Pop(); netMsg.MessageContent = headerContent; netMsg.MessageType = WebMessage.MSG_TYPE_HANDSHAKE; output.Add(netMsg); total++; netMsg = new WebMessage(); netMsg.VirtualHeaderSize = 2; stack.Push(netMsg); if (handshakeMsg != null && handshakeMsg.Length > 0) session.Send(handshakeMsg); } else { if (curpos > m_MaxMsgSize) session.Close(); else stream.Position = orgpos; return false; } } if (netMsg.ReceivingState == WebMessage.STATE_WAIT_FOR_BODY && stream.Length - stream.Position >= netMsg.ContentSize) { Byte[] bytes = new Byte[netMsg.ContentSize]; stream.Read(bytes, 0, netMsg.ContentSize); netMsg.RawContent = bytes; netMsg.ReceivingState = WebMessage.STATE_READY; if (stack.Count > 0) stack.Pop(); output.Add(netMsg); total++; netMsg = new WebMessage(); netMsg.VirtualHeaderSize = 2; stack.Push(netMsg); } } while (netMsg.ReceivingState == WebMessage.STATE_WAIT_FOR_HEADER && stream.Length - stream.Position >= netMsg.VirtualHeaderSize) { if (netMsg.ReceivingState == WebMessage.STATE_WAIT_FOR_HEADER) { if (stream.Length - stream.Position >= netMsg.VirtualHeaderSize) { Byte[] bytes = new Byte[netMsg.VirtualHeaderSize]; stream.Read(bytes, 0, netMsg.VirtualHeaderSize); if (netMsg.VirtualHeaderSize == 2) { // first byte ... sbyte opcode = (sbyte)(bytes[0] & 0x0f); switch (opcode) // not support 0x00 for now ... { case 0x08: session.Close(); return false; case 0x09: netMsg.MessageType = WebMessage.MSG_TYPE_PING; break; case 0x0A: netMsg.MessageType = WebMessage.MSG_TYPE_PONG; break; case 0x01: netMsg.MessageType = WebMessage.MSG_TYPE_STRING; break; case 0x02: netMsg.MessageType = WebMessage.MSG_TYPE_BINARY; break; default: session.Close(); // just close it if undefined op code found return false; } bool needmask = (bytes[1] & 0x80) == 0x80; if (needmask) { netMsg.VirtualHeaderSize += 4; netMsg.MaskFlag = 1; } else { netMsg.MaskFlag = 0; } sbyte payloadlen = (sbyte)(bytes[1] & 0x7f); if (payloadlen == 126) { netMsg.VirtualHeaderSize += 2; netMsg.HeaderFlag = 1; } else if (payloadlen == 127) { netMsg.VirtualHeaderSize += 8; netMsg.HeaderFlag = 2; } else { netMsg.HeaderFlag = 0; } } if (netMsg.VirtualHeaderSize > bytes.Length) { stream.Position = stream.Position - bytes.Length; continue; } if (netMsg.MaskFlag > 0) { netMsg.MaskBytes = new byte[4]; Buffer.BlockCopy(bytes, netMsg.VirtualHeaderSize - 4, netMsg.MaskBytes, 0, 4); } if (netMsg.HeaderFlag == 1) { netMsg.ContentSize = (int)bytes[2] * 256 + (int)bytes[3]; } else if (netMsg.HeaderFlag == 2) { long len = 0; int n = 1; for (int i = 7; i >= 0; i--) { len += (int)bytes[i + 2] * n; n *= 256; } netMsg.ContentSize = (int)len; } else { netMsg.ContentSize = (sbyte)(bytes[1] & 0x7f); } if (netMsg.ContentSize > m_MaxMsgSize) netMsg.ContentSize = 0; if (netMsg.ContentSize < 0) netMsg.ContentSize = 0; if (netMsg.ContentSize > 0) { netMsg.ReceivingState = WebMessage.STATE_WAIT_FOR_BODY; } else { netMsg.ReceivingState = WebMessage.STATE_READY; if (stack.Count > 0) stack.Pop(); netMsg = new WebMessage(); netMsg.VirtualHeaderSize = 2; stack.Push(netMsg); continue; } } } if (netMsg.ReceivingState == WebMessage.STATE_WAIT_FOR_BODY) { if (stream.Length - stream.Position >= netMsg.ContentSize) { Byte[] bytes = new Byte[netMsg.ContentSize]; stream.Read(bytes, 0, netMsg.ContentSize); if (netMsg.MaskFlag > 0 && netMsg.MaskBytes != null) { int masklen = netMsg.MaskBytes.Length; for (int i = 0; i < bytes.Length; i++) { bytes[i] = (byte)(bytes[i] ^ netMsg.MaskBytes[i % masklen]); } } if (netMsg.MessageType == WebMessage.MSG_TYPE_STRING) { netMsg.MessageContent = Encoding.UTF8.GetString(bytes, 0, bytes.Length); } if (netMsg.MessageType == WebMessage.MSG_TYPE_BINARY || netMsg.MessageType == WebMessage.MSG_TYPE_PING || netMsg.MessageType == WebMessage.MSG_TYPE_PONG) { netMsg.RawContent = bytes; netMsg.ContentSize = bytes.Length; } output.Add(netMsg); total++; netMsg.ReceivingState = WebMessage.STATE_READY; if (stack.Count > 0) stack.Pop(); netMsg = new WebMessage(); netMsg.VirtualHeaderSize = 2; stack.Push(netMsg); } } } if (total > 0 && stream.Length - stream.Position <= 0) return true; if (netMsg.ReceivingState != WebMessage.STATE_WAIT_FOR_HEADER && netMsg.ReceivingState != WebMessage.STATE_WAIT_FOR_BODY && netMsg.ReceivingState != WebMessage.STATE_READY) { session.Close(); } return false; }
public static object readMessage(WebMessage message, RSACryptoServiceProvider sender_rsa) { //VUNERABILTY //IN CASE OF client restart the fake server can resend the message, the token is still valid //sol: on boot reset all client token //this solve also reply attack as the message would all change token, so I need only 1 session message id //if the message id buffer if full receiver shall send an authentication request along with the correct answer (to avoid answer to be to different from normal message) if (message == null) { return(null); } byte[] signature = message.Signature; RSACryptoServiceProvider my_rsa = message.getGlobalObject <IMyRsaProvider>().getMySra(); //checking unique id byte[] message_id_bytes = my_rsa.Decrypt(message.MessageID, false); if (!sender_rsa.VerifyData(message_id_bytes, new SHA1CryptoServiceProvider(), message.MessageIDSignaure)) { return(null); } string message_id = message_id_bytes.getString(); if (message_ids.Contains(message_id)) { return(null); } //replay attack!!! if (message_ids.Count > replay_store_size) { message_ids = new HashSet <string>(); } message_ids.Add(message_id); byte[] Key = my_rsa.Decrypt(message.Key, false); byte[] IV = my_rsa.Decrypt(message.IV, false); //Create a new instance of the RijndaelManaged class //and decrypt the stream. RijndaelManaged RMCrypto = new RijndaelManaged(); //Create an instance of the CryptoStream class, pass it the NetworkStream, and decrypt //it with the Rijndael class using the key and IV. MemoryStream ms = new MemoryStream(message.Message); CryptoStream CryptStream = new CryptoStream(ms, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read); MemoryStream output = new MemoryStream(); byte[] buffer = new byte[1024]; int read = CryptStream.Read(buffer, 0, buffer.Length); while (read > 0) { output.Write(buffer, 0, read); read = CryptStream.Read(buffer, 0, buffer.Length); } CryptStream.Flush(); CryptStream.Dispose(); ms.Dispose(); byte[] received_message = output.ToArray(); if (!sender_rsa.VerifyData(received_message, new SHA1CryptoServiceProvider(), signature)) { return(null); } //OK message verified and decrypted! IFormatter formatter = new BinaryFormatter(); ms = new MemoryStream(received_message); object message_object = formatter.Deserialize(ms); ms.Dispose(); return(message_object); }
public virtual void ValidateClient(object client) { Session session = client as Session; if (session == null) { return; } Task.Factory.StartNew(() => { try { string target = ""; string reqpath = WebMessage.GetSessionData(session, "Path").ToString(); if (m_ClientValidator != null) { target = m_ClientValidator.Validate(session.GetRemoteIp(), reqpath); } else { List <string> paramList = new List <string>(); string[] parts = reqpath.Split('/'); foreach (var part in parts) { if (part.Trim().Length > 0) { paramList.Add(part.Trim()); } } if (paramList.Count > 0) { target = paramList.First(); } } if (target != null && target.Length > 0) { bool isOK = true; try { byte[] welcomeData = null; string welcomeText = ""; var channel = m_ResourceManager.GetChannel(target, false); if (channel != null) { welcomeData = channel.GetWelcomeData(); welcomeText = channel.GetWelcomeText(); } if (welcomeData != null && welcomeData.Length > 0) { session.Send(new WebMessage(welcomeData)); } if (welcomeText != null && welcomeText.Length > 0) { session.Send(new WebMessage(welcomeText)); } } catch { isOK = false; } if (isOK) { List <object> clients = null; int channelClientCount = 0; lock (m_WebClients) { if (m_WebClients.ContainsKey(target)) { clients = m_WebClients[target]; } } if (clients != null) { lock (clients) { clients.Add(session); channelClientCount = clients.Count; } } if (m_InputPort <= 0) { // update state lock (m_States) { if (!m_States.ContainsKey(target)) { var channelState = new MediaChannelState(); channelState.ChannelName = target; channelState.ClientCount = channelClientCount; channelState.ServerInfo = m_ServerName + "(" + m_InputIp + ":" + m_InputPort + "/" + m_OutputIp + ":" + m_OutputPort + ")"; m_States.Add(target, channelState); } } } } } else { session.Close(); // just close it if failed to validate } } catch (Exception ex) { Logger.Error("Validation error: " + ex.Message); } }); }
/// <summary>Initializes a new instance of the <see cref="XAuthException"/> class.</summary> /// <param name="message">The message.</param> /// <param name="request">The request.</param> public XAuthException(WebMessage message, XmlRequest request) : base(message) { Request = request; }
private void btnChat_Click(object sender, EventArgs e) { WebMessage.SendString(m_ChatClient.GetSession(), "CHAT|" + edtUser.Text + "|" + edtMsg.Text); edtMsg.Text = ""; }
private void btnJoin_Click(object sender, EventArgs e) { WebMessage.SendString(m_ChatClient.GetSession(), "JOIN|" + edtUser.Text); }