nskd-lbr 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/nskd-lbr.js +2 -2
- package/src/nskd-lbr.min.js +3 -3
package/package.json
CHANGED
package/src/nskd-lbr.js
CHANGED
|
@@ -41,10 +41,10 @@ class NskdLbr {
|
|
|
41
41
|
console.warn(prefix, message);
|
|
42
42
|
break;
|
|
43
43
|
case 'success':
|
|
44
|
-
console.
|
|
44
|
+
console.log(`%c${prefix} ${message}`, 'color: green');
|
|
45
45
|
break;
|
|
46
46
|
default:
|
|
47
|
-
console.
|
|
47
|
+
console.log(prefix, message);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
package/src/nskd-lbr.min.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
class NskdLbr{constructor(t={}){this.apiUrl=t.apiUrl||"https://check.noskid.today/",this.debug=t.debug||!1,this.timeout=t.timeout||1e4,this.strictCheck=
|
|
1
|
+
class NskdLbr{constructor(t={}){this.apiUrl=t.apiUrl||"https://check.noskid.today/",this.debug=t.debug||!1,this.timeout=t.timeout||1e4,this.strictCheck=void 0===t.strictCheck||t.strictCheck,this.onLog=t.onLog||null,this.certificateData=null,this.verificationKey=null,this.localData=null,this.isValid=!1}nskdLbrLog(t,e="info"){if(this.debug){var r=`[${(new Date).toLocaleTimeString()}] NoSkid:`;switch(e){case"error":console.error(r,t);break;case"warning":console.warn(r,t);break;case"success":console.nskdLbrLog(`%c${r} `+t,"color: green");break;default:console.nskdLbrLog(r,t)}}this.onLog&&"function"==typeof this.onLog&&this.onLog(t,e)}async loadFromFile(t){try{if(this.nskdLbrLog("Starting certificate verification process...","info"),!t)throw new Error("No file provided");if(!t.name.toLowerCase().endsWith(".png"))throw new Error("File must be a PNG image");this.nskdLbrLog("Processing certificate file: "+t.name,"info");var e=await this.readFileAsArrayBuffer(t),r=await this.extractTextFromPng(e);if(!r)throw new Error("Could not extract verification data from file");if(this.verificationKey=this.extractVerificationKey(r),this.verificationKey)return this.nskdLbrLog("Successfully extracted verification key","success"),this.localData=this.extractLocalData(r),this.localData&&(this.nskdLbrLog("Local certificate data extracted:","info"),this.nskdLbrLog("Username: "+this.localData.username,"info"),this.nskdLbrLog("Creation Date: "+this.localData.creationDate,"info")),await this.verifyWithAPI();throw new Error("No valid verification key found in certificate")}catch(t){throw this.nskdLbrLog("Error loading certificate: "+t.message,"error"),t}}async verifyWithKey(t){try{if(!t||"string"!=typeof t)throw new Error("Invalid verification key provided");if(/^[a-f0-9]{64}$/i.test(t))return this.verificationKey=t.toLowerCase(),this.nskdLbrLog(`Verifying certificate with key: ${this.verificationKey.substring(0,16)}...`,"info"),await this.verifyWithAPI();throw new Error("Verification key must be a 64-character hexadecimal string")}catch(t){throw this.nskdLbrLog("Error verifying certificate: "+t.message,"error"),t}}getCertificateData(){return this.certificateData?{...this.certificateData,key:this.verificationKey,localUsername:this.localData?this.localData.username:null,localCreationDate:this.localData?this.localData.creationDate:null}:null}isValidCertificate(){return this.isValid}getFormattedDetails(){var t;return this.certificateData?`
|
|
2
2
|
Certificate Details:
|
|
3
|
-
- Certificate #: ${t.certificate_number}
|
|
3
|
+
- Certificate #: ${(t=this.certificateData).certificate_number}
|
|
4
4
|
- Username: ${t.username}
|
|
5
5
|
- Percentage: ${t.percentage}%
|
|
6
6
|
- Creation Date: ${t.creationDate}
|
|
7
7
|
- Country: ${t.country} (${t.countryCode})
|
|
8
|
-
`.trim()}reset(){this.certificateData=null,this.verificationKey=null,this.localData=null,this.isValid=!1,this.nskdLbrLog("Certificate data reset","info")}readFileAsArrayBuffer(
|
|
8
|
+
`.trim():"No certificate data available"}reset(){this.certificateData=null,this.verificationKey=null,this.localData=null,this.isValid=!1,this.nskdLbrLog("Certificate data reset","info")}readFileAsArrayBuffer(i){return new Promise((e,t)=>{var r=new FileReader;r.onload=t=>e(t.target.result),r.onerror=()=>t(new Error("Error reading file")),r.readAsArrayBuffer(i)})}async extractTextFromPng(r){try{var i=new Uint8Array(r);if(137!==i[0]||80!==i[1]||78!==i[2]||71!==i[3])throw new Error("Not a valid PNG file");let t=8,e=null;for(;t<i.length-12;){var a=i[t]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3];if("tEXt"===String.fromCharCode(i[t+4],i[t+5],i[t+6],i[t+7])){var s=i.slice(t+8,t+8+a),o=new TextDecoder("utf-8").decode(s),n=o.indexOf("\0");if(-1!==n){var c=o.substring(0,n),l=o.substring(n+1);if("noskid-key"===c){e=l;break}}}t+=8+a+4}return e?(this.nskdLbrLog("Certificate data extracted successfully from PNG","success"),e):(this.nskdLbrLog("No 'noskid-key' text chunk found in PNG","error"),null)}catch(t){return this.nskdLbrLog("Error extracting text from PNG: "+t.message,"error"),null}}extractVerificationKey(t){try{var e=/-*BEGIN NOSKID KEY-*\s*([a-f0-9]{64})/i,r=t.match(e);return r?r[1].toLowerCase():null}catch(t){return this.nskdLbrLog("Error extracting verification key: "+t.message,"error"),null}}extractLocalData(t){try{var e,r,i,a,s,o=/-----BEGIN NOSKID KEY-----\s*([a-f0-9]+)\s*([A-Za-z0-9+/=]+)\s*([A-Za-z0-9+/=]+)\s*-----END NOSKID KEY-----/,n=t.match(o);return n?(e=n[2],i=(r=atob(e.replace(/=/g,"")).match(/CERT-\d+-(.+)/))?r[1]:null,a=n[3],{username:i,creationDate:(s=atob(a.replace(/=/g,"")).match(/CREATED-(.+)/))?s[1]:null}):null}catch(t){return this.nskdLbrLog("Error extracting local data: "+t.message,"error"),null}}async verifyWithAPI(){try{this.nskdLbrLog("Verifying certificate with server...","info");let t=new AbortController;var e=setTimeout(()=>t.abort(),this.timeout),r=await fetch(this.apiUrl+"?key="+encodeURIComponent(this.verificationKey),{signal:t.signal,headers:{"User-Agent":"NskdLbr/1.0.0"}});if(clearTimeout(e),!r.ok)throw new Error(`HTTP ${r.status}: `+r.statusText);var i=await r.json();if(!i.success)return this.isValid=!1,this.nskdLbrLog("Certificate verification failed: "+i.message,"error"),{valid:!1,message:i.message,cached:i.cached||!1};if(this.localData&&this.strictCheck){var a=this.compareData(this.localData,i.data);if(!a.valid)return this.isValid=!1,this.nskdLbrLog("Certificate data mismatch!","error"),this.nskdLbrLog("Mismatch reason: "+a.reason,"error"),this.nskdLbrLog("Note: Strict checking is enabled. Set strictCheck to false to skip local data validation.","warning"),{valid:!1,message:"Data mismatch: "+a.reason,cached:i.cached||!1,strictCheck:!0};this.nskdLbrLog("Local data validation passed","success")}else this.localData&&!this.strictCheck&&this.nskdLbrLog("Strict checking disabled - skipping local data validation","warning");return this.isValid=!0,this.certificateData=i.data,this.nskdLbrLog("Certificate is VALID!","success"),{valid:!0,message:"Certificate verified successfully",data:i.data,cached:i.cached||!1,strictCheck:this.strictCheck}}catch(t){if("AbortError"===t.name)throw new Error("Request timeout - server took too long to respond");throw new Error("API verification failed: "+t.message)}}compareData(t,e){return t&&e?t.username!==e.username?{valid:!1,reason:`Username mismatch: Local=${t.username}, API=`+e.username}:(t=t.creationDate.substring(0,16))!==(e=e.creationDate.substring(0,16))?{valid:!1,reason:`Creation date mismatch: Local=${t}, API=`+e}:{valid:!0}:{valid:!1,reason:"Missing data for comparison"}}}"undefined"!=typeof module&&module.exports?module.exports=NskdLbr:window.NskdLbr=NskdLbr;
|