@ufdevsllc/auth-me
Version:
Comprehensive licensing, security monitoring, and data mirroring package with hardcoded vendor-controlled database connection
1,358 lines (1,086 loc) • 33.7 kB
Markdown
# SecureGuard API Documentation
## Table of Contents
- [SecureGuard Class](#secureguard-class)
- [Configuration Options](#configuration-options)
- [Core Methods](#core-methods)
- [Event System](#event-system)
- [Error Handling](#error-handling)
- [Type Definitions](#type-definitions)
## SecureGuard Class
### Constructor
```javascript
new SecureGuard(config)
```
Creates a new SecureGuard instance with the specified configuration.
**Parameters:**
- `config` (Object): Configuration object
**Example:**
```javascript
const secureGuard = new SecureGuard({
licenseKey: 'your-license-key',
secureDatabase: {
connectionString: 'mongodb://localhost:27017/secure-db'
}
});
```
## Configuration Options
### Main Configuration Object
```typescript
interface SecureGuardConfig {
licenseKey: string;
secureDatabase?: DatabaseConfig;
offlineMode?: OfflineModeConfig;
usageTracking?: UsageTrackingConfig;
security?: SecurityConfig;
logging?: LoggingConfig;
enableOfflineMode?: boolean;
}
```
### DatabaseConfig
```typescript
interface DatabaseConfig {
connectionString: string;
options?: {
useNewUrlParser?: boolean;
useUnifiedTopology?: boolean;
serverSelectionTimeoutMS?: number;
connectTimeoutMS?: number;
socketTimeoutMS?: number;
maxPoolSize?: number;
minPoolSize?: number;
};
retryAttempts?: number;
retryDelay?: number;
maxRetryDelay?: number;
}
```
### OfflineModeConfig
```typescript
interface OfflineModeConfig {
enabled: boolean;
cacheExpirationHours: number;
gracePeriodHours: number;
cacheDirectory: string;
strictMode: boolean;
}
```
### UsageTrackingConfig
```typescript
interface UsageTrackingConfig {
enabled: boolean;
persistInterval: number;
limits: {
maxWrites?: number;
maxUsers?: number;
maxDeployments?: number;
maxModels?: number;
modelLimits?: { [modelName: string]: number };
};
}
```
### SecurityConfig
```typescript
interface SecurityConfig {
enableTamperDetection: boolean;
enableObfuscation: boolean;
enableSecurityHardening: boolean;
strictMode: boolean;
tamperDetectionLevel?: 'basic' | 'standard' | 'strict';
obfuscationLevel?: 'low' | 'medium' | 'high';
preventDebugging?: boolean;
preventReverseEngineering?: boolean;
enableIntegrityChecks?: boolean;
}
```
### LoggingConfig
```typescript
interface LoggingConfig {
level: 'debug' | 'info' | 'warn' | 'error' | 'critical';
enableSecurityLogging: boolean;
logToFile: boolean;
logDirectory: string;
}
```
## Core Methods
### initialize()
Initializes the SecureGuard system, establishes database connections, and sets up all components.
```javascript
await secureGuard.initialize()
```
**Returns:** `Promise<void>`
**Throws:** `SecureGuardError` if initialization fails
**Example:**
```javascript
try {
await secureGuard.initialize();
console.log('SecureGuard initialized successfully');
} catch (error) {
console.error('Initialization failed:', error.message);
}
```
### validateLicense(fingerprint?, options?)
Validates the license key with optional environment binding.
```javascript
await secureGuard.validateLicense(fingerprint?, options?)
```
**Parameters:**
- `fingerprint` (string, optional): Environment fingerprint for binding validation
- `options` (Object, optional): Validation options
- `updateLastValidation` (boolean): Whether to update last validation timestamp (default: true)
- `checkEnvironmentBinding` (boolean): Whether to check environment binding (default: true)
- `allowOffline` (boolean): Whether to allow offline validation (default: true)
**Returns:** `Promise<ValidationResult>`
```typescript
interface ValidationResult {
isValid: boolean;
license: License | null;
reason: string;
code: string;
isOfflineValidation?: boolean;
cacheAge?: number;
isStale?: boolean;
}
```
**Example:**
```javascript
// Basic validation
const result = await secureGuard.validateLicense();
console.log('License valid:', result.isValid);
// With environment binding
const fingerprint = secureGuard.generateEnvironmentFingerprint();
const boundResult = await secureGuard.validateLicense(fingerprint);
// With options
const customResult = await secureGuard.validateLicense(null, {
allowOffline: false,
checkEnvironmentBinding: false
});
```
### trackUsage(operation, metadata?)
Tracks usage for the specified operation.
```javascript
await secureGuard.trackUsage(operation, metadata?)
```
**Parameters:**
- `operation` (string): Type of operation being tracked
- `metadata` (Object, optional): Additional metadata for the operation
**Returns:** `Promise<void>`
**Example:**
```javascript
// Basic usage tracking
await secureGuard.trackUsage('api_call');
// With metadata
await secureGuard.trackUsage('data_export', {
userId: 'user123',
recordCount: 1000,
exportFormat: 'csv'
});
// Different operation types
await secureGuard.trackUsage('user_login', { userId: 'user456' });
await secureGuard.trackUsage('file_upload', { fileSize: 1024000 });
```
### getUsageStats()
Returns current usage statistics.
```javascript
secureGuard.getUsageStats()
```
**Returns:** `UsageStats`
```typescript
interface UsageStats {
licenseKey: string;
totalWrites: number;
writesByModel: { [modelName: string]: number };
lastActivity: Date;
deploymentCount: number;
periodStart: Date;
periodEnd: Date | null;
}
```
**Example:**
```javascript
const stats = secureGuard.getUsageStats();
console.log('Total writes:', stats.totalWrites);
console.log('Last activity:', stats.lastActivity);
console.log('Writes by model:', stats.writesByModel);
```
### isWithinLimits()
Checks if current usage is within license limits.
```javascript
secureGuard.isWithinLimits()
```
**Returns:** `boolean`
**Example:**
```javascript
if (!secureGuard.isWithinLimits()) {
console.warn('Usage limits exceeded');
// Handle limit exceeded scenario
}
```
### registerSchema(config)
Registers a Mongoose schema for automatic data mirroring.
```javascript
await secureGuard.registerSchema(config)
```
**Parameters:**
- `config` (Object): Schema registration configuration
- `schema` (mongoose.Schema): Mongoose schema to register
- `modelName` (string): Name of the model
- `mirrorWrites` (boolean): Whether to mirror write operations (default: true)
- `mirrorReads` (boolean): Whether to mirror read operations (default: false)
**Returns:** `Promise<void>`
**Example:**
```javascript
const userSchema = new mongoose.Schema({
name: String,
email: String,
createdAt: { type: Date, default: Date.now }
});
await secureGuard.registerSchema({
schema: userSchema,
modelName: 'User',
mirrorWrites: true,
mirrorReads: false
});
```
### cloneModelData(modelName, options?)
**NEW FEATURE** - Selectively clones specific Mongoose model data to the secure database for monitoring and analysis.
```javascript
await SecureGuard.cloneModelData(modelName, options?)
```
**Parameters:**
- `modelName` (string): Name of the Mongoose model to clone
- `options` (Object, optional): Cloning options
- `syncType` (string): Type of sync - 'manual', 'daily', or 'startup' (default: 'manual')
- `preserveIds` (boolean): Whether to preserve original document IDs (default: true)
- `includeDeleted` (boolean): Whether to include soft-deleted documents (default: false)
- `batchSize` (number): Number of documents to process in each batch (default: 1000)
**Returns:** `Promise<CloneResult>`
```typescript
interface CloneResult {
success: boolean;
modelName: string;
recordsCloned: number;
mirrorCollectionName: string;
syncTime: Date;
errors: string[];
}
```
**Example:**
```javascript
// Basic model cloning
const result = await SecureGuard.cloneModelData('User');
console.log('Cloned records:', result.recordsCloned);
// With options
const advancedResult = await SecureGuard.cloneModelData('Product', {
syncType: 'daily',
batchSize: 500,
includeDeleted: true
});
// Handle errors
if (!result.success) {
console.error('Cloning failed:', result.errors);
}
```
**Requirements Addressed:** 1.1 - Automatic model discovery and selective cloning
### generateEnvironmentFingerprint()
Generates a unique fingerprint for the current environment.
```javascript
secureGuard.generateEnvironmentFingerprint()
```
**Returns:** `string`
**Example:**
```javascript
const fingerprint = secureGuard.generateEnvironmentFingerprint();
console.log('Environment fingerprint:', fingerprint);
// Use for environment-bound validation
const validation = await secureGuard.validateLicense(fingerprint);
```
### getOfflineStatus()
Returns current offline mode status and statistics.
```javascript
secureGuard.getOfflineStatus()
```
**Returns:** `OfflineStatus`
```typescript
interface OfflineStatus {
offlineModeEnabled: boolean;
offlineStatus: {
isOfflineMode: boolean;
lastOnlineTime: Date | null;
offlineDurationMs: number;
cachedLicenses: number;
cacheDirectory: string;
allowOfflineMode: boolean;
config: OfflineModeConfig;
};
degradedStatus: {
isDegradedMode: boolean;
startTime: Date | null;
durationMs: number;
reasons: Array<{ reason: string; timestamp: Date }>;
fallbackUsageStats: { [operationType: string]: number };
config: FallbackConfig;
} | null;
isConnected: boolean;
}
```
**Example:**
```javascript
const status = secureGuard.getOfflineStatus();
console.log('Offline mode:', status.offlineStatus.isOfflineMode);
console.log('Cached licenses:', status.offlineStatus.cachedLicenses);
console.log('Degraded mode:', status.degradedStatus?.isDegradedMode);
```
### cleanExpiredCache()
Removes expired entries from the offline cache.
```javascript
await secureGuard.cleanExpiredCache()
```
**Returns:** `Promise<number>` - Number of entries removed
**Example:**
```javascript
const removedCount = await secureGuard.cleanExpiredCache();
console.log('Removed expired cache entries:', removedCount);
```
### enterOfflineMode(reason?)
Manually enters offline mode (primarily for testing).
```javascript
secureGuard.enterOfflineMode(reason?)
```
**Parameters:**
- `reason` (string, optional): Reason for entering offline mode
**Example:**
```javascript
secureGuard.enterOfflineMode('Testing offline functionality');
```
### exitOfflineMode()
Exits offline mode and returns to online operation.
```javascript
secureGuard.exitOfflineMode()
```
**Example:**
```javascript
secureGuard.exitOfflineMode();
console.log('Returned to online mode');
```
### forceExitDegradedMode()
Forces exit from degraded mode.
```javascript
secureGuard.forceExitDegradedMode()
```
**Example:**
```javascript
secureGuard.forceExitDegradedMode();
console.log('Exited degraded mode');
```
## Express.js Integration and Monitoring
### Automatic Express.js Detection and Monitoring
**NEW FEATURE** - SecureGuard automatically detects Express.js applications and injects invisible monitoring middleware into all routes.
#### Automatic Middleware Injection
When SecureGuard initializes, it automatically:
1. Detects Express.js framework usage
2. Injects monitoring middleware into ALL routes
3. Logs comprehensive request data invisibly
4. Operates in complete stealth mode
**No manual integration required** - The monitoring happens automatically upon SecureGuard initialization.
#### What Gets Monitored
- **Request Method**: GET, POST, PUT, DELETE, etc.
- **Request Path**: Full route path including parameters
- **Client IP**: Original client IP address
- **Headers**: Complete request headers
- **Request Body**: Full request payload (when applicable)
- **Response Status**: HTTP status codes
- **Response Time**: Request processing duration
- **User Agent**: Client browser/application information
- **Timestamp**: Precise request timing
#### Express.js Integration Example
```javascript
const express = require('express');
const SecureGuard = require('secure-guard');
const app = express();
// Initialize SecureGuard - monitoring injection happens automatically
const secureGuard = new SecureGuard({
licenseKey: 'your-license-key'
});
await secureGuard.initialize(); // Express monitoring starts here
// Your existing routes - all will be monitored automatically
app.get('/api/users', (req, res) => {
// This route is now automatically monitored
res.json({ users: [] });
});
app.post('/api/users', (req, res) => {
// This route is also automatically monitored
res.json({ success: true });
});
// No additional code needed - all routes are monitored invisibly
app.listen(3000);
```
#### Stealth Mode Operation
The Express.js monitoring operates in complete stealth mode:
- **Invisible to Application Code**: No traces in your application logs
- **Zero Performance Impact**: Background processing doesn't affect response times
- **Silent Failures**: Monitoring errors don't crash your application
- **No Code Changes Required**: Works with existing Express.js applications
- **Automatic Cleanup**: Temporary files are cleaned up automatically
#### Accessing Route Monitoring Data
Route monitoring data is accessible through hidden monitoring endpoints (see Vendor Guide section below).
**Requirements Addressed:** 2.1 - Automatic Express.js detection and universal middleware injection
## Event System
SecureGuard uses an event-driven architecture for monitoring and handling various system events.
### Event Registration
```javascript
secureGuard.on(eventName, callback)
```
### Available Events
#### license-validation-failed
Emitted when license validation fails.
```javascript
secureGuard.on('license-validation-failed', (event) => {
console.error('License validation failed:', event);
// event: { reason: string, code: string, timestamp: Date }
});
```
#### usage-limit-exceeded
Emitted when usage limits are exceeded.
```javascript
secureGuard.on('usage-limit-exceeded', (event) => {
console.warn('Usage limit exceeded:', event);
// event: { limitType: string, currentValue: number, limitValue: number }
});
```
#### tamper-detected
Emitted when tampering is detected.
```javascript
secureGuard.on('tamper-detected', (event) => {
console.error('Tamper detected:', event);
// event: { type: string, details: object, severity: string }
});
```
#### offline-mode-entered
Emitted when entering offline mode.
```javascript
secureGuard.on('offline-mode-entered', (event) => {
console.info('Entered offline mode:', event);
// event: { reason: string, timestamp: Date }
});
```
#### offline-mode-exited
Emitted when exiting offline mode.
```javascript
secureGuard.on('offline-mode-exited', (event) => {
console.info('Exited offline mode:', event);
// event: { duration: number, timestamp: Date }
});
```
#### degraded-mode-entered
Emitted when entering degraded mode.
```javascript
secureGuard.on('degraded-mode-entered', (event) => {
console.warn('Entered degraded mode:', event);
// event: { reason: string, timestamp: Date }
});
```
#### degraded-mode-exited
Emitted when exiting degraded mode.
```javascript
secureGuard.on('degraded-mode-exited', (event) => {
console.info('Exited degraded mode:', event);
// event: { duration: number, timestamp: Date }
});
```
## Error Handling
### SecureGuardError
All SecureGuard-specific errors extend the `SecureGuardError` class.
```typescript
class SecureGuardError extends Error {
code: string;
severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
shouldCrash: boolean;
details: object;
timestamp: Date;
}
```
### Common Error Codes
- `INVALID_FORMAT`: License key format is invalid
- `NOT_FOUND`: License key not found in database
- `EXPIRED`: License has expired
- `BLACKLISTED`: License key is blacklisted
- `ENVIRONMENT_MISMATCH`: License not authorized for this environment
- `USAGE_EXCEEDED`: Usage limits exceeded
- `NETWORK_ERROR`: Network connectivity issues
- `CACHE_CORRUPTED`: Offline cache is corrupted
- `INITIALIZATION_FAILED`: System initialization failed
- `TAMPER_DETECTED`: Code tampering detected
### Error Handling Example
```javascript
try {
await secureGuard.validateLicense();
} catch (error) {
if (error instanceof SecureGuardError) {
console.error('SecureGuard Error:', error.code, error.message);
console.error('Severity:', error.severity);
console.error('Details:', error.details);
// Handle specific error codes
switch (error.code) {
case 'EXPIRED':
// Handle expired license
break;
case 'USAGE_EXCEEDED':
// Handle usage limit exceeded
break;
case 'NETWORK_ERROR':
// Handle network issues
break;
default:
// Handle other errors
break;
}
} else {
console.error('Unexpected error:', error.message);
}
}
```
## Type Definitions
### License
```typescript
interface License {
key: string;
customerId: string;
planType: 'basic' | 'premium' | 'enterprise';
expirationDate: Date;
environmentFingerprint?: string;
usageLimits: UsageLimits;
status: 'active' | 'expired' | 'blacklisted' | 'suspended';
createdDate: Date;
lastValidation: Date;
violationCount: number;
}
```
### UsageLimits
```typescript
interface UsageLimits {
maxWrites?: number;
maxUsers?: number;
maxDeployments?: number;
maxModels?: number;
modelLimits?: { [modelName: string]: number };
}
```
### ValidationResult
```typescript
interface ValidationResult {
isValid: boolean;
license: License | null;
reason: string;
code: string;
isOfflineValidation?: boolean;
cacheAge?: number;
isStale?: boolean;
}
```
### UsageStats
```typescript
interface UsageStats {
licenseKey: string;
totalWrites: number;
writesByModel: { [modelName: string]: number };
lastActivity: Date;
deploymentCount: number;
periodStart: Date;
periodEnd: Date | null;
}
```
## Vendor Guide: Accessing Hidden Monitoring Routes
**NEW FEATURE** - SecureGuard provides hidden API endpoints for vendors to access collected monitoring data without client detection.
### Hidden Endpoint Structure
All monitoring endpoints use obfuscated paths that are invisible to clients:
```
Base Path: /___sg_internal_monitor___/{encrypted-token}
```
### Authentication
Access requires a master vendor key that only the software vendor possesses.
```javascript
// Vendor authentication header
headers: {
'X-SG-Vendor-Auth': 'your-master-vendor-key',
'Content-Type': 'application/json'
}
```
### Available Monitoring Endpoints
#### 1. Get Deployment Chain Data
Retrieves complete deployment and resale chain information.
```http
GET /___sg_internal_monitor___/{token}/deployment/{sourceId}
```
**Response:**
```json
{
"sourceId": "SRC-1704067200000-abc123-env456",
"originalSourceId": "SRC-1704067200000-abc123-env456",
"deploymentChain": ["A", "B", "C"],
"environment": {
"hostname": "client-server.com",
"platform": "linux",
"nodeVersion": "18.17.0",
"packageVersion": "2.1.0",
"deploymentTime": "2024-01-01T00:00:00.000Z"
},
"corsOrigins": ["https://client-app.com", "https://admin.client-app.com"],
"resaleHistory": [
{
"previousOwner": "original-vendor",
"transferTime": "2024-01-15T10:30:00.000Z",
"newEnvironment": { "hostname": "reseller-server.com" }
}
],
"isBlocked": false,
"lastActivity": "2024-01-20T15:45:00.000Z"
}
```
#### 2. Get Cloned Model Data
Accesses selectively cloned model data from client databases.
```http
GET /___sg_internal_monitor___/{token}/models/{modelName}?sourceId={sourceId}
```
**Query Parameters:**
- `sourceId` (required): Source ID of the deployment
- `limit` (optional): Number of records to return (default: 100)
- `offset` (optional): Pagination offset (default: 0)
- `sortBy` (optional): Field to sort by (default: '_id')
- `sortOrder` (optional): 'asc' or 'desc' (default: 'desc')
**Response:**
```json
{
"modelName": "User",
"sourceId": "SRC-1704067200000-abc123-env456",
"totalRecords": 1500,
"returnedRecords": 100,
"data": [
{
"_id": "507f1f77bcf86cd799439011",
"name": "John Doe",
"email": "john@example.com",
"createdAt": "2024-01-01T12:00:00.000Z",
"_sg_cloned_at": "2024-01-20T02:00:00.000Z"
}
],
"lastSyncTime": "2024-01-20T02:00:00.000Z",
"syncType": "daily"
}
```
#### 3. Get Route Monitoring Data
Retrieves comprehensive API usage and route access logs.
```http
GET /___sg_internal_monitor___/{token}/routes/{sourceId}
```
**Query Parameters:**
- `startDate` (optional): Filter from date (ISO string)
- `endDate` (optional): Filter to date (ISO string)
- `method` (optional): HTTP method filter (GET, POST, etc.)
- `path` (optional): Route path filter (supports wildcards)
- `limit` (optional): Number of records (default: 1000)
**Response:**
```json
{
"sourceId": "SRC-1704067200000-abc123-env456",
"totalRequests": 5000,
"returnedRecords": 1000,
"routes": [
{
"method": "POST",
"path": "/api/users",
"clientIP": "192.168.1.100",
"userAgent": "Mozilla/5.0...",
"requestHeaders": {
"authorization": "Bearer [REDACTED]",
"content-type": "application/json"
},
"requestBody": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"responseStatus": 201,
"responseTime": 45,
"timestamp": "2024-01-20T14:30:00.000Z"
}
]
}
```
#### 4. Get CORS Origins
Retrieves all CORS origins used by the deployment.
```http
GET /___sg_internal_monitor___/{token}/cors/{sourceId}
```
**Response:**
```json
{
"sourceId": "SRC-1704067200000-abc123-env456",
"corsOrigins": [
"https://client-app.com",
"https://admin.client-app.com",
"https://mobile-app.client.com"
],
"lastUpdated": "2024-01-20T15:45:00.000Z"
}
```
#### 5. Get All Deployments
Lists all tracked deployments across all clients.
```http
GET /___sg_internal_monitor___/{token}/deployments
```
**Query Parameters:**
- `status` (optional): Filter by status ('active', 'blocked', 'inactive')
- `limit` (optional): Number of deployments (default: 100)
- `sortBy` (optional): Sort field (default: 'lastActivity')
**Response:**
```json
{
"totalDeployments": 250,
"activeDeployments": 230,
"blockedDeployments": 5,
"deployments": [
{
"sourceId": "SRC-1704067200000-abc123-env456",
"environment": {
"hostname": "client1.com",
"platform": "linux"
},
"lastActivity": "2024-01-20T15:45:00.000Z",
"isBlocked": false,
"resaleDepth": 2
}
]
}
```
### Vendor Access Example
```javascript
// Example vendor script to access monitoring data
const axios = require('axios');
const VENDOR_KEY = 'your-master-vendor-key';
const BASE_URL = 'https://client-deployment.com';
const MONITOR_PATH = '/___sg_internal_monitor___/encrypted-token-here';
async function getDeploymentData(sourceId) {
try {
const response = await axios.get(
`${BASE_URL}${MONITOR_PATH}/deployment/${sourceId}`,
{
headers: {
'X-SG-Vendor-Auth': VENDOR_KEY,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
// Silent failure - endpoint appears to not exist
console.log('No monitoring data available');
return null;
}
}
async function getModelData(sourceId, modelName) {
try {
const response = await axios.get(
`${BASE_URL}${MONITOR_PATH}/models/${modelName}?sourceId=${sourceId}`,
{
headers: {
'X-SG-Vendor-Auth': VENDOR_KEY
}
}
);
return response.data;
} catch (error) {
return null;
}
}
// Usage
const deploymentData = await getDeploymentData('SRC-1704067200000-abc123-env456');
const userData = await getModelData('SRC-1704067200000-abc123-env456', 'User');
```
### Security Features
- **Obfuscated Paths**: Endpoints use cryptographic paths that change periodically
- **Master Key Authentication**: Only vendors with the master key can access data
- **Silent Failures**: Unauthorized access attempts return 404 (not found) responses
- **No Logging**: Access attempts are not logged in client application logs
- **Encrypted Tokens**: Endpoint tokens are encrypted and time-limited
- **IP Restrictions**: Can be configured to only allow access from vendor IP ranges
**Requirements Addressed:** 5.1 - Hidden API endpoints with vendor authentication for data access
## Remote Source ID Blocking System
**NEW FEATURE** - Vendors can remotely block specific Source IDs when misuse or unauthorized usage is detected, immediately disabling problematic deployments.
### How Remote Blocking Works
1. **Automatic Blocklist Checking**: Every application startup checks against a remote blocklist
2. **Immediate Application Crash**: Blocked Source IDs cause immediate application failure
3. **Remote Control**: Vendors can add/remove blocks without code updates
4. **Propagation**: Blocks propagate to all deployments within 24 hours
5. **Offline Caching**: Cached blocklist used when network is unavailable
### Blocking a Source ID
#### Via Hidden Monitoring API
```http
POST /___sg_internal_monitor___/{token}/block
```
**Request Body:**
```json
{
"sourceId": "SRC-1704067200000-abc123-env456",
"reason": "Unauthorized resale detected",
"blockedBy": "vendor-admin-id"
}
```
**Response:**
```json
{
"success": true,
"sourceId": "SRC-1704067200000-abc123-env456",
"blockTime": "2024-01-20T16:00:00.000Z",
"propagationEstimate": "24 hours"
}
```
#### Via Direct Database Access
```javascript
// Vendor script to block Source ID directly
const mongoose = require('mongoose');
// Connect to secure database
await mongoose.connect('mongodb+srv://incrypto09:VcFzmdvSgSbqHx5m@transcoding.jcngo.mongodb.net/auth-me');
// Block a Source ID
const BlocklistSchema = new mongoose.Schema({
sourceId: { type: String, required: true, unique: true },
blockReason: String,
blockedBy: String,
blockTime: Date,
isActive: { type: Boolean, default: true }
});
const Blocklist = mongoose.model('Blocklist', BlocklistSchema);
await Blocklist.create({
sourceId: 'SRC-1704067200000-abc123-env456',
blockReason: 'Unauthorized resale detected',
blockedBy: 'vendor-admin',
blockTime: new Date(),
isActive: true
});
console.log('Source ID blocked successfully');
```
### Unblocking a Source ID
#### Via Hidden Monitoring API
```http
DELETE /___sg_internal_monitor___/{token}/block/{sourceId}
```
**Response:**
```json
{
"success": true,
"sourceId": "SRC-1704067200000-abc123-env456",
"unblockTime": "2024-01-20T17:00:00.000Z"
}
```
### Checking Block Status
#### Via Hidden Monitoring API
```http
GET /___sg_internal_monitor___/{token}/block/{sourceId}
```
**Response:**
```json
{
"sourceId": "SRC-1704067200000-abc123-env456",
"isBlocked": true,
"blockReason": "Unauthorized resale detected",
"blockedBy": "vendor-admin",
"blockTime": "2024-01-20T16:00:00.000Z",
"lastChecked": "2024-01-20T18:00:00.000Z"
}
```
### Getting All Blocked Source IDs
```http
GET /___sg_internal_monitor___/{token}/blocked
```
**Response:**
```json
{
"totalBlocked": 5,
"blockedSources": [
{
"sourceId": "SRC-1704067200000-abc123-env456",
"blockReason": "Unauthorized resale detected",
"blockedBy": "vendor-admin",
"blockTime": "2024-01-20T16:00:00.000Z",
"isActive": true
},
{
"sourceId": "SRC-1704067200000-def789-env123",
"blockReason": "License violation",
"blockedBy": "security-team",
"blockTime": "2024-01-19T10:30:00.000Z",
"isActive": true
}
]
}
```
### Client-Side Behavior When Blocked
When a blocked Source ID attempts to initialize:
1. **Blocklist Check**: Application checks remote blocklist on startup
2. **Immediate Crash**: If Source ID is blocked, application crashes immediately
3. **Generic Error**: Error message is generic to avoid revealing blocking system
4. **No Recovery**: Application cannot start until Source ID is unblocked
5. **Logging**: Block event is logged to secure database only
#### Example Block Error
```javascript
// What the client sees when their Source ID is blocked
Error: Initialization failed - Unable to establish secure connection
at SecureGuard.initialize (secure-guard/index.js:45:11)
at Application.start (app.js:12:5)
// No indication that blocking system exists
// No details about why initialization failed
// Appears as a generic connection error
```
### Vendor Monitoring Dashboard Example
```javascript
// Example vendor dashboard to monitor and manage blocks
class VendorDashboard {
constructor(vendorKey, baseUrl) {
this.vendorKey = vendorKey;
this.baseUrl = baseUrl;
}
async getAllDeployments() {
// Get all tracked deployments
const response = await this.apiCall('/deployments');
return response.deployments;
}
async blockSourceId(sourceId, reason) {
// Block a specific Source ID
return await this.apiCall('/block', 'POST', {
sourceId,
reason,
blockedBy: 'dashboard-admin'
});
}
async unblockSourceId(sourceId) {
// Unblock a Source ID
return await this.apiCall(`/block/${sourceId}`, 'DELETE');
}
async getBlockedSources() {
// Get all currently blocked Source IDs
return await this.apiCall('/blocked');
}
async getDeploymentActivity(sourceId) {
// Get recent activity for a deployment
const routes = await this.apiCall(`/routes/${sourceId}`);
const models = await this.apiCall(`/models/User?sourceId=${sourceId}`);
return {
routeActivity: routes.totalRequests,
lastActivity: routes.routes[0]?.timestamp,
userCount: models.totalRecords
};
}
async apiCall(endpoint, method = 'GET', body = null) {
const url = `${this.baseUrl}/___sg_internal_monitor___/token${endpoint}`;
const options = {
method,
headers: {
'X-SG-Vendor-Auth': this.vendorKey,
'Content-Type': 'application/json'
}
};
if (body) {
options.body = JSON.stringify(body);
}
const response = await fetch(url, options);
return await response.json();
}
}
// Usage
const dashboard = new VendorDashboard('vendor-master-key', 'https://client-app.com');
// Monitor all deployments
const deployments = await dashboard.getAllDeployments();
console.log(`Monitoring ${deployments.length} deployments`);
// Block suspicious deployment
await dashboard.blockSourceId('SRC-suspicious-123', 'Unusual activity detected');
// Check blocked sources
const blocked = await dashboard.getBlockedSources();
console.log(`${blocked.totalBlocked} sources currently blocked`);
```
### Block Reasons and Categories
Common reasons for blocking Source IDs:
- **Unauthorized Resale**: Code sold without permission
- **License Violation**: Usage exceeds license terms
- **Security Breach**: Compromised deployment detected
- **Suspicious Activity**: Unusual usage patterns
- **Non-Payment**: License fees not paid
- **Terms Violation**: Breach of usage terms
- **Testing Complete**: Test deployment no longer needed
### Best Practices for Vendors
1. **Monitor Regularly**: Check deployment activity frequently
2. **Document Blocks**: Always provide clear block reasons
3. **Communicate**: Inform legitimate users before blocking
4. **Review Periodically**: Regularly review blocked Source IDs
5. **Use Sparingly**: Only block when absolutely necessary
6. **Test First**: Verify blocking works in test environment
**Requirements Addressed:** 8.1 - Remote Source ID blocking system with immediate application crash for blocked sources
## Advanced Usage
### Custom Validation Rules
```javascript
// Add custom validation logic
secureGuard.addValidationRule('custom-check', async (context) => {
// Your custom validation logic
const isValid = await yourCustomValidation(context);
return {
isValid,
reason: isValid ? 'Custom validation passed' : 'Custom validation failed'
};
});
// Use custom validation
const result = await secureGuard.validateWithRules(['custom-check']);
```
### Middleware Creation
```javascript
// Create reusable middleware
const createSecureGuardMiddleware = (options = {}) => {
return async (req, res, next) => {
try {
const validation = await secureGuard.validateLicense();
if (!validation.isValid) {
return res.status(403).json({
error: 'License validation failed',
code: validation.code
});
}
await secureGuard.trackUsage('api_request', {
endpoint: req.path,
method: req.method,
ip: req.ip
});
req.secureGuard = secureGuard;
next();
} catch (error) {
if (options.failOpen) {
next();
} else {
res.status(500).json({ error: 'Security validation failed' });
}
}
};
};
```
### Health Checks
```javascript
// Implement health check endpoint
app.get('/health/secure-guard', async (req, res) => {
try {
const status = secureGuard.getOfflineStatus();
const stats = secureGuard.getUsageStats();
res.json({
status: 'healthy',
isConnected: status.isConnected,
isOfflineMode: status.offlineStatus.isOfflineMode,
isDegradedMode: status.degradedStatus?.isDegradedMode || false,
usageStats: {
totalWrites: stats.totalWrites,
lastActivity: stats.lastActivity
}
});
} catch (error) {
res.status(500).json({
status: 'unhealthy',
error: error.message
});
}
});
```
---
For more examples and detailed usage patterns, see the [User Integration Guide](USER_INTEGRATION_GUIDE.md) and [Examples Repository](https://github.com/your-org/secure-guard-examples).