Changeset 2c4ecb7


Ignore:
Timestamp:
Dec 8, 2017 2:27:29 AM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
a3e42c43
Parents:
28f31ae
Message:

SusiMail?: Reference mails by UIDL, not index on page

  • Add more safe mime types for downloading
  • Put UIDL in show message form, in prep for removing session object UIDL
Location:
apps/susimail/src/src/i2p/susi
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/util/Folder.java

    r28f31ae r2c4ecb7  
    353353         * @return Element on the current page on the given position.
    354354         */
     355/****  unused, we now fetch by UIDL, not position
    355356        public synchronized O getElementAtPosXonCurrentPage( int x )
    356357        {
     
    365366                return result;
    366367        }
     368****/
    367369
    368370        /**
  • apps/susimail/src/src/i2p/susi/webmail/PersistentMailCache.java

    r28f31ae r2c4ecb7  
    200200
    201201        /**
    202          *   ~/.i2p/susimail/cache/cache-xxxxx/cur/s[a-z]/mail-xxxxx.full.txt.gz
     202         *   ~/.i2p/susimail/cache/cache-xxxxx/cur/s[b64char]/mail-xxxxx.full.txt.gz
    203203         *   folder1 is the base.
    204204         */
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    r28f31ae r2c4ecb7  
    7171import net.i2p.CoreVersion;
    7272import net.i2p.I2PAppContext;
     73import net.i2p.data.Base64;
    7374import net.i2p.data.DataHelper;
    7475import net.i2p.servlet.RequestWrapper;
     
    119120       
    120121        /*
     122         * hidden params
     123         */
     124        private static final String SUSI_NONCE = "susiNonce";
     125        private static final String B64UIDL = "b64uidl";
     126
     127        /*
    121128         * button names
    122129         */
     
    136143        private static final String DOWNLOAD = "download";
    137144        private static final String RAW_ATTACHMENT = "att";
    138         private static final String SUSI_NONCE = "susiNonce";
    139145       
    140146        private static final String MARKALL = "markall";
     
    636642                                        String charset = mailPart.charset;
    637643                                        if( charset == null ) {
    638                                                 charset = "US-ASCII";
     644                                                charset = "ISO-8859-1";
    639645                                                // don't show this in text mode which is used to include the mail in the reply or forward
    640646                                                if (html)
     
    688694                                                type.startsWith("audio/") || type.equals("application/ogg") ||
    689695                                                type.startsWith("video/") ||
     696                                                (type.startsWith("text/") && !type.equals("text/html")) ||
    690697                                                type.equals("application/zip") || type.equals("application/x-gtar") ||
    691698                                                type.equals("application/compress") || type.equals("application/gzip") ||
    692699                                                type.equals("application/x-7z-compressed") || type.equals("application/x-rar-compressed") ||
    693                                                 type.equals("application/x-tar") || type.equals("application/x-bzip2"))) {
     700                                                type.equals("application/x-tar") || type.equals("application/x-bzip2") ||
     701                                                type.equals("application/pdf") || type.equals("application/x-bittorrent") ||
     702                                                type.equals("application/pgp-signature"))) {
    694703                                                out.println( "<a href=\"" + myself + "?" + RAW_ATTACHMENT + "=" +
    695704                                                         mailPart.hashCode() + "\">" + _t("Download attachment {0}", ident) + "</a>");
     
    10051014                                        // these buttons are now hidden on the folder page,
    10061015                                        // but the idea is to use the first checked message
    1007                                         List<Integer> items = getCheckedItems(request);
     1016                                        List<String> items = getCheckedItems(request);
    10081017                                        if (!items.isEmpty()) {
    1009                                                 int pos = items.get(0).intValue();
    1010                                                 uidl = sessionObject.folder.getElementAtPosXonCurrentPage( pos );
     1018                                                String b64UIDL = items.get(0);
     1019                                                // This is the I2P Base64, not the encoder
     1020                                                uidl = Base64.decodeToString(b64UIDL);
    10111021                                        }
    10121022                                }
     
    11221132                        String show = request.getParameter( SHOW );
    11231133                        if( show != null && show.length() > 0 ) {
    1124                                 try {
    1125 
    1126                                         int id = Integer.parseInt( show );
    1127                                        
    1128                                         if( id >= 0 && id < sessionObject.folder.getPageSize() ) {
    1129                                                 String uidl = sessionObject.folder.getElementAtPosXonCurrentPage( id );
    1130                                                 if( uidl != null ) {
    1131                                                         sessionObject.state = STATE_SHOW;
    1132                                                         sessionObject.showUIDL = uidl;
    1133                                                 }
    1134                                         }
    1135                                 }
    1136                                 catch( NumberFormatException nfe )
    1137                                 {
     1134                                // This is the I2P Base64, not the encoder
     1135                                String uidl = Base64.decodeToString(show);
     1136                                if(uidl != null) {
     1137                                        sessionObject.state = STATE_SHOW;
     1138                                        sessionObject.showUIDL = uidl;
     1139                                } else {
    11381140                                        sessionObject.error += _t("Message id not valid.") + '\n';
    11391141                                }
     
    11451147         * Returns e.g. 3,5 for ?check3=1&check5=1 (or POST equivalent)
    11461148         * @param request
    1147          * @return non-null
    1148          */
    1149         private static List<Integer> getCheckedItems(RequestWrapper request) {
    1150                 List<Integer> rv = new ArrayList<Integer>(8);
     1149         * @return non-null List of Base64 UIDLs, or attachment numbers as Strings
     1150         */
     1151        private static List<String> getCheckedItems(RequestWrapper request) {
     1152                List<String> rv = new ArrayList<String>(8);
    11511153                for( Enumeration<String> e = request.getParameterNames(); e.hasMoreElements(); ) {
    11521154                        String parameter = e.nextElement();
    11531155                        if( parameter.startsWith( "check" ) && request.getParameter( parameter ).equals("1")) {
    1154                                 String number = parameter.substring( 5 );
    1155                                 try {
    1156                                         rv.add(Integer.valueOf(number));
    1157                                 } catch( NumberFormatException nfe ) {}
     1156                                String item = parameter.substring(5);
     1157                                rv.add(item);
    11581158                        }
    11591159                }
     
    12281228                                        String contentType = request.getContentType( NEW_FILENAME );
    12291229                                        String encodeTo;
    1230                                         if( contentType.toLowerCase(Locale.US).startsWith( "text/" ) )
     1230                                        String ctlc = contentType.toLowerCase(Locale.US);
     1231                                        if (ctlc.startsWith("text/")) {
    12311232                                                encodeTo = "quoted-printable";
    1232                                         else
     1233                                                // Is this a better guess than the platform encoding?
     1234                                                // Either is a better guess than letting the receiver
     1235                                                // interpret it as ISO-8859-1
     1236                                                if (!ctlc.contains("charset="))
     1237                                                        contentType += "; charset=\"utf-8\"";
     1238                                        } else {
    12331239                                                encodeTo = "base64";
     1240                                        }
    12341241                                        Encoding encoding = EncodingFactory.getEncoding(encodeTo);
    12351242                                        if (encoding != null) {
     
    12521259                }
    12531260                else if( sessionObject.attachments != null && buttonPressed( request, DELETE_ATTACHMENT ) ) {
    1254                         for (Integer item : getCheckedItems(request)) {
    1255                                 int n = item.intValue();
    1256                                 for( int i = 0; i < sessionObject.attachments.size(); i++ ) {
    1257                                         Attachment attachment = sessionObject.attachments.get(i);
    1258                                         if( attachment.hashCode() == n ) {
    1259                                                 sessionObject.attachments.remove( i );
    1260                                                 break;
     1261                        for (String item : getCheckedItems(request)) {
     1262                                try {
     1263                                        int n = Integer.parseInt(item);
     1264                                        for( int i = 0; i < sessionObject.attachments.size(); i++ ) {
     1265                                                Attachment attachment = sessionObject.attachments.get(i);
     1266                                                if( attachment.hashCode() == n ) {
     1267                                                        sessionObject.attachments.remove( i );
     1268                                                        break;
     1269                                                }
    12611270                                        }
    1262                                 }
     1271                                } catch (NumberFormatException nfe) {}
    12631272                        }                       
    12641273                }
     
    14381447                        if( buttonPressed( request, REALLYDELETE ) ) {
    14391448                                List<String> toDelete = new ArrayList<String>();
    1440                                 for (Integer item : getCheckedItems(request)) {
    1441                                         int n = item.intValue();
    1442                                         String uidl = sessionObject.folder.getElementAtPosXonCurrentPage( n );
    1443                                         if( uidl != null )
     1449                                for (String b64UIDL : getCheckedItems(request)) {
     1450                                        // This is the I2P Base64, not the encoder
     1451                                        String uidl = Base64.decodeToString(b64UIDL);
     1452                                        if (uidl != null)
    14441453                                                toDelete.add(uidl);
    14451454                                }
     
    18061815                                        "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"" + myself + "\" accept-charset=\"UTF-8\">\n" +
    18071816                                        "<input type=\"hidden\" name=\"" + SUSI_NONCE + "\" value=\"" + nonce + "\">");
    1808 
     1817                                if( sessionObject.state == STATE_SHOW && sessionObject.showUIDL != null) {
     1818                                        String b64UIDL = Base64.encode(sessionObject.showUIDL);
     1819                                        out.println("<input type=\"hidden\" name=\"" + B64UIDL + "\" value=\"" + b64UIDL + "\">");
     1820                                }
    18091821                                if( sessionObject.error != null && sessionObject.error.length() > 0 ) {
    18101822                                        out.println( "<div class=\"notifications\" onclick=\"this.remove()\"><p class=\"error\">" + quoteHTML(sessionObject.error).replace("\n", "<br>") + "</p></div>" );
     
    22872299                        else
    22882300                                type = "linkold";
    2289                         String link = "<a href=\"" + myself + "?" + SHOW + "=" + i + "\" class=\"" + type + "\">";
    2290                         String jslink = " onclick=\"document.location='" + myself + '?' + SHOW + '=' + i + "';\" ";
     2301                        // this is I2P Base64, not the encoder
     2302                        String b64UIDL = Base64.encode(uidl);
     2303                        String link = "<a href=\"" + myself + "?" + SHOW + "=" + b64UIDL + "\" class=\"" + type + "\">";
     2304                        String jslink = " onclick=\"document.location='" + myself + '?' + SHOW + '=' + b64UIDL + "';\" ";
    22912305                       
    22922306                        boolean idChecked = false;
    2293                         String checkId = sessionObject.pageChanged ? null : request.getParameter( "check" + i );
     2307                        String checkId = sessionObject.pageChanged ? null : request.getParameter( "check" + b64UIDL );
    22942308                       
    22952309                        if( checkId != null && checkId.equals("1"))
     
    23082322                        //              ", clear=" + sessionObject.clear );
    23092323                        out.println( "<tr class=\"list" + bg + "\">" +
    2310                                         "<td><input type=\"checkbox\" class=\"optbox\" name=\"check" + i + "\" value=\"1\"" +
     2324                                        "<td><input type=\"checkbox\" class=\"optbox\" name=\"check" + b64UIDL + "\" value=\"1\"" +
    23112325                                        " onclick=\"deleteboxclicked();\" " +
    23122326                                        ( idChecked ? "checked" : "" ) + ">" + "</td><td " + jslink + ">" +
Note: See TracChangeset for help on using the changeset viewer.