Skip to content

Commit

Permalink
feat: ban category
Browse files Browse the repository at this point in the history
  • Loading branch information
SiongSng committed Aug 21, 2022
1 parent 9ca256c commit 36bb60d
Show file tree
Hide file tree
Showing 11 changed files with 103 additions and 51 deletions.
10 changes: 10 additions & 0 deletions RPMTW-Server.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>
1 change: 1 addition & 0 deletions lib/database/models/auth/ban_category.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enum BanCategory { universeChat, permanent }
13 changes: 11 additions & 2 deletions lib/database/models/auth/ban_info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import 'package:rpmtw_server/database/database.dart';

import 'package:rpmtw_server/database/db_model.dart';
import 'package:rpmtw_server/database/index_fields.dart';
import 'package:rpmtw_server/database/model_field.dart';
import 'package:rpmtw_server/database/models/auth/ban_category.dart';

class BanInfo extends DBModel {
static const String collectionName = 'ban_infos';
Expand All @@ -15,24 +17,29 @@ class BanInfo extends DBModel {
/// 封鎖原因
final String reason;

final BanCategory category;

/// 使用此 IP 登入的使用者帳號 UUID
final List<String> userUUID;

const BanInfo({
required this.ip,
required this.reason,
required this.category,
required this.userUUID,
required String uuid,
}) : super(uuid: uuid);

BanInfo copyWith({
String? ip,
String? reason,
BanCategory? category,
List<String>? userUUID,
}) {
return BanInfo(
ip: ip ?? this.ip,
reason: reason ?? this.reason,
category: category ?? this.category,
userUUID: userUUID ?? this.userUUID,
uuid: uuid,
);
Expand All @@ -43,6 +50,7 @@ class BanInfo extends DBModel {
return {
'ip': ip,
'reason': reason,
'category': category.name,
'userUUID': userUUID,
'uuid': uuid,
};
Expand All @@ -52,11 +60,12 @@ class BanInfo extends DBModel {
return BanInfo(
ip: map['ip'],
reason: map['reason'],
category: BanCategory.values.byName(map['category']),
userUUID: List<String>.from(map['userUUID']),
uuid: map['uuid']!,
);
}

static Future<BanInfo?> getByIP(String ip) async =>
DataBase.instance.getModelByField<BanInfo>('ip', ip);
static Future<List<BanInfo>> getByIP(String ip) async =>
DataBase.instance.getModelsByField<BanInfo>([ModelField('ip', ip)]);
}
20 changes: 16 additions & 4 deletions lib/handler/auth_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:mailer/mailer.dart';
import 'package:mailer/smtp_server.dart';
import 'package:mongo_dart/mongo_dart.dart';
import 'package:rpmtw_server/database/models/auth/auth_code_.dart';
import 'package:rpmtw_server/database/models/auth/ban_category.dart';
import 'package:rpmtw_server/database/models/auth/ban_info.dart';
import 'package:rpmtw_server/utilities/api_response.dart';
import 'package:shelf/shelf.dart';
Expand All @@ -24,6 +25,13 @@ class AuthHandler {
return jwt.sign(AuthHandler.secretKey);
}

static String generatePasswordHash(String password) {
final dbCrypt = DBCrypt();
// Generate salt, 10 rounds by default
final String salt = dbCrypt.gensaltWithRounds(AuthHandler.saltRounds);
return dbCrypt.hashpw(password, salt); // Hash the password with the salt
}

static Future<AuthCode> generateAuthCode(
String email, String userUUID) async {
AuthCode authCode = AuthCode.create(email);
Expand All @@ -35,10 +43,13 @@ class AuthHandler {
return (request) {
return Future.sync(() async {
try {
BanInfo? banInfo = await BanInfo.getByIP(request.ip);
if (banInfo != null) {
// 檢查是否被封鎖
return APIResponse.banned(reason: banInfo.reason);
List<BanInfo> banInfos = await BanInfo.getByIP(request.ip);
// Check the user is banned or not
for (final info in banInfos) {
if (info.category == BanCategory.permanent) {
return APIResponse.banned(
reason: info.reason, category: info.category);
}
}
} catch (e) {
return APIResponse.internalServerError();
Expand Down Expand Up @@ -243,6 +254,7 @@ abstract class _BaseValidatedResult {

/// 驗證結果訊息
String message;

_BaseValidatedResult(this.isValid, this.code, this.message);

Map toMap() {
Expand Down
11 changes: 10 additions & 1 deletion lib/handler/universe_chat_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:dotenv/dotenv.dart';
import 'package:http/http.dart' as http;
import 'package:mongo_dart/mongo_dart.dart';
import 'package:rpmtw_dart_common_library/rpmtw_dart_common_library.dart';
import 'package:rpmtw_server/database/models/auth/ban_category.dart';
import 'package:rpmtw_server/database/models/auth/user_role.dart';
import 'package:rpmtw_server/utilities/request_extension.dart';
import 'package:socket_io/socket_io.dart';
Expand Down Expand Up @@ -127,7 +128,14 @@ class UniverseChatHandler {

BanInfo? banInfo;
fetch() async {
banInfo = await BanInfo.getByIP(ip.address);
List<BanInfo> banInfos = await BanInfo.getByIP(ip.address);
for (final info in banInfos) {
if (info.category == BanCategory.universeChat ||
info.category == BanCategory.permanent) {
banInfo = info;
break;
}
}
initCheckList[1] = true;
}

Expand Down Expand Up @@ -304,6 +312,7 @@ class UniverseChatHandler {
class _CacheMinecraftInfo {
final String uuid;
final String name;

const _CacheMinecraftInfo({
required this.uuid,
required this.name,
Expand Down
1 change: 1 addition & 0 deletions lib/routes/api_route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:shelf_router/shelf_router.dart';

abstract class APIRoute {
String get routeName;

void router(Router router) => throw UnimplementedError();

void register(Router mainRouter) {
Expand Down
8 changes: 2 additions & 6 deletions lib/routes/auth_route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,13 @@ class AuthRoute extends APIRoute {
if (!emailValidatedResult.isValid) {
return APIResponse.badRequest(message: emailValidatedResult.message);
}
DBCrypt dbCrypt = DBCrypt();
String salt =
dbCrypt.gensaltWithRounds(AuthHandler.saltRounds); // 生成鹽,加密次數為10次
String hash = dbCrypt.hashpw(password, salt); //使用加鹽算法將明文密碼生成為雜湊值

User user = User(
username: data.fields['username'],
email: email,
avatarStorageUUID: data.fields['avatarStorageUUID'],
emailVerified: false,
passwordHash: hash,
passwordHash: AuthHandler.generatePasswordHash(password),
uuid: Uuid().v4(),
loginIPs: [req.ip]);

Expand Down Expand Up @@ -179,7 +175,7 @@ class AuthRoute extends APIRoute {
{
'uuid': 'e5634ad4-529d-42d4-9a56-045c5f5888cd',
'password': 'test'
}
}
*/
router.postRoute('/get-token', (req, data) async {
String uuid = data.fields['uuid'];
Expand Down
6 changes: 4 additions & 2 deletions lib/utilities/api_response.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:convert';

import 'package:rpmtw_dart_common_library/rpmtw_dart_common_library.dart';
import 'package:rpmtw_server/database/list_model_response.dart';
import 'package:rpmtw_server/database/models/auth/ban_category.dart';
import 'package:rpmtw_server/utilities/messages.dart';
import 'package:shelf/shelf.dart';
import 'dart:io';
Expand Down Expand Up @@ -84,12 +85,13 @@ class APIResponse {
static Response modelNotFound<T>({String? modelName}) => notFound(
'${modelName ?? T.toString().toCapitalizedWithSpace()} not found');

static Response banned({required String reason}) =>
static Response banned(
{required String reason, required BanCategory category}) =>
Response(HttpStatus.forbidden,
body: json.encode({
'status': HttpStatus.forbidden,
'message': 'Banned',
'data': {'reason': reason}
'data': {'reason': reason, 'category': category.name}
}),
headers: _baseHeaders);
}
12 changes: 4 additions & 8 deletions lib/utilities/request_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,10 @@ import 'package:shelf_router/shelf_router.dart';

extension RequestExtension on Request {
String get ip {
String? xForwardedFor = headers['X-Forwarded-For'];
if (xForwardedFor != null && kTestMode) {
return xForwardedFor;
String? cfIP = headers['CF-Connecting-IP'];
if (cfIP != null) {
return cfIP;
} else {
String? cfIP = headers['CF-Connecting-IP'];
if (cfIP != null) {
return cfIP;
}

HttpConnectionInfo connectionInfo =
context['shelf.io.connection_info'] as HttpConnectionInfo;
InternetAddress internetAddress = connectionInfo.remoteAddress;
Expand Down Expand Up @@ -184,6 +179,7 @@ class RouteData {
final Uint8List bytes;

Stream<List<int>> get byteStream => http.ByteStream.fromBytes(bytes);

String get body => utf8.decode(bytes);

RouteData(this.fields, this.bytes);
Expand Down
Loading

0 comments on commit 36bb60d

Please sign in to comment.