diff options
Diffstat (limited to 'Backend/Api/Api/Services/UserService.cs')
-rw-r--r-- | Backend/Api/Api/Services/UserService.cs | 117 |
1 files changed, 106 insertions, 11 deletions
diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 8e10a15..84c4465 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -3,6 +3,8 @@ using Api.Models; using MongoDB.Driver; using Microsoft.AspNetCore.Http; using System.Security.Claims; +using MimeKit; +using MailKit.Net.Smtp; namespace Api.Services { @@ -11,12 +13,14 @@ namespace Api.Services private readonly IHttpContextAccessor _httpContext; private readonly IMongoCollection<User> _users; private readonly IJwtService _jwtService; - public UserService(IDatabaseConnection settings, IMongoClient mongoClient, IJwtService jwtService, IHttpContextAccessor httpContextAccessor) + private IConfiguration _configuration; + public UserService(IDatabaseConnection settings, IMongoClient mongoClient, IJwtService jwtService, IHttpContextAccessor httpContextAccessor, IConfiguration configuration) { var database = mongoClient.GetDatabase(settings.DatabaseName); _users = database.GetCollection<User>(settings.UserCollectionName); - _jwtService=jwtService; + _jwtService = jwtService; this._httpContext = httpContextAccessor; + this._configuration = configuration; } public async Task<int> createUser(User user) @@ -122,21 +126,31 @@ namespace Api.Services user.name = register.name; user.verified = false; user.password = hashPassword(register.password); - user.emailToken = _jwtService.GenEmailToken(user.username); + user.creationDate = DateTime.Now.ToUniversalTime(); + user.emailToken = ""; await _users.InsertOneAsync(user); + user.emailToken = _jwtService.GenEmailToken(user); + await _users.ReplaceOneAsync(x => x._id == user._id, user); + SendEmailKod(user); + return "User Registered"; } - public async Task<Boolean> VerifyUser(string _id) + public async Task<Boolean> VerifyUser(VerifyUser login) { - User user = await _users.FindAsync(x => x._id==_id).Result.FirstOrDefaultAsync(); - if(user != null) + User user = await _users.FindAsync(x => x.email == login.email).Result.FirstOrDefaultAsync(); + if (user != null && checkPassword(login.password, user.password)) { - user.verified = true; - await _users.ReplaceOneAsync(x => x._id == _id, user); - return true; + var basekod = _jwtService.EmailTokenToKod(user.emailToken); + if (basekod != null) + if (String.Compare(login.kod,basekod) == 0) + { + user.verified = true; + await _users.ReplaceOneAsync(x => x._id == user._id, user); + return true; + } } return false; } @@ -153,13 +167,14 @@ namespace Api.Services public async Task<string> Login(Login login) { - User user = await _users.FindAsync(x => x.email == login.email).Result.FirstOrDefaultAsync(); // add && x.verified == true after implementing - if(user != null && checkPassword(login.password, user.password)) + User user = await _users.FindAsync(x => x.email == login.email && x.verified == true).Result.FirstOrDefaultAsync(); + if (user != null && checkPassword(login.password, user.password)) { return _jwtService.GenToken(user); } return null; } + public async Task<string> UserIdFromJwt() { string id = null; @@ -172,5 +187,85 @@ namespace Api.Services } return id; } + + public async Task<Boolean> ResendVerifyKod(Login login) + { + User user = await _users.FindAsync(x => x.email == login.email).Result.FirstOrDefaultAsync(); + if (user != null && checkPassword(login.password, user.password)) + { + user.emailToken = _jwtService.GenEmailToken(user); + await _users.ReplaceOneAsync(x => x._id == user._id, user); + SendEmailKod(user); + + return true; + } + return false; + } + + public Boolean SendEmailKod(User user) + { + MimeMessage message = new MimeMessage(); + message.From.Add(new MailboxAddress("Tim Oddyssey", _configuration.GetSection("EmailCfg:Email").Value)); + message.To.Add(MailboxAddress.Parse(user.email)); + message.Subject = "Vas Oddyssey verifikacioni kod"; //think of something better yeah? + + var kod = _jwtService.EmailTokenToKod(user.emailToken); + if (kod == null) + return false; + + var bodybuilder = new BodyBuilder(); + bodybuilder.HtmlBody = String.Format(@"<h3>Verfikacioni kod:</h3><h2>"+kod+"</h2><br><p>Kod traje <b>30</b> minuta</p>"); + message.Body = bodybuilder.ToMessageBody(); + + SmtpClient client = new SmtpClient(); + try + { + client.Connect(_configuration.GetSection("EmailCfg:SmtpServer").Value, 465, true); + client.Authenticate(_configuration.GetSection("EmailCfg:Email").Value, _configuration.GetSection("EmailCofg:Password").Value); + client.Send(message); + + } + catch (Exception ex) + { + return false; + } + finally + { + client.Disconnect(true); + client.Dispose(); + } + return true; + } + + public async Task<Boolean> ForgotPassword(JustMail jm) + { + User user = await _users.FindAsync(x => x.email == jm.email && x.verified == true).Result.FirstOrDefaultAsync(); + if (user != null) + { + user.emailToken = _jwtService.GenEmailToken(user); + await _users.ReplaceOneAsync(x => x._id == user._id, user); + SendEmailKod(user); + + return true; + } + return false; + } + + public async Task<Boolean> ResetPassword(ResetPass rp) + { + User user = await _users.FindAsync(x => x.email == rp.email && x.verified == true).Result.FirstOrDefaultAsync(); + if (user != null) + { + var basekod = _jwtService.EmailTokenToKod(user.emailToken); + if (basekod != null) + if (String.Compare(rp.kod, basekod) == 0) + { + user.password = hashPassword(rp.newpass); + await _users.ReplaceOneAsync(x => x._id == user._id, user); + return true; + } + } + return false; + } } } |