diff --git a/src/Yavsc.Abstract/Chat/HubInputValidator.cs b/src/Yavsc.Abstract/Chat/HubInputValidator.cs new file mode 100644 index 00000000..2a29248a --- /dev/null +++ b/src/Yavsc.Abstract/Chat/HubInputValidator.cs @@ -0,0 +1,83 @@ +// +// ChatHub.cs +// +// Author: +// Paul Schneider +// +// Copyright (c) 2016-2019 GNU GPL +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see . + +using System; +using System.Linq; + +namespace Yavsc +{ + public class HubInputValidator { + + public Action NotifyUser {get;set;} + public bool ValidateRoomName (string roomName) + { + bool valid = ValidateStringLength(roomName,1,25); + if (valid) valid = IsLetterOrDigit(roomName); + if (!valid) NotifyUser(NotificationTypes.Error, "roomName", ChatHub.InvalidRoomName); + return valid; + } + public bool ValidateUserName (string userName) + { + bool valid = ValidateStringLength(userName, 1,12); + if (valid) valid = IsLetterOrDigit(userName); + NotifyUser(NotificationTypes.Error, "char:"+userName.First (c => !char.IsLetterOrDigit(c)), ChatHub.InvalidUserName); + return valid; + } + public bool ValidateMessage (string message) + { + if (!ValidateStringLength(message, 1,240)) + { + NotifyUser(NotificationTypes.Error, "message", ChatHub.InvalidMessage); + return false; + } + return true; + } + public bool ValidateReason (string reason) + { + if (!ValidateStringLength(reason, 1,240)) + { + NotifyUser(NotificationTypes.Error, "reason", ChatHub.InvalidReason); + return false; + } + return true; + } + static bool ValidateStringLength(string str, int minLen, int maxLen) + { + if (string.IsNullOrEmpty(str)) + { + if (minLen<=0) { + return true; + } else { + return false; + } + } + if (str.Length>maxLen||str.Length().CreateScope(); @@ -62,7 +64,7 @@ namespace Yavsc NotifyUser(NotificationTypes.Error, context, error); }); _logger = loggerFactory.CreateLogger(); - + HubInputValidator = new HubInputValidator { NotifyUser = this.NotifyUser }; } void SetUserName(string cxId, string userName) @@ -199,50 +201,12 @@ namespace Yavsc return base.OnReconnected(); } - static bool IsLetterOrDigit(string s) - { - foreach (var c in s) - if (!char.IsLetterOrDigit(c)) - return false; - return true; - } - bool ValidateRoomName (string roomName) - { - bool valid = ValidateStringLength(roomName,1,25); - if (valid) valid = IsLetterOrDigit(roomName); - if (!valid) NotifyUser(NotificationTypes.Error, "roomName", InvalidRoomName); - return valid; - } - bool ValidateUserName (string userName) - { - bool valid = ValidateStringLength(userName, 1,12); - if (valid) valid = IsLetterOrDigit(userName); - NotifyUser(NotificationTypes.Error, "char:"+userName.First (c => !char.IsLetterOrDigit(c)), InvalidUserName); - return valid; - } - bool ValidateMessage (string message) - { - if (!ValidateStringLength(message, 1,240)) - { - NotifyUser(NotificationTypes.Error, "message", InvalidMessage); - return false; - } - return true; - } - bool ValidateReason (string reason) - { - if (!ValidateStringLength(reason, 1,240)) - { - NotifyUser(NotificationTypes.Error, "reason", InvalidReason); - return false; - } - return true; - } + public void Nick(string nickName) { - if (!ValidateUserName(nickName)) return; + if (!HubInputValidator.ValidateUserName(nickName)) return; var candidate = "?" + nickName; if (_cxManager.IsConnected(candidate)) @@ -258,24 +222,12 @@ namespace Yavsc return _cxManager.IsPresent(roomName, userName); } - bool ValidateStringLength(string str, int minLen, int maxLen) - { - if (string.IsNullOrEmpty(str)) - { - if (minLen<=0) { - return true; - } else { - return false; - } - } - if (str.Length>maxLen||str.Length r.Name == room); if (existent) { @@ -320,19 +272,23 @@ namespace Yavsc _dbContext.ChatRoom.Add(newroom); _dbContext.SaveChanges(user.Id); } + + [Authorize] public void KickBan(string roomName, string userName, string reason) { - if (!ValidateRoomName(roomName)) return ; - if (!ValidateUserName(userName)) return ; - if (!ValidateReason(reason)) return; + if (!HubInputValidator.ValidateRoomName(roomName)) return ; + if (!HubInputValidator.ValidateUserName(userName)) return ; + if (!HubInputValidator.ValidateReason(reason)) return; Kick(roomName, userName, reason); Ban(roomName, userName, reason); } + + [Authorize] public void Kick(string roomName, string userName, string reason) { - if (!ValidateRoomName(roomName)) return ; - if (!ValidateUserName(userName)) return ; - if (!ValidateReason(reason)) return; + if (!HubInputValidator.ValidateRoomName(roomName)) return ; + if (!HubInputValidator.ValidateUserName(userName)) return ; + if (!HubInputValidator.ValidateReason(reason)) return; ChatRoomInfo chanInfo; var roomGroupName = ChatHubConstants.HubGroupRomsPrefix + roomName; if (_cxManager.TryGetChanInfo(roomName, out chanInfo)) @@ -353,25 +309,28 @@ namespace Yavsc Clients.Group(roomGroupName).notifyRoom(NotificationTypes.Kick, roomName, $"{userName}: {reason}"); } + [Authorize] public void Ban(string roomName, string userName, string reason) { - if (!ValidateRoomName(roomName)) return ; - if (!ValidateUserName(userName)) return ; - if (!ValidateReason(reason)) return; + if (!HubInputValidator.ValidateRoomName(roomName)) return ; + if (!HubInputValidator.ValidateUserName(userName)) return ; + if (!HubInputValidator.ValidateReason(reason)) return; var cxIds = _cxManager.GetConnexionIds(userName); throw new NotImplementedException(); } + + [Authorize] public void Gline(string userName, string reason) { - if (!ValidateUserName(userName)) return ; - if (!ValidateReason(reason)) return; + if (!HubInputValidator.ValidateUserName(userName)) return ; + if (!HubInputValidator.ValidateReason(reason)) return; throw new NotImplementedException(); } public void Part(string roomName, string reason) { - if (!ValidateRoomName(roomName)) return ; - if (!ValidateReason(reason)) return; + if (!HubInputValidator.ValidateRoomName(roomName)) return ; + if (!HubInputValidator.ValidateReason(reason)) return; if (_cxManager.Part(Context.ConnectionId, roomName, reason)) { var roomGroupName = ChatHubConstants.HubGroupRomsPrefix + roomName; @@ -393,8 +352,8 @@ namespace Yavsc public void Send(string roomName, string message) { - if (!ValidateRoomName(roomName)) return ; - if (!ValidateMessage(message)) return ; + if (!HubInputValidator.ValidateRoomName(roomName)) return ; + if (!HubInputValidator.ValidateMessage(message)) return ; var groupname = ChatHubConstants.HubGroupRomsPrefix + roomName; ChatRoomInfo chanInfo ; @@ -425,8 +384,8 @@ namespace Yavsc [Authorize] public void SendPV(string userName, string message) { - if (!ValidateUserName(userName)) return ; - if (!ValidateMessage(message)) return ; + if (!HubInputValidator.ValidateUserName(userName)) return ; + if (!HubInputValidator.ValidateMessage(message)) return ; if (userName[0] != '?') if (!Context.User.IsInRole(Constants.AdminGroupName)) @@ -456,7 +415,7 @@ namespace Yavsc public void SendStream(string connectionId, long streamId, string message) { - if (!ValidateMessage(message)) return; + if (!HubInputValidator.ValidateMessage(message)) return; var sender = Context.User.Identity.Name; var cli = Clients.Client(connectionId); cli.addStreamInfo(sender, streamId, message);