Changeset 1e30efd


Ignore:
Timestamp:
Dec 23, 2017 6:49:48 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
a827b2f
Parents:
bf193b3
Message:

SusiMail?: Limit quoted-words to max line length
Change HeaderLine? encoder to work on chars, not bytes,
so multibyte chars aren't split across lines.
Fix places where lines were one or two chars too long.
More to do, as it isn't tokenizing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java

    rbf193b3 r1e30efd  
    4040 *  http://en.wikipedia.org/wiki/MIME#Encoded-Word
    4141 *  http://tools.ietf.org/html/rfc2047
     42 *  https://jeffreystedfast.blogspot.com/2013/09/time-for-rant-on-mime-parsers.html
     43 *  https://jeffreystedfast.blogspot.com/2013/08/why-decoding-rfc2047-encoded-headers-is.html
    4244 *
    4345 * @author susi
     
    5254        private static final int BUFSIZE = 2;
    5355
    54         public String encode( byte in[] ) throws EncodingException {
     56        /**
     57         *  This will split multibyte chars across lines,
     58         *  see 4th ref above
     59         *
     60         *  @throws UnsupportedOperationException always
     61         */
     62        public String encode(byte in[]) throws EncodingException {
     63                throw new UnsupportedOperationException("use encode(String)");
     64        }
     65
     66        @Override
     67        public String encode(String str) throws EncodingException {
    5568                StringBuilder out = new StringBuilder();
    56                 int l = 0, buffered = 0, tmp[] = new int[BUFSIZE];
     69                int l = 0, buffered = 0;
     70                char tmp[] = new char[BUFSIZE];
    5771                boolean quoting = false;
    5872                boolean quote = false;
    5973                boolean linebreak = false;
    6074                StringBuilder quotedSequence = null;
    61                 int rest = in.length;
     75                int rest = str.length();
    6276                int index = 0;
    6377                while( true ) {
    6478                        while( rest > 0 && buffered < BUFSIZE ) {
    65                                 tmp[buffered++] = in[index++];
     79                                tmp[buffered++] = str.charAt(index++); 
    6680                                rest--;
    6781                        }
     
    6983                                break;
    7084                       
    71                         int c = tmp[0];
     85                        char c = tmp[0];
    7286                        buffered--;
    7387                        for( int j = 1; j < BUFSIZE; j++ )
     
    93107                        }
    94108                        if( quote ) {
    95                                 if( ! quoting ) {
     109                                // the encoded char
     110                                StringBuilder qc = new StringBuilder(16);
     111                                if (c <= 127) {
     112                                        // single byte char
     113                                        qc.append(HexTable.table[c]);
     114                                } else {
     115                                        byte[] utf = DataHelper.getUTF8(String.valueOf(c));
     116                                        for (int j = 0; j < utf.length; j++) {
     117                                                int b = utf[j] & 0xff;
     118                                                qc.append(HexTable.table[b]);
     119                                        }
     120                                }
     121                                if (quoting) {
     122                                        // would it be too long?
     123                                        if (l + quotedSequence.length() + qc.length() + 2 >= 76) {
     124                                                // close q-seq, wrap line, and start a new q-seq
     125                                                out.append(quotedSequence);
     126                                                out.append("?=\r\n\t");
     127                                                l = 1;
     128                                                quoting = false;
     129                                        }
     130                                }
     131                                if (!quoting) {
     132                                        // close q-seq, wrap line, and start a new q-seq
    96133                                        quotedSequence = new StringBuilder(64);
    97134                                        quotedSequence.append("=?utf-8?Q?");
    98135                                        quoting = true;
    99136                                }
    100                                 quotedSequence.append(HexTable.table[ c < 0 ? 256 + c : c ]);
     137                                quotedSequence.append(qc);
    101138                        }
    102139                        else {
     
    104141                                        quotedSequence.append("?=");
    105142                                        int sl = quotedSequence.length();
    106                                         if( l + sl > 76 ) {
     143                                        if( l + sl >= 76 ) {
    107144                                                /*
    108145                                                 * wrap line
    109146                                                 */
    110147                                                out.append( "\r\n\t" );
    111                                                 l = 0;
     148                                                l = 1;
    112149                                        }
    113150                                        out.append( quotedSequence );
     
    121158                                }
    122159                                else {
    123                                         if( l > 76 ) {
     160                                        if( l >= 76 ) {
    124161                                                out.append( "\r\n\t" );
    125                                                 l = 0;
    126                                         }
    127                                         out.append( (char)c );
     162                                                l = 1;
     163                                        }
     164                                        out.append(c);
    128165                                        l++;
    129166                                }
     
    133170                        quotedSequence.append("?=");
    134171                        int sl = quotedSequence.length();
    135                         if( l + sl > 76 ) {
     172                        if( l + sl >= 76 ) {
    136173                                /*
    137174                                 * wrap line
    138175                                 */
    139176                                out.append( "\r\n\t" );
    140                                 l = 0;
     177                                l = 1;
    141178                        }
    142179                        out.append( quotedSequence );
Note: See TracChangeset for help on using the changeset viewer.