mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-24 15:45:35 +08:00
fix(aws): add validateAwsRegion to all AWS route schemas to prevent SSRF (#4250)
* fix(aws): add validateAwsRegion to all AWS route schemas to prevent SSRF * fix(validation): add mx and eu-isoe prefixes to validateAwsRegion regex * test(validation): add mx-central-1, eu-isoe-west-1, and us-iso-west-1 region test cases * fix(aws): eliminate double validateAwsRegion call and fix regex alternation order - Replace double-call .refine() pattern with single-call + static message across all 61 AWS routes - Reorder regex alternation to put longer prefixes first (eu-isoe before eu, us-isob/us-iso/us-gov before us) for engine-agnostic correctness
This commit is contained in:
@@ -9,12 +9,18 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
|
||||
const logger = createLogger('CloudWatchDescribeAlarms')
|
||||
|
||||
const DescribeAlarmsSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
alarmNamePrefix: z.string().optional(),
|
||||
|
||||
@@ -4,13 +4,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createCloudWatchLogsClient } from '@/app/api/tools/cloudwatch/utils'
|
||||
|
||||
const logger = createLogger('CloudWatchDescribeLogGroups')
|
||||
|
||||
const DescribeLogGroupsSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
prefix: z.string().optional(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createCloudWatchLogsClient, describeLogStreams } from '@/app/api/tools/cloudwatch/utils'
|
||||
|
||||
const logger = createLogger('CloudWatchDescribeLogStreams')
|
||||
|
||||
const DescribeLogStreamsSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
logGroupName: z.string().min(1, 'Log group name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createCloudWatchLogsClient, getLogEvents } from '@/app/api/tools/cloudwatch/utils'
|
||||
|
||||
const logger = createLogger('CloudWatchGetLogEvents')
|
||||
|
||||
const GetLogEventsSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
logGroupName: z.string().min(1, 'Log group name is required'),
|
||||
|
||||
@@ -4,12 +4,18 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
|
||||
const logger = createLogger('CloudWatchGetMetricStatistics')
|
||||
|
||||
const GetMetricStatisticsSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
namespace: z.string().min(1, 'Namespace is required'),
|
||||
|
||||
@@ -4,12 +4,18 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
|
||||
const logger = createLogger('CloudWatchListMetrics')
|
||||
|
||||
const ListMetricsSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
namespace: z.string().optional(),
|
||||
|
||||
@@ -8,6 +8,7 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
|
||||
const logger = createLogger('CloudWatchPutMetricData')
|
||||
@@ -43,7 +44,12 @@ const VALID_UNITS = [
|
||||
] as const
|
||||
|
||||
const PutMetricDataSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
namespace: z.string().min(1, 'Namespace is required'),
|
||||
|
||||
@@ -4,13 +4,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createCloudWatchLogsClient, pollQueryResults } from '@/app/api/tools/cloudwatch/utils'
|
||||
|
||||
const logger = createLogger('CloudWatchQueryLogs')
|
||||
|
||||
const QueryLogsSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
logGroupNames: z.array(z.string().min(1)).min(1, 'At least one log group name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createDynamoDBClient, deleteItem } from '@/app/api/tools/dynamodb/utils'
|
||||
|
||||
const logger = createLogger('DynamoDBDeleteAPI')
|
||||
|
||||
const DeleteSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
tableName: z.string().min(1, 'Table name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createDynamoDBClient, getItem } from '@/app/api/tools/dynamodb/utils'
|
||||
|
||||
const logger = createLogger('DynamoDBGetAPI')
|
||||
|
||||
const GetSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
tableName: z.string().min(1, 'Table name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createRawDynamoDBClient, describeTable, listTables } from '@/app/api/tools/dynamodb/utils'
|
||||
|
||||
const logger = createLogger('DynamoDBIntrospectAPI')
|
||||
|
||||
const IntrospectSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
tableName: z.string().optional(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createDynamoDBClient, putItem } from '@/app/api/tools/dynamodb/utils'
|
||||
|
||||
const logger = createLogger('DynamoDBPutAPI')
|
||||
|
||||
const PutSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
tableName: z.string().min(1, 'Table name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createDynamoDBClient, queryItems } from '@/app/api/tools/dynamodb/utils'
|
||||
|
||||
const logger = createLogger('DynamoDBQueryAPI')
|
||||
|
||||
const QuerySchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
tableName: z.string().min(1, 'Table name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createDynamoDBClient, scanItems } from '@/app/api/tools/dynamodb/utils'
|
||||
|
||||
const logger = createLogger('DynamoDBScanAPI')
|
||||
|
||||
const ScanSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
tableName: z.string().min(1, 'Table name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createDynamoDBClient, updateItem } from '@/app/api/tools/dynamodb/utils'
|
||||
|
||||
const logger = createLogger('DynamoDBUpdateAPI')
|
||||
|
||||
const UpdateSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
tableName: z.string().min(1, 'Table name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { addUserToGroup, createIAMClient } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMAddUserToGroupAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1, 'User name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { attachRolePolicy, createIAMClient } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMAttachRolePolicyAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
roleName: z.string().min(1, 'Role name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { attachUserPolicy, createIAMClient } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMAttachUserPolicyAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1, 'User name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createAccessKey, createIAMClient } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMCreateAccessKeyAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().optional().nullable(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, createRole } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMCreateRoleAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
roleName: z.string().min(1, 'Role name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, createUser } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMCreateUserAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1, 'User name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, deleteAccessKey } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMDeleteAccessKeyAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
accessKeyIdToDelete: z.string().min(1, 'Access key ID to delete is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, deleteRole } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMDeleteRoleAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
roleName: z.string().min(1, 'Role name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, deleteUser } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMDeleteUserAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1, 'User name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, detachRolePolicy } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMDetachRolePolicyAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
roleName: z.string().min(1, 'Role name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, detachUserPolicy } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMDetachUserPolicyAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1, 'User name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, getRole } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMGetRoleAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
roleName: z.string().min(1, 'Role name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, getUser } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMGetUserAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1).optional().nullable(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, listAttachedRolePolicies } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMListAttachedRolePoliciesAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
roleName: z.string().min(1, 'Role name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, listAttachedUserPolicies } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMListAttachedUserPoliciesAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1, 'User name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, listGroups } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMListGroupsAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
pathPrefix: z.string().optional().nullable(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, listPolicies } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMListPoliciesAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
scope: z.string().optional().nullable(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, listRoles } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMListRolesAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
pathPrefix: z.string().optional().nullable(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, listUsers } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMListUsersAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
pathPrefix: z.string().optional().nullable(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, removeUserFromGroup } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMRemoveUserFromGroupAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
userName: z.string().min(1, 'User name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIAMClient, simulatePrincipalPolicy } from '../utils'
|
||||
|
||||
const logger = createLogger('IAMSimulatePrincipalPolicyAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
policySourceArn: z.string().min(1, 'Policy source ARN is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { checkAssignmentDeletionStatus, createSSOAdminClient } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterCheckAssignmentDeletionStatusAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
instanceArn: z.string().min(1, 'Instance ARN is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { checkAssignmentCreationStatus, createSSOAdminClient } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterCheckAssignmentStatusAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
instanceArn: z.string().min(1, 'Instance ARN is required'),
|
||||
|
||||
@@ -8,13 +8,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSSOAdminClient, mapAssignmentStatus } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterCreateAccountAssignmentAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
instanceArn: z.string().min(1, 'Instance ARN is required'),
|
||||
|
||||
@@ -8,13 +8,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSSOAdminClient, mapAssignmentStatus } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterDeleteAccountAssignmentAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
instanceArn: z.string().min(1, 'Instance ARN is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createOrganizationsClient, describeAccount } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterDescribeAccountAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
accountId: z.string().min(12, 'Account ID must be 12 digits').max(12),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIdentityStoreClient, getGroupByDisplayName } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterGetGroupAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
identityStoreId: z.string().min(1, 'Identity Store ID is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIdentityStoreClient, getUserByEmail } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterGetUserAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
identityStoreId: z.string().min(1, 'Identity Store ID is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSSOAdminClient, listAccountAssignmentsForPrincipal } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterListAccountAssignmentsAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
instanceArn: z.string().min(1, 'Instance ARN is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createOrganizationsClient, listAccounts } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterListAccountsAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
maxResults: z.number().min(1).max(20).optional(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createIdentityStoreClient, listGroups } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterListGroupsAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
identityStoreId: z.string().min(1, 'Identity Store ID is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSSOAdminClient, listInstances } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterListInstancesAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
maxResults: z.number().min(1).max(100).optional(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSSOAdminClient, listPermissionSets } from '../utils'
|
||||
|
||||
const logger = createLogger('IdentityCenterListPermissionSetsAPI')
|
||||
|
||||
const Schema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
instanceArn: z.string().min(1, 'Instance ARN is required'),
|
||||
|
||||
@@ -3,6 +3,7 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, createTemplate } from '../utils'
|
||||
|
||||
@@ -10,7 +11,12 @@ const logger = createLogger('SESCreateTemplateAPI')
|
||||
|
||||
const CreateTemplateSchema = z
|
||||
.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
templateName: z.string().min(1, 'Template name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, deleteTemplate } from '../utils'
|
||||
|
||||
const logger = createLogger('SESDeleteTemplateAPI')
|
||||
|
||||
const DeleteTemplateSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
templateName: z.string().min(1, 'Template name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, getAccount } from '../utils'
|
||||
|
||||
const logger = createLogger('SESGetAccountAPI')
|
||||
|
||||
const GetAccountSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
})
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, getTemplate } from '../utils'
|
||||
|
||||
const logger = createLogger('SESGetTemplateAPI')
|
||||
|
||||
const GetTemplateSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
templateName: z.string().min(1, 'Template name is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, listIdentities } from '../utils'
|
||||
|
||||
const logger = createLogger('SESListIdentitiesAPI')
|
||||
|
||||
const ListIdentitiesSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
pageSize: z.number().int().min(0).max(1000).nullish(),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, listTemplates } from '../utils'
|
||||
|
||||
const logger = createLogger('SESListTemplatesAPI')
|
||||
|
||||
const ListTemplatesSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
pageSize: z.number().int().min(1).max(100).nullish(),
|
||||
|
||||
@@ -3,6 +3,7 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, sendBulkEmail } from '../utils'
|
||||
|
||||
@@ -14,7 +15,12 @@ const DestinationSchema = z.object({
|
||||
})
|
||||
|
||||
const SendBulkEmailSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
fromAddress: z.string().email('Valid sender email address is required'),
|
||||
|
||||
@@ -3,6 +3,7 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, sendEmail } from '../utils'
|
||||
|
||||
@@ -10,7 +11,12 @@ const logger = createLogger('SESSendEmailAPI')
|
||||
|
||||
const SendEmailSchema = z
|
||||
.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
fromAddress: z.string().email('Valid sender email address is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSESClient, sendTemplatedEmail } from '../utils'
|
||||
|
||||
const logger = createLogger('SESSendTemplatedEmailAPI')
|
||||
|
||||
const SendTemplatedEmailSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
fromAddress: z.string().email('Valid sender email address is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { assumeRole, createSTSClient } from '../utils'
|
||||
|
||||
const logger = createLogger('STSAssumeRoleAPI')
|
||||
|
||||
const AssumeRoleSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
roleArn: z.string().min(1, 'Role ARN is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSTSClient, getAccessKeyInfo } from '../utils'
|
||||
|
||||
const logger = createLogger('STSGetAccessKeyInfoAPI')
|
||||
|
||||
const GetAccessKeyInfoSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
targetAccessKeyId: z.string().min(1, 'Target access key ID is required'),
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSTSClient, getCallerIdentity } from '../utils'
|
||||
|
||||
const logger = createLogger('STSGetCallerIdentityAPI')
|
||||
|
||||
const GetCallerIdentitySchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
})
|
||||
|
||||
@@ -3,13 +3,19 @@ import { toError } from '@sim/utils/errors'
|
||||
import { type NextRequest, NextResponse } from 'next/server'
|
||||
import { z } from 'zod'
|
||||
import { checkInternalAuth } from '@/lib/auth/hybrid'
|
||||
import { validateAwsRegion } from '@/lib/core/security/input-validation'
|
||||
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
|
||||
import { createSTSClient, getSessionToken } from '../utils'
|
||||
|
||||
const logger = createLogger('STSGetSessionTokenAPI')
|
||||
|
||||
const GetSessionTokenSchema = z.object({
|
||||
region: z.string().min(1, 'AWS region is required'),
|
||||
region: z
|
||||
.string()
|
||||
.min(1, 'AWS region is required')
|
||||
.refine((v) => validateAwsRegion(v).isValid, {
|
||||
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
|
||||
}),
|
||||
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
||||
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
||||
durationSeconds: z.number().int().min(900).max(129600).nullish(),
|
||||
|
||||
@@ -1311,12 +1311,31 @@ describe('validateAwsRegion', () => {
|
||||
expect(result.isValid).toBe(true)
|
||||
})
|
||||
|
||||
it.concurrent('should accept us-iso-west-1', () => {
|
||||
const result = validateAwsRegion('us-iso-west-1')
|
||||
expect(result.isValid).toBe(true)
|
||||
})
|
||||
|
||||
it.concurrent('should accept us-isob-east-1', () => {
|
||||
const result = validateAwsRegion('us-isob-east-1')
|
||||
expect(result.isValid).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('valid Mexico regions', () => {
|
||||
it.concurrent('should accept mx-central-1', () => {
|
||||
const result = validateAwsRegion('mx-central-1')
|
||||
expect(result.isValid).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('valid EU Sovereign Cloud regions', () => {
|
||||
it.concurrent('should accept eu-isoe-west-1', () => {
|
||||
const result = validateAwsRegion('eu-isoe-west-1')
|
||||
expect(result.isValid).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('invalid regions', () => {
|
||||
it.concurrent('should reject null', () => {
|
||||
const result = validateAwsRegion(null)
|
||||
|
||||
@@ -857,7 +857,9 @@ export function validateAirtableId(
|
||||
* - GovCloud: us-gov-east-1, us-gov-west-1
|
||||
* - China: cn-north-1, cn-northwest-1
|
||||
* - Israel: il-central-1
|
||||
* - ISO partitions: us-iso-east-1, us-isob-east-1
|
||||
* - ISO partitions: us-iso-east-1, us-iso-west-1, us-isob-east-1
|
||||
* - Mexico: mx-central-1
|
||||
* - EU Sovereign Cloud: eu-isoe-west-1
|
||||
*
|
||||
* @param value - The AWS region to validate
|
||||
* @param paramName - Name of the parameter for error messages
|
||||
@@ -883,7 +885,7 @@ export function validateAwsRegion(
|
||||
}
|
||||
|
||||
const awsRegionPattern =
|
||||
/^(af|ap|ca|cn|eu|il|me|sa|us|us-gov|us-iso|us-isob)-(central|north|northeast|northwest|south|southeast|southwest|east|west)-\d{1,2}$/
|
||||
/^(eu-isoe|us-isob|us-iso|us-gov|af|ap|ca|cn|eu|il|me|mx|sa|us)-(central|north|northeast|northwest|south|southeast|southwest|east|west)-\d{1,2}$/
|
||||
|
||||
if (!awsRegionPattern.test(value)) {
|
||||
logger.warn('Invalid AWS region format', {
|
||||
|
||||
Reference in New Issue
Block a user