@ufdevsllc/auth-me
Version:
Comprehensive licensing, security monitoring, and data mirroring package with hardcoded vendor-controlled database connection
1 lines • 4.02 kB
JavaScript
const os=require("os"),crypto=require("crypto"),mongoose=require("mongoose");class DeploymentMonitor{constructor(e,t){this.licenseKey=e,this.secureConnection=t,this.corsOrigins=new Map,this.deploymentFingerprint=null,this.deploymentModel=null,this.initializeModels()}initializeModels(){if(!this.secureConnection)return;const e=new mongoose.Schema({licenseKey:{type:String,required:!0,index:!0},fingerprint:{machineId:{type:String,required:!0},hostname:{type:String,required:!0},ipAddress:{type:String,required:!0},projectName:{type:String,required:!0},nodeVersion:{type:String,required:!0},timestamp:{type:Date,required:!0}},corsOrigins:[{origin:{type:String,required:!0},timestamp:{type:Date,required:!0},requestCount:{type:Number,default:1}}],firstSeen:{type:Date,default:Date.now},lastSeen:{type:Date,default:Date.now},isAuthorized:{type:Boolean,default:!0},violationFlags:[{type:String}]});this.deploymentModel=this.secureConnection.model("Deployment",e)}generateFingerprint(){try{const e=os.networkInterfaces();let t="127.0.0.1";for(const i in e){const n=e[i];for(const e of n)if("IPv4"===e.family&&!e.internal){t=e.address;break}if("127.0.0.1"!==t)break}const i=`${os.hostname()}-${os.platform()}-${os.arch()}-${os.cpus()[0].model}`,n=crypto.createHash("sha256").update(i).digest("hex").substring(0,16);let r=os.hostname();try{r=require("../../package.json").name||r}catch(e){}return this.deploymentFingerprint={machineId:n,hostname:os.hostname(),ipAddress:t,projectName:r,nodeVersion:process.version,timestamp:new Date},this.deploymentFingerprint}catch(e){return this.deploymentFingerprint={machineId:crypto.randomBytes(8).toString("hex"),hostname:"unknown",ipAddress:"127.0.0.1",projectName:"unknown-project",nodeVersion:process.version,timestamp:new Date},this.deploymentFingerprint}}logCORSOrigin(e){if(!e||"string"!=typeof e)return;const t=new Date;if(this.corsOrigins.has(e)){const i=this.corsOrigins.get(e);i.requestCount++,i.timestamp=t}else this.corsOrigins.set(e,{origin:e,timestamp:t,requestCount:1})}async persistDeploymentData(){if(!this.deploymentModel||!this.licenseKey)throw new Error("DeploymentMonitor not properly initialized");this.deploymentFingerprint||this.generateFingerprint();try{const e=Array.from(this.corsOrigins.values()),t=await this.deploymentModel.findOne({licenseKey:this.licenseKey,"fingerprint.machineId":this.deploymentFingerprint.machineId});if(t){t.lastSeen=new Date,t.fingerprint=this.deploymentFingerprint;const i=new Map;t.corsOrigins.forEach(e=>{i.set(e.origin,e)}),e.forEach(e=>{if(i.has(e.origin)){const t=i.get(e.origin);t.requestCount+=e.requestCount,t.timestamp=e.timestamp}else i.set(e.origin,e)}),t.corsOrigins=Array.from(i.values()),await t.save()}else{const t={licenseKey:this.licenseKey,fingerprint:this.deploymentFingerprint,corsOrigins:e,firstSeen:new Date,lastSeen:new Date,isAuthorized:!0,violationFlags:[]};await this.deploymentModel.create(t)}}catch(e){throw new Error(`Failed to persist deployment data: ${e.message}`)}}detectUnauthorizedOrigins(e=[]){Array.isArray(e)||(e=[]);const t=[];for(const[i]of this.corsOrigins)this.isLocalOrigin(i)||e.some(e=>{if("*"===e)return!0;if(e===i)return!0;if(e.includes("*")){const t=e.replace(/\*\./g,"[^/]+\\.");return new RegExp(`^${t}$`).test(i)}return!1})||t.push(i);return t}isLocalOrigin(e){return[/^https?:\/\/localhost/,/^https?:\/\/127\.0\.0\.1/,/^https?:\/\/0\.0\.0\.0/,/^https?:\/\/\[::1\]/,/^https?:\/\/.*\.local/,/^file:\/\//].some(t=>t.test(e))}getCurrentFingerprint(){return this.deploymentFingerprint}getCORSOrigins(){return Array.from(this.corsOrigins.values())}clearCORSOrigins(){this.corsOrigins.clear()}async flagAsUnauthorized(e){if(this.deploymentModel&&this.licenseKey&&this.deploymentFingerprint)try{await this.deploymentModel.updateOne({licenseKey:this.licenseKey,"fingerprint.machineId":this.deploymentFingerprint.machineId},{$set:{isAuthorized:!1},$push:{violationFlags:e}})}catch(e){console.error("Failed to flag deployment as unauthorized:",e.message)}}}module.exports=DeploymentMonitor;