/usr/lib/nodejs/node-stringprep/index.js is in node-node-stringprep 0.6.2-2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 'use strict';
var log = require('debug')('node-stringprep')
// from unicode/uidna.h
var UIDNA_ALLOW_UNASSIGNED = 1
var UIDNA_USE_STD3_RULES = 2
try {
var bindings = require('bindings')('node_stringprep.node')
} catch (ex) {
if (process.title !== 'browser') {
console.log(
'Cannot load StringPrep-' +
require('./package.json').version +
' bindings (using fallback). You may need to ' +
'`npm install node-stringprep`'
)
log(ex)
}
}
var toUnicode = function(value, options) {
options = options || {}
try {
return bindings.toUnicode(value,
(options.allowUnassigned && UIDNA_ALLOW_UNASSIGNED) | 0)
} catch (e) {
return value
}
}
var toASCII = function(value, options) {
options = options || {}
try {
return bindings.toASCII(value,
(options.allowUnassigned && UIDNA_ALLOW_UNASSIGNED) |
(options.useSTD3Rules && UIDNA_USE_STD3_RULES))
} catch (e) {
if (options.throwIfError) {
throw e
} else {
return value
}
}
}
var StringPrep = function(operation) {
this.operation = operation
try {
this.stringPrep = new bindings.StringPrep(this.operation)
} catch (e) {
this.stringPrep = null
log('Operation does not exist', operation, e)
}
}
StringPrep.prototype.UNKNOWN_PROFILE_TYPE = 'Unknown profile type'
StringPrep.prototype.UNHANDLED_FALLBACK = 'Unhandled JS fallback'
StringPrep.prototype.LIBICU_NOT_AVAILABLE = 'libicu unavailable'
StringPrep.prototype.useJsFallbacks = true
StringPrep.prototype.prepare = function(value) {
this.value = value
try {
if (this.stringPrep) {
return this.stringPrep.prepare(this.value)
}
} catch (e) {}
if (false === this.useJsFallbacks) {
throw new Error(this.LIBICU_NOT_AVAILABLE)
}
return this.jsFallback()
}
StringPrep.prototype.isNative = function() {
return (null !== this.stringPrep)
}
StringPrep.prototype.jsFallback = function() {
switch (this.operation) {
case 'nameprep':
case 'nodeprep':
return this.value.toLowerCase()
case 'resourceprep':
return this.value
case 'nfs4_cs_prep':
case 'nfs4_cis_prep':
case 'nfs4_mixed_prep prefix':
case 'nfs4_mixed_prep suffix':
case 'iscsi':
case 'mib':
case 'saslprep':
case 'trace':
case 'ldap':
case 'ldapci':
throw new Error(this.UNHANDLED_FALLBACK)
default:
throw new Error(this.UNKNOWN_PROFILE_TYPE)
}
}
StringPrep.prototype.disableJsFallbacks = function() {
this.useJsFallbacks = false
}
StringPrep.prototype.enableJsFallbacks = function() {
this.useJsFallbacks = true
}
module.exports = {
toUnicode: toUnicode,
toASCII: toASCII,
StringPrep: StringPrep
}
|