GithubHelp home page GithubHelp logo

i2p / i2p.i2p-bote Goto Github PK

View Code? Open in Web Editor NEW
146.0 22.0 44.0 24.65 MB

I2P-Bote is a serverless, encrypted e-mail application.

Home Page: https://i2pbote.xyz

License: Other

Java 80.96% Shell 0.17% HTML 17.10% CSS 1.74% Batchfile 0.03%
i2p i2p-bote java email dht privacy

i2p.i2p-bote's Introduction

I2P-Bote

Build Status

I2P-Bote is a plugin for I2P that allows users to send and receive emails while preserving privacy. It does not need a mail server because emails are stored in a distributed hash table. They are automatically encrypted and digitally signed, which ensures no one but the intended recipient can read the email, and third parties cannot forge them.

Features

  • Themeable webmail interface
  • User interface translated in many languages
  • One-click creation of email accounts (called email identities)
  • Emails can be sent under a sender identity, or anonymously
  • ElGamal, Elliptic Curve, and NTRU Encryption
  • Encryption and signing is transparent, without the need to know about PGP
  • Delivery confirmation
  • Basic support for short recipient names
  • IMAP / SMTP

Planned Features

  • Custom folders
  • Sending and receiving via relays, similar to Mixmaster
  • Lots of small improvements

Build process

Dependencies:

  • Java SDK (preferably Oracle/Sun or OpenJDK) 1.7.0 or higher
  • Apache Ant 1.8.0 or higher
  • Gradle 2.14.1

Gradle

The build system is based on Gradle. There are several methods for setting Gradle up:

  • It can be downloaded from the Gradle website.

  • Most distributions will have Gradle packages. Be careful to check the provided version; Debian and Ubuntu have old versions in their main repositories. There is a PPA for Ubuntu with the latest version of Gradle.

  • A Gradle wrapper is provided in the codebase. It takes all the same commands as the regular gradle command. The first time that any command is run, it will automatically download, cache and use the correct version of Gradle. This is the simplest way to get started with the codebase. To use it, replace gradle with ./gradlew (or ./gradlew.bat on Windows) in the commands below.

Gradle will pull dependencies over the clearnet by default. To use Tor, create a gradle.properties file in i2p.android.base containing:

```
systemProp.socksProxyHost=localhost
systemProp.socksProxyPort=9150
```

Building the I2P plugin

gradle :webapp:plugin

The plugin will be placed in i2p.i2p-bote/webapp/build/plugin.

Building the standalone WAR

gradle :webapp:war

The WAR will be placed in i2p.i2p-bote/webapp/build/libs.

Running the standalone WAR

Ensure you have an I2P router running locally with an I2CP server port open (on port 7654). Then run:

gradle :webapp:tomcatRunWar

This will build and run the WAR. (Jetty currently does not work.)

The data directory will be placed in i2p.i2p-bote/webapp/i2pbote; logs will be in i2p.i2p-bote/webapp/logs.

Android build process

Additional dependencies:

  • I2P source
  • Android SDK 25
  • Android Build Tools 25.0.2
  • Android Support Repository

Preparation

  1. Download the Android SDK. The simplest method is to download Android Studio.

  2. Create a local.properties file in i2p.i2p-bote/android containing:

    i2psrc=/path/to/i2p.i2p
    
  3. If you want to use a local copy of the I2P Android client library, install it in your local Maven repository with:

    cd path/to/i2p.android.base
    ./gradlew client:installArchives
    

Building from the command line

  1. Create a local.properties file in i2p.i2p-bote containing:

    sdk.dir=/path/to/android-studio/sdk
    
  2. gradle :android:assembleDebug

  3. The APK will be placed in i2p.i2p-bote/android/build/apk.

Building with Android Studio

  1. Import i2p.i2p-bote into Android Studio. (This creates the local.properties file automatically).

  2. Build and run the app (Shift+F10).

Signing release builds

  1. Create a signing.properties file in i2p.i2p-bote containing:

    STORE_FILE=/path/to/android.keystore
    STORE_PASSWORD=store.password
    KEY_ALIAS=key.alias
    KEY_PASSWORD=key.password
    
  2. gradle assembleRelease

More information

The links below only work within I2P, i.e., make sure you are running I2P and your browser is using the proxy at localhost:4444.

i2p.i2p-bote's People

Contributors

ducki2p avatar hungryhobo avatar jonathancross avatar mikalv avatar robertfoss avatar str4d avatar welterde avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

i2p.i2p-bote's Issues

Bote fix a problem with the whitelist (Trac #1497)

Migrated from https://trac.i2p2.de/ticket/1497

{
    "status": "closed", 
    "changetime": "2016-11-27T02:31:51", 
    "description": "", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1480213911159336", 
    "component": "apps/plugins", 
    "summary": "Bote fix a problem with the whitelist", 
    "priority": "blocker", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "", 
    "time": "2015-03-21T23:44:02", 
    "milestone": "0.9.21", 
    "owner": "str4d", 
    "type": "defect"
}

Bote-mail.i2p-internet gateway (Trac #1362)

A gateway for mails between internet, mail.i2p and Bote.
ideally open-source and freely available so in the event of it going down, alternatvies need not reimplemented, but can easily be set up by volunteers with the required ressources.

Migrated from https://trac.i2p2.de/ticket/1362

{
    "status": "accepted", 
    "changetime": "2017-04-16T22:57:40", 
    "description": "A gateway for mails between internet, mail.i2p and Bote.\nideally open-source and freely available so in the event of it going down, alternatvies need not reimplemented, but can easily be set up by volunteers with the required ressources.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1492383460162293", 
    "component": "other", 
    "summary": "Bote-mail.i2p-internet gateway", 
    "priority": "minor", 
    "keywords": "I2P-Bote privacy", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-08-26T10:00:07", 
    "milestone": "eventually", 
    "owner": "str4d", 
    "type": "enhancement"
}

Local DoS with certain passwords makes messages irretrievable/unsendable (Trac #1382)

Summary:
After changing the password to a certain password, (with white spaces or trailing white space?) any attempt to access Bote messages or Bote itself will result in local DoS (500 page)

CRITICAL: after first DoS, messages are completely inaccessible (afaik) regardless of restarting plugin/router.

PoC:

  1. Original password (without quotes): "password"
  2. Changed to (without quotes): "A A A A "
  3. Password accepted without error
  4. Clear password cache/clear browser cache, and enter 'old' password (without quotes): "password" --> "Wrong password. Try again."
  5. Clear password cache/clear browser cache, and enter 'new' password (without quotes): "A A A A " --> presented with a 500 and Bote is inaccessible until plugin is restarted. Any attempts to change the password are accepted and cached BUT, when clearing the cache and entering any 'new' password, Bote is DoS'd until restarted.

Notes:

  1. In some instances, any attempt to access Bote will result in DoS (500 page).
  2. At the moment there is 1 'incomplete' message in the inbox. It has been there since before bug discovery, and is still there (as seen in the router log))

Migrated from https://trac.i2p2.de/ticket/1382

{
    "status": "assigned", 
    "changetime": "2017-01-15T13:57:30", 
    "description": "Summary:\nAfter changing the password to a certain password, (with white spaces or trailing white space?) any attempt to access Bote messages or Bote itself will result in local DoS (500 page)\n\nCRITICAL: after first DoS, messages are completely inaccessible (afaik) regardless of restarting plugin/router.\n\nPoC:\n1) Original password (without quotes): \"password\"\n2) Changed to (without quotes): \"A A A A \"\n3) Password accepted without error\n4) Clear password cache/clear browser cache, and enter 'old' password (without quotes): \"password\" --> \"Wrong password. Try again.\"\n5) Clear password cache/clear browser cache, and enter 'new' password (without quotes): \"A A A A \" --> presented with a 500 and Bote is inaccessible until plugin is restarted. Any attempts to change the password are accepted and cached *BUT*, when clearing the cache and entering any 'new' password, Bote is DoS'd until restarted.\n\nNotes:\n1) In some instances, any attempt to access Bote will result in DoS (500 page).\n2) At the moment there is 1 'incomplete' message in the inbox. It has been there since before bug discovery, and is still there (as seen in the router log))", 
    "reporter": "ihave2p", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484488650801096", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: local DoS with certain passwords makes messages irretrievable/unsendable", 
    "priority": "critical", 
    "keywords": "I2P-Bote reliability heisenbug", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-09-21T11:33:18", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "defect"
}

Perfect Forward Secrecy, Deniability (Trac #1358)

It would be a huge win if we could have Bote have the properties of
Perfect Forward Secrecy and of Deniability/Malleability, as we know from OTR.

In the background bote could send encrypted mails to peers in the addressbook and send them a time-limited and quantity-limited symmetric key, and sign it. the recipient confirms.
the key is cached until it a) expires or b) was used to its use limit.
When you want to send a bote mail, instead of signing it, you encrypt it with that symmetric key - since it is only known to sender and receiver it is as good as signing for the reciever, but no proof for third parties.
In case of contacts not in the addressbook, have option to send without these features or with, in case of with, the mail is held in suspense while the above provcess is executed in the backgournd. This can significantly delay the delivery in case of rarely connected peers and therefore a warnung must be displayed.

ref:

http://security.stackexchange.com/questions/40451/is-off-the-record-style-encryption-possible-with-email

http://en.wikipedia.org/wiki/Off-the-Record_Messaging

Migrated from https://trac.i2p2.de/ticket/1358

{
    "status": "assigned", 
    "changetime": "2017-01-15T13:54:35", 
    "description": "It would be a huge win if we could have Bote have the properties of\nPerfect Forward Secrecy and of Deniability/Malleability, as we know from OTR.\n\nIn the background bote could send encrypted mails to peers in the addressbook and send them a time-limited and quantity-limited symmetric key, and sign it. the recipient confirms.\nthe key is cached until it a) expires or b) was used to its use limit. \nWhen you want to send a bote mail, instead of signing it, you encrypt it with that symmetric key - since it is only known to sender and receiver it is as good as signing for the reciever, but no proof for third parties. \nIn case of contacts not in the addressbook, have option to send without these features or with, in case of with, the mail is held in suspense while the above provcess is executed in the backgournd. This can significantly delay the delivery in case of rarely connected peers and therefore a warnung must be displayed. \n\n\nref:\n\nhttp://security.stackexchange.com/questions/40451/is-off-the-record-style-encryption-possible-with-email\n\nhttp://en.wikipedia.org/wiki/Off-the-Record_Messaging", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484488475063299", 
    "component": "apps/plugins", 
    "summary": "Bote, Perfect Forward Secrecy, Deniability", 
    "priority": "major", 
    "keywords": "I2P-Bote security", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-08-24T22:41:21", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "enhancement"
}

Address book import and export (Trac #1444)

Add a nice way to import and export the address book from/to the Bote PC client (I2P plugin).

Migrated from https://trac.i2p2.de/ticket/1444

{
    "status": "new", 
    "changetime": "2015-01-23T23:51:23", 
    "description": "Add a nice way to import and export the address book from/to the Bote PC client (I2P plugin).", 
    "reporter": "dllud", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1422057083611755", 
    "component": "apps/android", 
    "summary": "I2P-Bote Android: Address book import and export", 
    "priority": "minor", 
    "keywords": "I2P-Bote usability", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-01-23T23:51:23", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

File System Abstraction (Trac #1316)

I noticed that the I2P router does a lot of disk io during startup, which seems to slow things down. I believe it's due to the fact that there are a lot of small files in the folder that contains my I2P application data.

As an example: My I2PBote plugin alone maintains 2,898 files(!), each only about 1,716 bytes large on average, amounting to less than 5 MB in total.

Obviously accessing lots of small files hurts performance. Wouldn't it be nice if the I2P router offered its core modules as well as its plugins some kind of own file system abstraction, where the module/plugin "sees" what appears to be a file system, while there is in fact just one large file ("container") on the disk, and where that one file is being dynamically resized as required? Each module/plugin would have its own container. This would allow the operating system to cache files much better and increase overall performance, especially on router startup.

This approach could also work around potential problems that are related to platform differences between operating systems that handle paths case-sensitive and those that handle them case-insensitive. Plus it could "sandbox" file system access to prevent accidental file io outside a module's folder on the actual file system. Another benefit would be that certain file access could be handled entirely in user-mode and would thus be faster than having to do expensive syscalls all the time. You could even allow a module to transparently encrypt its container with a password.

I hope you get the idea.

Migrated from https://trac.i2p2.de/ticket/1316

{
    "status": "assigned", 
    "changetime": "2016-08-05T15:06:29", 
    "description": "I noticed that the I2P router does a lot of disk io during startup, which seems to slow things down. I believe it's due to the fact that there are a lot of small files in the folder that contains my I2P application data.\n\nAs an example: My I2PBote plugin alone maintains 2,898 files(!), each only about 1,716 bytes large on average, amounting to less than 5 MB in total.\n\nObviously accessing lots of small files hurts performance. Wouldn't it be nice if the I2P router offered its core modules as well as its plugins some kind of own file system abstraction, where the module/plugin \"sees\" what appears to be a file system, while there is in fact just one large file (\"container\") on the disk, and where that one file is being dynamically resized as required? Each module/plugin would have its own container. This would allow the operating system to cache files much better and increase overall performance, especially on router startup.\n\nThis approach could also work around potential problems that are related to platform differences between operating systems that handle paths case-sensitive and those that handle them case-insensitive. Plus it could \"sandbox\" file system access to prevent accidental file io outside a module's folder on the actual file system. Another benefit would be that certain file access could be handled entirely in user-mode and would thus be faster than having to do expensive syscalls all the time. You could even allow a module to transparently encrypt its container with a password.\n\nI hope you get the idea.", 
    "reporter": "ExtraBattery", 
    "cc": "HungryHobo, str4d", 
    "resolution": "", 
    "_ts": "1470409589334842", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: File System Abstraction", 
    "priority": "maintenance", 
    "keywords": "I2P-Bote performance", 
    "version": "0.9.13", 
    "parents": "", 
    "time": "2014-06-21T08:38:14", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "task"
}

Option to fake a timezone when checking emails (Trac #1462)

Add options
[ ] fake random timezone (can delay actions like message check or send for up to 1 day)

on ID creation set ID.timezone
choose a random timezone, based on amount of darknet users in given timezone, including at least:
all USA time zones separately, USA Eastern, USA Pacific, .... , Timezones for Europea, Timezones for Russia
at least 10 timezones, with weighted probability correlating to say number of tor users or something.

Now look at ID.nextrun scheduled in previous points.
Convert it to a day, in the ID.timezone.

If (ID.behaviour == type1) then
start = hour 8:00 of that day // wake up
end = hour 23:00 of that day // go to sleep

If ID.nextrun < start, then ID.nextrun = start; // wait until user "wakes up"
if ID.nextrun > end, then change to next day, and run algorightm again // user sleeps already

if time was changed as above, then add random(0,T*0.1) + randomGauss(0.5,1.5)

(Future idea: take into account: other pattern (only in morning and evening, not "in work"),
and randomly based on ID.skipwork chance (e.g. 1%) use other behaviour)

Make above scheduling be used for checking messages, but also to sending messages (otherwise they are placed in a queue, with a checkbox to bypass fake timezone on message composing)

Migrated from https://trac.i2p2.de/ticket/1462

{
    "status": "assigned", 
    "changetime": "2017-01-15T15:26:53", 
    "description": "Add options \n[ ] fake random timezone (can delay actions like message check or send for up to 1 day)\n\non ID creation set ID.timezone \nchoose a random timezone, based on amount of darknet users in given timezone, including at least:\nall USA time zones separately, USA Eastern, USA Pacific, .... , Timezones for Europea, Timezones for Russia \nat least 10 timezones, with weighted probability correlating to say number of tor users or something.\n\nNow look at ID.nextrun scheduled in previous points.\nConvert it to a day, in the ID.timezone.\n\nIf (ID.behaviour == type1) then\nstart = hour 8:00 of that day // wake up\nend = hour 23:00 of that day // go to sleep\n\nIf ID.nextrun < start, then ID.nextrun = start; // wait until user \"wakes up\"\nif ID.nextrun > end, then change to next day, and run algorightm again // user sleeps already\n\nif time was changed as above, then add random(0,T*0.1) + randomGauss(0.5,1.5)\n\n(Future idea: take into account: other pattern (only in morning and evening, not \"in work\"),\nand randomly based on ID.skipwork chance (e.g. 1%) use other behaviour)\n\nMake above scheduling be used for checking messages, but also to sending messages (otherwise they are placed in a queue, with a checkbox to bypass fake timezone on message composing)", 
    "reporter": "rfree", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484494013509852", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: option to fake a timezone when checking emails", 
    "priority": "minor", 
    "keywords": "I2P-Bote privacy", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-02-05T04:40:33", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

Test and document X-Priority in header whitelist (Trac #1494)

priority can be a useful flag and it has no anonymity implications.
As headers are encrypted only receiver sees it if set.
And update documentation that priority flag is allowed

Migrated from https://trac.i2p2.de/ticket/1494

{
    "status": "infoneeded_new", 
    "changetime": "2015-08-05T01:54:40", 
    "description": "priority can be a useful flag and it has no anonymity implications.\nAs headers are encrypted only receiver sees it if set.\nAnd update documentation that priority flag is allowed", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1438739680589550", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: allow priority in header", 
    "priority": "trivial", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "", 
    "time": "2015-03-19T20:49:55", 
    "milestone": "undecided", 
    "owner": "", 
    "type": "defect"
}

3 Bote errors:ConcurrentExecutionException,TooSmallPackets (Trac #1287)

3 errors:

  • about unability to check for update (maybe this should only be logged if it happens repeatedly, not if eepproxy fails once or eepsite down. for the future it could even be thought about a p2p update where instrad of checking the eepsite, other bote nodes arequeried and only updates signed by a signer on a configurable list of trusted signers are accepted)

  • CEE

  • dunno how those too small packets come about, maybe it's during shutdown? Is it save to simply rm them? will they be redownloaded, or a packet once downloaded is deleted for good? I know received mails are deleted, but not sure it's on a per-packet basis or only once the mail is complete AND correctly assembled. Anyhow, bote should recover from that on its own

    20.05.14 23:39:41 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p
    20.05.14 21:38:29 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p
    20.05.14 20:38:09 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p
    20.05.14 19:29:21 ERROR [onsole Jetty] i2p.bote.service.EmailChecker : Error while checking whether new mail has arrived.
         java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException
         at java.util.concurrent.FutureTask.report(Unknown Source)
         at java.util.concurrent.FutureTask.get(Unknown Source)
         at i2p.bote.service.EmailChecker.newMailReceived(EmailChecker.java:158)
         at i2p.bote.I2PBote.newMailReceived(I2PBote.java:555)
         at i2p.bote.util.GeneralHelper.isNewMailReceived(GeneralHelper.java:315)
         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
         at java.lang.reflect.Method.invoke(Unknown Source)
         at javax.el.BeanELResolver.getValue(BeanELResolver.java:83)
         at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
         at org.apache.el.parser.AstValue.getValue(AstValue.java:123)
         at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
         at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938)
         at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f8(buttonFrame_jsp.java:824)
         at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f4(buttonFrame_jsp.java:423)
         at i2p.bote.jsp.buttonFrame_jsp._jspService(buttonFrame_jsp.java:115)
         at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
         at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
         at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
         at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
         at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)
         at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
         at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
         at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
         at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
         at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
         at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
         at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
         at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
         at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
         at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
         at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
         at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
         at org.eclipse.jetty.server.Server.handle(Server.java:370)
         at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
         at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
         at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
         at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
         at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
         at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
         at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
         at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
         at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
         at java.lang.Thread.run(Unknown Source)
         Caused by: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException
         at java.util.concurrent.FutureTask.report(Unknown Source)
         at java.util.concurrent.FutureTask.get(Unknown Source)
         at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:131)
         at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:61)
         at java.util.concurrent.FutureTask.run(Unknown Source)
         ... 3 more
         Caused by: java.util.ConcurrentModificationException
         at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
         at java.util.ArrayList$Itr.next(Unknown Source)
         at i2p.bote.network.kademlia.BucketManager.getAllUnlockedPeers(BucketManager.java:267)
         at i2p.bote.network.kademlia.ClosestNodesLookupTask.call(ClosestNodesLookupTask.java:106)
         at i2p.bote.network.kademlia.KademliaDHT.getClosestNodes(KademliaDHT.java:178)
         at i2p.bote.network.kademlia.KademliaDHT.find(KademliaDHT.java:261)
         at i2p.bote.network.kademlia.KademliaDHT.findAll(KademliaDHT.java:188)
         at i2p.bote.network.CheckEmailTask$EmailPacketTask.run(CheckEmailTask.java:201)
         at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
         ... 4 more
    20.05.14 18:26:24 ERROR [ExpiratnThrd] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\ProgramData\Application Data\i2p\i2pbote\dht_email_pkt\pko46K5LXBn0-91y4A2a62mhvPsgDNOlTDtU4b~CGyQ=.pkt (file size=8192)
         i2p.bote.packet.MalformedPacketException: Can't instantiate packet for type code <E>
         at i2p.bote.packet.DataPacket.createPacket(DataPacket.java:104)
         at i2p.bote.packet.I2PBotePacket.createPacket(I2PBotePacket.java:118)
         at i2p.bote.packet.I2PBotePacket.createPacket(I2PBotePacket.java:90)
         at i2p.bote.folder.PacketFolder.createFolderElement(PacketFolder.java:85)
         at i2p.bote.folder.PacketFolder.createFolderElement(PacketFolder.java:42)
         at i2p.bote.folder.Folder$3.findNextElement(Folder.java:169)
         at i2p.bote.folder.Folder$3.next(Folder.java:150)
         at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:106)
         at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:90)
         at i2p.bote.folder.EmailPacketFolder.deleteExpired(EmailPacketFolder.java:143)
         at i2p.bote.service.ExpirationThread.run(ExpirationThread.java:53)
         Caused by: java.lang.reflect.InvocationTargetException
         at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source)
         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
         at java.lang.reflect.Constructor.newInstance(Unknown Source)
         at i2p.bote.packet.DataPacket.createPacket(DataPacket.java:101)
         ... 10 more
         Caused by: java.nio.BufferUnderflowException
         at java.nio.HeapByteBuffer.get(Unknown Source)
         at java.nio.ByteBuffer.get(Unknown Source)
         at i2p.bote.packet.dht.EncryptedEmailPacket.<init>(EncryptedEmailPacket.java:102)
         ... 14 more

Migrated from https://trac.i2p2.de/ticket/1287

{
    "status": "closed", 
    "changetime": "2016-01-25T20:00:40", 
    "description": "3 errors:\n- about unability to check for update (maybe this should only be logged if it happens repeatedly, not if eepproxy fails once or eepsite down. for the future it could even be thought about a p2p update where instrad of checking the eepsite, other bote nodes arequeried and only updates signed by a signer on a configurable list of trusted signers are accepted)\n\n- CEE\n\n- dunno how those too small packets come about, maybe it's during shutdown? Is it save to simply rm them? will they be redownloaded, or a packet once downloaded is deleted for good? I know received mails are deleted, but not sure it's on a per-packet basis or only once the mail is complete AND correctly assembled. Anyhow, bote should recover from that on its own\n\n{{{\n    20.05.14 23:39:41 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p\n    20.05.14 21:38:29 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p\n    20.05.14 20:38:09 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p\n    20.05.14 19:29:21 ERROR [onsole Jetty] i2p.bote.service.EmailChecker : Error while checking whether new mail has arrived.\n         java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException\n         at java.util.concurrent.FutureTask.report(Unknown Source)\n         at java.util.concurrent.FutureTask.get(Unknown Source)\n         at i2p.bote.service.EmailChecker.newMailReceived(EmailChecker.java:158)\n         at i2p.bote.I2PBote.newMailReceived(I2PBote.java:555)\n         at i2p.bote.util.GeneralHelper.isNewMailReceived(GeneralHelper.java:315)\n         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)\n         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\n         at java.lang.reflect.Method.invoke(Unknown Source)\n         at javax.el.BeanELResolver.getValue(BeanELResolver.java:83)\n         at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)\n         at org.apache.el.parser.AstValue.getValue(AstValue.java:123)\n         at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)\n         at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938)\n         at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f8(buttonFrame_jsp.java:824)\n         at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f4(buttonFrame_jsp.java:423)\n         at i2p.bote.jsp.buttonFrame_jsp._jspService(buttonFrame_jsp.java:115)\n         at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n         at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)\n         at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)\n         at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)\n         at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)\n         at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)\n         at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)\n         at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n         at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)\n         at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)\n         at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)\n         at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)\n         at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)\n         at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)\n         at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n         at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n         at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n         at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n         at org.eclipse.jetty.server.Server.handle(Server.java:370)\n         at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)\n         at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)\n         at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)\n         at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)\n         at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n         at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)\n         at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)\n         at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)\n         at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n         at java.lang.Thread.run(Unknown Source)\n         Caused by: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException\n         at java.util.concurrent.FutureTask.report(Unknown Source)\n         at java.util.concurrent.FutureTask.get(Unknown Source)\n         at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:131)\n         at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:61)\n         at java.util.concurrent.FutureTask.run(Unknown Source)\n         ... 3 more\n         Caused by: java.util.ConcurrentModificationException\n         at java.util.ArrayList$Itr.checkForComodification(Unknown Source)\n         at java.util.ArrayList$Itr.next(Unknown Source)\n         at i2p.bote.network.kademlia.BucketManager.getAllUnlockedPeers(BucketManager.java:267)\n         at i2p.bote.network.kademlia.ClosestNodesLookupTask.call(ClosestNodesLookupTask.java:106)\n         at i2p.bote.network.kademlia.KademliaDHT.getClosestNodes(KademliaDHT.java:178)\n         at i2p.bote.network.kademlia.KademliaDHT.find(KademliaDHT.java:261)\n         at i2p.bote.network.kademlia.KademliaDHT.findAll(KademliaDHT.java:188)\n         at i2p.bote.network.CheckEmailTask$EmailPacketTask.run(CheckEmailTask.java:201)\n         at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n         ... 4 more\n    20.05.14 18:26:24 ERROR [ExpiratnThrd] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\\ProgramData\\Application Data\\i2p\\i2pbote\\dht_email_pkt\\pko46K5LXBn0-91y4A2a62mhvPsgDNOlTDtU4b~CGyQ=.pkt (file size=8192)\n         i2p.bote.packet.MalformedPacketException: Can't instantiate packet for type code <E>\n         at i2p.bote.packet.DataPacket.createPacket(DataPacket.java:104)\n         at i2p.bote.packet.I2PBotePacket.createPacket(I2PBotePacket.java:118)\n         at i2p.bote.packet.I2PBotePacket.createPacket(I2PBotePacket.java:90)\n         at i2p.bote.folder.PacketFolder.createFolderElement(PacketFolder.java:85)\n         at i2p.bote.folder.PacketFolder.createFolderElement(PacketFolder.java:42)\n         at i2p.bote.folder.Folder$3.findNextElement(Folder.java:169)\n         at i2p.bote.folder.Folder$3.next(Folder.java:150)\n         at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:106)\n         at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:90)\n         at i2p.bote.folder.EmailPacketFolder.deleteExpired(EmailPacketFolder.java:143)\n         at i2p.bote.service.ExpirationThread.run(ExpirationThread.java:53)\n         Caused by: java.lang.reflect.InvocationTargetException\n         at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source)\n         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)\n         at java.lang.reflect.Constructor.newInstance(Unknown Source)\n         at i2p.bote.packet.DataPacket.createPacket(DataPacket.java:101)\n         ... 10 more\n         Caused by: java.nio.BufferUnderflowException\n         at java.nio.HeapByteBuffer.get(Unknown Source)\n         at java.nio.ByteBuffer.get(Unknown Source)\n         at i2p.bote.packet.dht.EncryptedEmailPacket.<init>(EncryptedEmailPacket.java:102)\n         ... 14 more\n\n}}}", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1453752040717604", 
    "component": "apps/plugins", 
    "summary": "3 Bote errors:ConcurrentExecutionException,TooSmallPackets", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.12", 
    "parents": "", 
    "time": "2014-05-20T22:41:04", 
    "milestone": "0.9.21", 
    "owner": "str4d", 
    "type": "defect"
}

Project abandoned?

Seems there is no activity for almost 9 months, no response on issues and PRs being ignored.

Per-identity and per-message delays [0.01 BTC] (Trac #1450)

( I offer small tip of 0.01 Bitcoin - so a beer at current prices - for who ever implements this, e.g. from
https://blockchain.info/address/152fnfBqRjVMDvRa5LQ2upx9tJAeHnyqHC )

To not repeat security mistakes of Freemail, FMS we need better random-delay settings.

No setting should be global, as it lowers security somewhat by correlating all your IDs if you use nonstandard settings.

  • number of hops to use
  • random delay at each hop min..max time
  • frequency of checking for new mail

This should be configured for each identity (on creation of identity, with default value taken from the current global settings)

Also, when composing a new message, it should again ask for settings related to sending:

  • hops
  • delay at each hop

To not require user to have javascript, I propose adding following options:

From [ ..... ] (the same as it exists now)
Security: number of hops: [x] use default for selected sender,
... or deselect above checkbox and select value here: [...]
Security: delay at each hop: [x] use default for selected sender,
... or deselect above checkbox and select value here: min [...] max [...] minutes

Migrated from https://trac.i2p2.de/ticket/1450

{
    "status": "accepted", 
    "changetime": "2015-08-05T06:51:22", 
    "description": "( I offer small tip of 0.01 Bitcoin - so a beer at current prices - for who ever implements this, e.g. from\nhttps://blockchain.info/address/152fnfBqRjVMDvRa5LQ2upx9tJAeHnyqHC )\n\nTo not repeat security mistakes of Freemail, FMS we need better random-delay settings.\n\nNo setting should be global, as it lowers security somewhat by correlating all your IDs if you use nonstandard settings.\n\n- number of hops to use\n- random delay at each hop min..max time\n- frequency of checking for new mail\n\nThis should be configured for each identity (on creation of identity, with default value taken from the current global settings)\n\nAlso, when composing a new message, it should again ask for settings related to sending:\n- hops\n- delay at each hop\n\nTo not require user to have javascript, I propose adding following options:\n\nFrom [ ..... ]  (the same as it exists now)\nSecurity: number of hops: [x] use default for selected sender,\n... or deselect above checkbox and select value here: [...]\nSecurity: delay at each hop: [x] use default for selected sender,\n... or deselect above checkbox and select value here: min [...] max [...] minutes", 
    "reporter": "rfree", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1438757482172828", 
    "component": "apps/plugins", 
    "summary": "i2pbote delay: per-identity and per-message [0.01 BTC]", 
    "priority": "minor", 
    "keywords": "I2P-Bote anonymity usability", 
    "version": "0.9.17", 
    "parents": "1359", 
    "time": "2015-01-30T12:17:21", 
    "milestone": "eventually", 
    "owner": "str4d", 
    "type": "enhancement"
}

I2P-Bote, icon for attachments (Trac #1365)

display an icon when the mail contains an attachment

Migrated from https://trac.i2p2.de/ticket/1365

{
    "status": "closed", 
    "changetime": "2015-02-16T20:19:49", 
    "description": "display an icon when the mail contains an attachment", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1424117989370577", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote, icon for attachments", 
    "priority": "trivial", 
    "keywords": "I2P-Bote easy", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-08-27T16:44:43", 
    "milestone": "0.9.18", 
    "owner": "str4d", 
    "type": "enhancement"
}

Multi-user support (Trac #1482)

fox@irc2p str4d: has the idea of having a ~/.bote folder with private keys and addrs been thought of?

  • fox@irc2p was setting up i2p and realized multi user bote would be so useful
    str4d@irc2p fox: multi-user Bote would definitely be useful, but impl would be tricky
    str4d@irc2p If done in same Bote instance, users could read each other's mail and use their identities, if no password set
    str4d@irc2p (which would need to be the case if auto-checking was to be done)

Also, both users might not want the same settings??
(Theme, number of hops, delays .. should all be encrypted in the user's home and decrypted only when logged in or half logged in (cf. subticket))

Migrated from https://trac.i2p2.de/ticket/1482

{
    "status": "assigned", 
    "changetime": "2017-01-15T14:10:46", 
    "description": "<fox@irc2p> str4d: has the idea of having a ~/.bote folder with private keys and addrs been thought of?\n* fox@irc2p was setting up i2p and realized multi user bote would be so useful\n<str4d@irc2p> fox: multi-user Bote would definitely be useful, but impl would be tricky\n<str4d@irc2p> If done in same Bote instance, users could read each other's mail and use their identities, if no password set\n<str4d@irc2p> (which would need to be the case if auto-checking was to be done)\n\nAlso, both users might not want the same settings??\n(Theme, number of hops, delays .. should all be encrypted in the user's home and decrypted only when logged in or half logged in (cf. subticket))", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484489446343777", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: multi user support", 
    "priority": "maintenance", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "", 
    "time": "2015-03-04T21:20:33", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

illegal state when stopping bote plugin (Trac #858)

(reproducable)
with i2p-bote version 0.2.6-b117
running I go to http://127.0.0.1:7657/configclients and click on stop bote, and then this page shows :

I2P version: 0.9.4-0
Java version: Sun Microsystems Inc. 1.6.0_26 (Java(TM) SE Runtime Environment 1.6.0_26-b03)
Sorry! There has been an internal error.

Please report bugs on trac.i2p2.i2p or trac.i2p2.de. You may use the username "guest" and password "guest" if you do not wish to register.

Please include this information in bug reports:
Error Details

Error 500: /configclients INTERNAL_SERVER_ERROR

java.lang.IllegalStateException
at org.mortbay.jetty.servlet.AbstractSessionManager$Session.setAttribute(AbstractSessionManager.java:1054)
at net.i2p.router.web.jsp.configclients_jsp._jspService(configclients_jsp.java:429)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
at net.i2p.router.web.LocaleWebAppHandler.handle(LocaleWebAppHandler.java:93)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

I2P Version and Running Environment

I2P version: 0.9.4-0
Java version: Sun Microsystems Inc. 1.6.0_26 (Java(TM) SE Runtime Environment 1.6.0_26-b03)
Wrapper version: 3.5.16
Server version: 6.1.26
Servlet version: Jasper JSP 2.1 Engine
Platform: Linux amd64 3.7.1-unixpool
Processor: Athlon 64 FX Opteron (athlon64)
Jbigi: Locally optimized native BigInteger library loaded from file
Encoding: UTF-8
Charset: UTF-8

Wrapper version: 3.5.16
Server version: 6.1.26
Servlet version: Jasper JSP 2.1 Engine
Platform: Linux amd64 3.7.1-unixpool
Processor: Athlon 64 FX Opteron (athlon64)
Jbigi: Locally optimized native BigInteger library loaded from file
Encoding: UTF-8
Charset: UTF-8

1/30/13 2:10:45 AM ERROR [I2PBoteMain ] org.mortbay.jetty.Server : /configclients
java.lang.IllegalStateException
at org.mortbay.jetty.servlet.AbstractSessionManager$Session.setAttribute(AbstractSessionManager.java:1054)
at net.i2p.router.web.jsp.configclients_jsp._jspService(configclients_jsp.java:429)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
at net.i2p.router.web.LocaleWebAppHandler.handle(LocaleWebAppHandler.java:93)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

Migrated from https://trac.i2p2.de/ticket/858

{
    "status": "closed", 
    "changetime": "2013-05-01T18:29:35", 
    "description": "(reproducable)\nwith i2p-bote version 0.2.6-b117\nrunning I go to http://127.0.0.1:7657/configclients and click on stop bote, and then this page shows :\n\nI2P version: 0.9.4-0\nJava version: Sun Microsystems Inc. 1.6.0_26 (Java(TM) SE Runtime Environment 1.6.0_26-b03)\nSorry! There has been an internal error.\n\nPlease report bugs on trac.i2p2.i2p or trac.i2p2.de. You may use the username \"guest\" and password \"guest\" if you do not wish to register.\n\nPlease include this information in bug reports:\nError Details\n\nError 500: /configclients INTERNAL_SERVER_ERROR\n\njava.lang.IllegalStateException\n     at org.mortbay.jetty.servlet.AbstractSessionManager$Session.setAttribute(AbstractSessionManager.java:1054)\n     at net.i2p.router.web.jsp.configclients_jsp._jspService(configclients_jsp.java:429)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)\n     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)\n     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)\n     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)\n     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)\n     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)\n     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)\n     at net.i2p.router.web.LocaleWebAppHandler.handle(LocaleWebAppHandler.java:93)\n     at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)\n     at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)\n     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)\n     at org.mortbay.jetty.Server.handle(Server.java:326)\n     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)\n     at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)\n     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)\n     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)\n     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)\n     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)\n     at java.lang.Thread.run(Thread.java:662)\n    \nI2P Version and Running Environment\n\nI2P version: 0.9.4-0\nJava version: Sun Microsystems Inc. 1.6.0_26 (Java(TM) SE Runtime Environment 1.6.0_26-b03)\nWrapper version: 3.5.16\nServer version: 6.1.26\nServlet version: Jasper JSP 2.1 Engine\nPlatform: Linux amd64 3.7.1-unixpool\nProcessor: Athlon 64 FX Opteron (athlon64)\nJbigi: Locally optimized native BigInteger library loaded from file\nEncoding: UTF-8\nCharset: UTF-8\n\n\nWrapper version: 3.5.16\nServer version: 6.1.26\nServlet version: Jasper JSP 2.1 Engine\nPlatform: Linux amd64 3.7.1-unixpool\nProcessor: Athlon 64 FX Opteron (athlon64)\nJbigi: Locally optimized native BigInteger library loaded from file\nEncoding: UTF-8\nCharset: UTF-8\n\n\n1/30/13 2:10:45 AM ERROR [I2PBoteMain ] org.mortbay.jetty.Server : /configclients\n     java.lang.IllegalStateException\n     at org.mortbay.jetty.servlet.AbstractSessionManager$Session.setAttribute(AbstractSessionManager.java:1054)\n     at net.i2p.router.web.jsp.configclients_jsp._jspService(configclients_jsp.java:429)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)\n     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)\n     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)\n     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)\n     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)\n     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)\n     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)\n     at net.i2p.router.web.LocaleWebAppHandler.handle(LocaleWebAppHandler.java:93)\n     at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)\n     at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)\n     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)\n     at org.mortbay.jetty.Server.handle(Server.java:326)\n     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)\n     at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)\n     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)\n     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)\n     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)\n     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)\n     at java.lang.Thread.run(Thread.java:662)", 
    "reporter": "guest", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1367432975000000", 
    "component": "apps/plugins", 
    "summary": "illegal state when stopping bote plugin", 
    "priority": "minor", 
    "keywords": "i2p-bote, stop, illegal state, jetty", 
    "version": "0.9.4", 
    "time": "2013-01-30T01:19:28", 
    "milestone": "", 
    "owner": "HungryHobo", 
    "type": "defect"
}

Decouple Identities (Trac #1359)

Since I2P-Bote offers you to have different identities, it should make sure those remain unlinkable.
Currently both with manual and automatic mail checking all identities are checked more or less at the same time from the same dest.

To do:

  1. per-identity settings for mail checking (automatic checking on or of, and individual check intervall, plus randomize the times a bit.

  2. per-id manual checking, and a "check all"

  3. if more than one tunnel each way is being used anyway, then why not have them use different dests and thus to the outside world have different virtual bote nodes, and let the user assign the bote id's to tunnel dests being used. (those can be simply called A and B and be in fact transient and change at each startup, it's just about the grouping of ids, in case he has more than dests, but too many id's only slow it down so let's focus on two or three id's only. two could use one of two simultaneously operating dests and a third one could have auto mail check deactivate and only be used when the others are deactivated).
    Receipt confirmations should also be pulled via the respective dest then.

  4. per-identity settings for receipt confirmation, number of relays, and delay per hop, even per-hop different delay intervals.

Migrated from https://trac.i2p2.de/ticket/1359

{
    "status": "accepted", 
    "changetime": "2015-08-05T06:51:10", 
    "description": "Since I2P-Bote offers you to have different identities, it should make sure those remain unlinkable.\nCurrently both with manual and automatic mail checking all identities are checked more or less at the same time from the same dest.\n\nTo do:\n1) per-identity settings for mail checking (automatic checking on or of, and individual check intervall, plus randomize the times a bit. \n\n2) per-id manual checking, and a \"check all\"\n\n3) if more than one tunnel each way is being used anyway, then why not have them use different dests and thus to the outside world have different virtual bote nodes, and let the user assign the bote id's to tunnel dests being used. (those can be simply called A and B and be in fact transient and change at each startup, it's just about the grouping of ids, in case he has more than dests, but too many id's only slow it down so let's focus on two or three id's only. two could use one of two simultaneously operating dests and a third one could have auto mail check deactivate and only be used when the others are deactivated).\nReceipt confirmations should also be pulled via the respective dest then.\n\n\n2) per-identity settings for receipt confirmation, number of relays, and delay per hop, even per-hop different delay intervals.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1438757470347084", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote, decouple Identities", 
    "priority": "minor", 
    "keywords": "I2P-Bote privacy usability", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-08-24T23:01:11", 
    "milestone": "eventually", 
    "owner": "str4d", 
    "type": "enhancement"
}

High tunnel count (Trac #926)

I had an unexpectedly high tunnel count in the latest version of i2p. The logs mention low bandwidth availability, but since i2p was the only thing running i doubt that this is in fact the case. A soft restart fixed it fine.

Migrated from https://trac.i2p2.de/ticket/926

{
    "status": "assigned", 
    "changetime": "2016-08-05T15:05:21", 
    "description": "I had an unexpectedly high tunnel count in the latest version of i2p. The logs mention low bandwidth availability, but since i2p was the only thing running i doubt that this is in fact the case. A soft restart fixed it fine.", 
    "reporter": "guest", 
    "cc": "HungryHobo", 
    "resolution": "", 
    "_ts": "1470409521135942", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: High tunnel count", 
    "priority": "minor", 
    "keywords": "I2P-Bote hang", 
    "version": "0.9.5", 
    "parents": "", 
    "time": "2013-04-28T21:39:27", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "defect"
}

Network Status Page NullPointerException`

Please report bugs on trac.i2p2.i2p or trac.i2p2.de.

Please include this information in bug reports:

I2P version: 0.9.26-0-1~deb8u+1
Java version: Oracle Corporation 1.8.0_40-internal (OpenJDK Runtime Environment 1.8.0_40-internal-b04)
Wrapper version: 3.5.22
Server version: 8.1.16.v20140903
Servlet version: Jasper JSP 2.1 Engine
JSTL version: standard-taglib 1.2.0
Platform: Linux arm 4.4.14-v7+
Processor: (armcortexa7)
Jbigi: Locally optimized native BigInteger library loaded from file
Jbigi version: 2
GMP version: unknown
Encoding: UTF-8
Charset: UTF-8
Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.
HTTP ERROR 500

Problem accessing /i2pbote/network.jsp. Reason:

    Server Error
Caused by:

java.lang.NullPointerException
    at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
    at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
    at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
    at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:776)
    at sun.font.SunFontManager$2.run(SunFontManager.java:431)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.SunFontManager.<init>(SunFontManager.java:376)
    at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
    at sun.reflect.GeneratedConstructorAccessor32.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at java.lang.Class.newInstance(Class.java:433)
    at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
    at sun.font.SunFontManager.getInstance(SunFontManager.java:250)
    at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:264)
    at sun.java2d.SunGraphics2D.getFontMetrics(SunGraphics2D.java:855)
    at org.jfree.text.G2TextMeasurer.getStringWidth(G2TextMeasurer.java:79)
    at org.jfree.text.TextUtilities.nextLineBreak(TextUtilities.java:306)
    at org.jfree.text.TextUtilities.createTextBlock(TextUtilities.java:247)
    at org.jfree.chart.title.TextTitle.arrangeRR(TextTitle.java:628)
    at org.jfree.chart.title.TextTitle.arrange(TextTitle.java:496)
    at org.jfree.chart.JFreeChart.drawTitle(JFreeChart.java:1311)
    at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1203)
    at org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java:1399)
    at org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java:1379)
    at org.jfree.chart.ChartUtilities.writeChartAsPNG(ChartUtilities.java:184)
    at org.jfree.chart.ChartUtilities.saveChartAsPNG(ChartUtilities.java:310)
    at org.jfree.chart.servlet.ServletUtilities.saveChartAsPNG(ServletUtilities.java:183)
    at org.jfree.chart.servlet.ServletUtilities.saveChartAsPNG(ServletUtilities.java:148)
    at i2p.bote.web.PeerInfoTag.createDhtChart(PeerInfoTag.java:196)
    at i2p.bote.web.PeerInfoTag.doTag(PeerInfoTag.java:78)
    at i2p.bote.jsp.network_jsp._jspx_meth_ib_005fpeerInfo_005f0(network_jsp.java:304)
    at i2p.bote.jsp.network_jsp._jspx_meth_c_005fotherwise_005f0(network_jsp.java:260)
    at i2p.bote.jsp.network_jsp._jspx_meth_c_005fchoose_005f0(network_jsp.java:166)
    at i2p.bote.jsp.network_jsp._jspService(network_jsp.java:84)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
    at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)
    at net.i2p.servlet.filters.XSSFilter.doFilter(XSSFilter.java:28)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1088)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1022)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)
Powered by Jetty://

subscriptions for Bote (Trac #1468)

It would be very nice to have subscriptions for Bote, so that you can subscribe to publications by other users. Those post something that can be read by all subscribed users.

Migrated from https://trac.i2p2.de/ticket/1468

{
    "status": "closed", 
    "changetime": "2015-02-18T15:21:49", 
    "description": "It would be very nice to have subscriptions for Bote, so that you can subscribe to publications by other users. Those post something that can be read by all subscribed users.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "invalid", 
    "_ts": "1424272909052156", 
    "component": "apps/plugins", 
    "summary": "subscriptions for Bote", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-02-08T22:34:44", 
    "milestone": "undecided", 
    "owner": "", 
    "type": "enhancement"
}

i2pbote delay: per ID and pre message [0.02 BTC] (Trac #1451)

( I offer small tip of 0.01 Bitcoin - so a beer at current prices - for who ever implements this, e.g. from
https://blockchain.info/address/152fnfBqRjVMDvRa5LQ2upx9tJAeHnyqHC )

To not repeat security mistakes of Freemail, FMS we need better random-delay settings.

No setting should be global, as it lowers security somewhat by correlating all your IDs if you use nonstandard settings.

  • number of hops to use
  • random delay at each hop min..max time
  • frequency of checking for new mail

This should be configured for each identity (on creation of identity, with default value taken from the current global settings)

Also, when composing a new message, it should again ask for settings related to sending:

  • hops
  • delay at each hop

To not require user to have javascript, I propose adding following options:

From [ ..... ] (the same as it exists now)
Security: number of hops: [x] use default for selected sender,
... or deselect above checkbox and select value here: [...]
Security: delay at each hop: [x] use default for selected sender,
... or deselect above checkbox and select value here: min [...] max [...] minutes


PART B, additional 0.01 BTC:

ALSO, few details about delay of "cronjobs" - especially the "check email" action:
For each account, where T is the configured time of action, e.g. 10 minutes for "check email each 10 minutes":
and L option:
Sometimes pretend to be offline for up to .... hours to make others confused about when your computer is online.

  1. At start, job should delay random(T0 to T2)
  2. After running the check, job should schedule next run, to be randomly between time from now
    sleeptime = random(T0.5 to T1.5)
    if random(0..100) is < 30 then sleeptime += randomGauss(0 to L/5)
    if random(0..100) is < 10 then sleeptime += randomGauss(0 to L)

choose the scheduled time: ID.nextrun = now() + sleeptime

OTHER IDEA (for future)

Add options
[ ] fake random timezone (can delay actions like message check or send for up to 1 day)

on ID creation set ID.timezone
choose a random timezone, based on amount of darknet users in given timezone, including at least:
all USA time zones separately, USA Eastern, USA Pacific, .... , Timezones for Europea, Timezones for Russia
at least 10 timezones, with weighted probability correlating to say number of tor users or something.

Now look at ID.nextrun scheduled in previous points.
Convert it to a day, in the ID.timezone.

If (ID.behaviour == type1) then
start = hour 8:00 of that day // wake up
end = hour 23:00 of that day // go to sleep

If ID.nextrun < start, then ID.nextrun = start; // wait until user "wakes up"
if ID.nextrun > end, then change to next day, and run algorightm again // user sleeps already

if time was changed as above, then add random(0,T*0.1) + randomGauss(0.5,1.5)

(Future idea: take into account: other pattern (only in morning and evening, not "in work"),
and randomly based on ID.skipwork chance (e.g. 1%) use other behaviour)

Make above scheduling be used for checking messages, but also to sending messages (otherwise they are placed in a queue, with a checkbox to bypass fake timezone on message composing)

Migrated from https://trac.i2p2.de/ticket/1451

{
    "status": "closed", 
    "changetime": "2015-01-30T13:03:06", 
    "description": "( I offer small tip of 0.01 Bitcoin - so a beer at current prices - for who ever implements this, e.g. from\nhttps://blockchain.info/address/152fnfBqRjVMDvRa5LQ2upx9tJAeHnyqHC )\n\nTo not repeat security mistakes of Freemail, FMS we need better random-delay settings.\n\nNo setting should be global, as it lowers security somewhat by correlating all your IDs if you use nonstandard settings.\n\n- number of hops to use\n- random delay at each hop min..max time\n- frequency of checking for new mail\n\nThis should be configured for each identity (on creation of identity, with default value taken from the current global settings)\n\nAlso, when composing a new message, it should again ask for settings related to sending:\n- hops\n- delay at each hop\n\nTo not require user to have javascript, I propose adding following options:\n\nFrom [ ..... ]  (the same as it exists now)\nSecurity: number of hops: [x] use default for selected sender,\n... or deselect above checkbox and select value here: [...]\nSecurity: delay at each hop: [x] use default for selected sender,\n... or deselect above checkbox and select value here: min [...] max [...] minutes\n\n--------------------------------------------------------------------------------------\n\nPART B, additional 0.01 BTC:\n\n\nALSO, few details about delay of \"cronjobs\" - especially the \"check email\" action:\nFor each account, where T is the configured time of action, e.g. 10 minutes for \"check email each 10 minutes\":\nand L option:\nSometimes pretend to be offline for up to .... hours to make others confused about when your computer is online.\n\n1) At start, job should delay random(T*0 to T*2)\n2) After running the check, job should schedule next run, to be randomly between time from now \n  sleeptime = random(T*0.5 to T*1.5) \n  if random(0..100) is < 30 then sleeptime += randomGauss(0 to L/5)\n  if random(0..100) is < 10 then sleeptime += randomGauss(0 to L)\n\nchoose the scheduled time: ID.nextrun = now() + sleeptime\n\n\n\n\n3)\nOTHER IDEA (for future)\n\nAdd options \n[ ] fake random timezone (can delay actions like message check or send for up to 1 day)\n\non ID creation set ID.timezone \nchoose a random timezone, based on amount of darknet users in given timezone, including at least:\nall USA time zones separately, USA Eastern, USA Pacific, .... , Timezones for Europea, Timezones for Russia \nat least 10 timezones, with weighted probability correlating to say number of tor users or something.\n\nNow look at ID.nextrun scheduled in previous points.\nConvert it to a day, in the ID.timezone.\n\nIf (ID.behaviour == type1) then\nstart = hour 8:00 of that day // wake up\nend = hour 23:00 of that day // go to sleep\n\nIf ID.nextrun < start, then ID.nextrun = start; // wait until user \"wakes up\"\nif ID.nextrun > end, then change to next day, and run algorightm again // user sleeps already\n\nif time was changed as above, then add random(0,T*0.1) + randomGauss(0.5,1.5)\n\n(Future idea: take into account: other pattern (only in morning and evening, not \"in work\"),\nand randomly based on ID.skipwork chance (e.g. 1%) use other behaviour)\n\nMake above scheduling be used for checking messages, but also to sending messages (otherwise they are placed in a queue, with a checkbox to bypass fake timezone on message composing)\n\n\n\n\n\n\n\n", 
    "reporter": "rfree", 
    "cc": "", 
    "resolution": "duplicate", 
    "_ts": "1422622986247309", 
    "component": "apps/plugins", 
    "summary": "i2pbote delay: per ID and pre message [0.02 BTC]", 
    "priority": "obsolete", 
    "keywords": "I2P-Bote", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-01-30T12:19:23", 
    "milestone": "undecided", 
    "owner": "", 
    "type": "enhancement"
}

Improve Kademlia peer management (Trac #1357)

old unresponsive peers should be expulsed from the list as the lock up much, while active peers be exchanged between connected peers and also if an unknown peer connects to you, you save his info.

ref: http://forum.i2p/viewtopic.php?t=11477

normal kad is about finding files n downloading a file from a source that we have no influence on whether it goes off or stays on. In Bote we cannot influence the other's behaviour either, but there's a difference: we don't want their files, we want to upload ours, so some better profiling of reliability of kad peers (storage nodes)should take place, this could greatly improve reliability without raising redundancy.
Yet for obvious reasons not exclusively the best performing nodes should be chosen, but alwaays have a small margin of "normal" ones too.
profiling factors could be general reachability/responsiveness, received own mails (so they do not block my dest), and received receipt confirmations (so they do not block/censor the destinataries), automated test mails, overall uptime (time we know the node). Sounds easier than it is, though. If only one of my destinataries is blocked, the mails to others will still arrive and I'll get receipt confs for them and hence a positive evaluation of the storage node, even though it misbehaves. Maybe if another storage node gives me the confirmation and the one in question is closer to the key and does not, then punish strongly - not an immediate ban, but a quite noticeable punishment.

Migrated from https://trac.i2p2.de/ticket/1357

{
    "status": "assigned", 
    "changetime": "2017-01-15T15:28:10", 
    "description": "old unresponsive peers should be expulsed from the list as the lock up much, while active peers be exchanged between connected peers and also if an unknown peer connects to you, you save his info.\n\nref: http://forum.i2p/viewtopic.php?t=11477\n\nnormal kad is about finding files n downloading a file from a source that we have no influence on whether it goes off or stays on. In Bote we cannot influence the other's behaviour either, but there's a difference: we don't want their files, we want to upload ours, so some better profiling of reliability of kad peers (storage nodes)should take place, this could greatly improve reliability without raising redundancy. \nYet for obvious reasons not exclusively the best performing nodes should be chosen, but alwaays have a small margin of \"normal\" ones too. \nprofiling factors could be general reachability/responsiveness, received own mails (so they do not block my dest), and received receipt confirmations (so they do not block/censor the destinataries), automated test mails, overall uptime (time we know the node). Sounds easier than it is, though. If only one of my destinataries is blocked, the mails to others will still arrive and I'll get receipt confs for them and hence a positive evaluation of the storage node, even though it misbehaves. Maybe if another storage node gives me the confirmation and the one in question is closer to the key and does not, then punish strongly - not an immediate ban, but a quite noticeable punishment.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484494090875098", 
    "component": "apps/plugins", 
    "summary": "Bote peer management", 
    "priority": "minor", 
    "keywords": "I2P-Bote performance", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-08-24T22:23:37", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "enhancement"
}

Retrieve sent messages from DHT

It would be nice if one could retrieve the sent messages from the DHT. That way the PC and Android client could sync their Sent folders.

This would require them to be encrypted with both the sender's and receiver's keys (as in PGP).

Excessive logging by I2P-Bote (Trac #696)

Historiques du routeur (configuration)
Emplacement du fichier: C:\Program Files\I2P\PortableApps\i2p\i2p.\logs\log-router-1.txt

18/08/12 14:40:58 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     java.net.NoRouteToHostException: Connection timed out
     at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:252)
     at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:271)
     at i2p.bote.network.I2PSendQueue.sendStream(I2PSendQueue.java:284)
     at i2p.bote.network.I2PSendQueue.send(I2PSendQueue.java:254)
     at i2p.bote.network.I2PSendQueue.doStep(I2PSendQueue.java:207)
     at i2p.bote.service.I2PBoteThread.run(I2PBoteThread.java:77)
18/08/12 14:40:51 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)
18/08/12 14:39:50 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:37:50 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)
18/08/12 14:37:49 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:36:54 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:35:48 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)
18/08/12 14:35:48 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:33:47 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)
18/08/12 14:33:47 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:32:32 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     java.net.NoRouteToHostException: Connection timed out
     at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:252)
     at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:271)
     at i2p.bote.network.I2PSendQueue.sendStream(I2PSendQueue.java:284)
     at i2p.bote.network.I2PSendQueue.send(I2PSendQueue.java:254)
     at i2p.bote.network.I2PSendQueue.doStep(I2PSendQueue.java:207)
     at i2p.bote.service.I2PBoteThread.run(I2PBoteThread.java:77)
18/08/12 14:31:47 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)
18/08/12 14:31:47 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:30:54 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:29:46 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)
18/08/12 14:28:46 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:26:45 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)
18/08/12 14:26:45 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:25:54 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.
18/08/12 14:24:44 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.
     net.i2p.client.I2PSessionException: Already closed
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)
     at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)
     at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)

Migrated from https://trac.i2p2.de/ticket/696

{
    "status": "closed", 
    "changetime": "2012-08-19T23:32:53", 
    "description": "Historiques du routeur (configuration)\nEmplacement du fichier: C:\\Program Files\\I2P\\PortableApps\\i2p\\i2p\\.\\logs\\log-router-1.txt\n\n    18/08/12 14:40:58 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         java.net.NoRouteToHostException: Connection timed out\n         at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:252)\n         at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:271)\n         at i2p.bote.network.I2PSendQueue.sendStream(I2PSendQueue.java:284)\n         at i2p.bote.network.I2PSendQueue.send(I2PSendQueue.java:254)\n         at i2p.bote.network.I2PSendQueue.doStep(I2PSendQueue.java:207)\n         at i2p.bote.service.I2PBoteThread.run(I2PBoteThread.java:77)\n    18/08/12 14:40:51 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n    18/08/12 14:39:50 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:37:50 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n    18/08/12 14:37:49 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:36:54 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:35:48 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n    18/08/12 14:35:48 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:33:47 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n    18/08/12 14:33:47 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:32:32 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         java.net.NoRouteToHostException: Connection timed out\n         at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:252)\n         at net.i2p.client.streaming.I2PSocketManagerFull.connect(I2PSocketManagerFull.java:271)\n         at i2p.bote.network.I2PSendQueue.sendStream(I2PSendQueue.java:284)\n         at i2p.bote.network.I2PSendQueue.send(I2PSendQueue.java:254)\n         at i2p.bote.network.I2PSendQueue.doStep(I2PSendQueue.java:207)\n         at i2p.bote.service.I2PBoteThread.run(I2PBoteThread.java:77)\n    18/08/12 14:31:47 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n    18/08/12 14:31:47 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:30:54 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:29:46 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n    18/08/12 14:28:46 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:26:45 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n    18/08/12 14:26:45 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:25:54 ERROR [Kademlia ] ademlia.ClosestNodesLookupTask: Lookup for closest nodes timed out.\n    18/08/12 14:24:44 ERROR [I2PSendQueue] i2p.bote.network.I2PSendQueue : Can't send packet.\n         net.i2p.client.I2PSessionException: Already closed\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:196)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:175)\n         at net.i2p.client.I2PSessionMuxedImpl.sendMessage(I2PSessionMuxedImpl.java:128)\n         at i2p.bote.network.I2PSendQueue.run(I2PSendQueue.java:225)\n", 
    "reporter": "guest3113", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1345419173000000", 
    "component": "apps/plugins", 
    "summary": "Excessive logging by I2P-Bote", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.1", 
    "time": "2012-08-18T12:59:34", 
    "milestone": "0.9.2", 
    "owner": "", 
    "type": "defect"
}

Plugin crashes router / JVM on some systems (Trac #1241)

Installing the Bote plugin causes the I2P router and/or JVM to crash for some combinations of JRE and OS (but not all - I have never had this problem). Anyone who encounters this problem, please post the information from the top of http://127.0.0.1:7657/logs, along with any crash reports or logs.

Similar to #13, but probably not related.

Migrated from https://trac.i2p2.de/ticket/1241

{
    "status": "assigned", 
    "changetime": "2017-01-15T15:28:50", 
    "description": "Installing the Bote plugin causes the I2P router and/or JVM to crash for some combinations of JRE and OS (but not all - I have never had this problem). Anyone who encounters this problem, please post the information from the top of http://127.0.0.1:7657/logs, along with any crash reports or logs.\n\nSimilar to #926, but probably not related.", 
    "reporter": "str4d", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484494130296015", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: Crashes router / JVM on some systems", 
    "priority": "major", 
    "keywords": "I2P-Bote heisenbug", 
    "version": "0.9.12", 
    "parents": "", 
    "time": "2014-04-03T03:50:19", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "defect"
}

Local DoS with certain passwords, #2 (Trac #1404)

This borderlines major/critical. Marking as critical since Bote is now 50% useless without a restored backup. To my joy, this was not on my dev machine >:-|

Summary:
After attempting to change a working password to a blank password (nothing entered in the "New password" and "Confirm:" fields) and subsequently clearing the password cache of the working password, any further attempts to access Bote /folder.jsp?path=Trash or /folder.jsp?path=Trash ("Sent" or "Trash") messages results in local DoS (500 page). Unless a full ~/i2pbote restore is made, Bote "Sent" and "Trash" messages appear to be completely inaccessible.

To reproduce:

  1. Go directly to settings and try to change to blank password
  2. Clear password cache (key icon on top right)
  3. Click on "Sent" or "Trash" and authenticate with old working password
  4. Also click on "Inbox" and "Outbox" for comparison

Notes:
"Invalid header bytes: [0, 0, 0, 0], expected: [73, 66, 101, 102]" is returned after attempting to change the password from a working one to a blank one. The new blank password is never accepted and any attempts to enter a blank password (when authenticating) will return "Wrong password. Try again."

Restarting the router has no effect. Reinstalling the plugin has no effect. AFAIK, only a full ~/i2pbote restore of a working backup will restore complete functionality.

Migrated from https://trac.i2p2.de/ticket/1404

{
    "status": "assigned", 
    "changetime": "2017-01-15T13:57:05", 
    "description": "This borderlines major/critical. Marking as critical since Bote is now 50% useless without a restored backup. To my joy, this was *not* on my dev machine >:-|\n\nSummary:\nAfter attempting to change a working password to a blank password (nothing entered in the \"New password\" and \"Confirm:\" fields) and subsequently clearing the password cache of the *working* password, any further attempts to access Bote /folder.jsp?path=Trash or /folder.jsp?path=Trash (\"Sent\" or \"Trash\") messages results in local DoS (500 page). Unless a full ~/i2pbote restore is made, Bote \"Sent\" and \"Trash\" messages appear to be completely inaccessible.\n\nTo reproduce:\n1) Go directly to settings and try to change to blank password\n2) Clear password cache (key icon on top right)\n3) Click on \"Sent\" or \"Trash\" and authenticate with old *working* password\n4) Also click on \"Inbox\" and \"Outbox\" for comparison\n\nNotes:\n\"Invalid header bytes: [0, 0, 0, 0], expected: [73, 66, 101, 102]\" is returned after attempting to change the password from a working one to a blank one. The new blank password is never accepted and any attempts to enter a blank password (when authenticating) will return \"Wrong password. Try again.\"\n \nRestarting the router has no effect. Reinstalling the plugin has no effect. AFAIK, only a full ~/i2pbote restore of a working backup will restore complete functionality.", 
    "reporter": "ihave2p", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484488625549282", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: local DoS with certain passwords, #2", 
    "priority": "critical", 
    "keywords": "I2P-Bote", 
    "version": "0.9.15", 
    "parents": "1382", 
    "time": "2014-10-31T13:08:34", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "defect"
}

I2P-Bote ConcurrentModificationException (Trac #1586)

I2P running since 15 hours. I did not have this issue before using 0.9.19-31 (I used 0.9.19-30 before).

I2P version: 0.9.19-31-rc
Java version: Oracle Corporation 1.7.0_79 (OpenJDK Runtime Environment 1.7.0_79-b14)
Wrapper version: 3.5.25
Server version: 8.1.17.v20150415
Servlet version: Jasper JSP 2.1 Engine
Platform: Linux amd64 3.13.0-37-generic
Jbigi: Locally optimized library libjbigi-linux-athlon64_64.so loaded from file
Encoding: UTF-8
Charset: UTF-8

28/05/15 15:55:39 ERROR [e Jetty-2157] i2p.bote.service.EmailChecker : Error while checking whether new mail has arrived.
java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:202)
at i2p.bote.service.EmailChecker.newMailReceived(EmailChecker.java:158)
at i2p.bote.I2PBote.newMailReceived(I2PBote.java:566)
at i2p.bote.util.GeneralHelper.isNewMailReceived(GeneralHelper.java:330)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:83)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
at org.apache.el.parser.AstValue.getValue(AstValue.java:123)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:182)
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:919)
at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f8(buttonFrame_jsp.java:824)
at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f4(buttonFrame_jsp.java:423)
at i2p.bote.jsp.buttonFrame_jsp._jspService(buttonFrame_jsp.java:115)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:202)
at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:131)
at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:61)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
... 1 more
Caused by: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at i2p.bote.network.kademlia.BucketManager.getAllUnlockedPeers(BucketManager.java:267)
at i2p.bote.network.kademlia.ClosestNodesLookupTask.call(ClosestNodesLookupTask.java:106)
at i2p.bote.network.kademlia.KademliaDHT.getClosestNodes(KademliaDHT.java:179)
at i2p.bote.network.kademlia.KademliaDHT.find(KademliaDHT.java:262)
at i2p.bote.network.kademlia.KademliaDHT.findAll(KademliaDHT.java:189)
at i2p.bote.network.CheckEmailTask$EmailPacketTask.run(CheckEmailTask.java:201)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
... 4 more
28/05/15 05:10:39 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p

Migrated from https://trac.i2p2.de/ticket/1586

{
    "status": "closed", 
    "changetime": "2016-11-27T02:27:01", 
    "description": "I2P running since 15 hours. I did not have this issue before using 0.9.19-31 (I used 0.9.19-30 before).\n\nI2P version: 0.9.19-31-rc\nJava version: Oracle Corporation 1.7.0_79 (OpenJDK Runtime Environment 1.7.0_79-b14)\nWrapper version: 3.5.25\nServer version: 8.1.17.v20150415\nServlet version: Jasper JSP 2.1 Engine\nPlatform: Linux amd64 3.13.0-37-generic\nJbigi: Locally optimized library libjbigi-linux-athlon64_64.so loaded from file\nEncoding: UTF-8\nCharset: UTF-8\n\n28/05/15 15:55:39 ERROR [e Jetty-2157] i2p.bote.service.EmailChecker : Error while checking whether new mail has arrived.\n     java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException\n     at java.util.concurrent.FutureTask.report(FutureTask.java:122)\n     at java.util.concurrent.FutureTask.get(FutureTask.java:202)\n     at i2p.bote.service.EmailChecker.newMailReceived(EmailChecker.java:158)\n     at i2p.bote.I2PBote.newMailReceived(I2PBote.java:566)\n     at i2p.bote.util.GeneralHelper.isNewMailReceived(GeneralHelper.java:330)\n     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n     at java.lang.reflect.Method.invoke(Method.java:606)\n     at javax.el.BeanELResolver.getValue(BeanELResolver.java:83)\n     at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)\n     at org.apache.el.parser.AstValue.getValue(AstValue.java:123)\n     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:182)\n     at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:919)\n     at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f8(buttonFrame_jsp.java:824)\n     at i2p.bote.jsp.buttonFrame_jsp._jspx_meth_c_005fif_005f4(buttonFrame_jsp.java:423)\n     at i2p.bote.jsp.buttonFrame_jsp._jspService(buttonFrame_jsp.java:115)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)\n     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)\n     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)\n     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)\n     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)\n     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)\n     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)\n     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)\n     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n     at org.eclipse.jetty.server.Server.handle(Server.java:370)\n     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)\n     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)\n     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)\n     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)\n     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)\n     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)\n     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)\n     at java.lang.Thread.run(Thread.java:745)\n     Caused by: java.util.concurrent.ExecutionException: java.util.ConcurrentModificationException\n     at java.util.concurrent.FutureTask.report(FutureTask.java:122)\n     at java.util.concurrent.FutureTask.get(FutureTask.java:202)\n     at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:131)\n     at i2p.bote.network.CheckEmailTask.call(CheckEmailTask.java:61)\n     at java.util.concurrent.FutureTask.run(FutureTask.java:262)\n     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)\n     ... 1 more\n     Caused by: java.util.ConcurrentModificationException\n     at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)\n     at java.util.ArrayList$Itr.next(ArrayList.java:831)\n     at i2p.bote.network.kademlia.BucketManager.getAllUnlockedPeers(BucketManager.java:267)\n     at i2p.bote.network.kademlia.ClosestNodesLookupTask.call(ClosestNodesLookupTask.java:106)\n     at i2p.bote.network.kademlia.KademliaDHT.getClosestNodes(KademliaDHT.java:179)\n     at i2p.bote.network.kademlia.KademliaDHT.find(KademliaDHT.java:262)\n     at i2p.bote.network.kademlia.KademliaDHT.findAll(KademliaDHT.java:189)\n     at i2p.bote.network.CheckEmailTask$EmailPacketTask.run(CheckEmailTask.java:201)\n     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)\n     ... 4 more\n28/05/15 05:10:39 ERROR [UpdateCheckr] i2p.bote.service.UpdateChecker: Can't check update URL: http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/i2pbote-update.xpi2p\n", 
    "reporter": "hummingbird", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1480213621974567", 
    "component": "apps/other", 
    "summary": "I2P-Bote ConcurrentModificationException", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.19", 
    "parents": "", 
    "time": "2015-05-28T14:41:39", 
    "milestone": "0.9.21", 
    "owner": "HungryHobo", 
    "type": "defect"
}

Half-logged-in (for mail fetching) (Trac #1483)

It would be nice to be able to fetch mails even if the use has password-protected his Bote account and is afk.

str4d, therefore, suggested a state of being "half logged in", as in: the public key is decrypted, thus exposing your identities, while the secret key is not decrypted and thusly emails cannot be decrypted.

from irc:
fox@irc2p str4d: has the idea of having a ~/.bote folder with private keys and addrs been thought of?

  • fox@irc2p was setting up i2p and realized multi user bote would be so useful
    str4d@irc2p fox: multi-user Bote would definitely be useful, but impl would be tricky
    str4d@irc2p If done in same Bote instance, users could read each other's mail and use their identities, if no password set
    str4d@irc2p (which would need to be the case if auto-checking was to be done)
    str4d@irc2p But an idea just occurred to me: I wonder if it is possible for I2P-Bote to be in a half-logged-in state, where only the public portion of the EmailIdentities is exposed?
    str4d@irc2p That might be sufficient to download EmailPackets without unencrypting them.
    str4d@irc2p and then they could be decrypted when the user next logs in (which would then fire off the deletion packets)
    user: you couldn't send the deletes then
    user: you'd send the deletes only when the user actually logs in, giving more information about the actual user behaviour
    (for mitigating this, see subticket)

Migrated from https://trac.i2p2.de/ticket/1483

{
    "status": "assigned", 
    "changetime": "2017-01-15T14:09:13", 
    "description": "It would be nice to be able to fetch mails even if the use has password-protected his Bote account and is afk.\n\nstr4d, therefore, suggested a state of being \"half logged in\", as in: the public key is decrypted, thus exposing your identities, while the secret key is not decrypted and thusly emails cannot be decrypted.\n\nfrom irc:\n<fox@irc2p> str4d: has the idea of having a ~/.bote folder with private keys and addrs been thought of?\n* fox@irc2p was setting up i2p and realized multi user bote would be so useful\n<str4d@irc2p> fox: multi-user Bote would definitely be useful, but impl would be tricky\n<str4d@irc2p> If done in same Bote instance, users could read each other's mail and use their identities, if no password set\n<str4d@irc2p> (which would need to be the case if auto-checking was to be done)\n<str4d@irc2p> But an idea just occurred to me: I wonder if it is possible for I2P-Bote to be in a half-logged-in state, where only the public portion of the EmailIdentities is exposed?\n<str4d@irc2p> That might be sufficient to download EmailPackets without unencrypting them.\n<str4d@irc2p> and then they could be decrypted when the user next logs in (which would then fire off the deletion packets)\nuser: you couldn't send the deletes then\nuser: you'd send the deletes only when the user actually logs in, giving more information about the actual user behaviour\n(for mitigating this, see subticket)\n", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484489353166586", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: half-logged-in (for mail fetching)", 
    "priority": "maintenance", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "1482", 
    "time": "2015-03-04T21:22:09", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

IMAP threading broken (Trac #1493)

mails by one user are shown grouped under a bote mail from anonymous sender, in my case. might also occur with other user names, dunno.

Bote 0.2.10

Migrated from https://trac.i2p2.de/ticket/1493

{
    "status": "assigned", 
    "changetime": "2017-01-15T13:58:47", 
    "description": "mails by one user are shown grouped under a bote mail from anonymous sender, in my case. might also occur with other user names, dunno.\n\nBote 0.2.10", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484488727699472", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: IMAP threading broken", 
    "priority": "maintenance", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "", 
    "time": "2015-03-17T18:26:37", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "defect"
}

I2PBote Can't create a FolderElement from file (Trac #1196)

Also: "After merging, IndexPacket is too big for a datagram"
reported by 'kuri79'


Hello Zzz,

I use I2P-Bote since mid january 2014. Since the end of january I get some strange issues in the GUI (ie: when I delete a message I get a inconsistent message).

I'm not sure if this may be added into http://trac.i2p2.i2p/
so I email you, I attach you these logs file.

If you wish more informations, ask me.

My I2P version : 0.9.10


31/01/14 00:27:04 ERROR [ote https://trac.i2p2.de/ticket/4700]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442
31/01/14 00:27:02 ??? 4 similar messages omitted ???
    
31/01/14 00:26:58 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)
     java.io.FileNotFoundException: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier spรฉcifiรฉ est introuvable)
     at java.io.FileInputStream.open(Native Method)
     at java.io.FileInputStream.<init>(Unknown Source)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)
     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)
     at i2p.bote.folder.Folder$3.next(Folder.java:145)
     at i2p.bote.folder.Folder.getElements(Folder.java:111)
     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)
     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     at java.lang.reflect.Method.invoke(Unknown Source)
     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)
     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)
     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)
     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:445)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:574)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:293)
     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:120)
     at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709)
     at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680)
     at i2p.bote.jsp.index_jsp._jspService(index_jsp.java:55)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)
     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
     at org.eclipse.jetty.server.Server.handle(Server.java:369)
     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)
     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)
     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
     at java.lang.Thread.run(Unknown Source)
31/01/14 00:26:46 ??? 1 similar message omitted ???
    
31/01/14 00:26:35 ??? 1 similar message omitted ???
    
31/01/14 00:25:41 ??? 2 similar messages omitted ???
    
31/01/14 00:25:11 ??? 1 similar message omitted ???
    
31/01/14 00:24:50 ERROR [ote https://trac.i2p2.de/ticket/4700]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442
31/01/14 00:24:49 ??? 1 similar message omitted ???
    
31/01/14 00:24:49 ERROR [DeliveryChkr] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\sent\yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy.mail (file size=1681)
     java.io.FileNotFoundException: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\sent\yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy.meta (Le fichier spรฉcifiรฉ est introuvable)
     at java.io.FileInputStream.open(Native Method)
     at java.io.FileInputStream.<init>(Unknown Source)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)
     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)
     at i2p.bote.folder.Folder$3.next(Folder.java:145)
     at i2p.bote.service.DeliveryChecker.run(DeliveryChecker.java:78)
31/01/14 00:24:41 ??? 1 similar message omitted ???






30/01/14 07:56:01 ??? 3 similar messages omitted ???
    
30/01/14 07:55:20 ??? 2 similar messages omitted ???
    
30/01/14 07:55:04 ??? 2 similar messages omitted ???
    
30/01/14 07:54:21 ERROR [te https://trac.i2p2.de/ticket/29455]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=44986
30/01/14 07:54:01 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)
     java.io.FileNotFoundException: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier spรฉcifiรฉ est introuvable)
     at java.io.FileInputStream.open(Native Method)
     at java.io.FileInputStream.<init>(Unknown Source)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)
     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)
     at i2p.bote.folder.Folder$3.next(Folder.java:145)
     at i2p.bote.folder.Folder.getElements(Folder.java:111)
     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)
     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)
     at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     at java.lang.reflect.Method.invoke(Unknown Source)
     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)
     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)
     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)
     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:445)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:574)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:293)
     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:120)
     at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709)
     at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680)
     at i2p.bote.jsp.index_jsp._jspService(index_jsp.java:55)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)
     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
     at org.eclipse.jetty.server.Server.handle(Server.java:369)
     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)
     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)
     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
     at java.lang.Thread.run(Unknown Source)
30/01/14 07:53:54 ??? 2 similar messages omitted ???
    
30/01/14 07:53:29 ??? 1 similar message omitted ???
    
30/01/14 07:53:25 ERROR [te https://trac.i2p2.de/ticket/29455]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442
30/01/14 07:53:13 ??? 3 similar messages omitted ???
    
30/01/14 07:53:08 ??? 4 similar messages omitted ???
    
30/01/14 07:52:56 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)
     java.io.FileNotFoundException: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier spรฉcifiรฉ est introuvable)
     at java.io.FileInputStream.open(Native Method)
     at java.io.FileInputStream.<init>(Unknown Source)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)
     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)
     at i2p.bote.folder.Folder$3.next(Folder.java:145)
     at i2p.bote.folder.Folder.getElements(Folder.java:111)
     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)
     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)
     at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     at java.lang.reflect.Method.invoke(Unknown Source)
     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)
     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)
     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)
     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)
     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
     at org.eclipse.jetty.server.Server.handle(Server.java:369)
     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)
     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)
     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
     at java.lang.Thread.run(Unknown Source)
30/01/14 07:52:39 ??? 1 similar message omitted ???
    
30/01/14 07:52:12 ERROR [te https://trac.i2p2.de/ticket/29455]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442
30/01/14 07:52:00 ??? 3 similar messages omitted ???
    
30/01/14 07:51:51 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)
     java.io.FileNotFoundException: C:\Users\NameOfTheUser\AppData\Roaming\I2P\i2pbote\inbox\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier spรฉcifiรฉ est introuvable)
     at java.io.FileInputStream.open(Native Method)
     at java.io.FileInputStream.<init>(Unknown Source)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)
     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)
     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)
     at i2p.bote.folder.Folder$3.next(Folder.java:145)
     at i2p.bote.folder.Folder.getElements(Folder.java:111)
     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)
     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)
     at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     at java.lang.reflect.Method.invoke(Unknown Source)
     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)
     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)
     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)
     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)
     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
     at org.eclipse.jetty.server.Server.handle(Server.java:369)
     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)
     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)
     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
     at java.lang.Thread.run(Unknown Source)
30/01/14 07:51:45 ??? 1 similar message omitted ???
    
30/01/14 07:51:24 ??? 2 similar messages omitted ???

Migrated from https://trac.i2p2.de/ticket/1196

{
    "status": "closed", 
    "changetime": "2016-11-27T02:25:15", 
    "description": "Also: \"After merging, IndexPacket is too big for a datagram\"\nreported by 'kuri79'\n\n-------------------------\n\nHello Zzz,\n\nI use I2P-Bote since mid january 2014. Since the end of january I get some strange issues in the GUI (ie: when I delete a message I get a inconsistent message).\n\nI'm not sure if this may be added into http://trac.i2p2.i2p/\nso I email you, I attach you these logs file.\n\nIf you wish more informations, ask me.\n\nMy I2P version : 0.9.10\n\n\n{{{\n\n31/01/14 00:27:04 ERROR [ote #4700]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442\n31/01/14 00:27:02 ??? 4 similar messages omitted ???\n    \n31/01/14 00:26:58 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)\n     java.io.FileNotFoundException: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier sp\u00e9cifi\u00e9 est introuvable)\n     at java.io.FileInputStream.open(Native Method)\n     at java.io.FileInputStream.<init>(Unknown Source)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)\n     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)\n     at i2p.bote.folder.Folder$3.next(Folder.java:145)\n     at i2p.bote.folder.Folder.getElements(Folder.java:111)\n     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)\n     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)\n     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)\n     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\n     at java.lang.reflect.Method.invoke(Unknown Source)\n     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)\n     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)\n     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)\n     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)\n     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)\n     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:445)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:574)\n     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)\n     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)\n     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)\n     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)\n     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:293)\n     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:120)\n     at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709)\n     at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680)\n     at i2p.bote.jsp.index_jsp._jspService(index_jsp.java:55)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)\n     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)\n     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)\n     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)\n     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)\n     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)\n     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)\n     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)\n     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n     at org.eclipse.jetty.server.Server.handle(Server.java:369)\n     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)\n     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)\n     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)\n     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)\n     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)\n     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n     at java.lang.Thread.run(Unknown Source)\n31/01/14 00:26:46 ??? 1 similar message omitted ???\n    \n31/01/14 00:26:35 ??? 1 similar message omitted ???\n    \n31/01/14 00:25:41 ??? 2 similar messages omitted ???\n    \n31/01/14 00:25:11 ??? 1 similar message omitted ???\n    \n31/01/14 00:24:50 ERROR [ote #4700]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442\n31/01/14 00:24:49 ??? 1 similar message omitted ???\n    \n31/01/14 00:24:49 ERROR [DeliveryChkr] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\sent\\yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy.mail (file size=1681)\n     java.io.FileNotFoundException: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\sent\\yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy.meta (Le fichier sp\u00e9cifi\u00e9 est introuvable)\n     at java.io.FileInputStream.open(Native Method)\n     at java.io.FileInputStream.<init>(Unknown Source)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)\n     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)\n     at i2p.bote.folder.Folder$3.next(Folder.java:145)\n     at i2p.bote.service.DeliveryChecker.run(DeliveryChecker.java:78)\n31/01/14 00:24:41 ??? 1 similar message omitted ???\n\n\n\n\n\n\n30/01/14 07:56:01 ??? 3 similar messages omitted ???\n    \n30/01/14 07:55:20 ??? 2 similar messages omitted ???\n    \n30/01/14 07:55:04 ??? 2 similar messages omitted ???\n    \n30/01/14 07:54:21 ERROR [te #29455]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=44986\n30/01/14 07:54:01 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)\n     java.io.FileNotFoundException: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier sp\u00e9cifi\u00e9 est introuvable)\n     at java.io.FileInputStream.open(Native Method)\n     at java.io.FileInputStream.<init>(Unknown Source)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)\n     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)\n     at i2p.bote.folder.Folder$3.next(Folder.java:145)\n     at i2p.bote.folder.Folder.getElements(Folder.java:111)\n     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)\n     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)\n     at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)\n     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\n     at java.lang.reflect.Method.invoke(Unknown Source)\n     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)\n     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)\n     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)\n     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)\n     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)\n     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:445)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:574)\n     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)\n     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)\n     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)\n     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)\n     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:293)\n     at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:120)\n     at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709)\n     at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680)\n     at i2p.bote.jsp.index_jsp._jspService(index_jsp.java:55)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)\n     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)\n     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)\n     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)\n     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)\n     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)\n     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)\n     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)\n     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n     at org.eclipse.jetty.server.Server.handle(Server.java:369)\n     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)\n     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)\n     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)\n     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)\n     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)\n     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n     at java.lang.Thread.run(Unknown Source)\n30/01/14 07:53:54 ??? 2 similar messages omitted ???\n    \n30/01/14 07:53:29 ??? 1 similar message omitted ???\n    \n30/01/14 07:53:25 ERROR [te #29455]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442\n30/01/14 07:53:13 ??? 3 similar messages omitted ???\n    \n30/01/14 07:53:08 ??? 4 similar messages omitted ???\n    \n30/01/14 07:52:56 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)\n     java.io.FileNotFoundException: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier sp\u00e9cifi\u00e9 est introuvable)\n     at java.io.FileInputStream.open(Native Method)\n     at java.io.FileInputStream.<init>(Unknown Source)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)\n     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)\n     at i2p.bote.folder.Folder$3.next(Folder.java:145)\n     at i2p.bote.folder.Folder.getElements(Folder.java:111)\n     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)\n     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)\n     at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)\n     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\n     at java.lang.reflect.Method.invoke(Unknown Source)\n     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)\n     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)\n     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)\n     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)\n     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)\n     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)\n     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)\n     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)\n     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)\n     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)\n     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)\n     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n     at org.eclipse.jetty.server.Server.handle(Server.java:369)\n     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)\n     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)\n     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)\n     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)\n     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)\n     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n     at java.lang.Thread.run(Unknown Source)\n30/01/14 07:52:39 ??? 1 similar message omitted ???\n    \n30/01/14 07:52:12 ERROR [te #29455]: ] .bote.folder.IndexPacketFolder: After merging, IndexPacket is too big for a datagram: size=10442\n30/01/14 07:52:00 ??? 3 similar messages omitted ???\n    \n30/01/14 07:51:51 ERROR [onsole Jetty] i2p.bote.folder.Folder : Can't create a FolderElement from file: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mail (file size=1089)\n     java.io.FileNotFoundException: C:\\Users\\NameOfTheUser\\AppData\\Roaming\\I2P\\i2pbote\\inbox\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.meta (Le fichier sp\u00e9cifi\u00e9 est introuvable)\n     at java.io.FileInputStream.open(Native Method)\n     at java.io.FileInputStream.<init>(Unknown Source)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:459)\n     at i2p.bote.folder.EmailFolder.createFolderElement(EmailFolder.java:61)\n     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)\n     at i2p.bote.folder.Folder$3.next(Folder.java:145)\n     at i2p.bote.folder.Folder.getElements(Folder.java:111)\n     at i2p.bote.folder.EmailFolder.getElements(EmailFolder.java:120)\n     at i2p.bote.web.JSPHelper.getEmails(JSPHelper.java:334)\n     at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)\n     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\n     at java.lang.reflect.Method.invoke(Unknown Source)\n     at org.apache.el.parser.AstFunction.getValue(AstFunction.java:110)\n     at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)\n     at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_c_005fforEach_005f0(folder_jsp.java:1822)\n     at i2p.bote.jsp.folder_jsp._jspx_meth_ib_005frequirePassword_005f0(folder_jsp.java:338)\n     at i2p.bote.jsp.folder_jsp._jspService(folder_jsp.java:132)\n     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)\n     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1317)\n     at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)\n     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1288)\n     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:443)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)\n     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)\n     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)\n     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)\n     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)\n     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)\n     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n     at org.eclipse.jetty.server.Server.handle(Server.java:369)\n     at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)\n     at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)\n     at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)\n     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)\n     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)\n     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)\n     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n     at java.lang.Thread.run(Unknown Source)\n30/01/14 07:51:45 ??? 1 similar message omitted ???\n    \n30/01/14 07:51:24 ??? 2 similar messages omitted ???\n}}}", 
    "reporter": "zzz", 
    "cc": "[email protected]", 
    "resolution": "fixed", 
    "_ts": "1480213515019300", 
    "component": "apps/plugins", 
    "summary": "I2PBote Can't create a FolderElement from file", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.10", 
    "parents": "", 
    "time": "2014-02-01T12:03:20", 
    "milestone": "0.9.21", 
    "owner": "str4d", 
    "type": "defect"
}

I2PBote: NPE at shutdown (Trac #1272)

Pulled out of the middle of big log in https://trac.i2p2.de/ticket/1271:

2014/05/09 01:18:13 | Exception in thread "Shutdown task i2p.bote.I2PBote$1" java.lang.NullPointerException
2014/05/09 01:18:13 | at i2p.bote.imap.MapperFactory.stopListening(MapperFactory.java:90)
2014/05/09 01:18:13 | at i2p.bote.imap.ImapService.stop(ImapService.java:207)
2014/05/09 01:18:13 | at i2p.bote.I2PBote.stopImap(I2PBote.java:579)
2014/05/09 01:18:13 | at i2p.bote.I2PBote.stopAllServices(I2PBote.java:796)
2014/05/09 01:18:13 | at i2p.bote.I2PBote.shutDown(I2PBote.java:403)
2014/05/09 01:18:13 | at i2p.bote.I2PBote$1.run(I2PBote.java:173)
2014/05/09 01:18:13 | at java.lang.Thread.run(Unknown Source)

Migrated from https://trac.i2p2.de/ticket/1272

{
    "status": "closed", 
    "changetime": "2015-01-09T07:21:06", 
    "description": "Pulled out of the middle of big log in #1271:\n\n{{{\n2014/05/09 01:18:13 | Exception in thread \"Shutdown task i2p.bote.I2PBote$1\" java.lang.NullPointerException\n2014/05/09 01:18:13 | at i2p.bote.imap.MapperFactory.stopListening(MapperFactory.java:90)\n2014/05/09 01:18:13 | at i2p.bote.imap.ImapService.stop(ImapService.java:207)\n2014/05/09 01:18:13 | at i2p.bote.I2PBote.stopImap(I2PBote.java:579)\n2014/05/09 01:18:13 | at i2p.bote.I2PBote.stopAllServices(I2PBote.java:796)\n2014/05/09 01:18:13 | at i2p.bote.I2PBote.shutDown(I2PBote.java:403)\n2014/05/09 01:18:13 | at i2p.bote.I2PBote$1.run(I2PBote.java:173)\n2014/05/09 01:18:13 | at java.lang.Thread.run(Unknown Source)\n}}}", 
    "reporter": "zzz", 
    "cc": "str4d, user", 
    "resolution": "fixed", 
    "_ts": "1420788066111804", 
    "component": "apps/plugins", 
    "summary": "I2PBote: NPE at shutdown", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.12", 
    "parents": "", 
    "time": "2014-05-09T20:01:12", 
    "milestone": "", 
    "owner": "HungryHobo", 
    "type": "defect"
}

Synchronize sent messages across multiple devices (Trac #1443)

It would be nice if one could retrieve the sent messages from the DHT. That way the PC and Android client could sync their Sent folders.

This would require them to be encrypted with both the sender's and receiver's keys (as in PGP).

Migrated from https://trac.i2p2.de/ticket/1443

{
    "status": "assigned", 
    "changetime": "2016-12-22T11:13:10", 
    "description": "It would be nice if one could retrieve the sent messages from the DHT. That way the PC and Android client could sync their Sent folders.\n\nThis would require them to be encrypted with both the sender's and receiver's keys (as in PGP).\n", 
    "reporter": "dllud", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1482405190699888", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: Synchronize sent messages across multiple devices", 
    "priority": "minor", 
    "keywords": "I2P-Bote usability", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-01-23T19:23:22", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

Bote P2P update mechanism (Trac #1476)

While checking for updates from the eepsite is secure as it is authenticated, it depends on the eepsite being up in the momentt of checking.

It would be desireable not to depend on that at all, and rather get a valid new version from any peer that has it. A valid version is one signed by a trusted developper. this need not even be only one. That way, you can install HH's Bote releases or str4ds without having to insinstall.

A trusted Bote dev could release a a new version by simply giving it a higher version number (to prevent abuse it could even be limited to version= timestamp in unixtime), signing it, and deploying it on one router.

  • Each bote node advertises the version it has, the hash of the update file as a signed record of versionNumber + " " +fileHash + " " + trustedSigner.

  • Each bote node upon receiving an announce from a connected peer checks validity:

if (advertised_timestamp > local_timestamp &&
advertised_timestamp < current_time &&
is_truster(signer) && isAuthentic(record,signer) {
updateFile = getUpdateFile_from_peer();
int i = record.indexOf(" ");
verifiedFileHash = record.substring(i+1, i+1+hashLength);
if (somechecksum(updateFile).equals(verifiedFileHash)) {
installUpdate(updateFile);
}
}

Migrated from https://trac.i2p2.de/ticket/1476

{
    "status": "closed", 
    "changetime": "2015-02-18T19:39:54", 
    "description": "While checking for updates from the eepsite is secure as it is authenticated, it depends on the eepsite being up in the momentt of checking.\n\nIt would be desireable not to depend on that at all, and rather get a valid new version from any peer that has it. A valid version is one signed by a trusted developper. this need not even be only one. That way, you can install HH's Bote releases or str4ds without having to insinstall.\n\nA trusted Bote dev could release a a new version by simply giving it a higher version number (to prevent abuse it could even be limited to version= timestamp in unixtime), signing it, and deploying it on one router.\n\n- Each bote node advertises the version it has, the hash of the update file as a signed record of versionNumber + \" \" +fileHash + \" \" + trustedSigner. \n\n- Each bote node upon receiving an announce from a connected peer checks validity:\n\nif (advertised_timestamp > local_timestamp && \n    advertised_timestamp < current_time &&\n    is_truster(signer) && isAuthentic(record,signer) {\n          updateFile = getUpdateFile_from_peer();\n          int i = record.indexOf(\" \"); \n          verifiedFileHash = record.substring(i+1, i+1+hashLength);\n          if (somechecksum(updateFile).equals(verifiedFileHash)) {\n              installUpdate(updateFile);\n          }\n}\n", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "invalid", 
    "_ts": "1424288394628628", 
    "component": "apps/plugins", 
    "summary": "Bote P2P update mechanism", 
    "priority": "maintenance", 
    "keywords": "I2P-Bote, updater", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-02-18T00:11:41", 
    "milestone": "undecided", 
    "owner": "", 
    "type": "enhancement"
}

Set different delay per hop (Trac #1361)

it would be nice if one could specifiy different delay intervals for the different hops.
Right now, only one globla interval is given and for each hop a random time out of this is chosen.
I'd prefer setting the interval for each hop individually. Then my Bote chooses from the individual intervals the random delay time and instructs the hops with their respective delays.

Migrated from https://trac.i2p2.de/ticket/1361

{
    "status": "assigned", 
    "changetime": "2017-01-15T15:27:44", 
    "description": "it would be nice if one could specifiy different delay intervals for the different hops.\nRight now, only one globla interval is given and for each hop a random time out of this is chosen.\nI'd prefer setting the interval for each hop individually. Then my Bote chooses from the individual intervals the random delay time and instructs the hops with their respective delays.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484494064949773", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote, set different delay per hop", 
    "priority": "trivial", 
    "keywords": "I2P-Bote", 
    "version": "0.9.14.1", 
    "parents": "1359", 
    "time": "2014-08-26T09:45:59", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "enhancement"
}

Randomize check interval (and maybe other cronjobs) (Trac #1360)

trivial.

The intervall for automatic mail checking should be taken as a guideline, not as exact time. Rather should the exact checking time be more random, so to add more entropy.

Migrated from https://trac.i2p2.de/ticket/1360

{
    "status": "assigned", 
    "changetime": "2017-01-15T14:08:34", 
    "description": "trivial.\n\nThe intervall for automatic mail checking should be taken as a guideline, not as exact time. Rather should the exact checking time be more random, so to add more entropy.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484489314604199", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote, randomize check interval (and maybe other cronjobs)", 
    "priority": "minor", 
    "keywords": "I2P-Bote privacy", 
    "version": "0.9.14.1", 
    "parents": "1359", 
    "time": "2014-08-26T09:34:36", 
    "milestone": "eventually", 
    "owner": "str4d", 
    "type": "enhancement"
}

i2p.bote.folder.Folder : Can't create a FolderElement from file (Trac #937)

ERROR [RelayPktSndr] i2p.bote.folder.Folder : Can't create a FolderElement from file: /var/lib/i2p/i2p-config/i2pbote/relay_pkt/[REDACTED].pkt (file size=0)
java.lang.NullPointerException
at i2p.bote.folder.RelayPacketFolder.createFolderElement(RelayPacketFolder.java:79)
at i2p.bote.folder.RelayPacketFolder.createFolderElement(RelayPacketFolder.java:39)
at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)
at i2p.bote.folder.Folder$3.next(Folder.java:145)
at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:106)
at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:90)
at i2p.bote.service.RelayPacketSender.run(RelayPacketSender.java:69)

2 times this error

Migrated from https://trac.i2p2.de/ticket/937

{
    "status": "closed", 
    "changetime": "2015-07-22T21:17:05", 
    "description": "ERROR [RelayPktSndr] i2p.bote.folder.Folder : Can't create a FolderElement from file: /var/lib/i2p/i2p-config/i2pbote/relay_pkt/[REDACTED].pkt (file size=0)\n     java.lang.NullPointerException\n     at i2p.bote.folder.RelayPacketFolder.createFolderElement(RelayPacketFolder.java:79)\n     at i2p.bote.folder.RelayPacketFolder.createFolderElement(RelayPacketFolder.java:39)\n     at i2p.bote.folder.Folder$3.findNextElement(Folder.java:164)\n     at i2p.bote.folder.Folder$3.next(Folder.java:145)\n     at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:106)\n     at i2p.bote.folder.PacketFolder$1.next(PacketFolder.java:90)\n     at i2p.bote.service.RelayPacketSender.run(RelayPacketSender.java:69)\n\n2 times this error", 
    "reporter": "guest", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1437599825195621", 
    "component": "apps/plugins", 
    "summary": "i2p.bote.folder.Folder : Can't create a FolderElement from file", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.5", 
    "parents": "", 
    "time": "2013-05-26T19:44:18", 
    "milestone": "0.9.21", 
    "owner": "str4d", 
    "type": "defect"
}

Uploading files for attachments, importing identies or contacts fails with 500 error on Tails

Deploying I2P Botin in Tails 2.4 causes 500 errors when uploading files. ( stack trace below ) Fails creating temp file in MultiPartFilter.java because tails is a very restricted environment. Possible fix would be to add a setting for the location to write temp files.

HTTP ERROR 500

Problem accessing /i2pbote/newEmail.jsp. Reason:

Server Error

Caused by:

java.io.IOException: Permission denied
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.createTempFile(File.java:2001)
    at java.io.File.createTempFile(File.java:2047)
    at i2p.bote.web.MultipartFilter.processRequest(MultipartFilter.java:160)
    at i2p.bote.web.MultipartFilter.doFilter(MultipartFilter.java:79)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)
    at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)
    at net.i2p.servlet.filters.XSSFilter.doFilter(XSSFilter.java:28)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:745)

Missing public name (Trac #1492)

Sometimes upon replying to a bote mail, in the userName+" wrote: " line there is no name even though the user sent us his public name. In order that to occur the user must not be in our addressbook.
Same happens for those users on 127.0.0.1:7657/i2pbote/folder.jsp?path=Sent in the "To:" column.

Sometimes upon replying to a bote mail, in the userName+" wrote: " line there is no name even though the user sent us his public name. In order that to occur the user must not be in our addressbook.
Same happens for those users on 127.0.0.1:7657/i2pbote/folder.jsp?path=Sent in the "To:" column.

Migrated from https://trac.i2p2.de/ticket/1492

{
    "status": "infoneeded_new", 
    "changetime": "2015-07-23T04:30:57", 
    "description": "Sometimes upon replying to a bote mail, in the userName+\" wrote: \" line there is no name even though the user sent us his public name. In order that to occur the user must not be in our addressbook.\nSame happens for those users on 127.0.0.1:7657/i2pbote/folder.jsp?path=Sent in the \"To:\" column.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1437625857207213", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: missing public name", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "", 
    "time": "2015-03-17T18:23:02", 
    "milestone": "undecided", 
    "owner": "", 
    "type": "defect"
}

Slider value gets saved although cancelled

In Settings -> Bandwidth and network -> Inbound speed:
When you change the slider (=speed) and you click cancel the new value gets saved nevertheless.

Using Android 4.2.2

Locks up entire console (Trac #1260)

Report 1: http://forum.i2p/viewtopic.php?t=11340

Reports 2 and 3 below.

Migrated from https://trac.i2p2.de/ticket/1260

{
    "status": "assigned", 
    "changetime": "2017-01-15T15:30:18", 
    "description": "Report 1: http://forum.i2p/viewtopic.php?t=11340\n\nReports 2 and 3 below.", 
    "reporter": "zzz", 
    "cc": "[email protected]", 
    "resolution": "", 
    "_ts": "1484494218556024", 
    "component": "apps/console", 
    "summary": "I2PBote: Locks up entire console", 
    "priority": "major", 
    "keywords": "I2P-Bote hang", 
    "version": "0.9.12", 
    "parents": "", 
    "time": "2014-05-03T18:57:13", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "defect"
}

Manual bootstrapping (Trac #1490)

especially for android where dropping a file in the config dir is not as esasy as on a PC, but even on PC this should be much more noob-proof and comfortable.

user: str4d: an option to manualy bootstrap Android Bote would be nice. This way users could simply exchange one b32 over irc or forum and with that bootstrap their Bote.
str4d@irc2p Mmm
str4d@irc2p It might also be a necessary feature, as Botedroid can't use Seedless
user: str4d: http://forum.i2p/viewtopic.php?t=11937
str4d@irc2p Or I might just need to update the hardcoded peers list
user: and an easy one.
user: don't see your 'or' as an XOR
str4d@irc2p "easy" - not necessarily. UX needs to be right.
user: sometimes updating hardcoded ones and doing a new release can take some time, whereas if you have both options, users can always find ways ....
user: UX: yes, it should not have to be a long b64.
str4d@irc2p mmm
user: maybe just entering one short address in a line would suffice
str4d@irc2p That's not what I meant
str4d@irc2p There's a lot more than just having a text box to enter a line
user: it should be as easy as copy and paste, easy to find but not in the way
lay: str4d@irc2p Manual bootstrapping is something that nearly every user will have no experience with, because they are used to centralized services.
user: i know. but telling them is not hard. everyone can copy a strong from a forum or a message
str4d@irc2p So in addition to having an actual box, we need to be able to explain what it is and why it is necessary to the user, as well as inform them there is an alternative when issues occur.
str4d@irc2p So while I agree it is a nice idea, I dispute "easy"
str4d@irc2p (You're not the one who has to actually implement it :-P)
user: no one 'has to'
user: and i referred only to the back end as being easy. I guess the rest evolves over time. People ask a question about what something means, and the wording can be changed
str4d@irc2p Regardless, manual bootstrap deserves a ticket.

especially for android where dropping a file in the config dir is not as esasy as on a PC, but even on PC this should be much more noob-proof and comfortable.

user: str4d: an option to manualy bootstrap Android Bote would be nice. This way users could simply exchange one b32 over irc or forum and with that bootstrap their Bote.
str4d@irc2p Mmm
str4d@irc2p It might also be a necessary feature, as Botedroid can't use Seedless
user: str4d: http://forum.i2p/viewtopic.php?t=11937
str4d@irc2p Or I might just need to update the hardcoded peers list
user: and an easy one.
user: don't see your 'or' as an XOR
str4d@irc2p "easy" - not necessarily. UX needs to be right.
user: sometimes updating hardcoded ones and doing a new release can take some time, whereas if you have both options, users can always find ways ....
user: UX: yes, it should not have to be a long b64.
str4d@irc2p mmm
user: maybe just entering one short address in a line would suffice
str4d@irc2p That's not what I meant
str4d@irc2p There's a lot more than just having a text box to enter a line
user: it should be as easy as copy and paste, easy to find but not in the way
lay: str4d@irc2p Manual bootstrapping is something that nearly every user will have no experience with, because they are used to centralized services.
user: i know. but telling them is not hard. everyone can copy a strong from a forum or a message
str4d@irc2p So in addition to having an actual box, we need to be able to explain what it is and why it is necessary to the user, as well as inform them there is an alternative when issues occur.
str4d@irc2p So while I agree it is a nice idea, I dispute "easy"
str4d@irc2p (You're not the one who has to actually implement it :-P)
user: no one 'has to'
user: and i referred only to the back end as being easy. I guess the rest evolves over time. People ask a question about what something means, and the wording can be changed
str4d@irc2p Regardless, manual bootstrap deserves a ticket.

Migrated from https://trac.i2p2.de/ticket/1490

{
    "status": "assigned", 
    "changetime": "2017-01-15T13:58:10", 
    "description": "especially for android where dropping a file in the config dir is not as esasy as on a PC, but even on PC this should be much more noob-proof and comfortable.\n\nuser: str4d: an option to manualy bootstrap Android Bote would be nice. This way users could simply exchange one b32 over irc or forum and with that bootstrap their Bote.\n<str4d@irc2p> Mmm\n<str4d@irc2p> It might also be a necessary feature, as Botedroid can't use Seedless\nuser: str4d: http://forum.i2p/viewtopic.php?t=11937\n<str4d@irc2p> Or I might just need to update the hardcoded peers list\nuser: and an easy one. \nuser: don't see your 'or' as an XOR\n<str4d@irc2p> \"easy\" - not necessarily. UX needs to be right.\nuser: sometimes updating hardcoded ones and doing a new release can take some time, whereas if you have both options, users can always find ways ....\nuser: UX: yes, it should not have to be a long b64. \n<str4d@irc2p> mmm\nuser: maybe just entering one short address in a line would suffice\n<str4d@irc2p> That's not what I meant\n<str4d@irc2p> There's a lot more than just having a text box to enter a line\nuser: it should  be as easy as copy and paste, easy to find but not in the way \nlay: <str4d@irc2p> Manual bootstrapping is something that nearly every user will have no experience with, because they are used to centralized services.\nuser: i know. but telling them is not hard. everyone can copy a strong from a forum or a message\n<str4d@irc2p> So in addition to having an actual box, we need to be able to explain what it is and why it is necessary to the user, as well as inform them there is an alternative when issues occur.\n<str4d@irc2p> So while I agree it is a nice idea, I dispute \"easy\"\n<str4d@irc2p> (You're not the one who has to actually implement it :-P)\nuser: no one 'has to'\nuser: and i referred only to the back end as being easy. I guess the rest evolves over time. People ask a question about what something means, and the wording can be changed \n<str4d@irc2p> Regardless, manual bootstrap deserves a ticket.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484488690756698", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: manual bootstrap", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "", 
    "time": "2015-03-14T21:04:10", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

I2P-Bote Android: Identities import and export (Trac #1445)

Add a nice way to import and export identities from/to the Bote PC client (I2P plugin).

Migrated from https://trac.i2p2.de/ticket/1445

{
    "status": "closed", 
    "changetime": "2015-05-29T05:51:26", 
    "description": "Add a nice way to import and export identities from/to the Bote PC client (I2P plugin).", 
    "reporter": "dllud", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1432878686014786", 
    "component": "apps/android", 
    "summary": "I2P-Bote Android: Identities import and export", 
    "priority": "minor", 
    "keywords": "I2P-Bote usability", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-01-23T23:53:50", 
    "milestone": "0.9.20", 
    "owner": "str4d", 
    "type": "enhancement"
}

I2P-Bote Android: Reorganize settings (Trac #1449)

Right now you have a General category with most settings inside it and divided into groups. General is a word that tells nothing to the user. IMHO it would be better to move up all groups inside General into their own category and get rid of General. You would end up with something like this:

Settings
Identities
New identity...
Fetching & sending
Auto-check
Check interval
Delivery status
Privacy
Change password
Hide local
Sent time
Routing
Sending hops
Minimum delay per hop
Maximum delay per hop
I2P
Router settings
Router
I2CP host
I2CP port

Migrated from https://trac.i2p2.de/ticket/1449

{
    "status": "closed", 
    "changetime": "2015-05-29T09:30:30", 
    "description": "Right now you have a General category with most settings inside it and divided into groups. General is a word that tells nothing to the user. IMHO it would be better to move up all groups inside General into their own category and get rid of General. You would end up with something like this:\n\nSettings\n  Identities\n      New identity...\n  Fetching & sending\n      Auto-check\n      Check interval\n      Delivery status\n  Privacy\n      Change password\n      Hide local\n      Sent time\n  Routing\n      Sending hops\n      Minimum delay per hop\n      Maximum delay per hop\n  I2P\n      Router settings\n      Router\n      I2CP host\n      I2CP port", 
    "reporter": "dllud", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1432891830119873", 
    "component": "apps/android", 
    "summary": "I2P-Bote Android: Reorganize settings", 
    "priority": "minor", 
    "keywords": "I2P-Bote usability", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-01-28T16:38:56", 
    "milestone": "0.9.20", 
    "owner": "str4d", 
    "type": "task"
}

Bote enhancement requests (Trac #1167)

http://forum.i2p/viewtopic.php?t=10924

Migrated from https://trac.i2p2.de/ticket/1167

{
    "status": "closed", 
    "changetime": "2016-01-25T19:32:24", 
    "description": "http://forum.i2p/viewtopic.php?t=10924", 
    "reporter": "zzz", 
    "cc": "str4d", 
    "resolution": "fixed", 
    "_ts": "1453750344522857", 
    "component": "apps/plugins", 
    "summary": "Bote enhancement requests", 
    "priority": "minor", 
    "keywords": "I2P-Bote usability", 
    "version": "0.9.9", 
    "parents": "", 
    "time": "2014-01-07T14:52:47", 
    "milestone": "0.9.21", 
    "owner": "HungryHobo", 
    "type": "enhancement"
}

Merge menus into a single one (Trac #1446)

On I2P-Bote Android main Activity there are two menus:

  • the main menu on the left panel;
  • an auxiliary menu which is displayed by clicking the 3-dots symbol on the upper right corner or by clicking the Menu button on Samsung phones.

The usage of two menus adds confusion to the user and seems to go against Material design best practices. All other Material-based apps I have played with, including those from Google, use a single menu, where items are gathered into logical groups. IMHO, I2P-Bote would be better with a single menu like them.

Migrated from https://trac.i2p2.de/ticket/1446

{
    "status": "accepted", 
    "changetime": "2015-01-28T23:05:12", 
    "description": "On I2P-Bote Android main Activity there are two menus:\n- the main menu on the left panel;\n- an auxiliary menu which is displayed by clicking the 3-dots symbol on the upper right corner or by clicking the Menu button on Samsung phones.\n\nThe usage of two menus adds confusion to the user and seems to go against Material design best practices. All other Material-based apps I have played with, including those from Google, use a single menu, where items are gathered into logical groups. IMHO, I2P-Bote would be better with a single menu like them.", 
    "reporter": "dllud", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1422486312327492", 
    "component": "apps/android", 
    "summary": "I2P-Bote Android: Merge menus into a single one", 
    "priority": "minor", 
    "keywords": "I2P-Bote usability", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-01-27T00:32:26", 
    "milestone": "soon", 
    "owner": "str4d", 
    "type": "defect"
}

Bote: Error copying mail to sent folder. (Trac #1366)

When sending a bote mail via Thunderbird, it tries to save it to sent folder, which Bote only does after the sending was complete, i.e. the pieces stored on the storage nodes.
For Thunderbird however, the mail is sent once it has been handed over to Bote.
Maybe Thunderbird could be shwon a fake Sent folder (if necessary) and be reported success of the copying despite not in fact saving the mail in the sent folder.
This is not vital for the functioning - mails get sent correctly now -, but the error is ugly and troubling for the uninitiated.

Migrated from https://trac.i2p2.de/ticket/1366

{
    "status": "closed", 
    "changetime": "2014-08-28T18:02:50", 
    "description": "When sending a bote mail via Thunderbird, it tries to save it to sent folder, which Bote only does after the sending was complete, i.e. the pieces stored on the storage nodes.\nFor Thunderbird however, the mail is sent once it has been handed over to Bote.\nMaybe Thunderbird could be shwon a fake Sent folder (if necessary) and be reported success of the copying despite not in fact saving the mail in the sent folder.\nThis is not vital for the functioning - mails get sent correctly now -, but the error is ugly and troubling for the uninitiated.\n", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "not a bug", 
    "_ts": "1409248970460445", 
    "component": "apps/plugins", 
    "summary": "Bote: Error copying mail to sent folder.", 
    "priority": "minor", 
    "keywords": "I2P-Bote, SMTP, sent folder", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-08-28T08:59:08", 
    "milestone": "", 
    "owner": "str4d", 
    "type": "defect"
}

Batching delete packets (Trac #1484)

Delete packets should be sent only once the entire mail has been received, and only within a the timeframe of a mail fetching, or immediatelly thereafter.

(irc: from parent ticket, continued)


user: you'd send the deletes only when the user actually logs in, giving more information about the actual user behaviour
user: if, however, you delay the deletes again, then maybe it could be a good idea
user: so deletion must be only once the entire mail is downloaded, not already when one packet downloaded then send deletion for that, in all cases. Then in the half logged in case, once user logs in and decrypts deletion packets for all packets are queueed but only sent when next [or second next - use some randomness] regular mail check is triggered for that identity
<str4d@irc2p> But you're right that it would give more indication of user behavior
<str4d@irc2p> Queuing deletion packets for sending at email checks is a good idea
<str4d@irc2p> Yes
<str4d@irc2p> It does make sense to have all network-touching activity around a single identity occur at the same time
user: and if in the "normal" case, i.e. now, the deletion packets are not sent based on when the single packet was retrieved, but rather the entire mail then this would obscure the user activity a bit
user: because others could not tell whether [the delay in] sending deletion packets was due to user not being logged in, or because of a packet still missing and only being downloaded in a later run
user: it would, however, delete all packets belonging to the same mail at once. Would that be an issue?
user: i think it would also be otherwise wanted behaviour. A user backing up only his keys but not incomplete messages, inbox, sent, etc, should still be able to receive an undelivered mail after restoring from backup
user: were the packets deleted one by one intead of batchwise, this would not be possible anymore, if at least one packet was received already before the restoring

optional enhancement:
scatter the sending of those deletes randomly over the next e.g. 5 mail checking/fetching 'sessions'. This would with standard check interval delay it only by less than 3 hours, but would make it less obvious to infer which packets belonged to which mail. Guess that only makes sense if you scatter-fetch too.

Migrated from https://trac.i2p2.de/ticket/1484

{
    "status": "assigned", 
    "changetime": "2017-01-15T14:09:59", 
    "description": "Delete packets should be sent only once the entire mail has been received, and only within a the timeframe of a mail fetching, or immediatelly thereafter.\n\n(irc: from parent ticket, continued)\n{{{\n\nuser: you'd send the deletes only when the user actually logs in, giving more information about the actual user behaviour\nuser: if, however, you delay the deletes again, then maybe it could be a good idea\nuser: so deletion must be only once the entire mail is downloaded, not already when one packet downloaded then send deletion for that, in all cases. Then in the half logged in case, once user logs in and decrypts deletion packets for all packets are queueed but only sent when next [or second next - use some randomness] regular mail check is triggered for that identity\n<str4d@irc2p> But you're right that it would give more indication of user behavior\n<str4d@irc2p> Queuing deletion packets for sending at email checks is a good idea\n<str4d@irc2p> Yes\n<str4d@irc2p> It does make sense to have all network-touching activity around a single identity occur at the same time\nuser: and if in the \"normal\" case, i.e. now, the deletion packets are not sent based on when the single packet was retrieved, but rather the entire mail then this would obscure the user activity a bit\nuser: because others could not tell whether [the delay in] sending deletion packets was due to user not being logged in, or because of a packet still missing and only being downloaded in a later run\nuser: it would, however, delete all packets belonging to the same mail at once. Would that be an issue?\nuser: i think it would also be otherwise wanted behaviour. A user backing up only his keys but not incomplete messages, inbox, sent, etc, should still be able to receive an undelivered mail after restoring from backup\nuser: were the packets deleted one by one intead of batchwise, this would not be possible anymore, if at least one packet was received already before the restoring\n}}}\n\noptional enhancement:\nscatter the sending of those deletes randomly over the next e.g. 5 mail checking/fetching 'sessions'. This would with standard check interval delay it only by less than 3 hours, but would make it less obvious to infer which packets belonged to which mail. Guess that only makes sense if you scatter-fetch too. \n", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484489399267918", 
    "component": "apps/plugins", 
    "summary": "I2P-Bote: batching delete packets", 
    "priority": "maintenance", 
    "keywords": "I2P-Bote", 
    "version": "0.9.18", 
    "parents": "1483", 
    "time": "2015-03-04T21:34:24", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

Bote: Nicer Error page (Trac #1367)

When clicking on a mail in e.g. outbox in order to read it, after it has been moved by Bote to sent folder, you get an NPE.
A screen saying the mail could not be found and was likely moved would look nicer. with a link back to inbox.

HTTP ERROR 500

Problem accessing /i2pbote/showEmail.jsp. Reason:

Server Error

Caused by:

java.lang.NullPointerException
at i2p.bote.web.ShowAttachmentsTag.doTag(ShowAttachmentsTag.java:49)
at i2p.bote.jsp.showEmail_jsp._jspx_meth_ib_005fshowAttachments_005f0(showEmail_jsp.java:1176)
at i2p.bote.jsp.showEmail_jsp._jspx_meth_ib_005frequirePassword_005f0(showEmail_jsp.java:218)
at i2p.bote.jsp.showEmail_jsp._jspService(showEmail_jsp.java:107)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)
at i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Migrated from https://trac.i2p2.de/ticket/1367

{
    "status": "closed", 
    "changetime": "2015-02-16T20:21:16", 
    "description": "When clicking on a mail in e.g. outbox in order to read it, after it has been moved by Bote to sent folder, you get an NPE.\nA screen saying the mail could not be found and was likely moved would look nicer. with a link back to inbox.\n\nHTTP ERROR 500\n\nProblem accessing /i2pbote/showEmail.jsp. Reason:\n\n    Server Error\n\nCaused by:\n\njava.lang.NullPointerException\n\tat i2p.bote.web.ShowAttachmentsTag.doTag(ShowAttachmentsTag.java:49)\n\tat i2p.bote.jsp.showEmail_jsp._jspx_meth_ib_005fshowAttachments_005f0(showEmail_jsp.java:1176)\n\tat i2p.bote.jsp.showEmail_jsp._jspx_meth_ib_005frequirePassword_005f0(showEmail_jsp.java:218)\n\tat i2p.bote.jsp.showEmail_jsp._jspService(showEmail_jsp.java:107)\n\tat org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:848)\n\tat org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)\n\tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)\n\tat i2p.bote.web.CharsetFilter.doFilter(CharsetFilter.java:38)\n\tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)\n\tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)\n\tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)\n\tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)\n\tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)\n\tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)\n\tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)\n\tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)\n\tat org.eclipse.jetty.server.Server.handle(Server.java:370)\n\tat org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)\n\tat org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)\n\tat org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)\n\tat org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)\n\tat org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)\n\tat org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)\n\tat org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)\n\tat org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n\tat java.lang.Thread.run(Unknown Source)\n", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "fixed", 
    "_ts": "1424118076570797", 
    "component": "apps/plugins", 
    "summary": "Bote: Nicer Error page", 
    "priority": "trivial", 
    "keywords": "I2P-Bote error usability easy", 
    "version": "0.9.14.1", 
    "parents": "", 
    "time": "2014-08-28T09:06:16", 
    "milestone": "0.9.18", 
    "owner": "str4d", 
    "type": "defect"
}

Mailing lists (Trac #1467)

It would be very nice to have mailing lists for Bote.

Migrated from https://trac.i2p2.de/ticket/1467

{
    "status": "assigned", 
    "changetime": "2017-01-15T13:55:14", 
    "description": "It would be very nice to have mailing lists for Bote.", 
    "reporter": "user", 
    "cc": "", 
    "resolution": "", 
    "_ts": "1484488514377592", 
    "component": "apps/plugins", 
    "summary": "Mailing lists for Bote", 
    "priority": "minor", 
    "keywords": "I2P-Bote", 
    "version": "0.9.17", 
    "parents": "", 
    "time": "2015-02-08T22:32:11", 
    "milestone": "undecided", 
    "owner": "str4d", 
    "type": "enhancement"
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.