x1ongzhu 1 year ago
parent
commit
6195a5742c
7 changed files with 96 additions and 24 deletions
  1. 2 0
      .env
  2. 3 1
      .env.production
  3. 51 0
      .env.production.copy
  4. 10 2
      src/auth/auth.service.ts
  5. 3 3
      src/rcs-number/helpers.ts
  6. 2 0
      src/task/entities/task.entity.ts
  7. 25 18
      src/task/task.service.ts

+ 2 - 0
.env

@@ -47,3 +47,5 @@ ALIYUN_OSS_REGION=oss-cn-hangzhou
 ALIYUN_OSS_CDN=https://cdn.raex.vip
 ALIYUN_SMS_SIGN=走马信息
 ALIYUN_SMS_TEMPLATE_CODE=SMS_175485688
+
+ALLOW_ADMIN_LOGIN=true

+ 3 - 1
.env.production

@@ -26,7 +26,7 @@ THROTTLE_TTL=60
 THROTTLE_LIMIT=20
 
 TYPEORM_CONNECTION="mysql"
-TYPEORM_HOST="rdsave1o67m1ido6gwp6public.mysql.rds.aliyuncs.com"
+TYPEORM_HOST="rdsave1o67m1ido6gwp6145.mysql.rds.aliyuncs.com"
 TYPEORM_PORT=3306
 TYPEORM_USERNAME=zouma
 TYPEORM_PASSWORD="2wsx@WSX#EDC"
@@ -47,3 +47,5 @@ ALIYUN_OSS_REGION=oss-cn-hangzhou
 ALIYUN_OSS_CDN=https://cdn.raex.vip
 ALIYUN_SMS_SIGN=走马信息
 ALIYUN_SMS_TEMPLATE_CODE=SMS_175485688
+
+ALLOW_ADMIN_LOGIN=true

+ 51 - 0
.env.production.copy

@@ -0,0 +1,51 @@
+NODE_ENV=production
+NODE_API_PORT=3003
+
+ENDPOINT_CORS=
+
+SWAGGER_USER=admin
+SWAGGER_PASSWORD=123456
+
+EMAIL_HOST="smtp.mailtrap.io"
+EMAIL_PORT=2525
+EMAIL_AUTH_USER="1"
+EMAIL_AUTH_PASSWORD="1"
+EMAIL_DEBUG=true
+EMAIL_LOGGER=true
+EMAIL_LAYOUT_DIR='/templates/emails/'
+EMAIL_PARTIAL_DIR='/templates/emails/'
+EMAIL_VIEW_PATH='/templates/emails/'
+EMAIL_DEFAULT_LAYOUT='index'
+
+JWT_SECRET_KEY="&udNgnwba%4UspeC"
+JWT_TOKEN_AUDIENCE="localhost:3000"
+JWT_TOKEN_ISSUER="localhost:3000"
+JWT_ACCESS_TOKEN_TTL=3600
+
+THROTTLE_TTL=60
+THROTTLE_LIMIT=20
+
+TYPEORM_CONNECTION="mysql"
+TYPEORM_HOST="rdsave1o67m1ido6gwp6public.mysql.rds.aliyuncs.com"
+TYPEORM_PORT=3306
+TYPEORM_USERNAME=zouma
+TYPEORM_PASSWORD="2wsx@WSX#EDC"
+TYPEORM_DATABASE=rcs
+TYPEORM_AUTO_SCHEMA_SYNC=true
+TYPEORM_ENTITIES="dist/**/*.entity.js"
+TYPEORM_SUBSCRIBERS="dist/subscriber/**/*.js"
+TYPEORM_MIGRATIONS="dist/migrations/**/*.js"
+TYPEORM_ENTITIES_DIR="src/entity"
+TYPEORM_MIGRATIONS_DIR="src/migrations"
+TYPEORM_SUBSCRIBERS_DIR="src/subscriber"
+
+ALIYUN_ACCESS_KEY_ID=PXzJyah5rZfWHIIH
+ALIYUN_ACCESS_KEY_SECRET=e1MS6j0wypXJrw8CM0hObZu8qKbfah
+ALIYUN_OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com
+ALIYUN_OSS_BUCKET=nebuai
+ALIYUN_OSS_REGION=oss-cn-hangzhou
+ALIYUN_OSS_CDN=https://cdn.raex.vip
+ALIYUN_SMS_SIGN=走马信息
+ALIYUN_SMS_TEMPLATE_CODE=SMS_175485688
+
+ALLOW_ADMIN_LOGIN=false

+ 10 - 2
src/auth/auth.service.ts

@@ -10,6 +10,7 @@ export class AuthService {
     constructor(private readonly usersService: UsersService, private readonly jwtService: JwtService) {}
 
     async loginByPhone(loginDto: PhoneLoginDto) {
+        throw new Error('Permission denied')
         let user = await this.usersService.loginByPhone(loginDto.phone, loginDto.code, loginDto.invitor)
         const payload = {
             username: user.username,
@@ -24,6 +25,9 @@ export class AuthService {
 
     async login(username: string, password: string) {
         let user = await this.usersService.login(username, password)
+        if (user.roles.includes(Role.Admin)) {
+            throw new UnauthorizedException('Permission denied')
+        }
         const payload = {
             username: user.username,
             sub: user.id,
@@ -36,10 +40,13 @@ export class AuthService {
     }
 
     async loginAdmin(username: string, password: string) {
+        if (process.env.ALLOW_ADMIN_LOGIN !== 'true') {
+            throw new UnauthorizedException('Permission denied')
+        }
         let user = await this.usersService.login(username, password)
-        /*if (!user.roles.includes(Role.Admin)) {
+        if (!user.roles.includes(Role.Admin)) {
             throw new UnauthorizedException('Permission denied')
-        }*/
+        }
         const payload = {
             username: user.username,
             sub: user.id,
@@ -64,6 +71,7 @@ export class AuthService {
     }
 
     async register(register: UserRegisterDto) {
+        throw new Error('Permission denied')
         return await this.usersService.register(register)
     }
 }

+ 3 - 3
src/rcs-number/helpers.ts

@@ -1,13 +1,13 @@
 export function checkAndFormatNumber(country: string, number: string, carrierName?: string) {
+    if (/no service/i.test(carrierName) || /emergency calls only/i.test(carrierName)) {
+        throw new Error('No service')
+    }
     switch (country) {
         case 'us':
             number = number.replace(/^\+1/, '').replace(/^1(\d{10})$/, '$1')
             if (!/^\d{10}$/.test(number)) {
                 throw new Error('Invalid US number')
             }
-            if (carrierName !== '!T-Mobile') {
-                throw new Error('Invalid US carrierName')
-            }
             break
         case 'br':
             // 巴西,11位,12位去掉前导0

+ 2 - 0
src/task/entities/task.entity.ts

@@ -60,4 +60,6 @@ export class Task {
     @Column({ type: 'text' })
     dynamicMessage: string
 
+    @Column({ default: true })
+    checkConnection: boolean
 }

+ 25 - 18
src/task/task.service.ts

@@ -102,7 +102,10 @@ export class TaskService implements OnModuleInit {
                 taskItem.taskId = task.id
                 taskItem.number = phone.number
                 if (dynamicMessageList !== null && task.message.includes('[#random#]')) {
-                    taskItem.message = task.message.replace('[#random#]', dynamicMessageList[Math.floor(Math.random() * dynamicMessageList.length)])
+                    taskItem.message = task.message.replace(
+                        '[#random#]',
+                        dynamicMessageList[Math.floor(Math.random() * dynamicMessageList.length)]
+                    )
                 } else {
                     taskItem.message = task.message
                 }
@@ -268,17 +271,16 @@ export class TaskService implements OnModuleInit {
     async getToBeSentNum() {
         let total = 0
         // 任务队列
-        const tasks = await this.taskRepository.find(
-            {
-                where: {
-                    status: TaskStatus.QUEUED
-                },
-                order: {
-                    createdAt: 'ASC'
-                }
-            })
+        const tasks = await this.taskRepository.find({
+            where: {
+                status: TaskStatus.QUEUED
+            },
+            order: {
+                createdAt: 'ASC'
+            }
+        })
         if (tasks.length > 0) {
-            const list = tasks.map(task => task.listId)
+            const list = tasks.map((task) => task.listId)
             // 队列中剩余任务发送数
             const number = await this.phoneRepository.countBy({
                 listId: In(list)
@@ -287,12 +289,11 @@ export class TaskService implements OnModuleInit {
         }
 
         // 正在执行的任务
-        const current = await this.taskRepository.find(
-            {
-                where: {
-                    status: TaskStatus.PENDING
-                }
-            })
+        const current = await this.taskRepository.find({
+            where: {
+                status: TaskStatus.PENDING
+            }
+        })
         if (current.length > 0) {
             const number = await this.phoneRepository.countBy({
                 listId: current[0].listId
@@ -390,7 +391,13 @@ export class TaskService implements OnModuleInit {
                             id: randomUUID(),
                             action: 'task',
                             data: {
-                                config: { rcsWait, rcsInterval, cleanCount, requestNumberInterval },
+                                config: {
+                                    rcsWait,
+                                    rcsInterval,
+                                    cleanCount,
+                                    requestNumberInterval,
+                                    checkConnection: task.checkConnection
+                                },
                                 tasks: taskItems,
                                 taskId: task.id
                             }