Преобразование IMAP UTF-7 с собственным Javascript - PullRequest
0 голосов
/ 22 марта 2020

Я пытался получить дескриптор хорошего кода, который предоставит Javascript для преобразования почтовых ящиков IMAP UTF7 в JS в строку UTF-16. Кажется, такой работы не сделано. Кто-нибудь из вас создал один из них или у кого-то есть доступ? Я счастлив построить один, но не хотел, если есть кто-то, у кого это уже есть.

Когда я смотрю на спецификации, это выглядит как строка между '&' и '-', сначала декодируется с base64 и затем декодируется как UTF-16 Big Endian, и выполняется обратный процесс для кодирования текста не-ascii в части UTF-16 и затем base64. Base64 + / представляется как + для безопасных операций с файлами вместо + _ в других случаях.

Дайте мне знать, если у кого-нибудь есть решение, и я с радостью воспользуюсь им или напишу и поместу в Github!

Спасибо

Виджай

1 Ответ

0 голосов
/ 22 марта 2020

Я думаю, что нашел достаточно простое решение для этого, так как никто не ответил. Надеюсь, кто-нибудь найдет этот маленький скрипт полезным для преобразования UTF7

>z='Συστήματα_Ανίχνευσης_Εισ & related security.pdf'
>encode_imap_utf7(z)
"&A6MDxQPDA8QDtwMBA7wDsQPEA7E-_&A5EDvQO5AwEDxwO9A7UDxQPDA7cDwg-_&A5UDuQPD- &- related security.pdf"
>decode_imap_utf7(encode_imap_utf7(z))
"Συστήματα_Ανίχνευσης_Εισ & related security.pdf"
>decode_imap_utf7(encode_imap_utf7(z)) == z
true
/* Se RFC 2060 - no / ~ \ in folder names */
function ureplacer(pmatch) {
    var ret = ""
    pmatch = pmatch.replace(/\,/g,'/')
    var ix = pmatch.substr(1,pmatch.length-2)

    if (ix.length % 4 != 0) 
      ix = ix.padEnd(ix.length+ 4 - ix.length % 4,"=")
    try {
    var dx = atob(ix)
    for (var j = 0; j < dx.length; j = j+2) {
        ret = ret + String.fromCharCode((dx.charCodeAt(j) << 8) + dx.charCodeAt(j+1))
    }
    } catch(err) {
    console.log("Error in decoding foldername IMAP UTF7, sending empty string back")
    console.log(err)
    ret = ""
    }
    return ret
}

function breplacer(umatch) {
    var bst = ""
    for (var i=0; i < umatch.length; i++) {
      var f = umatch.charCodeAt(i)
      bst = bst + String.fromCharCode(f >> 8) + String.fromCharCode(f & 255)
    }

    try {
    bst = '&'+btoa(bst).replace(/\//g,',').replace(/=+/,'')+'-'
    }catch(err) {
    console.log("Error in encoding foldername IMAP UTF7, sending empty string back")
    console.log(err)
    bst = ""
    }
    return bst
}

function decode_imap_utf7(mstring) {
    var stm = new RegExp(/(\&[A-Za-z0-9\+\,]+\-)/,'g')
    return mstring.replace(stm,ureplacer).replace('&-','&')
}

function encode_imap_utf7(ustring) {
    ustring = ustring.replace(/\/|\~|\\/g,'')
    var vgm = new RegExp(/([^\x20-\x7e]+)/,'g')
    return ustring.replace('&','&-').replace(vgm,breplacer)
}

...