50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
/** SASL PLAIN (IRCv3). No import. */
|
|
|
|
function bareIrcB64Encode(bytes) {
|
|
var table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
var s = ''
|
|
var i = 0
|
|
while (i < bytes.length) {
|
|
var a = bytes[i++]
|
|
var b = i < bytes.length ? bytes[i++] : NaN
|
|
var c = i < bytes.length ? bytes[i++] : NaN
|
|
var triple =
|
|
((a & 255) << 16) |
|
|
((Number.isFinite(b) ? b & 255 : 0) << 8) |
|
|
(Number.isFinite(c) ? c & 255 : 0)
|
|
s += table.charAt((triple >> 18) & 63)
|
|
s += table.charAt((triple >> 12) & 63)
|
|
s += Number.isFinite(b) ? table.charAt((triple >> 6) & 63) : '='
|
|
s += Number.isFinite(c) ? table.charAt(triple & 63) : '='
|
|
}
|
|
return s
|
|
}
|
|
|
|
function bareIrcUtf8Bytes(str) {
|
|
var s = String(str == null ? '' : str)
|
|
if (typeof TextEncoder !== 'undefined')
|
|
return Array.from(new TextEncoder().encode(s))
|
|
var out = []
|
|
for (var i = 0; i < s.length; i++) out.push(s.charCodeAt(i) & 255)
|
|
return out
|
|
}
|
|
|
|
/**
|
|
* AUTHENTICATE PLAIN payload (account \0 account \0 password), chunked ≤400.
|
|
* @returns {string[]}
|
|
*/
|
|
function bareIrcSaslPlainChunks(user, pass) {
|
|
var u = String(user || '')
|
|
var p = String(pass || '')
|
|
var raw = bareIrcUtf8Bytes('\0' + u + '\0' + p)
|
|
var b64 = bareIrcB64Encode(raw)
|
|
var chunks = []
|
|
var i = 0
|
|
if (!b64) return ['+']
|
|
while (i < b64.length) {
|
|
chunks.push(b64.slice(i, i + 400))
|
|
i += 400
|
|
}
|
|
return chunks
|
|
}
|