This repository was archived by the owner on Jan 30, 2025. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUsersController.cs
More file actions
178 lines (150 loc) · 8.74 KB
/
Copy pathUsersController.cs
File metadata and controls
178 lines (150 loc) · 8.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Cors;
using System.Net;
using static MechaChat.API.Handlers.MySQLHandler;
using System.Net.Http;
using CryptSharp;
using System;
using Newtonsoft.Json;
using MechaChat.API.Models;
using MechaChat.API.Attributes;
using Microsoft.AspNetCore.Http;
using System.ComponentModel;
namespace MechaChat.API.Controllers
{
[RoutePrefix("v1/users")]
[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = false, PreflightMaxAge = 86400)]
public class UsersController : ApiController
{
public static Functions Functions = new Functions();
/// <summary>
/// Refreshes the users session token so they stay logged in to the website.
/// </summary>
/// <response code="404">The account is not found, Cannot refresh the session token.</response>
/// <response code="403">The account is banned, Cannot refresh the session token, and sends a request to log the user out.</response>
/// <response code="200">The account has been found, Refreshes the session token.</response>
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status404NotFound)]
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status403Forbidden)]
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status200OK)]
[Route("refreshtoken")]
[Authorize(Roles = "system")]
[HttpPost]
public async Task<HttpResponseMessage> RefreshCurrentJWTokenAsync(UserRefreshModel refreshData)
{
var jwtokengen = Functions.GenerateJSONWebToken();
var userAccessToken = Functions.EncodeStringBase58(refreshData.UserAccessToken);
var userObj = await SelectSingleQuery<UserAccountsModel>($"SELECT * FROM `user_accounts` WHERE `user_email` = '{refreshData.EmailAddress}' AND `user_id` = '{refreshData.UserId}' AND `access_token` = '{userAccessToken}' LIMIT 1");
if (userObj == null || bool.Parse(userObj.UserIsDeleted)) return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Account not found!");
if (bool.Parse(userObj.UserIsBanned)) return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Account is banned!");
var decodedAccessToken = Functions.DecodeStringBase58(userObj.UserAccessToken);
var jsonUserData = new
{
userid = userObj.UserId,
avatar = userObj.UserProfilePic,
username = userObj.UserUsername,
emailaddress = userObj.UserEmail,
systemroles = userObj.UserRoles,
systemtheme = userObj.UserSystemTheme,
discriminator = userObj.UserDiscriminator,
status = userObj.UserStatus,
statusMsg = userObj.UserStatusMsg,
mood = userObj.UserMood
};
var jsonData = new
{
accountStore = jsonUserData,
tokenStore = new
{
accesstoken = decodedAccessToken,
jwtoken = jwtokengen
}
};
return Request.CreateResponse(HttpStatusCode.OK, jsonData);
}
/// <summary>
/// Creates a new user with the data provided.
/// </summary>
/// <response code="201">All info provided is valid, Will create a new user with the info provided.</response>
/// <response code="400">One of the inputs where not valid, Cannot create the account.</response>
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status400BadRequest)]
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status201Created)]
[Route("create")]
[Authorize(Roles = "system")]
[HttpPost]
public async Task<HttpResponseMessage> CreateUserAccount(UserCreateModel userCreationForm)
{
if (userCreationForm.EmailAddress == null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Please enter an email!");
if (userCreationForm.Username == null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Please enter a username!");
if (userCreationForm.Password == null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Please enter a password!");
if (userCreationForm.Password.Length < 6) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Password must be 6 or more characters!");
if (userCreationForm.DateOfBirth == null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Please enter your date of birth!");
var userCreationData = new UserCreateModel
{
EmailAddress = userCreationForm.EmailAddress,
Username = userCreationForm.Username,
DateOfBirth = userCreationForm.DateOfBirth
};
var userAccountId = Functions.IdentifierGen();
var IsEmailInUse = await SelectSingleQuery<UserAccountsModel>($"SELECT * FROM `user_accounts` WHERE `user_email` = '{userCreationData.EmailAddress}' LIMIT 1");
if (IsEmailInUse != null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Email address is already in use.");
//var userDiscriminator = Functions.();
var newUserCreateData = new
{
newUserId = userAccountId,
newUserData = new
{
EmailAddress = userCreationForm.EmailAddress,
Username = userCreationForm.Username,
DateOfBirth = userCreationForm.DateOfBirth
}
};
return Request.CreateResponse(HttpStatusCode.Created, newUserCreateData);
}
/// <summary>
/// Sign the user in with the data they provided.
/// </summary>
/// <response code="200">All info provided is correct, Will sign the user in.</response>
/// <response code="404">The user cannot be found with the info provided, Cannot sign the user in.</response>
/// <response code="403">The password the user provided does not match, Or the user has been banned, Cannot sign the user in.</response>
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status200OK)]
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status404NotFound)]
[Microsoft.AspNetCore.Mvc.ProducesResponseType(StatusCodes.Status403Forbidden)]
[Route("login")]
[Authorize(Roles = "system")]
[HttpPost]
public async Task<HttpResponseMessage> CheckAuthenticationAsync(UserLoginModel userLoginForm)
{
if (userLoginForm.EmailAddress == null) return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Please enter your email!");
if (userLoginForm.Password == null) return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Please enter your password!");
var userObj = await SelectSingleQuery<UserAccountsModel>($"SELECT * FROM `user_accounts` WHERE `user_email` = '{userLoginForm.EmailAddress}' LIMIT 1");
if (userObj == null || bool.Parse(userObj.UserIsDeleted)) return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Email or Password is incorrect!");
if (!Crypter.CheckPassword(userLoginForm.Password, userObj.UserPassword)) return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Email or Password is incorrect");
if (bool.Parse(userObj.UserIsBanned)) return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "This account has been banned!");
var jwtokengen = Functions.GenerateJSONWebToken();
var decodedAccessToken = Functions.DecodeStringBase58(userObj.UserAccessToken);
var jsonUserData = new {
userid = userObj.UserId,
avatar = userObj.UserProfilePic,
username = userObj.UserUsername,
emailaddress = userObj.UserEmail,
discriminator = userObj.UserDiscriminator,
systemroles = userObj.UserRoles,
systemtheme = userObj.UserSystemTheme,
status = userObj.UserStatus,
statusMsg = userObj.UserStatusMsg,
mood = userObj.UserMood
};
var jsonData = new
{
accountStore = jsonUserData,
tokenStore = new
{
accesstoken = decodedAccessToken,
jwtoken = jwtokengen
}
};
return Request.CreateResponse(HttpStatusCode.OK, jsonData);
}
}
}