diff --git a/NEWS.md b/NEWS.md index c135d94a455..d36e5c66aec 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,38 +5,235 @@ next: 1498: -- Support Schema hypha[net] -- Update Sharesite to 0.5.1 -- Deprecated custom datetime handling class CurrentTimeUTC -- ⚠ The Windows installer is currently not signed! -- Shorten description of sharesite freesite for english -- gzip: replace test workaround by fixing the output of the compressor — thanks to Bombe for the SingleOffsetReplacingOutputStream! -- replace GregorianCalendar with java.time.OffsetDateTime in CurrentTimeUTC — thanks to Veniamin Fernandes -- CSS: Support word-wrap: anywhere and CSS selector focus-within. -- Move UPnP2 to normal plugins. It does not seem broken, but UPnP does -- Move Library plugin to advanced plugins because new users tend to get lost with it -- html-filter: allow summary and details html element. Thanks to naejadu -- 💄 Add a bit of styling to the plugin list (for winterfacey) — thanks to Bombe -- 🔥 Remove option that to load plugins from central server — thanks to Bombe! -- fix: invalid max store size showed bytes with GiB suffix -- polish: show datastore size warning with GiB suffix -- Refine ClientRequestSelectorTest, PersistentJobRunnerImplTest, SplitFileFetcherStorageTest, and SplitFileInserterStorageTest — thanks to Veniamin Fernandes -- Change deprecated jcenter() maven repo to mavenCentral() — thanks to Veniamin Fernandes -- 🐛 Fix JarClassLoader’s ability to work with ServiceLoader — thanks to Bombe! -- refactor the browser warning wizard page -- fix the flag size of nepal — thanks to Percept0r@NYZkOs7eQ…! -- Switch swiss flag to civil and state ensign — thanks to Percept0r@NY -- bookmarks: Add Opennet SeedNodes stats site -- Reorder starting bookmarks: FFS → clean spider → Index of Indexes -- Re-order default software bookmarks by ease of use from fproxy -- Add generate media site to the default bookmarks -- Show the noderef in basic-mode: it is now robust enough -- Added tests for PebbleUtils — thanks to Bombe! -- 🐛 Fix NPE when subsets are not initialized — thanks to Bombe -- reduce logging for too many excluded sub-arrays thanks to Hiina -- disable setting for new-load-management (NLM broke nodes) -- add utility to disable a config option, thanks to Bombe -- merge debian package as default build action thanks to DC*/desyncr! This resolves one of our high impact tasks. +# Short changelog: + +This release resolves the last blocker for Freenet / Hyphanet 0.8 by +providing an official Debian package. Additionally it optimizes the +networking and data transfer core and provides many improvements for +website authors and user experience. + + +Starting with this release, Freenet / Hyphanet has an official Debian +package built automatically via github actions. This was the most +important [high-impact-task][] and the last release blocker of version +0.8 in our [Roadmap][]. Big thanks go to DC*! + +With this finally realized, the next step is to get in contact with +the many privacy focussed distributions which build on Debian to make +`hyphanet-fred` available where it is most important. Once this is +done, tools which build on Hyphanet — like FMS, but also jSite and +tools from pyFreenet — can be packaged to work out of the box, using +Hyphanet as an ordinary background service. That’s a step towards +Hyphanet as decentralized, privacy-preserving communication backend for +other applications. + +Another step towards this is accepting the Schema hypha[net] to +simplify writing browser extensions that forward hypha:-links to +Hyphanet. + + +The networking layer was optimized significantly. Searching packet +types is often stopped early and common or cheaper checks are done +before less common or time-consuming checks. This gives significant +reductions of CPU load, especially for very fast nodes. + +Juiceman fixed a bug limiting MTU to 1280 where not needed. + +And recently failed and data not found cooldown times were reduced to +5 minutes and 3 minutes, reducing one of the big annoyances when +accessing a site quickly after upload. + +On the data transfer layer, healing was optimized. After 1495 strongly +increased the amount of healing to keep large files available for +longer, 1498 specializes healing to keys close to the node location. +This reduces healing per file, but improves privacy, because healing +inserts are then more similar to forwarding — they mostly send data +close to the nodes location — and it reduces the network load of +healing, because the specialized healing inserts need fewer hops to +reach the optimal storage location in the network. + + +In addition to these changes deep down, there are a number of directly +visible improvements. + +The plugins KeepAlive and Sharesite are updated (the latter now uses +the new Night Zen Garden style). The UPnP2 plugin is now visible in +simple mode. It can replace UPnP and should work better. On the +flipside the Library plugin is moved to advanced plugins, because it +does not work reliably enough. + +The plugin list is easier to navigate by removing the defunct option +to download plugins from the clearnet and by adding better styling. +Downloading from the clearnet was an unnecessary privacy risk since +we’ve been bundling essential plugins with the installer for a few +years now. + + +The noderef for friend-to-friend connections is shown in simple mode +again, because it is robust enough with the changes in recent years. +This should remove a barrier to adding direct connections and enabling +fully confidential messages between friends. + +There are new configuration options to allow connecting via local +services. That’s a step towards making it easy to add a second layer +of security, for example confining connections to a local network. +Thanks goes to s7r for these changes! + +When bandwidth detection fails, the upload bandwidth now defaults to +160KiB/s. Also the NLM config is now disabled statically. This was a +testing setup which could still be active in old nodes, but it would +break connectivity nowadays. + + +The default bookmarks include the Opennet SeedNodes statistics, +the generate media site to create decentralized streaming sites, and +the high-impact-tasks. The bookmarks are also re-ordered to be a +better match for newcomers. Starting category: first steps, clean +spider, Index of Indexes. For the software category ordered by ease of +use from fproxy. + +For website authors, more CSS elements, selectors and combinators +(`:checked`, `word-wrap: anywhere`, `focus-within`, `^=`, `$=`, `*=`, +`>`, `+`, `~`) and additional HTML elements (`summary`, `details`, +``) are available. This strongly expands the +possibilities of websites authors in Hyphanet, because Javascript or +webassembly are no viable options in an environment where a privacy +breach could put people at risk. We’ve seen with Java applets, that +untrusted code will always break out of its containment. The CSS +improvements in contrast provide a safe way to enable limited +interactivity. + +Streaming support via m3u lists was improved to allow accessing +segments of up to 200MiB. + +And using `-1` as version in a USK now properly finds version `0`, if +this is the only existing version. + + +There were a number of Java 21 fixes, including all our tests (thanks +to Bombe!), and improvement to the github actions (thanks to +AHOHNMYC). + +In addition to that there was a lot of polish. Bert Massop and +Veniamin Fernandes replaced our homegrown CurrentTimeUTC with modern +Java options. Alex fixed the pronoun used in strings. Bombe added +getters for all direct field access in the node. Hiina reduced logging +level of store warnings so no unneeded backtraces are created for node +with large stores and Juiceman updated code to use more modern +structures. + +Time-dependence of compressor selection was removed. This caused +non-determinism for inserts and could cause keys to be +non-reproducible on systems with faster or slower network. + + +And finally the new [exe signing workflow][] we built to fulfill the +requirements of SignPath, our new windows installer signing provider +for the upcoming releases, runs the [verify-build script][] on every +release to ensure that the jar we release has actually been built from +the sources. This provides a second safety net, in addition to +anonymous users running the script and posting the results (thanks to +all who did this — please keep it up, otherwise people have to fully +trust github). The release is not yet byte-by-byte reproducible, +because the jar MANIFEST defines among other info the exact java +version used to compile it, and the java version available differs by +distribution and time, so it would get harder over time to verify the +build. + + +A special thanks goes to Bombe for many careful reviews! + +[high-impact-task]: https://github.com/hyphanet/wiki/wiki/High-Impact-tasks +[Roadmap]: https://github.com/hyphanet/wiki/wiki/Roadmap +[exe signing workflow]: https://github.com/hyphanet/sign-windows-installer +[verify-build script]: https://github.com/hyphanet/scripts/blob/master/verify-build + +# Full changelog: + + +## high impact tasks +merge debian package as default build action thanks to DC*/desyncr! This resolves one of our high impact tasks. + +## Plugins +Update KeepAlive to commit 86e47a101f26fd1d3be0437681a043aa4ae3f22c +Update Sharesite to 0.5.1 +Move UPnP2 to normal plugins. It does not seem broken, but UPnP does +Move Library plugin to advanced plugins because new users tend to get lost with it +💄 Add better styling to the plugin list in winterfacey to make it easier to understand at a glance — thanks to Bombe +🔥 Remove option to load plugins from central server — thanks to Bombe! This was an unnecessary privacy risk, since we’re already bundling essential plugins with the installer, and it made plugin handling harder to understand. + +## Bookmarks +Add high-impact-tasks to bookmarks +Add generate media site to the default bookmarks +Add Opennet SeedNodes stats site +Reorder starting bookmarks: FFS → clean spider → Index of Indexes +Reorder default software bookmarks by ease of use from fproxy +Disable activelink for Index of Indexes (workaround, because it fails) + +## Optimize networking and transfer layer +break early when condition is met — thanks to Juiceman +Check the HashCode before equals. This saves ~20% method-runtime. +Re-order or’ed MessageFilters so the most likely is checked first +specialize healing to keys close to the node +fix healing decision: do not divide 0-1 by MAX_VALUE — thanks to Bombe for the review! +Reduce recently failed and data not found wait times + +## Filters +CSS: Fix: checked only the first char of the key part of CSS selectors, Add test that would catch too lax filtering. +CSS: Support pseudo-element checked. This enables limited interactivity via CSS. +CSS: Support the attribute selectors ^= $= *=, Add tests. +CSS: Support Combinators > + and ~, add test for ~ and simplify the implementation +CSS: Support word-wrap: anywhere and CSS selector focus-within. +HTML: allow summary and details html element. Thanks to naejadu +HTML: accept , thanks to torusrxxx + +## Constants +Show the noderef in basic-mode: it is now robust enough + +## Configuration +accepting localhost in NodeIPPortDetector and allowBindToLocalhost configurable — thanks to s7r! +Provide static methods for simpler boolean config creation +Increase default bandwidth to 160KiB upload, when detection fails +disable setting for new-load-management (NLM broke nodes) +add utility to disable a config option, thanks to Bombe + +## Misc +add m3u-player insertion test: is added at end of body +[CI] Update actions, fix actions cache +♻️ add and use getters and setters for access to node fields +Increase max transparent passthrough to 200MiB links in m3u-lists. +Remove time-dependence of compressor selection. This caused +non-determinism for inserts and could cause keys to be +non-reproducible. +improve date object construction in CurrentTimeUTC.get() +Support Schema hypha[net] to simplify writing browser extensions that forward hypha://-links to Hyphanet. +polish: show datastore size warning with GiB suffix +Remove hash generation to native big integer to reduce dependencies. This had come in when merging an old pull request and added a new dependency without need. + +## Polish +Replace indexOf with .contains() +Change more string comparisons into .isEmpty() checks +Capitalize L in literal longs +Add missing Global flag to GetFailed FCP message. Thanks to oishii and Bombe! +Fix links to mailing lists and IRC in CONTRIBUTING.md — thanks to Juiceman! +Deprecated custom datetime handling class CurrentTimeUTC +replace GregorianCalendar with java.time.OffsetDateTime in CurrentTimeUTC — thanks to Veniamin Fernandes +Refine ClientRequestSelectorTest, PersistentJobRunnerImplTest, SplitFileFetcherStorageTest, and SplitFileInserterStorageTest — thanks to Veniamin Fernandes +Change deprecated jcenter() maven repo to mavenCentral() — thanks to Veniamin Fernandes +Added tests for PebbleUtils — thanks to Bombe! +🐛 Fix NPE when subsets are not initialized — thanks to Bombe +reduce logging for too many excluded sub-arrays thanks to Hiina +fix the flag size of nepal — thanks to Percept0r@NYZkOs7eQ…! +Switch swiss flag to civil and state ensign — thanks to Percept0r@NY + +## Fixes +Thanks to Bombe all our tests work again on Java 21! +🐛 Fix JarClassLoader’s ability to work with ServiceLoader — thanks to Bombe! +gzip: replace test workaround by fixing the output of the compressor — thanks to Bombe for the SingleOffsetReplacingOutputStream! +fix: invalid max store size showed bytes with GiB suffix + + +Also a special thanks to Bombe for many careful reviews! 1497: diff --git a/README.md b/README.md index 2db6a4c3f78..b4012ce9e9b 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,16 @@ of the archive it downloads from `https://services.gradle.org`. $ mkdir -p lib; cd lib && grep -o CHK.* ../dependencies.properties | xargs -P16 -I {} bash -c 'fcpget -v {} "$(echo {} | sed s,^.*/,,)"' $ ant -propertyfile build.properties -f build-clean.xml -Dtest.skip=true -Dfindbugs.skip=true +## Building the installers + +The installers are built from specialized repositories: + +- The GNU/Linux, macOS and *nix installer is built from [hyphanet/java_installer](https://github.com/hyphanet/java_installer). +- The Windows installer is built from [hyphanet/wininstaller-innosetup](https://github.com/hyphanet/wininstaller-innosetup) and signed with [hyphanet/sign-windows-installer](https://github.com/hyphanet/sign-windows-installer). + +Free code signing for the Windows installer is provided by [SignPath.io](https://about.signpath.io/?), the certificate by the [SignPath Foundation](https://signpath.org/). + + ## Testing ### Run Tests diff --git a/build.gradle b/build.gradle index cf3f9768087..6054c6767b7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ +import java.security.MessageDigest + buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.9.+' - classpath files('gradle/gradle-witness.jar') } } @@ -13,13 +14,17 @@ configurations { compile } -apply plugin: 'witness' apply plugin: 'java' apply plugin: 'maven-publish' repositories { flatDir { dirs uri("${projectDir}/lib") } - maven { url 'https://mvn.freenetproject.org' } + maven { + url 'https://mvn.freenetproject.org' + metadataSources { + artifact() + } + } mavenCentral() } @@ -28,6 +33,7 @@ sourceSets { test.compileClasspath += configurations.provided } +def version_buildir = file("$projectDir/build/tmp/compileVersion/") def version_src = 'freenet/node/Version.java' sourceSets { @@ -47,15 +53,17 @@ def gitrev task buildInfo { try { def cmd = "git describe --always --abbrev=4 --dirty" - def proc = cmd.execute() + def proc = cmd.execute([], project.rootDir) gitrev = proc.text.trim() - } catch (java.io.IOException e) { + } catch (IOException ignored) { gitrev = "@unknown@" } } -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} tasks.withType(JavaCompile) { options.encoding = "UTF-8" @@ -65,38 +73,38 @@ tasks.withType(Javadoc) { options.encoding = "UTF-8" } -task compileVersion (type: JavaCompile) { - copy { - from sourceSets.main.java.srcDirs - into "${buildDir}/build/tmp/compileVersion/" - include "${version_src}" +task generateVersionSource(type: Copy) { + dependsOn buildInfo + from(sourceSets.main.java.srcDirs) { + include version_src filter { - String line -> line.replaceAll("@custom@","${gitrev}") + String line -> line.replaceAll('@custom@', gitrev) } } + into version_buildir +} + +task compileVersion (type: JavaCompile) { + dependsOn generateVersionSource, compileJava sourceCompatibility = 1.8 targetCompatibility = 1.8 - source = "${buildDir}/build/tmp/compileVersion/" - include "${version_src}" - classpath = files(sourceSets.main.compileClasspath, sourceSets.main.output.classesDir) - destinationDir = file("${buildDir}/java/version/") + source = version_buildir + include version_src + classpath = files(sourceSets.main.compileClasspath, sourceSets.main.output.classesDirs) + destinationDirectory.set(layout.buildDirectory.dir("java/version/").get()) } -compileVersion.dependsOn buildInfo -compileVersion.dependsOn compileJava -processResources.dependsOn compileVersion - -task jar (type: Jar, overwrite: true) { - from (compileVersion) { - include 'freenet/node/Version**class' - } - from ("${buildDir}/classes/java/main/") { +task buildJar(type: Jar) { + dependsOn compileVersion, processResources + from(processResources) + from(compileJava.destinationDirectory) { exclude 'freenet/node/Version.class' exclude 'freenet/node/Version$1.class' } + from(compileVersion.destinationDirectory) preserveFileTimestamps = true reproducibleFileOrder = true - duplicatesStrategy = "warn" + duplicatesStrategy = DuplicatesStrategy.FAIL archivesBaseName = "freenet" manifest { attributes("Permissions": "all-permissions") @@ -114,12 +122,14 @@ task jar (type: Jar, overwrite: true) { ], "common") } } -jar.dependsOn processResources + +jar.enabled = false +jar.dependsOn buildJar def jars = [] gradle.addListener(new TaskExecutionListener() { void afterExecute(Task task, TaskState state) { - if(task in AbstractArchiveTask) { + if(task in AbstractArchiveTask && task.enabled) { jars << task.outputs.files.singleFile } } @@ -130,7 +140,7 @@ gradle.addBuildListener(new BuildAdapter() { void buildFinished(BuildResult result) { if(jars) { def hash = { - File file -> def sha256 = java.security.MessageDigest.getInstance('SHA-256') + File file -> def sha256 = MessageDigest.getInstance('SHA-256') file.eachByte(1024 * 4) { buffer, len -> sha256.update(buffer, 0, len) } println "SHA-256 of ${file.name}: ${sha256.digest().encodeHex().toString()}" } @@ -141,12 +151,12 @@ gradle.addBuildListener(new BuildAdapter() { }) task copyResourcesToClasses2 { - inputs.dir sourceSets.main.java.srcDirs - outputs.dir sourceSets.main.output.classesDir + inputs.files sourceSets.main.allSource + outputs.dir layout.buildDirectory.dir("classes/java/main/") doLast { copy { - from sourceSets.main.java.srcDirs - into sourceSets.main.output.classesDir + from sourceSets.main.allSource + into layout.buildDirectory.dir("classes/java/main/") include 'freenet/l10n/*properties' include 'freenet/l10n/iso-*.tab' include 'freenet/clients/http/staticfiles/**' @@ -155,20 +165,21 @@ task copyResourcesToClasses2 { } copy { from "${projectDir}/" - into sourceSets.main.output.classesDir + into layout.buildDirectory.dir("classes/java/main/") include 'dependencies.properties' } } } processResources.dependsOn copyResourcesToClasses2 +compileVersion.dependsOn copyResourcesToClasses2 task copyTestResourcesToClasses2 { - inputs.dir sourceSets.test.java.srcDirs - outputs.dir sourceSets.test.output.classesDir + inputs.files sourceSets.test.allSource + outputs.dir layout.buildDirectory.dir("classes/java/test/") doLast { copy { - from sourceSets.test.java.srcDirs - into sourceSets.test.output.classesDir + from sourceSets.test.allSource + into layout.buildDirectory.dir("classes/java/test/") include 'freenet/client/filter/*/**' include 'freenet/crypt/ciphers/rijndael-gladman-test-data/**' include 'freenet/l10n/*properties' @@ -191,7 +202,7 @@ test { // no inner class include 'freenet/**/*Test.class' exclude 'freenet/**/*$*Test.class' - workingDir = sourceSets.test.output.classesDir + workingDir = layout.buildDirectory.dir("classes/java/test/") scanForTestClasses = false systemProperties += [ "test.l10npath_test": "freenet/l10n/", @@ -228,52 +239,33 @@ publishing { task copyRuntimeLibs(type: Copy) { into "${buildDir}/output/" - from configurations.runtime + from configurations.runtimeClasspath from jar } copyRuntimeLibs.dependsOn jar // In this section you declare the dependencies for your production and test code dependencies { - compile "org.bouncycastle:bcprov-jdk15on:1.59" - compile "net.java.dev.jna:jna:4.5.2" - compile "net.java.dev.jna:jna-platform:4.5.2" - compile "org.freenetproject:freenet-ext:29" - compile "io.pebbletemplates:pebble:3.1.5" + implementation "org.bouncycastle:bcprov-jdk15on:1.59" + implementation "net.java.dev.jna:jna:4.5.2" + implementation "net.java.dev.jna:jna-platform:4.5.2" + implementation "org.freenetproject:freenet-ext:29" + implementation "io.pebbletemplates:pebble:3.1.5" // dependencies of pebble - compile "org.unbescape:unbescape:1.1.6.RELEASE" - compile "org.slf4j:slf4j-api:1.7.25" - - testCompile 'junit:junit:4.13.2' - testCompile "org.mockito:mockito-core:1.9.5" - testCompile "org.hamcrest:hamcrest:2.2" - testCompile "org.objenesis:objenesis:1.0" -} + implementation "org.unbescape:unbescape:1.1.6.RELEASE" + implementation "org.slf4j:slf4j-api:1.7.25" -dependencyVerification { - // testCompile includes all of compile deps... so let's include only these - includedConfigurations = [configurations.testCompile] - verify = [ - 'org.bouncycastle:bcprov-jdk15on:1c31e44e331d25e46d293b3e8ee2d07028a67db011e74cb2443285aed1d59c85', - 'net.java.dev.jna:jna-platform:f1d00c167d8921c6e23c626ef9f1c3ae0be473c95c68ffa012bc7ae55a87e2d6', - 'net.java.dev.jna:jna:0c8eb7acf67261656d79005191debaba3b6bf5dd60a43735a245429381dbecff', - 'org.freenetproject:freenet-ext:32f2b3d6beedf54137ea2f9a3ebef67666d769f0966b08cd17fd7db59ba4d79f', - 'junit:junit:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3', - 'org.mockito:mockito-core:f97483ba0944b9fa133aa29638764ddbeadb51ec3dbc02074c58fa2caecd07fa', - 'org.hamcrest:hamcrest:5e62846a89f05cd78cd9c1a553f340d002458380c320455dd1f8fc5497a8a1c1', - 'org.objenesis:objenesis:c5694b55d92527479382f254199b3c6b1d8780f652ad61e9ca59919887f491a8', - 'io.pebbletemplates:pebble:d253a6dde59e138698aaaaee546461d2f1f6c8bd2aa38ecdd347df17cf90d6f0', - // dependencies of pebble - 'org.unbescape:unbescape:597cf87d5b1a4f385b9d1cec974b7b483abb3ee85fc5b3f8b62af8e4bec95c2c', - 'org.slf4j:slf4j-api:18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79' - ] + testImplementation 'junit:junit:4.13.2' + testImplementation "org.mockito:mockito-core:1.9.5" + testImplementation "org.hamcrest:hamcrest:3.0" + testImplementation "org.objenesis:objenesis:1.0" } task tar(type: Tar) { description = "Build a source release, specifically excluding the build directories and gradle wrapper files" compression = Compression.BZIP2 - baseName = "freenet-sources" + archiveBaseName = "freenet-sources" from(project.rootDir) { exclude '**/build' @@ -281,20 +273,22 @@ task tar(type: Tar) { exclude '.gradle' } - into(baseName) + into(archiveBaseName) preserveFileTimestamps = true reproducibleFileOrder = true // Set destination directory. - destinationDir = file("${project.buildDir}") + destinationDirectory = file("${project.buildDir}") - archiveName = "${baseName}.tgz" + archiveFileName = "${archiveBaseName}.tgz" doLast { // generate md5 checksum - ant.checksum file:"$destinationDir/$archiveName" + ant.checksum file:"$destinationDirectory/$archiveFileName" } } -javadoc << { - failOnError false +javadoc { + doLast { + failOnError false + } } diff --git a/gradle/verification-keyring.gpg b/gradle/verification-keyring.gpg new file mode 100644 index 00000000000..d48a88918b7 Binary files /dev/null and b/gradle/verification-keyring.gpg differ diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys new file mode 100644 index 00000000000..7cb57aff144 --- /dev/null +++ b/gradle/verification-keyring.keys @@ -0,0 +1,988 @@ +pub B341DDB020FCB6AB +sub 315693699F8D102F +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEowbDsRBAD2jx/Q2jNuCkgiS3fzIj6EzDP+2kipIKH2LEnpnTiBlds2PFYM +xYibVab/grgQODxTdDnAKifbJA/4h1/T7ba+OV+xIUoSI5MbgaF3USidiDHPX0pY +qvG+k3hKECLysQ2zoZpcC8c2ePiZQSVC2i5BRqgs0xZPz3kiT5U9WPozTwCgtasB +TgHhkOGhZ0SOUuQ4dL54R9cEAIaDjdPcI7LxyOMvvGTuW/SaS9JyP21Kch+Vf6I4 +vKWWqXEaF0So8S088zHnBrcBKhu9D1sKIHS64EoYCrznfMUtoENPe4sf5QuJmZ9D ++fBuFcudQIpkx8L73q+E3fmCK0uX+anqipJtS8mgpMeabKda4KkjDsZkiaNl7OBI +0H09BACofK1HTNHNke2N0wXN1GyG7IAqprKl4lBbu5aRXvfKQ2tDj8s5webNQ+Se +Om/Yg0Bi+CiONLgUjiwYe1wNls8zkk3LwYFeKIJ1AjAY3auBRWOI0/IFFzwTkV8J +YPHa3Dl/kmYp8NMMwA5bgrblggM0Qhnp+k//xpb0FYbmwHMwUrkCDQRKMGw7EAgA +5MMlt89bomqE0TSq63JnPaSeEKsAx6A1KaXaSg0LEI7fMebSQcAdVdAFBo4HaR+j +NNGv5JGTvAObLrqxnn5mU/+qhdTw4WCf17R4ETEKc3iFN3xrpxz2Vew8ZWpw3PcE +gCe27ZN02J6BgtEqhT9v9f0EkAgRHIkcaFCnxme1yPOFN+O0/n1A+59Ar8rmwcHG +opSoZlGDEdEdqElx/shQjqq6Lx3bWYXS+fGzSAip+EAX/dh8S9mZuS6VCWjLx0St +a1tuouq9PdOz5/4W/z4dF36XbZd1UZHkw7DSAUXYXfwfHPmrBOrLx8L+3nLjNnF4 +SSBd14AfOhnBcTQtvLuVMwADBQf8DC9ZhtJqHB/aXsQSrJtmoHbUHuOB3Hd8486U +bZR+BPnnXQndt3Lm2zaSY3plWM2njxL42kuPVrhddLu4fWmWGhn/djFhUehZ7hsr +Qw735eMPhWZQpFnXQBRX98ElZ4VVspszSBhybwlH39iCQBOv/IuR/tykWIxjPY7R +H41EWcSOjJ1LJM2yrk/R+FidUyetedcwUApuDZHnH330Tl/1e+MYpmMzgdUGpU9v +xZJHD9uzEbIxyTd2ky2y3R+n/6EkRt3AU9eI0IY1BqUh0wAuGv/Mq2aSDXXNYJ/p +znXSQBjmy2tvJlqXn+wI1/ujRMHTTFUBySuMyZkC0PwUAAnWMYhJBBgRAgAJBQJK +MGw7AhsMAAoJELNB3bAg/Larfc0AnAmQbEg9XnLr/t0iUS7+V7FcL5KpAJ9k3LS5 +JI97g3GZQ2CHkQwJ3+WcPw== +=OasT +-----END PGP PUBLIC KEY BLOCK----- + +pub 7C7D8456294423BA +sub 9842FE565AA0601E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN +Yjq5KsVOQxZzloVdtqx75rznT7fZq98g7Nq9IeEtB6k4tnh6XQLhljJMk0a3mzdt +q3VzdxeVbwCaPJ0zixv8XPTAH6MpRJUvP9XjzxwaYHrjwcQ1LslW4TrIzwCgi5rf +jChLCyKcaL05gqUjl4lmefED/iqOwYZw5pJ8+X+OHUViiOB43wsJt1brAhPj4KgB +ODStcE6WlHFKi7YzcYNLzYMebSGYn6bj65b3qNf6rybWD1hGUFK4122Q7+HCH9Ic +J+rr8HwjGFo/yxI0/mkyaF0BthXYPy4WtdsdTM2kgx8Zr3Q2rSt1jBPuV3q8d27z +FZMiA/9cWPkRx0RfAJmBPKmKkbBkEtBbNau3G7MY1OEAkEkRnzmnyyjr5IP84A7K +RdjTCvkbiQrOQH00Ki4sHIg+9Xv1gDg1XLkFDzRARKA1TxjL0OeS4RWF3iia7Swk +MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurkCDQRL7GcQEAgA +thrbFDDbIGq97dbX1ZEwNGpjILdeumxZzaCc5PgldHGA86TL2V9iPpONJtv7/Csr +1c/rvH0IA/BFu+0Kde9UP+z9JycmfJpIsd2Qtxfhn9R4+Td0VtN9NNkpt1+JcThb +zyQq4UU82uBKwSG/wzubOI4Fn+7ypIuNgDkqK0STIL3ucKF/RV77PsOBeLHkCGKI +VhUUfY1D51BWZKKB1efaVK7PLdnsi64lAhbaexA43dwUUtVwQOvDzJVtkycV2IMw +XwyHonlK+4vbcwIH2BAU46LIZy+VFaI+lNNmR9+xeWH49oJYnMWIXif4RzvO1ag2 +KKwlG2sacuVTtpWVqKayBwADBQf7BGl4POKtluAbX3a/KGnX1YyibPT2e4pdOxqb +KTwuRc7ILIK/LVcejVuLd+eOF1QmjToI7Y3qjlzvtaxSemfkxbIQpdus0SyHEEAG +H/qjNuTs8ZwEl9tPPrKaJHbJ9kQrlDPwkufA0NDAXTE76UhcHPY0DeykAKEw2rav +EqI7Y0nXR2WSmRLFChmQ+aNTm/9UGI/IoRdS/dgo1eaLD/7RLFeL5tGDe+2nj+B6 +j+52nZEmaRCWWU7O9jYL1cQu5WTurtneCLtIqehLsjuVz9ihBysYuUcTOV/6W0AI +clQoMEiFR9Kyv0owDk6LtX2DgibJuAvvLlnajsiGm5nyVh3G1IhJBBgRAgAJBQJL +7GcQAhsMAAoJEHx9hFYpRCO6iXUAnRcLw17lBhe/WcKFRkzETSxaJcjIAJ4/P1NN +On/eScLdx27sje7q3sBENw== +=TzHJ +-----END PGP PUBLIC KEY BLOCK----- + +pub 3B17BFC1FCC1B644 +sub AB1D1A77026CB606 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFro+cgBCADCxtYd7ZFChfyOnmp/rCtWS0DGY48wCmJTcgOyBFuTy8UJ+PdK +e8aBsbpx6I5OM2WqvsGkqs/vboAbZxJ+G0br0qriXrz2SUQEJ7EMJJsUgkVSb/iO +DEiqTr+XASuqVoCKsUnB+7eCWycsfODVYZbEjo52PZIJwiNS2yXBtYjf6t6i1rx0 +KrMF9dy9ZRWKe48UGK4KkZ5l9/yiM5CscJM3Wt5fBdFKpp8JmJQHMUivwURjT7dP +o7ZDBLmvgs1/U55AJw9Uo7FwmNSoxr77OtGFaN6rmQS2w1jEt0ieujmuvj+z91sw +FKQ8vxVBSLDtzDNP4NMA4Ie4G4sLDAzi0+1xABEBAAG5AQ0EWuj5yAEIALC3ywW3 +q+flFxeSpSuhLPNrJ1xzp5Ox8sZ/56f7PBEHYR4XAqyF5RLTaslHjxVkdq7JfQsi +saoW48ToFGU4wt21A9Wgh+k6LpnO2CLPvZZmLmXYvikoU74JReCaLjxWLqgD5aQG +6LakGNGgB4qHngFhccJozJn7irGUb2rJ58TkwAfbvghIKOvp2RI6dInKFEuIeWBz +98v5xZp0HRbMnq0bd4RqNGXdJ3yJ2VyC4nVCw+IaZafVgI8MWSaQCiOgwVgS73kL +wgX3xTFfsKMie8Kwo6zCYFyFekKdImG7w9yVavQmgSid2K+Xkb3qxpfjTZSM7qsK +23nL/IoKChLu7eUAEQEAAYkBHwQYAQgACQUCWuj5yAIbDAAKCRA7F7/B/MG2RF3+ +B/46dH70jqBWl/8UtnV4/Tb3hNXb2vU3w7BTawg7qHmUPj0R6BBtRPQqvPxH7K62 +8ARhgBdEaVKMDA6ijSet7zJm2mU9DlBz+Yunz5a1jlDN/vXAzOQyA7jEd9iyI4Dn +lWp+0Gy8EXEysV1mrXRQd0EwRp8kyozLpjAk+P3Xtu6OEHEWOJHZ67OzVLx/bOfU +DIn5Sv8Dxi3cmaAj5ZjnCfM7a35nseGhFcezd+HjQy2v7W1X+zCJaDejdGe32pPU +5Bx0+rqt7BzGjCtQ9N952neH8mAeLLhcpVQQqHx/YjIqJ1qfMPX6vXsur7fxJ1t0 +oY3gZlwqvKcRwJwExFAQotNX +=Ql65 +-----END PGP PUBLIC KEY BLOCK----- + +pub A6ADFC93EF34893E +sub 9C4C23E6FFE405BD +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN +OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr +9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe +d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+ +0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg +SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG5AQ0ET7FnEgEIAM3i3e1s +jwrx2PN8XYMPQWG+/YTtw1BYDl2+iYE+LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXo +gWqKrkJ0LRjlpdKhKBvyH1ex4grh3cWN/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+ +MR3aFIsii+vadrwYYvuVYGeWvdZhB7mJKYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG +7Xd3tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC +9cHh5eCol11uSoWPKcQR2Ar8Eo56nxv/UApdu15iJ7R8cA5guKeeS4jt0CGCPs2P +huggDxI73Xvl4zsAEQEAAYkBHwQYAQIACQUCT7FnEgIbDAAKCRCmrfyT7zSJPuyl +B/9iwtIQeexMWBmQNdDe0md8HLulDfcujPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb +1YCP79uF0qgswSxINYCOJx4nTPIP9BOdTwqfGo7ul27REgNq4lIUW0GkMgZAUA2f +t/vc0u/I0PqnhKCi4Pq79hLIx7eiX2ySfXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA +54J1qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2cpIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/ +o0co+GoYkieIxxibDCmt3BioLgmyzpGUsMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJ +EEIhZlI/ojefaZkRseFrtl3X +=pJaU +-----END PGP PUBLIC KEY BLOCK----- + +pub 2189CA6247F3DEE5 +sub DC032628E927D006 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFEsDjYBCADKUrv1zJObnlCQ/2AyexoofOuSSzj+L8AIRm2tm2qdPgYNYZHJ +II661t4G5mg6QSGRlO1+NaD1S4GlcEpYvC860Uv26M9FbUAjlMJlWqLoNME9N1Oe +eSLKs+C6RroY4qDuuA0UaLE1SQ9i5cm5bxPIfbm6aCcIzecTbfD18bxIq3fZrO2S +yHek0H2upHAipKd2g2Ed4CikWZV2f8MoMZr7CLs4XgrmpEF01Ab5RBX01kX2MYaa +Vk1BAc3FgLwA/azW3X1pdiyD4iAesHN6SlAaD7x2tZs8CrnRCaWLu31t+x+Sc4Uc +zShjTGdB+euZykFpJW3t/D9BLicjRDTGjBfZABEBAAG5AQ0EUSwONgEIANijDStd +yc4CSVYSXmX+ZQnWTF3gjYMkszD41yT129Xw1RTw//ayxYeBYruIgZb24eAULVhp +hEEW9XgkXvPT1gvAlU27GJ5DYswuh+EIJGGjZMngvORS4Dvr+lkWXU347dgBIIHw +vVl+rw2hUrnhn6Y/nBGWHRFWIXAMwQC2w61iwa2E1aLUJ1u3OvrC8U7Llmb76YOe +qLGbOFiQN9vcr5orrqP/dAdTr4MoyS6dG7Lh8McfWwEDzq0Ygy5d0EJDudusApwc +SQ9set/SO6b3F7IiQHAz2+sXlGJB1Kscx6tpbt5NRegKQp3qyZG71pp31QRePgbf +O99L+AAv19DsQ40AEQEAAYkCRAQYAQIADwUCUSwONgIbLgUJB4YfgAEpCRAhicpi +R/Pe5cBdIAQZAQIABgUCUSwONgAKCRDcAyYo6SfQBtuJB/sH31Gs3MKbEJksDtR3 +VKXGp+kll7BYSoVYv+llFcx7CxkAJNUQ/LH8l9Zbd/j8MA7e1V/ts/QkuLcLqtbe +IdPWcHqXNSjFgOCIC46zGfV8dOmtjlblhfG8YvUZNnlEtJAFBtxOV+kKnMV7YWnS +xm/slrbEFyaaQpicdtP+hw5ubWIAIzK+N3PbjXgKlIywSljU8iXsch2oCms8dAMY +TQeqhnbq5VRjpIyGVrYzqubRLojeXWdCJ60rDvFHnqCyEJgKtxiWX4lQBGfdsnqK +pmJNVv0X4CDHxyPUwChTtFLgNiJvJ2OoYJi5oEg0IZ0rt/9JNNwNnUYlB3qYCXU8 +3771PnwH/iql4tb/K9HUZMcZdjJ9cwljVbwL0Lk4SPeVuPkhTsRmSsrm9FHjOJkX +RitmKnkQWbhBChV3oxVwklJTstYoGXHsUrHnmYV21C8y0HVGEuu2bGyWD7YaOH5c +ayTK1jWK3Jm3BqFE1ORHQjPLMYd+ysGZsCFGcAGEL/3XBu0Tx1poq24uckus5XVk +zq9Kt/d/C8lZR+TSi8In64cpKSl8ZuowN7h7gvldhC3A1jLu2vwyA2IBEaew3EbZ +P0Trh3QbPrrKYy8ljK3LXa6TrtCpkO2JdQDC2Ih/3IS1ed2w6MML/Ss5trXwUuAN +a2WwWwzksx7K6171af7wQ5jdvQaFDVM= +=KJKl +-----END PGP PUBLIC KEY BLOCK----- + +pub 3D52C2966A51F8F4 +sub 888C89049BDEB64C +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEqVGHgRBACyrZHA3gvzM5WeoD6WwQSIPdTPuWw5EUonHytf4m7pgX8Xkj2G +enqbzW70POgJDUTUpvHDSCaAWiPY+ld1h0j+ghXgKD7IQjqFQTvnkdBT/qbOL7P1 +Umv5OLGSKeyx/BhxNiD0uF/huyP9b1HWC9dbIdVebhDcyBDkBAFtJMOxjwCgjnxw +sUI5vJ5FMPDjUdRPTVQxwlkD/1PGN4Ycdn8ncmZ1OG0T+vmL+C+yGMIdbWIizffC +Li05HMziwK33NHk5ABkeyIijm4Mq7JUlSSwt6gQXJTGlidHEcmKqSTg4AQhybPL5 +w40KcjNyAeQhIFgHAfMzy+Ikxzlt8fNunMTf6utWrPq2IU4uE4lJT4kSL1ic89vx +a4CLA/4g4MJVuzTegJXS5vhMnEI2Nhmc2MIAsEhPcIwJjhUN4rJJMcVxQO+Cmrfl +0rcosxA6wtjFDdPcuXYiAoJBJQrVYp6+w4GyHW45/WR6iGas/Rm0ZRQqnf9WnlpX +o5d7uEwzLfck4iVw+z298y6qk52coFKaKPH0bGVxguifMNdbwbkCDQRKlRh4EAgA +oSWTikKPMX99ZIqYgjAKlM82x6H5xxkisLGwI13m/nvRgOBy8gYzfJCdxrEupnvN +k4PK7twUka18oAoaKfKFBdIKQ0bSyUNV/RzkJDhkBCCU0T8DbN7Xe4rP35l1PvSK +OwtGmIxovip+Spm/j38KKnSTWyZ0JIBTOYEoB8wzyna/fcibwIy/M/wj+lrurXE/ +6QnAxqJjAsL2MtuTurC5IMfRPQqUL0yMk+l+wUpuBaWhg70NhbsTisdJy9TP+Nsu +7tCJu3GumEuYKd3E46xIFedyA1etFHr9n7GkjQkrthlqaza2bUFOv2xOpTJOvZYr +15zOCpHslcIQiWT5zWCQcwADBgf/WBNDvc3jNmAyTP3nLRbA2JP+tVBVwdQkHktY +4EjaLC7HjUA5TblQFTycXtZyKJ+LUwXM2W47h4HMXhSRq7E/wzMUHGhUMBf21MwY +//8mirKgRiU1rkArBKtr+bHTpsJ1UEoCaGzXxvTGxWZSLLrV1nBvbBXXOOhFKvCy +mFcudN12i1MfBrubGNT905obseKThEc1umWzeRRWOlFEZkCONLR9PgSwCok7TT3O +lkaGKRQB4cu54e/faOaLvFh2BgqSIoMgGHfVLJBTbssV6GL6T4YoU2Bq0wtLZ2k9 +tMgJHvPziWrk0rI4oesVWDmbEoRgAsYlTkdev0u98g3c5zAHLYhJBBgRAgAJBQJK +lRh4AhsMAAoJED1SwpZqUfj05WEAnRNjXTAHWA3uXnDtK4XDHeCkqzUIAJwO+CnW +RTDq7K7Q63sS3rHl9X9ZgA== +=lGHK +-----END PGP PUBLIC KEY BLOCK----- + +pub 2189CA6247F3DEE5 +sub DC032628E927D006 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFEsDjYBCADKUrv1zJObnlCQ/2AyexoofOuSSzj+L8AIRm2tm2qdPgYNYZHJ +II661t4G5mg6QSGRlO1+NaD1S4GlcEpYvC860Uv26M9FbUAjlMJlWqLoNME9N1Oe +eSLKs+C6RroY4qDuuA0UaLE1SQ9i5cm5bxPIfbm6aCcIzecTbfD18bxIq3fZrO2S +yHek0H2upHAipKd2g2Ed4CikWZV2f8MoMZr7CLs4XgrmpEF01Ab5RBX01kX2MYaa +Vk1BAc3FgLwA/azW3X1pdiyD4iAesHN6SlAaD7x2tZs8CrnRCaWLu31t+x+Sc4Uc +zShjTGdB+euZykFpJW3t/D9BLicjRDTGjBfZABEBAAG5AQ0EUSwONgEIANijDStd +yc4CSVYSXmX+ZQnWTF3gjYMkszD41yT129Xw1RTw//ayxYeBYruIgZb24eAULVhp +hEEW9XgkXvPT1gvAlU27GJ5DYswuh+EIJGGjZMngvORS4Dvr+lkWXU347dgBIIHw +vVl+rw2hUrnhn6Y/nBGWHRFWIXAMwQC2w61iwa2E1aLUJ1u3OvrC8U7Llmb76YOe +qLGbOFiQN9vcr5orrqP/dAdTr4MoyS6dG7Lh8McfWwEDzq0Ygy5d0EJDudusApwc +SQ9set/SO6b3F7IiQHAz2+sXlGJB1Kscx6tpbt5NRegKQp3qyZG71pp31QRePgbf +O99L+AAv19DsQ40AEQEAAYkCRAQYAQIADwUCUSwONgIbLgUJB4YfgAEpCRAhicpi +R/Pe5cBdIAQZAQIABgUCUSwONgAKCRDcAyYo6SfQBtuJB/sH31Gs3MKbEJksDtR3 +VKXGp+kll7BYSoVYv+llFcx7CxkAJNUQ/LH8l9Zbd/j8MA7e1V/ts/QkuLcLqtbe +IdPWcHqXNSjFgOCIC46zGfV8dOmtjlblhfG8YvUZNnlEtJAFBtxOV+kKnMV7YWnS +xm/slrbEFyaaQpicdtP+hw5ubWIAIzK+N3PbjXgKlIywSljU8iXsch2oCms8dAMY +TQeqhnbq5VRjpIyGVrYzqubRLojeXWdCJ60rDvFHnqCyEJgKtxiWX4lQBGfdsnqK +pmJNVv0X4CDHxyPUwChTtFLgNiJvJ2OoYJi5oEg0IZ0rt/9JNNwNnUYlB3qYCXU8 +3771PnwH/iql4tb/K9HUZMcZdjJ9cwljVbwL0Lk4SPeVuPkhTsRmSsrm9FHjOJkX +RitmKnkQWbhBChV3oxVwklJTstYoGXHsUrHnmYV21C8y0HVGEuu2bGyWD7YaOH5c +ayTK1jWK3Jm3BqFE1ORHQjPLMYd+ysGZsCFGcAGEL/3XBu0Tx1poq24uckus5XVk +zq9Kt/d/C8lZR+TSi8In64cpKSl8ZuowN7h7gvldhC3A1jLu2vwyA2IBEaew3EbZ +P0Trh3QbPrrKYy8ljK3LXa6TrtCpkO2JdQDC2Ih/3IS1ed2w6MML/Ss5trXwUuAN +a2WwWwzksx7K6171af7wQ5jdvQaFDVM= +=KJKl +-----END PGP PUBLIC KEY BLOCK----- + +pub 86E02C5A42196CA8 +uid Christian Grobmeier (Apache Codesigning) + +sub B4038E8B427473DA +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=B9qr +-----END PGP PUBLIC KEY BLOCK----- + +pub 7C25280EAE63EBE5 +uid Oleg Kalnichevski +uid Oleg Kalnichevski + +sub 926DFB2EDB329089 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +ZNfGiQCfdH3+RPBbKSQofz2bGx7/niTd9qg= +=CP3a +-----END PGP PUBLIC KEY BLOCK----- + +pub ECA081A9790D4FC4 +uid Ralph Schaer + +sub CEC8F362662576CF +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBEwwaQIBCAC/SIIRRSgKRDy1LGdgMiwnXSFCw6GmVHmcKw/EIZSgRwpr5c5G +jIsdubpDLgICSCQcqiSYArx46nyBazksvvKji95oSBAdnuNMFD0XC5MdHBn5OE6I +poa1CBnz/g2XTskrK85Ct+LelP6migrebK2pAKC5LuHn6nyFpb8C/ceQ3ou77yYj +5i4/TP9QDFqnWL4tkdAhnoACmBil5sH8Kt0pR9fPtb+wDOnjtHDpb5FH5pPIN5zV +EdP0k9MA6pp0wtWXavdMspJoxJctiqJ+AL8ejNqI7PbvXcUQ2A4k/oUYJUm2JU6g +UGzs17pWDUE+xekjmTJEEKwhIVR8I8+dTzohABEBAAG0JFJhbHBoIFNjaGFlciA8 +cmFscGhzY2hhZXJAZ21haWwuY29tPokBOAQTAQIAIgUCTDBpAgIbAwYLCQgHAwIG +FQgCCQoLBBYCAwECHgECF4AACgkQ7KCBqXkNT8RRHQgAlacmTmvQ2sti+9Sbwmzq +lLwb0Lp9T4UXb9rmPt3dwpNOQmT1FAtjiGBjJ4/lm0wra4f7pQUOyhLr9ZmbD7QV +m6z3/SjyBajDAGPQbmtASjhl6QU0EFetJhhIpiznuvCdX+DDltV3uMWHMdIp/XOJ +IO6nu8guV07k85Ud0OmjXyBfqV54HbqQL5a9rEqYuBWDMGlQGjjbWbrMe0SZZUVt +e2g9z6Ki4oisSvBS7ZQ3x4Uzz45fcfWWqIKstzyjfMJ5obITkkHXqEO/CQ+uR06f +0NoB2CYGe59Ee4cRJ8R32pQJ1bfw4ehQsnOrcB3bj1taLspkPn/RG7+qYYVck1kU +z7kBDQRMMGkCAQgAyLpmVFisy7DFYkTnvnDjAzkmjvtBKyjYytG/Le81L60wBbVe +PhVAq1MaNikGtdm5ofjvQ9j7K/z8Mpn8KYExsNkNcrREZcuBswlOJZZvqsSDy8RY +EUQ7rR7SgQEqSpBCqGVe96q08hoam0D2ohviokocoFr6JiGXYaXTnYsJKwZCgY3I +r1FxVaXvkqqFwLGvPlGL28L6un5GTbplRJThOujaWtiOpjWt63GnJ35ukpOOKxtO +H0MoYZwx8A/IN8J9nH7fR0c6y8pgloOcrDFRBacGSUJtxdy+qK/R225xF8eudO/G +CXrVyxM1oMGL/MtnXfU1euZl0VENjLyDE+G+DwARAQABiQEfBBgBAgAJBQJMMGkC +AhsMAAoJEOyggal5DU/EKtQIAKQW/u8UPr7fBs6ir/xSURK649reQdCREqEoZccX +nwRUJAJwz75g2jNJeag/4VjgAVmoKELu8PnHBy5TeTeoDKhVfop8iwIZazdWG4ri +lTWIdVdqq4viw7jktaVSyPo17wUJc1+YgKMprSk9fNptU9gD00P0RDcdrEmBzDe6 +mrZXlmNr9ecOU3hJRrAi6DDMdMsBCQTqownQqIKLX13akKk63TaSzO1/y/UcmLbj +VbGAJ2YeyoirsXbAm5565Esrd+ZzFtUlYySFsma7MtE3Ry/U259VP9kcx6hET6Xq +Q2QTcPh8Hht67/q6SyQGbHuvZZ17kvVHvYBP21xQPgPV5Kc= +=ane8 +-----END PGP PUBLIC KEY BLOCK----- + +pub BE096E29EDB8D141 +uid Eric Lafortune (Key for signing ProGuard artefacts) + +sub E05A9780475FAB55 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFFGZXQBCADeZK9xuCrDwJ7v37y8RITlchzBfJEWv7cSbrSIBlFNAsUUoshW +Y8U6xYKe0GdiLVta2F8bzs0Si4LcDeglQNi9Fxvh3/jfs0MEJUfSeZ4z1Mn5WY35 +utbdlHe6i+7qvhpHveREwWoWuvFGKeSCV8SioolG1mzxrDVLkQefPZ+Kr+xd2cYZ +SIkbjdhCvJHcUkD9gs8Wz9q9eDyc7dGJmfBYaQ7Xa6lbd852qj8LjQ7Gd41yHU6T +U3oo0kKfAPFkW7rX4zeJEBgpncK0i4ertd5to/y2hauqPU3VMExqNS0/L2GqKNmb +Q2Me02pBSBCrLLCUJkm8jZorPNxlQxHpFLHDABEBAAG0T0VyaWMgTGFmb3J0dW5l +IChLZXkgZm9yIHNpZ25pbmcgUHJvR3VhcmQgYXJ0ZWZhY3RzKSA8ZXJpY0BncmFw +aGljcy5jb3JuZWxsLmVkdT6JATgEEwECACIFAlFGZXQCGwMGCwkIBwMCBhUIAgkK +CwQWAgMBAh4BAheAAAoJEL4JbintuNFBUQ0H/1ahtWOeS+EEZqUxxgLE3aiuw6XR +mcFY/9kRlnBsKpWGGyV0DRkLThXSV5fWwiP0+moef04Miv81txVXR3U5f4MY3U5J +SDgeB1GK+BvcYz1CXxGcErgaMIDXu/K03OyQNp1lD2kjmDDz8SHdVqpv/aFfxWpL +uMaogbStXfbDiMjeMg2zRcAzXqu7JlMt3z33uiTUZk9jubAPOBnP5/Yhuc2wcnfu +cLUUL9xNE6gpl0Noy8qJ2TaVoHLfDEdSgVbLDNpippNQCIEXn8VtlBCG9FBtTUR7 +z8fGU8f+ijNYHMa6jNsDlSo45/RV+alQSSZhx3hPCIgO2klEkawBs0ikEjS5AQ0E +UUZldAEIAL0CmXXJLZWMbKXEROAYFnUqQ4eNLUcLY1NfL9xrF2KP6apMXLJdftwz +JtcenfD5vra8w5JJBn6cvY4Dr4zmueDSsN3Cpgr7c0trDNspAQMyUGmg4Cw7lAMr +uIX2om1TTa5ALsQ1PfupnLFLFKbYd2MmfwEVHgEBAzqmr89RoG/NnlV4uxvWumb/ +OrLzzizGLHdLFjnq3Szl6wQPJwmxCtWHvzW/Y+HYclm+wp0sufvrXJ/G1RrHKxwh +xaDVyLKsb5wkUC6SZmE477SP6ZCokoAGHqEK+5JnM9MYXreQ7N6NggRUseCokFaq +ckze5wVBXmPuVAg76ScPFQd4JzLkGzUAEQEAAYkBHwQYAQIACQUCUUZldAIbDAAK +CRC+CW4p7bjRQSkUCACPWdIvMXPtSQFnFR8oUIGxvcp9MYdealHNYkf3qgJTuWbH +TeD8WpE53immju4hitOq/qDevKOWhcfSaLqCtdRyYQFFDWQt4SsiGdWfCvKiBMSM +nrDQI9f+XCv7J3ute5alyMgv9Uo1XLyyiwhz9kJ9mzg+ENvy152PucI4TN63qMRQ +MQbkAenrTzIer+5Q9ZY4TILC8pVVAIPQjTHuhdh8VMclTdkHab2PCFC57/3djJyY +44PLhN3hLI4CElAGLUwBZLRa6OFOvwW5naivwgk0zeeTqq/jTOWPYiy2dyyX1pRX +8bJh5et4mXyM7HLHRp+FblgWxpFWNvMCEpxujLsG +=B/UT +-----END PGP PUBLIC KEY BLOCK----- + +pub 15C71C0A4E0B8EDD +sub 891E4C2D471515FE +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +tiwy+wOBjaK9g3Kk8jsN3I8t +=8Tiq +-----END PGP PUBLIC KEY BLOCK----- + +pub 80C08B1C29100955 +uid Jake Wharton + +sub CF771F914C2A4A73 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBE2fCWARBAC3v9wYo5kmynmVP+43ccamidflSLQjjpsXpSDLPFokGxeuw0OC +QJy46m8b5ACoCqRlfwnRRcEHxiSlaBATJA6hi7NRO41R39C62JXsIxNJR16JNQ5k +oG/NOAraw0E1RQIFslznQexfxPg4yFIVrsFp1wkpCRrCklatPMNap2DuNwCg7PWJ +1vV93YIsaH0O2fnXz3E+6zsD/3cTzUWuySEDiCLNO3JYJm97v4NDQ93encP1Ooxh +n+PSIP4GvjrAObh3FfWUucv8UGqcw5bAL7dA1z8SgKeyFk/afs2XofXdvC+PhZqC +DwU0NiE0D/tDWqX0qIG4ezTU2uk+5dE/WVl3R10nOBgquQdWIdYKGfV4FNTiEduD +Uw7fA/0XcwFom7eyR9eBonQmgIadljztm4gkv11lY33V1ZfJNndPKNzwevDwX+om +/VEHvpEfPx5toD4H523BPx55ZtfowuMtFHZI718alpCo3h6xaDhGwXvsg3s9k03k +rfxzCjf9qcJX1gb2JVZ2+2jCwUDQZeEwV2vivjGNiN9rShWW+7QkSmFrZSBXaGFy +dG9uIDxqYWtld2hhcnRvbkBnbWFpbC5jb20+iGAEExECACAFAk2fCWACGwMGCwkI +BwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCAwIscKRAJVQoeAKDLeCOKKnt5aqlHD/7+ +QPOgX4iYPACgvGRCubBztEBkU2xXbr9J2cQY5em5Ag0ETZ8JYBAIALeU4dgFKEn8 +b3E1LUT25svvUUX2kuVLQ5TzokC6zjWQrPehOlsYx+ey8RSN/6A5rBLtn1z75ror +F3+vN5kLPAz8x2Th6Cxd6lvn3DQHfvDL0YHlp0AZzhHx5ogyJxdaqwzNy0JWxava +FGN6b8bbrR1Nf08kq/d5dNe+NGVdBXcuqUo6jt1W+tkbntklS5e+B9/Q/4L8dYkl +8xXRIMAuKw6h8j4LFXse6xndWeWtTIkfZImz0f7cLQV5X7QSv90i1KfzT9hLiUjp +wqPydtTNuB6+gda64jFNhVcvgW+h7MH6FT/zSss2Jh2eDR4HFrv7EJSS8dKCvPox +y8El8pQMG/8AAwUIAIXq+ryw44voH/IdbvTQtK4t5/lp/Oj9b7QrMR3u/iQxM4K3 +dq7rUbA8hjdMM3gfMu13B4pzGtpcf25b4NIIQkhES9+CUDQDYHF+gwkrwEascbdf +YZiLAHtcMjW1Og+IhTY8wDuJT4I1pqumSzWV8UxVJctqNUTY2eU7158oD5+prdCc +eQLbzxoKFtu056kZ2+46v6bAl8g/w8WoVORUuHruuvKohMVPHwNQws7KHCFy9YCr +4yIQfqC8g8oITqlgUZcZaXx6K+NndwA6LAoXJL0edaZOZBuFq5H7Fkrw07+OIQFq +LTGcFpR12AzDh9lmtyJQ8nVfb6IjAOSwBPlEZWSISQQYEQIACQUCTZ8JYAIbDAAK +CRCAwIscKRAJVd58AJ0YA8xv0U5Odm8u21BvyxjGS3tBZACggF6P6KjhUPpIAYTS +6v3TtzhkJdo= +=Zirr +-----END PGP PUBLIC KEY BLOCK----- + +pub 5F69AD087600B22C +sub 0440006D577EAE4B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE7JURcBCADO+9Dc4/JnB+wX+fq+Fr2zUGSPOT6/qjE5kXL4FEbJKsqDSAKG +VnbtRrsIUdmNIFQmz71bBDFhRBbrSrkz927k8eUPhYtxE2NmmWSuKgrjF4qviPQv +m/7SqGx378m/qw4EvpgGUB8EYif98LYdWp5vsU/zx0Ps9auqvetAzJaL9489oE0F +q8FVhve6BMfUUV7zOTCmJnf438YO68upjU0PVBdfFE6Qx4cgCeWbQGy2cooW5azN +iIenhuYU1qikmxMHq2xZzN4uSTWLGDpimPyz+Y1aTSYJ/bgn9gPStbI9sojWo9SS +5gvNK3XqJzMwxwFow86UcIE0vPD2T6ZlBAXRABEBAAG5AQ0ETslRFwEIANrjVe+1 +SPgEY9Xfe2+XGN/3q9DHHPP0PXLTGPuWKUmAzkBddNEAXTkPKtyCbH4WXhf4jBZR +yFIpLkoGrW/yIeJZNfoq5xET7ldjDaAMNxb59/78JfyctGbEAgUlzueFONk3Dl0s +DS5GDiWqJg4orqOtUcY+46oo6Z8ncKBbxIvOL+qv1KLWtzIoxjG81PUMk1/CfTij +HgklKtLlbpOHs3m47/28AP2sf6kESKxBwzjgdSyeSci2nCuPoeSfLTJBJlsREL+z +DaJES4G2nj6r/rXX9YHnuH9n0hNxFyhcY0ztsIyz1wqx0kiOYHnLIpUJ+2TcR/YN +mFCYqZ/co98sDMUAEQEAAYkBHwQYAQIACQUCTslRFwIbDAAKCRBfaa0IdgCyLK1s +B/97PLjfP4A523G01/uzf2X0AVyWfh/RhopJmESRNcaDnhLfTDqmchg02XxjP6jS +ngxn2q+6XEUJTCvwODbbOROndTl/HwZFAbWGp8sozS5U98g4zulWldEgrIAMzY1G +anOJcUvWrTepneZupViwHR4Ia17lei7IijkvveobXIaAr075u5nDyO8NeOsiUUsg +gufj8mxt7pbeWOkAEpMCN2VgdLtDylKKoJcFp4KZbvtBYm9q8ULy99orOGK2Gmfl +8KEervwYL9Gb2YsqZNe1JNe6w2/yX3i6g5+6Fuh5YIvSji20USIO78GVaNiMXKO2 +hsWaeXOM0n2j759uNb/Nd2XA +=2J9s +-----END PGP PUBLIC KEY BLOCK----- + +pub 2C7B12F2A511E325 +uid Ceki Gulcu + +sub 10DA72CD7FBFA159 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS +2gUXM0R+SunMlun9KsqjnojJ2ObVPvbm1Hg/66JSRgR3JWfIpSlJxLicpfu8rCfN +bOjh4v9ZipD+px8w3o/RNrnZH/KRsoJg9yER6pf+pUZqTJfdg5lXezc1WF+/1qVo +ypldMGfrkfLsPrUZTT689ubbig978e7eYmJEqldtaIwaAzHQnB70wIJyg/rEwFUM +ldsvs6t6czSuJ4zPMvmh8TMpTg9e6+DMktPl1CWRONl8RPpgYMIC96gb4OnfDDjk +Ex6clSCwgbDwdeAyOjjR6pVq+pCNTo1Pcj5jABEBAAG0GENla2kgR3VsY3UgPGNl +a2lAcW9zLmNoPokBOAQTAQIAIgUCT5k74QIbAwYLCQgHAwIGFQgCCQoLBBYCAwEC +HgECF4AACgkQLHsS8qUR4yVwIwgAlj6R9Lxk/GnclmSvgtTyk1r5GxJ75iSCzs7q +DlNuM6EfFbuZvLWORGgP8KtdQdh/bdICtRbh2eoW0vEKJKkl0ZI0/RnVMYKYpIHi +KVUSjPq0svwDk5tUa7taNSdHfi9o1G1doBHyPu1u1xDVzMSWsbEvx6aVr2HkBDRy +A+VcmnX6tokZjyRX4C9ldX3tR+ffn7v2Iy0bIesM92nMPnH/fPXWlnbQKTxQeMj2 +qYSl3H/NGp57G7KNSl1na5U8ueMcUtYb+eHphMsmaEb9xw8dM96CzIPZh1xMHNoQ +NNJibURysbUpFlGUTOv6K0A392QkX3GwuCQGOeLWHOoQHD6Jt7kBDQRPmTvhAQgA +trGiCYnW3tqvDzaStXsguVw67pou65dO7LTcrX+NTvejJZ9SrC89JsfiKBwtvyS3 +X/qiB+S7RP21PH7SYOy+orwDw1nacNNeiTdPnxQCDQVNeWpSpmbLlA+0b6K3aPf/ +EaCKndXmnQyXVOoSXZJ9bqAe0um0NRbO7M+L1KArVkWW56ms+DvHAeZaGnSDDHQp +JI5haUqgSWWP/VoPEU1x0qiBZwY3lokSwRMISC4E/uiUvvm7rvfbBzfOiVrjNPLl +sVPiQRgOTfQO7dUZAmt2yqWJt1Clliby4fgBVcOYUx0QCMiz8MZGtSB17+hSrC2C +b1T6n0ypxuYyh4sV2LtqMQARAQABiQEfBBgBAgAJBQJPmTvhAhsMAAoJECx7EvKl +EeMlX0UIAKS+4ZAKrGG9jbWfzTTDbu9zzkXgV13suMD+XcGz10DkdluTUBXj8wWl +p289fXNm4E49ipsNK+dcZ+gOATjUvb1Llh6D6bHz1QM7olxBCeU2feTmYYKBH8GY +Y9JZzfAXNMQhcNiiPj+ntZqePy/EFA4uZHM7We7vl2c7CBcDAq1NNeEczo0KvG7A +Wt6QoaMVmbvA14EKadNzrmEy9apkag1BKvwzXInYCvIHMa9ZqicOSUcI5QCYu5Tu +fvIE7Eq3Khh2Ex1FiOaEA+57LMrt6NsSKXrB8JNYbI5pqE1rxJXZnYtx3ZpPAAEf +LjPdi1AOkWhvhsoPmiGFC6ebYQ5eVbI= +=9O4j +-----END PGP PUBLIC KEY BLOCK----- + +pub 7457CA33C3CE9E15 +sub ABE9F3126BB741C1 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFIXyRQBCADe285y3Pu7KzoKyP6wqeNXtvvuwMatAmPm5x/i+S8MlryqzsYa +x6twUmXV1yKjjtGrO+9fHvTOWBfSSP+fP9KTaTQYSasoJq2Mw4cQDy1i0zrxNZUw +N4/BiyjQA25sdfaOolhO0sFlZuTZpYy5wG72KkA1ygNq0L+8aBKhEF6zDU61YzCC +AxjcgTftgTeeoqkJtYa06lNz3jmJDN+zUQignfRa3ymoGtFHTzoXR9maE8RWDty4 +y+DY+8ibdGgSgKPZ0byTCDyNojgU1YTlADa/1/NY1ShYg617O1xicLNo0JEJlf2U +Tu4Ymql36+xSkYSISU97Q6Utgq27XMuZvDUDABEBAAG5AQ0EUhfJFAEIAN9NHRd2 +bYP/3CDi+n1ilSChld0NR3DUBgS/AdqQ7IoAUfj7skyI/WyaMdV4uy6vRh5YgNg2 +g01nd0LLZR8Gf2Ck+D6F88CdZaTxlkcxHV/dXMZ8yBO+0D6yFRZEL7Imsv8Ig4QX +OVwfuiXEPk/Ef5Dy9SdAVhcoErTGGR6BOGVVvexGtBwefsjMaOG0khkRbWIQ32Wx +fUFuAv5XBQ0ckLrlKvYWUYhOlXg27GtFKH2EBBF0Z5ZWu7gaBFwSV0oLp9EWcD+C ++WEwUSfBdqfRJtyXvgf4kZdwdQ5caM8P2/Sdncl2l/LU1At2Smc+plr6zhIhDlLh +lrzKGa16oARSBdUAEQEAAYkCPgQYAQoACQUCUhfJFAIbLgEpCRB0V8ozw86eFcBd +IAQZAQoABgUCUhfJFAAKCRCr6fMSa7dBwURMCADHrqwRNHkbG1QsXJr9oUK6KVkL +sPhcngIhxRLlqe89omg9G7eGNauzs2PKsB3txotCFc7ROVNv/TAuSDYzkPos8G46 +p3bGesjfJb24zc6GMT4RGIJoh1oNG1IciafIIHjp2ZJHRmEDwmvZG24OHJ+mlHLj +aedtqlWu+zwwhH2VZrI/U3gW/x4imbk9UyyzciEIxrAc+fc19xl5PkUVcSDVC0cA +qGpeZz8+SxFaf3Rr0aGnSbeuHRjNupmoxkQOAey1ztmdWiCPf5RFfmFD+fENh+/x +qYiGorYpcIN7UAsMkvD5UHc5ZG2tTD41jM99w9Lm/xHJ9ks8gNwZESwIzr6ABKIH +/1ulsflI216qPz5o7uUxlTm8NfTyATfCUuZEDMYGOjDQPqQa8hFebqjWWYBUq2Sl +aKD2xMeEuEXV+M5k88Cx6T2nvaZWMsrD7uGj+tTsFaKBGxP5p2OSEWOTETKKv6Cx +7vcMTQmrqSFo47bFKlNSs+aVM48UnQeFtTDyOhwa5jvtqtst4eQHwHWQ99BK0TEy +mNx0vF0nPjWA76CRrfopOwXKdxJgoKq4MrxE92ot5I82AZBPeiWVJ+6wECeK/GoB +IXZ5jEUqrQmmzIboWA5G5PMJ8egzLJNRJjTWHjCWrUTnwNcqaD4/qZxIlW4Lt0uv +Glx6pKOJQ05u+9X/BzoVWrw= +=ajY9 +-----END PGP PUBLIC KEY BLOCK----- + +pub 164BD2247B936711 +uid Marc Philipp (JUnit Development, 2014) + +sub EFE8086F9E93774E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +Qw== +=iceo +-----END PGP PUBLIC KEY BLOCK----- + +pub 1861C322C56014B2 +uid Niall Pemberton (Code signing) + +sub 9A347756830C4541 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +co8an9pO9/oqU6vlZUr38w== +=g8ME +-----END PGP PUBLIC KEY BLOCK----- + +pub A1B4460D8BA7B9AF +uid Mockito (http://mockito.org) + +sub BA6D22590B3F9BEA +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE4waOEBCADHDHNTq1NRR5TSooIrKY0BTQnaLfjKZfcJOwp+btBJrOUO7+e/ +V3M4DZQclj/e8SBiVmRPK8Oyrv6i5B5+Ee/qNlLjWiO10AJ/PLRjYdoW1V6PlTm7 +2aUxQ/wNXxDcOoH8M7Y4fEqZJ3rFuta8ogeIYnkUwUk3gc5YKk7KJDbiOXQfRxlY +9MeVKyoYfj+2Szaaz98W097Pqf9+7i3WjB3TKR1pnWlzF6rLWIGBJqcJuTGLWUAB +hwOMoNiIBAqyGu8E4rT8pP9OueprOeIjyKgOBWV5yctIxd7uu51sGR47TM2wmMmm +r/Kz8FkMr1efof7Bx4mJuup6wQXonRMVBqpLABEBAAG0M01vY2tpdG8gKGh0dHA6 +Ly9tb2NraXRvLm9yZykgPG1vY2tpdG8ucGxAZ21haWwuY29tPokBOAQTAQIAIgUC +TjBo4QIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQobRGDYunua/0Ewf/ +QRv2EXl6rlgV9LgXifdgD4ctYsMvhmJV0uaAaTvTcNpbYL0lG8FpCs0KHvBLWkoq +esOdJYT4q/9msnBAMXS/9ckteDism8BwZR0qi9qzASzzMJEH7cdpr1te17JR0fl7 +8cgbGyw6UGfRSay9c3HyV0rCuQSFPMwQkG5YVpRiN6NSnYqDczS+aSjd6JCKu/4I +LVgu4jH8oaUcGJEaWLmExSUzrUv9HFZXQJxLzrFT4k6AVVzBQCuEYW9XtgosKwfo +0GweBXkC7iuO+bfNi84vyRLTkK50h4+rVNkyvNlgqknbeGrpvOvGErYJy24API/5 +TNP+ZLCTl7Y+qQejTFVJ4bkBDQROMGjhAQgAxDjlr6Oakgs+5d5NcIYpJ/8S5BIU +aVlmjKoaFJoAy46WzvvpaTC022js1ZSvrM8wlSxSk+kD6/FAJw2pJwRgVrolOYJQ +mqLqgTA2QSN+leWo0x8gC1+QXzrquCOd7m/+h8FHUDaxc29XQ+7+HtNvsSxY9dtD +zgQGXjPXSppVCSiDNy1IuIAxmEAFSxok12Glxq/n2DFx6OnVB+5vvt0C8nQ6w0hQ +AQKPUmO7fNav5lZMfKgR95NrvF1Hu5V6DZvpbXg6+NWfA8LsCampARrou5qzy67h +b/+KKGHTDMOvZZlGw6oSnPngqmh06QqY7P4PKVkOo3Vb6+02ltyZ95RgmQARAQAB +iQEfBBgBAgAJBQJOMGjhAhsMAAoJEKG0Rg2Lp7mv2b0IAI5pDzLtBGxYhmO1rSDg +Y+JY7ZAr4srW/7K6Zc0RmWv48JsZOf7T78kIrif6jrF+ZwBLrdP93umMr9aJ/mJg +lr+0oag0ZVhEW6Jb7dgiRn8F9+qcCs6lyozAG805oW2lULkwqSJ1xNs79v9RtOWl +I5ruLVbS7XhGv0qH+ly1xpIuYOzNvpOgj1pC3Pv+NuL2hrLUZVg1vM9eCM3TDVbD +yJZrxKdMemMSGHHsXWHtn8t4BT88kice4weDq8GBl1Dx+ApO1+iHj779nMX1Drfa +xtJLTRqH9fhHesISmte8fPiydGT/HCA9quKUuxyN4W6Uwu+Uov12cGV2sAI+H5qP +hF4= +=FXjQ +-----END PGP PUBLIC KEY BLOCK----- + +pub 33CD6733AF5EC452 +uid Dennis Lundberg (CODE SIGNING KEY) + +sub 3624EE1473A843C2 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +v5JsdMMyJvQc+xtjXg7OVA== +=RVv2 +-----END PGP PUBLIC KEY BLOCK----- + +pub 85911F425EC61B51 +uid Marc Philipp +uid Open Source Development +uid Marc Philipp +uid Marc Philipp + +sub 8B2A34A7D4A9B8B3 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +bpJ8mdzS2PJko7mm +=7SBx +-----END PGP PUBLIC KEY BLOCK----- + +pub 152888E10EF880B3 +uid Daniel Fernandez + +sub 1CB037909F7E059F +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBEtnRE8BCACzVmIkAALxSHQAbp5HCXCLqL16UnxJcrcUIcnRQSXiwjAcNsjS +S1mRwr0WrmaquTQYDk1W8owUdmAXdTfSHgtJKFRKdJ20IymeXx1VrmUiiCNY9Jf1 +xYhaJAopMTeEp65q8enAZcxjyqVxk7wOPgKD6uakQDdwiJtWHsug7zlmUtzZ6Phk +iCxhrJSasatOqQoJon+RMlsFYWLulDFv7CmDJq/GLS6bMDajKt+SXBsnKL/gUWZ4 +hT0sL4Ux6lkshyey1BSbmDbMnHmzR2Ng8oIzKziA900FFaAWsyg3S6vi6I4P/x4N +PfOR2BiUwcPi7lA6Tp0lwPM0IdiUep9Nl13vABEBAAG0M0RhbmllbCBGZXJuYW5k +ZXogPGRmZXJuYW5kZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0PokBOAQTAQIAIgUC +S2dETwIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQFSiI4Q74gLNZ6Qf9 +G6Yr02yGjtoQEiKBhSRwyY44W+FBRLESFZ+M2yrVr74li0/1RVX0e0zyYUWQTWcY +6ySzuvWdfqBlEeh+o7PPV5VwoBp/xHvbL8ufEREqjbL/0c/4O24ojTEWeOb7nGKr +z5dxvy+fV6EzJfK37g3vYZoqy3uv1O8205UgzF84XpVW3pAmZRHz8G5+NapQD/nt +p+zW1PqPK1FvRFxcMDsFhE0F4qAPB5W1jst+E/G3eyOeS5OxXePYiLaSlJo3XovP +TgZKMZAu1WusPfrcTL+rzb8Rr/TQinb1jNkVCOyfqHk0Jfunda4dW8tgWLkau/A4 +eki1H5pOYEm7/lOQ3HRlLLkBDQRLZ0RPAQgArznjhUDrXc+Rj3JK5c9Kz7rIkRmj +fvXAz/fWjgPGE75brZPcicuSY/DIMXglvYg4Nn2ELpfcdpA/2NbI9IbvBRvMm7lz +un9mYlq4Id6kvpBhQbCg3ksyy6aailNB3oLN9Z3DFw2CnndDE9YuAkLHtSwR80yl +M1Ain0OhHh+cPU9eoQSTZiPI4nmNFoLlIUmLHIqmGIndEsdkWg+BczFsc7ARKLn4 +1xHVg7/o1TBleyxUrLVp2LatNWZZdqD4pZfeAalrrmgTJHP89X++Qgtdt1baMWio +mMUusUjxM+WuUSzPmYt8C2LG1dp8Dfvwr8DD98MrHwf1AkNfGGNSTWTWbQARAQAB +iQEfBBgBAgAJBQJLZ0RPAhsMAAoJEBUoiOEO+ICzSdEIAIkL3iyzDsl8s76qY5EI +JPodAYBeN85uA4V0tFdmnObUzas4Qkl8btGiYScQaeTBH+MepUqJiae59yOES2Yh +y6bf9t1+WNkYUbPqvazSQgK1rujjlpvK33szMwaAr4OsiCXgLXjiiyUihNTu9yOn +/kaV+ry1D1dVd05NgH/kHsGcXC7+bX9DrVYMzZd8vIDTK1cYEFSk/4f/ej5TkD1b +VyuZpWG381vO/zchFeEFO68wd7KmVuUpfemZx4vaG6u/wA9DCulCVIhScBIXmLdw +UWihEmfbGu3sZ3xuqmInxEJa8pPgjoTHTQ1KcUx8QDUSXg0Ne49z1DnRbB0ieTIV +dqA= +=llhr +-----END PGP PUBLIC KEY BLOCK----- + +pub BEDE11EAF1164480 +uid Joe Schmetzer + +sub 4BE257B370130000 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +33wjXAW0h+qq7/7Yq3w3/7ncv9sWIzU= +=NtIH +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 00000000000..70d6d62ab8a --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,488 @@ + + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 28861d273a5..943f0cbfa75 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4230076d14a..171d8761b27 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip -distributionSha256Sum=8626cbf206b4e201ade7b87779090690447054bc93f052954c78480fa6ed186e +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d517f..65dcd68d65c 100755 --- a/gradlew +++ b/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d6a2c..6689b85beec 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -9,19 +25,23 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,38 +65,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/src/freenet/client/ClientMetadata.java b/src/freenet/client/ClientMetadata.java index 53e68a11017..2cc0a5bc82e 100644 --- a/src/freenet/client/ClientMetadata.java +++ b/src/freenet/client/ClientMetadata.java @@ -54,7 +54,7 @@ public static ClientMetadata construct(DataInputStream dis) throws MetadataParse /** Get the document MIME type. Will always be a valid MIME type, unless there * has been an error; if it is unknown, will return application/octet-stream. */ public String getMIMEType() { - if((mimeType == null) || (mimeType.length() == 0)) + if((mimeType == null) || mimeType.isEmpty()) return DefaultMIMETypes.DEFAULT_MIME_TYPE; return mimeType; } diff --git a/src/freenet/client/DefaultMIMETypes.java b/src/freenet/client/DefaultMIMETypes.java index b42c11fac6f..94ce12158af 100644 --- a/src/freenet/client/DefaultMIMETypes.java +++ b/src/freenet/client/DefaultMIMETypes.java @@ -754,6 +754,7 @@ public synchronized static short byName(String s) { addMIMEType((short)619, "audio/speex", "spx"); addMIMEType((short)620, "audio/ogg", "oga"); addMIMEType((short)621, "audio/flac", "flac"); + addMIMEType((short)622, "image/webp", "webp"); } /** Guess a MIME type from a filename. diff --git a/src/freenet/client/FailureCodeTracker.java b/src/freenet/client/FailureCodeTracker.java index 88731eeea68..3189e427fe4 100644 --- a/src/freenet/client/FailureCodeTracker.java +++ b/src/freenet/client/FailureCodeTracker.java @@ -135,7 +135,7 @@ public synchronized String toString() { if(map == null) return super.toString()+":empty"; StringBuilder sb = new StringBuilder(super.toString()); sb.append(':'); - if(map.size() == 0) sb.append("empty"); + if(map.isEmpty()) sb.append("empty"); else if(map.size() == 1) { sb.append("one:"); Integer code = (Integer) (map.keySet().toArray())[0]; diff --git a/src/freenet/client/Metadata.java b/src/freenet/client/Metadata.java index c165a4d672f..7aa86ba1054 100644 --- a/src/freenet/client/Metadata.java +++ b/src/freenet/client/Metadata.java @@ -1317,7 +1317,7 @@ public HashMap getDocuments() { HashMap docs = new HashMap(); for (Map.Entry entry: manifestEntries.entrySet()) { String st = entry.getKey(); - if (st.length()>0) + if (!st.isEmpty()) docs.put(st, entry.getValue()); } return docs; diff --git a/src/freenet/client/async/BaseManifestPutter.java b/src/freenet/client/async/BaseManifestPutter.java index fc2af9baae1..81d4d122e49 100644 --- a/src/freenet/client/async/BaseManifestPutter.java +++ b/src/freenet/client/async/BaseManifestPutter.java @@ -1584,7 +1584,7 @@ public static ManifestElement[] flatten(HashMap manifestElements) public static void flatten(HashMap manifestElements, List v, String prefix) { for(Map.Entry entry: manifestElements.entrySet()) { String name = entry.getKey(); - String fullName = prefix.length() == 0 ? name : prefix+ '/' +name; + String fullName = prefix.isEmpty() ? name : prefix+ '/' +name; Object o = entry.getValue(); if(o instanceof HashMap) { flatten(Metadata.forceMap(o), v, fullName); diff --git a/src/freenet/client/async/BinaryBlobWriter.java b/src/freenet/client/async/BinaryBlobWriter.java index 5dfbefd74c4..2ea549fc249 100644 --- a/src/freenet/client/async/BinaryBlobWriter.java +++ b/src/freenet/client/async/BinaryBlobWriter.java @@ -119,8 +119,8 @@ private void finalizeBucket(boolean mark) throws IOException, BinaryBlobAlreadyC } Bucket out = _bf.makeBucket(-1); getSnapshot(out, mark); - for (int i=0,n=_buckets.size(); i ctx.maxOutputLength) || (metadata.topCompressedSize > ctx.maxTempLength)) { @@ -654,7 +654,7 @@ public boolean run(ClientContext context) { } String mimeType = clientMetadata.getMIMETypeNoParams(); - if(mimeType != null && ArchiveManager.ARCHIVE_TYPE.isUsableArchiveType(mimeType) && metaStrings.size() > 0) { + if(mimeType != null && ArchiveManager.ARCHIVE_TYPE.isUsableArchiveType(mimeType) && !metaStrings.isEmpty()) { // Looks like an implicit archive, handle as such metadata.setArchiveManifest(); // Pick up MIME type from inside archive @@ -729,7 +729,7 @@ public boolean run(ClientContext context) { clientMetadata.mergeNoOverwrite(metadata.getClientMetadata()); // even splitfiles can have mime types! String mimeType = clientMetadata.getMIMETypeNoParams(); - if(mimeType != null && ArchiveManager.ARCHIVE_TYPE.isUsableArchiveType(mimeType) && metaStrings.size() > 0) { + if(mimeType != null && ArchiveManager.ARCHIVE_TYPE.isUsableArchiveType(mimeType) && !metaStrings.isEmpty()) { // Looks like an implicit archive, handle as such metadata.setArchiveManifest(); // Pick up MIME type from inside archive diff --git a/src/freenet/client/async/SplitFileFetcher.java b/src/freenet/client/async/SplitFileFetcher.java index c0525178e61..f2ef033bada 100644 --- a/src/freenet/client/async/SplitFileFetcher.java +++ b/src/freenet/client/async/SplitFileFetcher.java @@ -126,7 +126,7 @@ public SplitFileFetcher(Metadata metadata, GetCompletionCallback rcb, ClientRequ try { // Completion via truncation. if(isFinalFetch && cb instanceof FileGetCompletionCallback && - (decompressors == null || decompressors.size() == 0) && + (decompressors == null || decompressors.isEmpty()) && !fetchContext.filterData) { FileGetCompletionCallback fileCallback = ((FileGetCompletionCallback)cb); File targetFile = fileCallback.getCompletionFile(); diff --git a/src/freenet/client/async/SplitFileFetcherKeyListener.java b/src/freenet/client/async/SplitFileFetcherKeyListener.java index 656b1a28e47..375ccb83ae8 100644 --- a/src/freenet/client/async/SplitFileFetcherKeyListener.java +++ b/src/freenet/client/async/SplitFileFetcherKeyListener.java @@ -247,11 +247,11 @@ public int paddedMainBloomFilterSize() { public boolean probablyWantKey(Key key, byte[] saltedKey) { if(filter.checkFilter(saltedKey)) { byte[] salted = localSaltKey(key); - for(int i=0;i cancelBefore(long curLatest, ClientContext context) { private void finishCancelBefore(List v, ClientContext context) { if(v != null) { - for(int i=0;i 0) + if(!checkers.isEmpty()) return new USKStoreChecker(checkers); else return null; } diff --git a/src/freenet/client/async/USKManager.java b/src/freenet/client/async/USKManager.java index 0fd20242b6d..13b068f80f4 100644 --- a/src/freenet/client/async/USKManager.java +++ b/src/freenet/client/async/USKManager.java @@ -332,8 +332,7 @@ public void startTemporaryBackgroundFetcher(USK usk, ClientContext context, fina @Override public void run() { if(cancelled != null) { - for(int i=0;i medias = commaListFromIdentifiers(parts, 1); - if(medias != null && medias.size() > 0) { + if(medias != null && !medias.isEmpty()) { for(i=0;i 0) { + if(medias != null && !medias.isEmpty()) { filteredTokens.append(braceSpace); filteredTokens.append("@media "); boolean first = true; @@ -3543,7 +3543,7 @@ private static ParsedWord parseToken(StringBuilder origToken, StringBuilder deco if(logDEBUG) Logger.debug(CSSTokenizerFilter.class, "whitespace stripped: "+strippedOrig+" decoded "+decodedToken); - if(strippedOrig.length() == 0) return null; + if(strippedOrig.isEmpty()) return null; if(strippedOrig.length() > 2) { char c = strippedOrig.charAt(0); @@ -3586,7 +3586,7 @@ private static ParsedWord parseToken(StringBuilder origToken, StringBuilder deco decodedToken.setLength(decodedToken.length()-(strippedOrig.length()-i-1)); strippedOrig = strippedOrig.substring(0, i+1); - if(strippedOrig.length() == 0) return null; + if(strippedOrig.isEmpty()) return null; return new ParsedAttr(origToken.toString(), decodedToken.toString(), dontLikeOrigToken); } else return null; @@ -3617,7 +3617,7 @@ private static ParsedWord parseToken(StringBuilder origToken, StringBuilder deco decodedToken.setLength(decodedToken.length()-(strippedOrig.length()-i-1)); strippedOrig = strippedOrig.substring(0, i+1); - if(strippedOrig.length() == 0) return null; + if(strippedOrig.isEmpty()) return null; String[] split = FilterUtils.removeWhiteSpace(strippedOrig.split(","),false); if(split.length == 0 || (plural && split.length > 3) || ((!plural) && split.length > 2) || (plural && split.length < 2)) @@ -4218,9 +4218,9 @@ else if(expression.charAt(i)=='<') } String firstPart=expression.substring(0,i); String secondPart=expression.substring(firstIndex,expression.length()); - if(secondPart.length() > 0 && secondPart.charAt(0) == ' ') { + if(!secondPart.isEmpty() && secondPart.charAt(0) == ' ') { secondPart = secondPart.substring(1); - } else if(secondPart.length() > 0) { + } else if(!secondPart.isEmpty()) { throw new IllegalStateException("Don't know what to do with char after <>[]: "+secondPart.charAt(0)); } if(logDEBUG) Logger.debug(this, "9in < firstPart="+firstPart+" secondPart="+secondPart+" tokensCanBeGivenLowerLimit="+tokensCanBeGivenLowerLimit+" tokensCanBeGivenUpperLimit="+tokensCanBeGivenUpperLimit); @@ -4266,7 +4266,7 @@ public boolean doubleAmpersandVerifier(String expression, ParsedWord[] words, Fi String firstPart = ""; int lastB = -1; // Check for invalid patterns. - assert(expression.length() != 0); + assert(!expression.isEmpty()); assert(expression.charAt(expression.length()-1) != 'b'); assert(expression.charAt(0) != 'b'); @@ -4275,7 +4275,7 @@ public boolean doubleAmpersandVerifier(String expression, ParsedWord[] words, Fi for (int i = 0; i <= expression.length(); i++) { if(i == expression.length() || expression.charAt(i)=='b') { if(!firstPart.isEmpty()) { - if(ignoredParts.length() == 0) { + if(ignoredParts.isEmpty()) { ignoredParts = firstPart; } else { ignoredParts = ignoredParts+"b"+firstPart; @@ -4296,7 +4296,7 @@ public boolean doubleAmpersandVerifier(String expression, ParsedWord[] words, Fi // list we do not want that potential false positive and so here we are // forcing the verifier to take at least one word. int maxLoops = words.length; - while (maxLoops-- > 0 && propertyVerifierList.size() != 0) { + while (maxLoops-- > 0 && !propertyVerifierList.isEmpty()) { for(int i = words.length; i > 0; i--) { ParsedWord[] tokensToVerify = Arrays.copyOf(words, i); boolean tokenConsumed = false; @@ -4333,8 +4333,7 @@ public boolean doubleAmpersandVerifier(String expression, ParsedWord[] words, Fi // Verifiers that still remain in the list may accept an empty word array // here we will let those verifiers accept an empty array if they want to. boolean result = true; - for (int i = 0; i < propertyVerifierList.size(); i++) { - CSSPropertyVerifier verifier = propertyVerifierList.get(i); + for (CSSPropertyVerifier verifier : propertyVerifierList) { result = result && verifier.checkValidity(words, cb); } @@ -4459,7 +4458,7 @@ public boolean recursiveDoubleBarVerifier(String expression,ParsedWord[] words,F String secondPart = ""; int lastA = -1; // Check for invalid patterns. - assert(expression.length() != 0); + assert(!expression.isEmpty()); assert(expression.charAt(expression.length()-1) != 'a'); assert(expression.charAt(0) != 'a'); for(int i=0;i<=expression.length();i++) @@ -4467,7 +4466,7 @@ public boolean recursiveDoubleBarVerifier(String expression,ParsedWord[] words,F if(i == expression.length() || expression.charAt(i)=='a') { if(!firstPart.isEmpty()) { - if(ignoredParts.length() == 0) + if(ignoredParts.isEmpty()) ignoredParts = firstPart; else ignoredParts = ignoredParts+"a"+firstPart; diff --git a/src/freenet/client/filter/ContentFilter.java b/src/freenet/client/filter/ContentFilter.java index 4d54298677d..3ae493ca552 100644 --- a/src/freenet/client/filter/ContentFilter.java +++ b/src/freenet/client/filter/ContentFilter.java @@ -81,6 +81,12 @@ true, false, new PNGFilter(true, true, true), false, false, false, false, true, true, false, new BMPFilter(), false, false, false, false, true, false, l10n("imageBMPReadAdvice"), false, null, null, false)); + + // WEBP - has a filter + register(new FilterMIMEType("image/webp", "webp", new String[] { "image/webp" }, new String[0], + true, false, new WebPFilter(), false, false, false, false, true, false, + l10n("imageWebPReadAdvice"), + false, null, null, false)); /* Ogg - has a filter * Xiph's container format. Contains one or more logical bitstreams. @@ -92,7 +98,7 @@ true, false, new BMPFilter(), false, false, false, false, true, false, true, false, new OggFilter(), true, true, false, true, false, false, l10n("containerOggReadAdvice"),false, null, null, false)); - /* FLAC - Needs filter + /* FLAC - has a filter * Lossless audio format. This data is sometimes encapsulated inside * of ogg containers. It is, however, not currently supported, and * is very dangerous, as it may specify URLs from which album art @@ -335,7 +341,7 @@ public static FilterStatus filter(InputStream input, OutputStream output, String else { // Run the read filter if there is one. if(handler.readFilter != null) { - if(handler.takesACharset && ((charset == null) || (charset.length() == 0))) { + if(handler.takesACharset && ((charset == null) || (charset.isEmpty()))) { int bufferSize = handler.charsetExtractor.getCharsetBufferSize(); input.mark(bufferSize); byte[] charsetBuffer = new byte[bufferSize]; @@ -448,7 +454,7 @@ public static String detectCharset(byte[] input, int length, FilterMIMEType hand } // If no BOM, use the charset from the referring document. - if(handler.useMaybeCharset && maybeCharset != null && (maybeCharset.length() != 0)) + if(handler.useMaybeCharset && maybeCharset != null && (!maybeCharset.isEmpty())) return maybeCharset; if(charset != null) diff --git a/src/freenet/client/filter/ElementInfo.java b/src/freenet/client/filter/ElementInfo.java index 78e63287ac5..91c40b34867 100644 --- a/src/freenet/client/filter/ElementInfo.java +++ b/src/freenet/client/filter/ElementInfo.java @@ -323,7 +323,7 @@ public static boolean isValidHTMLTag(String tag) */ public static boolean isValidName(String name) { - if(name.length()==0) + if(name.isEmpty()) { return false; } @@ -351,7 +351,7 @@ public static boolean isValidName(String name) public static boolean isValidIdentifier(String name) { - if(name.length()==0) + if(name.isEmpty()) { return false; } diff --git a/src/freenet/client/filter/FilterUtils.java b/src/freenet/client/filter/FilterUtils.java index 9c0e1bdac1c..a8ed13cfd16 100644 --- a/src/freenet/client/filter/FilterUtils.java +++ b/src/freenet/client/filter/FilterUtils.java @@ -103,7 +103,7 @@ public static boolean isLength(String value,boolean isSVG) //SVG lengths allow % { String lengthValue=null; value=value.trim(); - if (value.length() == 0) { + if (value.isEmpty()) { return false; } if (isSVG) { diff --git a/src/freenet/client/filter/HTMLFilter.java b/src/freenet/client/filter/HTMLFilter.java index d3b9258a895..4c6e206a12c 100644 --- a/src/freenet/client/filter/HTMLFilter.java +++ b/src/freenet/client/filter/HTMLFilter.java @@ -170,7 +170,7 @@ public void pushElementInStack(String element) { } public String popElementFromStack() { - if(openElements.size()>0) + if(!openElements.isEmpty()) return openElements.pop(); else return null; @@ -480,7 +480,7 @@ void run() throws IOException, DataFilterException { //Writing the remaining tags for XHTML if any if(getisXHTML()) { - while(openElements.size()>0) + while(!openElements.isEmpty()) w.write(""); } w.flush(); @@ -662,7 +662,7 @@ String processTag(List splitTag, Writer w, HTMLParseContext pc) if (pc.writeStyleScriptWithTag) { pc.writeStyleScriptWithTag = false; String style = pc.currentStyleScriptChunk; - if ((style == null) || (style.length() == 0)) + if ((style == null) || style.isEmpty()) pc.writeAfterTag.append(""); else w.write(style); @@ -793,7 +793,7 @@ public ParsedTag(List v) { if (((len - 1 != 0) || (s.length() > 1)) && s.endsWith("/")) { s = s.substring(0, s.length() - 1); v.set(len - 1, s); - if (s.length() == 0) + if (s.isEmpty()) len--; endSlash = true; // Don't need to set it back because everything is an I-value @@ -841,8 +841,8 @@ public String toString() { sb.append(element); if (unparsedAttrs != null) { int n = unparsedAttrs.length; - for (int i = 0; i < n; i++) { - sb.append(' ').append(unparsedAttrs[i]); + for (String unparsedAttr : unparsedAttrs) { + sb.append(' ').append(unparsedAttr); } } if (endSlash) @@ -2145,8 +2145,8 @@ static class TagVerifier { } this.booleanAttrs = new HashSet(); if (booleanAttrs != null) { - for(int x = 0; x < booleanAttrs.length; x++) { - this.booleanAttrs.add(booleanAttrs[x]); + for (String booleanAttr : booleanAttrs) { + this.booleanAttrs.add(booleanAttr); } } } @@ -2179,7 +2179,7 @@ ParsedTag sanitize(ParsedTag t, HTMLParseContext pc) throws DataFilterException } } else if (idx > -1) { String x = s.substring(0, idx); - if (x.length() == 0) + if (x.isEmpty()) x = prevX; x = x.toLowerCase(); String y; @@ -2647,8 +2647,9 @@ Map sanitizeHash(Map h, if (type != null) { String[] typesplit = splitType(type); type = typesplit[0]; - if ((typesplit[1] != null) && (typesplit[1].length() > 0)) + if ((typesplit[1] != null) && !typesplit[1].isEmpty()) { charset = typesplit[1]; + } if(logDEBUG) Logger.debug( this, @@ -2744,9 +2745,9 @@ Map sanitizeHash(Map h, // Allow no rel or rev, even on , as per HTML spec. - if(parsedRel.length() != 0) + if(!parsedRel.isEmpty()) hn.put("rel", parsedRel); - if(parsedRev.length() != 0) + if(!parsedRev.isEmpty()) hn.put("rev", parsedRev); if(rel != null) { @@ -3069,7 +3070,7 @@ Map sanitizeHash(Map h, throwFilterException(l10n("invalidMetaType")); } else if ( http_equiv.equalsIgnoreCase("Content-Language")) { - if(content.matches("((?>[a-zA-Z0-9]*)(?>-[A-Za-z0-9]*)*(?>,\\s*)?)*") && (!content.trim().isEmpty())) { + if(content.matches("((?>[a-zA-Z0-9]*)(?>-[A-Za-z0-9]*)*(?>,\\s*)?)*") && !content.trim().isEmpty()) { hn.put("http-equiv", "Content-Language"); hn.put("content", content); } @@ -3342,7 +3343,7 @@ static String sanitizeStyle(String style, FilterCallback cb, HTMLParseContext hp throw e; } String s = w.toString(); - if ((s == null) || (s.length() == 0)) + if ((s == null) || s.isEmpty()) return null; // Core.logger.log(SaferFilter.class, "Style now: " + s, LogLevel.DEBUG); if(logMINOR) Logger.minor(HTMLFilter.class, "Style finally: " + s); @@ -3457,7 +3458,7 @@ static String sanitizeURI( if(logMINOR) Logger.minor(HTMLFilter.class, "Sanitizing URI: "+suri+" ( override type "+overrideType +" override charset "+overrideCharset+" ) inline="+inline, new Exception("debug")); boolean addMaybe = false; - if((overrideCharset != null) && (overrideCharset.length() > 0)) + if((overrideCharset != null) && !overrideCharset.isEmpty()) overrideType += "; charset="+overrideCharset; else if(maybeCharset != null) addMaybe = true; diff --git a/src/freenet/client/filter/OggPage.java b/src/freenet/client/filter/OggPage.java index b7f5eb4b951..03a9d294a1b 100644 --- a/src/freenet/client/filter/OggPage.java +++ b/src/freenet/client/filter/OggPage.java @@ -245,10 +245,10 @@ public byte[] calculateCRC() { array[24] = 0; array[25] = 0; int crc_reg = 0; - for(int i=0;i>>24) & 0xff) ^ (array[i] & 0xff)]; + crc_reg = (crc_reg << 8) ^ crc_lookup[((crc_reg >>> 24) & 0xff) ^ (b & 0xff)]; } return new byte[] { (byte)crc_reg, (byte) (crc_reg>>>8), diff --git a/src/freenet/client/filter/PNGFilter.java b/src/freenet/client/filter/PNGFilter.java index 66ccc501fee..91df934e396 100644 --- a/src/freenet/client/filter/PNGFilter.java +++ b/src/freenet/client/filter/PNGFilter.java @@ -255,8 +255,8 @@ public void readFilter(InputStream input, OutputStream output, String charset, M } if (!validChunkType) { - for (int i = 0; i < HARMLESS_CHUNK_TYPES.length; i++) { - if (HARMLESS_CHUNK_TYPES[i].equals(chunkTypeString)) { + for (String harmlessChunkType : HARMLESS_CHUNK_TYPES) { + if (harmlessChunkType.equals(chunkTypeString)) { validChunkType = true; break; } diff --git a/src/freenet/client/filter/RIFFFilter.java b/src/freenet/client/filter/RIFFFilter.java new file mode 100644 index 00000000000..0436bb8acd3 --- /dev/null +++ b/src/freenet/client/filter/RIFFFilter.java @@ -0,0 +1,192 @@ +package freenet.client.filter; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.EOFException; +import java.util.Map; + +import freenet.l10n.NodeL10n; +import freenet.support.Logger; +import freenet.support.Logger.LogLevel; + +/** RIFF file format filter for several formats, such as AVI, WAV, MID, and WebP + * + */ +public abstract class RIFFFilter implements ContentDataFilter { + private static final byte[] magicNumber = new byte[] {'R', 'I', 'F', 'F'}; + + @Override + public void readFilter(InputStream input, OutputStream output, String charset, Map otherParams, + String schemeHostAndPort, FilterCallback cb) throws DataFilterException, IOException { + DataInputStream in = new DataInputStream(input); + DataOutputStream out = new DataOutputStream(output); + for(byte magicCharacter : magicNumber) { + if(magicCharacter != in.readByte()) throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), l10n("invalidStream")); + } + int fileSize = readLittleEndianInt(in); + for(byte magicCharacter : getChunkMagicNumber()) { + if(magicCharacter != in.readByte()) throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), l10n("invalidStream")); + } + out.write(magicNumber); + if(fileSize < 0) { + // FIXME Video with more than 2 GiB data need unsigned format + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), l10n("data2GB")); + } + if(fileSize < 12) { + // There couldn't be any chunk in such a small file + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), NodeL10n.getBase().getString("ContentFilter.EOFMessage")); + } + writeLittleEndianInt(out, fileSize); + out.write(getChunkMagicNumber()); + + Object context = createContext(); + byte[] fccType; + int ckSize; + int remainingSize = fileSize - 4; + try { + do { + fccType = new byte[4]; + in.readFully(fccType); + ckSize = readLittleEndianInt(in); + if(ckSize < 0 || remainingSize < ckSize + 8 + (ckSize & 1)) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), l10n("dataTooBig")); + } + remainingSize -= ckSize + 8 + (ckSize & 1); + readFilterChunk(fccType, ckSize, context, in, out, charset, otherParams, schemeHostAndPort, cb); + } while(remainingSize != 0); + } catch(EOFException e) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), NodeL10n.getBase().getString("ContentFilter.EOFMessage")); + } + // Testing if there is any unprocessed bytes left + if(input.read() != -1) { + // A byte is after expected EOF + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), NodeL10n.getBase().getString("ContentFilter.EOFMessage")); + } + // Do a final test + if(remainingSize != 0) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), NodeL10n.getBase().getString("ContentFilter.EOFMessage")); + } + EOFCheck(context); + } + + /** Get the FourCC to identify this file format + * @return array of four bytes + */ + protected abstract byte[] getChunkMagicNumber(); + + /** Create a context object holding the context states + * @return context object + */ + protected abstract Object createContext(); + + protected abstract void readFilterChunk(byte[] ID, int size, Object context, DataInputStream input, DataOutputStream output, String charset, Map otherParams, + String schemeHostAndPort, FilterCallback cb) throws DataFilterException, IOException; + + /** Check for invalid conditions after EOF is reached + * @param context context object + * @throws DataFilterException + */ + protected abstract void EOFCheck(Object context) throws DataFilterException; + + private static String l10n(String key) { + return NodeL10n.getBase().getString("RIFFFilter."+key); + } + + /** Pass through bytes to output unchanged + * @param in Input stream + * @param out Output stream + * @param size Number of bytes to copy + * @throws DataFilterException + * @throws IOException + */ + protected void passthroughBytes(DataInputStream in, DataOutputStream out, int size) throws DataFilterException, IOException { + if(size < 0) + { + if(Logger.shouldLog(LogLevel.WARNING, this.getClass())) Logger.warning(this, "RIFF block size " + size + " is less than 0"); + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), l10n("dataTooBig")); + } else { + // Copy 1MB at a time instead of all at once + int section; + int remaining = size; + if(remaining > 1024 * 1024) { + section = 1024 * 1024; + } else { + section = remaining; + } + byte[] buf = new byte[section]; + while(remaining > 0) { + if(remaining > 1024 * 1024) { + section = 1024 * 1024; + } else { + section = remaining; + } + in.readFully(buf, 0, section); + out.write(buf, 0, section); + remaining -= section; + } + } + } + + /** Write a JUNK chunk for unsupported data + * @param in Input stream + * @param out Output stream + * @param size Size of the chunk, if the size is odd, a padding is added + * @throws DataFilterException + * @throws IOException + */ + protected void writeJunkChunk(DataInputStream in, DataOutputStream out, int size) throws DataFilterException, IOException { + size += size % 2; // Add a padding if necessary + if(in.skip(size) < size) { + // EOFException? + throw new EOFException(); + } + if(size < 0) + { + if(Logger.shouldLog(LogLevel.WARNING, this.getClass())) Logger.warning(this, "RIFF block size " + size + " is less than 0"); + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), l10n("dataTooBig")); + } else { + // Write 1MB at a time instead of all at once + int section; + int remaining = size; + byte[] zeros = new byte[1024 * 1024]; + for(int i = 0; i < 1024 * 1024; i++) { + zeros[i] = 0; + } + byte[] JUNK = new byte[] {'J', 'U', 'N', 'K'}; + out.write(JUNK); + writeLittleEndianInt(out, size); + while(remaining > 0) { + if(remaining > 1024 * 1024) { + section = 1024 * 1024; + } else { + section = remaining; + } + out.write(zeros, 0, section); + remaining -= section; + } + } + } + + /** Read a little endian int. readInt and writeInt are big endian, but RIFF use little endian + * @param stream Stream to read from + * @return + * @throws IOException + */ + protected final static int readLittleEndianInt(DataInputStream stream) throws IOException { + int a; + a = stream.readInt(); + return Integer.reverseBytes(a); + } + + /** Write a little endian int + * @param stream Stream to write to + * @param a + * @throws IOException + */ + protected final static void writeLittleEndianInt(DataOutputStream stream, int a) throws IOException { + stream.writeInt(Integer.reverseBytes(a)); + } +} diff --git a/src/freenet/client/filter/VP8PacketFilter.java b/src/freenet/client/filter/VP8PacketFilter.java new file mode 100644 index 00000000000..5151ecd7e57 --- /dev/null +++ b/src/freenet/client/filter/VP8PacketFilter.java @@ -0,0 +1,46 @@ +package freenet.client.filter; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +public class VP8PacketFilter { + private boolean isWebP; + public VP8PacketFilter(boolean isWebp) { + this.isWebP = isWebp; + } + + public void parse(byte[] buf, int size) throws IOException { + try (DataInputStream input = new DataInputStream(new ByteArrayInputStream(buf))) { + // Reference: RFC 6386 + // Following code is based on vp8_parse_frame_header from RFC 6386 + int[] header = new int[6]; + for(int i = 0; i < 6; i++) + header[i] = input.readUnsignedByte(); + int sizeInHeader; + boolean isKeyframe; + int tmp = header[0] | (header[1] << 8) | (header[2] << 16); + isKeyframe = (tmp & 1) == 0; + if(!isKeyframe && isWebP) { + throw new DataFilterException("VP8 decode error", "VP8 decode error", "Not a keyframe in WebP image"); + } + if((tmp & 0x8) != 0) { //is_experimental bit is unsupported + throw new DataFilterException("VP8 decode error", "VP8 decode error", "VP8 frame version is unsupported"); + } + if((tmp & 0x10) == 0 && isWebP) { //is_shown must be true for a WebP image + throw new DataFilterException("VP8 decode error", "VP8 decode error", "WebP frame contains an image without is_shown flag"); + } + sizeInHeader = (tmp >> 5) & 0x7ffff; + if(size <= sizeInHeader + (isKeyframe ? 10 : 3)) { + throw new DataFilterException("VP8 decode error", "VP8 decode error", "VP8 frame size is invalid"); + } + if(isKeyframe) { + if(header[3] != 0x9d || header[4] != 0x01 || header[5] != 0x2a) { + throw new DataFilterException("VP8 decode error", "VP8 decode error", "VP8 frame sync code is invalid"); + } + } + } + // Rest of video: I don't know there is an attack + } + +} diff --git a/src/freenet/client/filter/WebPFilter.java b/src/freenet/client/filter/WebPFilter.java new file mode 100644 index 00000000000..e5af061cbfa --- /dev/null +++ b/src/freenet/client/filter/WebPFilter.java @@ -0,0 +1,192 @@ +package freenet.client.filter; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Map; + +import freenet.l10n.NodeL10n; +import freenet.support.Logger; +import freenet.support.Logger.LogLevel; + +public class WebPFilter extends RIFFFilter { + + //These constants are derived from mux_type.h in libwebp + private final int ANIMATION_FLAG = 0x00000002; + private final int XMP_FLAG = 0x00000004; + private final int EXIF_FLAG = 0x00000008; + private final int ALPHA_FLAG = 0x00000010; + private final int ICCP_FLAG = 0x00000020; + private final int ALL_VALID_FLAGS = 0x0000003e; + + @Override + protected byte[] getChunkMagicNumber() { + return new byte[] {'W', 'E', 'B', 'P'}; + } + + class WebPFilterContext { + public int VP8XFlags = 0; + public boolean hasVP8X = false; + public boolean hasANIM = false; + public boolean hasANMF = false; + public boolean hasALPH = false; + public boolean hasVP8 = false; + public boolean hasVP8L = false; + } + + @Override + protected Object createContext() { + return new WebPFilterContext(); + } + + @Override + protected void readFilterChunk(byte[] ID, int size, Object context, DataInputStream input, DataOutputStream output, String charset, Map otherParams, + String schemeHostAndPort, FilterCallback cb) throws DataFilterException, IOException { + boolean logDEBUG = Logger.shouldLog(LogLevel.DEBUG, this.getClass()); + WebPFilterContext ctx = (WebPFilterContext)context; + if(ID[0] == 'V' && ID[1] == 'P' && ID[2] == '8' && ID[3] == ' ') { + // VP8 Lossy format: RFC 6386 + // Most WebP files just contain a single chunk of this kind + if(ctx.hasVP8 || ctx.hasVP8L || ctx.hasANIM) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "Unexpected VP8 chunk was encountered"); + } + if(size < 10) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "The VP8 chunk was too small to be valid"); + } + output.write(ID); + if(logDEBUG) Logger.debug(this, "Passing through WebP VP8 block with " + size + " bytes."); + VP8PacketFilter VP8filter = new VP8PacketFilter(true); + // Just read 6 bytes of the header to validate + byte[] buf = new byte[6]; + input.readFully(buf); + VP8filter.parse(buf, size); + writeLittleEndianInt(output, size); + output.write(buf); + passthroughBytes(input, output, size - buf.length); + if((size & 1) != 0) // Add padding if necessary + output.writeByte(input.readByte()); + ctx.hasVP8 = true; + } else if(ID[0] == 'V' && ID[1] == 'P' && ID[2] == '8' && ID[3] == 'L') { + // VP8 Lossless format: https://chromium.googlesource.com/webm/libwebp/+/refs/tags/v1.4.0/doc/webp-lossless-bitstream-spec.txt + if(ctx.hasVP8 || ctx.hasVP8L || ctx.hasANIM || ctx.hasALPH) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "Unexpected VP8L chunk was encountered"); + } + //output.write(ID); + //output.writeInt(((size & 0xff000000) >> 24) | ((size & 0x00ff0000) >> 8) | ((size & 0x0000ff00) << 8) | ((size & 0x000000ff) << 24)); + // CVE-2023-4863 is an exploit for libwebp (before version 1.3.2) implementation of WebP lossless format, and that could be used in animation and alpha channel as well. This is really serious that we must not let Bad Thing happen. + // TODO: Check for CVE-2023-4863 exploit! + ctx.hasVP8L = true; + throw new DataFilterException(l10n("losslessUnsupportedTitle"), l10n("losslessUnsupportedTitle"), l10n("losslessUnsupported")); + } else if(ID[0] == 'A' && ID[1] == 'L' && ID[2] == 'P' && ID[3] == 'H') { + if(ctx.hasVP8L || ctx.hasANIM || ctx.hasALPH || (!ctx.hasVP8X) || ((ctx.VP8XFlags & ALPHA_FLAG) == 0)) { + // Only applicable to VP8 images. VP8L already has alpha channel, so does not need this. + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "Unexpected ALPH chunk was encountered"); + } + if(size == 0) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "Unexpected empty ALPH chunk"); + } + // Alpha channel + int flags = input.readUnsignedByte(); + if((flags & 2) != 0) { + // Compression is not uncompressed + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "WebP alpha channel contains reserved bits"); + } + if((flags & 0xc0) != 0) { + // Compression is not uncompressed + // TODO: Check for CVE-2023-4863 exploit! + throw new DataFilterException(l10n("alphUnsupportedTitle"), l10n("alphUnsupportedTitle"), l10n("alphUnsupported")); + } + output.write(ID); + if(logDEBUG) Logger.debug(this, "Passing through WebP ALPH block with " + size + " bytes."); + writeLittleEndianInt(output, size); + output.writeByte(flags); + passthroughBytes(input, output, size - 1); + if((size & 1) != 0) // Add padding if necessary + output.writeByte(input.readByte()); + ctx.hasALPH = true; + } else if(ID[0] == 'A' && ID[1] == 'N' && ID[2] == 'I' && ID[3] == 'M') { + if(ctx.hasVP8 || ctx.hasVP8L || ctx.hasANIM) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "Unexpected ANIM chunk was encountered"); + } + // Global animation parameters + //output.write(ID); + //output.writeInt(((size & 0xff000000) >> 24) | ((size & 0x00ff0000) >> 8) | ((size & 0x0000ff00) << 8) | ((size & 0x000000ff) << 24)); + // TODO: Check for CVE-2023-4863 exploit! + ctx.hasANIM = true; + throw new DataFilterException(l10n("animUnsupportedTitle"), l10n("animUnsupportedTitle"), l10n("animUnsupported")); + } else if(ID[0] == 'A' && ID[1] == 'N' && ID[2] == 'M' && ID[3] == 'F') { + // Animation frame + if((ctx.VP8XFlags & ANIMATION_FLAG) == 0 || ctx.hasVP8 || ctx.hasVP8L || !ctx.hasANIM) { + // Animation frame in static WebP file - Unexpected + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "Unexpected ANMF chunk was encountered"); + } else { + ctx.hasANMF = true; + //output.write(ID); + //output.writeInt(((size & 0xff000000) >> 24) | ((size & 0x00ff0000) >> 8) | ((size & 0x0000ff00) << 8) | ((size & 0x000000ff) << 24)); + // TODO: Check for CVE-2023-4863 exploit! + throw new DataFilterException(l10n("animUnsupportedTitle"), l10n("animUnsupportedTitle"), l10n("animUnsupported")); + } + } else if(ID[0] == 'V' && ID[1] == 'P' && ID[2] == '8' && ID[3] == 'X') { + // meta information + if(ctx.hasVP8 || ctx.hasVP8L || ctx.hasANIM || ctx.hasVP8X) { + // This should be the first chunk of the file + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "Unexpected VP8X chunk was encountered"); + } + ctx.VP8XFlags = readLittleEndianInt(input); + if((ctx.VP8XFlags & ~ALL_VALID_FLAGS) != 0) { + // Has reserved flags or uses unsupported image fragmentation + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "VP8X header has reserved flags"); + } + if(size != 10) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "VP8X header is too small or too big"); + } + output.write(ID); + writeLittleEndianInt(output, size); + ctx.VP8XFlags &= ~(XMP_FLAG | EXIF_FLAG | ICCP_FLAG); // removing ICCP, EXIF and XMP bits + writeLittleEndianInt(output, ctx.VP8XFlags); + ctx.hasVP8X = true; + byte[] widthHeight = new byte[6]; + input.readFully(widthHeight); + int width; + int height; + // width and height are 24 bits + width = widthHeight[0] | widthHeight[1] << 8 | widthHeight [2] << 16; + height = widthHeight[3] | widthHeight[4] << 8 | widthHeight [5] << 16; + width++; + height++; + if(width > 16384 || height > 16384) { + // VP8 lossy format couldn't encode more than 16384 pixels in width or height. Check again when lossless format is supported. + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "WebP image size is too big"); + } + output.write(widthHeight); + } else if(ID[0] == 'I' && ID[1] == 'C' && ID[2] == 'C' && ID[3] == 'P') { + // ICC Color Profile + if(logDEBUG) Logger.debug(this, "WebP image has ICCP block with " + size + " bytes converted into JUNK chunk."); + writeJunkChunk(input, output, size); + } else if(ID[0] == 'E' && ID[1] == 'X' && ID[2] == 'I' && ID[3] == 'F') { + // EXIF metadata + if(logDEBUG) Logger.debug(this, "WebP image has EXIF block with " + size + " bytes converted into JUNK chunk."); + writeJunkChunk(input, output, size); + } else if(ID[0] == 'X' && ID[1] == 'M' && ID[2] == 'P' && ID[3] == ' ') { + // XMP metadata + if(logDEBUG) Logger.debug(this, "WebP image has XMP block with " + size + " bytes converted into JUNK chunk."); + writeJunkChunk(input, output, size); + } else { + // Unknown block + if(logDEBUG) Logger.debug(this, "WebP image has Unknown block with " + size + " bytes converted into JUNK chunk."); + writeJunkChunk(input, output, size); + } + } + + @Override + protected void EOFCheck(Object context) throws DataFilterException { + WebPFilterContext ctx = (WebPFilterContext)context; + if(ctx.hasVP8 == false && ctx.hasVP8L == false && ctx.hasANMF == false) { + throw new DataFilterException(l10n("invalidTitle"), l10n("invalidTitle"), "No image chunk in the WebP file is found"); + } + } + + private static String l10n(String key) { + return NodeL10n.getBase().getString("WebPFilter."+key); + } +} diff --git a/src/freenet/clients/fcp/ClientPutDirMessage.java b/src/freenet/clients/fcp/ClientPutDirMessage.java index a3c02d41158..7b48380a7b3 100644 --- a/src/freenet/clients/fcp/ClientPutDirMessage.java +++ b/src/freenet/clients/fcp/ClientPutDirMessage.java @@ -104,7 +104,7 @@ public ClientPutDirMessage(SimpleFieldSet fs) throws MessageInvalidException { FreenetURI uu = new FreenetURI(u); // Client is allowed to put a slash at the end if it wants to, but this is discouraged. String[] meta = uu.getAllMetaStrings(); - if(meta != null && meta.length == 1 && meta[0].length() == 0) + if(meta != null && meta.length == 1 && meta[0].isEmpty()) uu = uu.setMetaString(null); uri = uu; } catch (MalformedURLException e) { diff --git a/src/freenet/clients/fcp/ClientPutDiskDirMessage.java b/src/freenet/clients/fcp/ClientPutDiskDirMessage.java index 8c2910015e5..1afd2120112 100644 --- a/src/freenet/clients/fcp/ClientPutDiskDirMessage.java +++ b/src/freenet/clients/fcp/ClientPutDiskDirMessage.java @@ -90,29 +90,29 @@ private HashMap makeBucketsByName(File thisdir, String prefix) t File filelist[] = thisdir.listFiles(); if(filelist == null) throw new MessageInvalidException(ProtocolErrorMessage.FILE_NOT_FOUND, "No such directory!", identifier, global); - for(int i = 0 ; i < filelist.length ; i++) { - if(filelist[i].isHidden() && !includeHiddenFiles) continue; - // Skip unreadable files and dirs - // Skip files nonexistent (dangling symlinks) - check last - if (filelist[i].canRead() && filelist[i].exists()) { - if (filelist[i].isFile()) { - File f = filelist[i]; - - FileBucket bucket = new FileBucket(f, true, false, false, false); - - ret.put(f.getName(), new ManifestElement(f.getName(), prefix + f.getName(), bucket, DefaultMIMETypes.guessMIMEType(f.getName(), true), f.length())); - } else if(filelist[i].isDirectory()) { - HashMap subdir = makeBucketsByName(new File(thisdir, filelist[i].getName()), prefix - + filelist[i].getName() + '/'); - ret.put(filelist[i].getName(), subdir); - } else if(!allowUnreadableFiles) { - throw new MessageInvalidException(ProtocolErrorMessage.FILE_NOT_FOUND, "Not directory and not file: "+filelist[i], identifier, global); - } - } else { - if(!allowUnreadableFiles) - throw new MessageInvalidException(ProtocolErrorMessage.FILE_NOT_FOUND, "Not readable or doesn't exist: "+filelist[i], identifier, global); - } - } + for (File file : filelist) { + if (file.isHidden() && !includeHiddenFiles) continue; + // Skip unreadable files and dirs + // Skip files nonexistent (dangling symlinks) - check last + if (file.canRead() && file.exists()) { + if (file.isFile()) { + File f = file; + + FileBucket bucket = new FileBucket(f, true, false, false, false); + + ret.put(f.getName(), new ManifestElement(f.getName(), prefix + f.getName(), bucket, DefaultMIMETypes.guessMIMEType(f.getName(), true), f.length())); + } else if (file.isDirectory()) { + HashMap subdir = makeBucketsByName(new File(thisdir, file.getName()), prefix + + file.getName() + '/'); + ret.put(file.getName(), subdir); + } else if (!allowUnreadableFiles) { + throw new MessageInvalidException(ProtocolErrorMessage.FILE_NOT_FOUND, "Not directory and not file: " + file, identifier, global); + } + } else { + if (!allowUnreadableFiles) + throw new MessageInvalidException(ProtocolErrorMessage.FILE_NOT_FOUND, "Not readable or doesn't exist: " + file, identifier, global); + } + } return ret; } diff --git a/src/freenet/clients/fcp/ClientPutMessage.java b/src/freenet/clients/fcp/ClientPutMessage.java index f5646ab0d41..f749c576b58 100644 --- a/src/freenet/clients/fcp/ClientPutMessage.java +++ b/src/freenet/clients/fcp/ClientPutMessage.java @@ -232,7 +232,7 @@ public ClientPutMessage(SimpleFieldSet fs) throws MessageInvalidException { if(fnam != null && fnam.indexOf('/') > -1) { throw new MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "TargetFilename must not contain slashes", identifier, global); } - if(fnam != null && fnam.length() == 0) { + if(fnam != null && fnam.isEmpty()) { fnam = null; // Deliberate override to tell us not to create one. } if(uri.getRoutingKey() == null && !uri.isKSK()) diff --git a/src/freenet/clients/fcp/FCPServer.java b/src/freenet/clients/fcp/FCPServer.java index 6d99fdc5165..e9a4b77490b 100644 --- a/src/freenet/clients/fcp/FCPServer.java +++ b/src/freenet/clients/fcp/FCPServer.java @@ -909,7 +909,7 @@ public void makePersistentGlobalRequest(FreenetURI fetchURI, boolean filterData, private File makeReturnFilename(FreenetURI uri, String expectedMimeType, File downloadsDir) { String ext; - if((expectedMimeType != null) && (expectedMimeType.length() > 0) && + if((expectedMimeType != null) && !expectedMimeType.isEmpty() && !expectedMimeType.equals(DefaultMIMETypes.DEFAULT_MIME_TYPE)) { ext = DefaultMIMETypes.getExtension(expectedMimeType); } else ext = null; diff --git a/src/freenet/clients/fcp/LoadPlugin.java b/src/freenet/clients/fcp/LoadPlugin.java index c36c249a281..4b5ae675e04 100644 --- a/src/freenet/clients/fcp/LoadPlugin.java +++ b/src/freenet/clients/fcp/LoadPlugin.java @@ -38,7 +38,7 @@ public LoadPlugin(SimpleFieldSet fs) throws MessageInvalidException { if(pluginURL == null) throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "Must contain a PluginURL field", identifier, false); String type = fs.get("URLType"); - if ((type != null) && (type.trim().length() > 0)) + if ((type != null) && !type.trim().isEmpty()) urlType = type.trim(); else urlType = null; diff --git a/src/freenet/clients/fcp/PersistentRequestClient.java b/src/freenet/clients/fcp/PersistentRequestClient.java index f6dfa114818..e9b72495393 100644 --- a/src/freenet/clients/fcp/PersistentRequestClient.java +++ b/src/freenet/clients/fcp/PersistentRequestClient.java @@ -483,11 +483,10 @@ public ClientGet getCompletedRequest(FreenetURI key) { // FIXME speed this up with another hashmap or something. // FIXME keep a transient hashmap in RAM, use it for fproxy. // FIXME consider supporting inserts too. - for(int i=0;i 0) + if(euri != null && !euri.isEmpty()) expectedURI = new FreenetURI(euri); else expectedURI = null; diff --git a/src/freenet/clients/fcp/TestDDARequestMessage.java b/src/freenet/clients/fcp/TestDDARequestMessage.java index 9a1930b3db1..03c702bac3c 100644 --- a/src/freenet/clients/fcp/TestDDARequestMessage.java +++ b/src/freenet/clients/fcp/TestDDARequestMessage.java @@ -32,7 +32,7 @@ public TestDDARequestMessage(SimpleFieldSet fs) throws MessageInvalidException { identifier = fs.get(DIRECTORY); if(identifier == null) throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "No Directory given!", null, false); - if(identifier.length() == 0) + if(identifier.isEmpty()) throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "The specified Directory can't be empty!", null, false); wantRead = fs.getBoolean(WANT_READ, false); diff --git a/src/freenet/clients/fcp/TestDDAResponseMessage.java b/src/freenet/clients/fcp/TestDDAResponseMessage.java index 4c999d2eb4a..b052fcf47fb 100644 --- a/src/freenet/clients/fcp/TestDDAResponseMessage.java +++ b/src/freenet/clients/fcp/TestDDAResponseMessage.java @@ -27,7 +27,7 @@ public TestDDAResponseMessage(SimpleFieldSet sfs) throws MessageInvalidException identifier = sfs.get(TestDDARequestMessage.DIRECTORY); if(identifier == null) throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "No Directory given!", null, false); - if(identifier.length() == 0) + if(identifier.isEmpty()) throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "The specified Directory can't be empty!", null, false); readContent = sfs.get(READ_CONTENT); diff --git a/src/freenet/clients/http/BookmarkEditorToadlet.java b/src/freenet/clients/http/BookmarkEditorToadlet.java index 57579a25b81..0992a82a6eb 100644 --- a/src/freenet/clients/http/BookmarkEditorToadlet.java +++ b/src/freenet/clients/http/BookmarkEditorToadlet.java @@ -80,7 +80,7 @@ private void addCategoryToList(BookmarkCategory cat, String path, HTMLNode list, String itemPath = URLEncoder.encode(path + item.getName(), false); HTMLNode li = new HTMLNode("li", "class", "item", item.getVisibleName()); String explain = item.getShortDescription(); - if(explain != null && explain.length() > 0) { + if(explain != null && !explain.isEmpty()) { li.addChild("#", " ("); li.addChild("#", explain); li.addChild("#", ")"); @@ -181,7 +181,7 @@ public void handleMethodGET(URI uri, HTTPRequest req, ToadletContext ctx) HTMLNode pageNode = page.outer; HTMLNode content = page.content; String originalBookmark = req.getParam("bookmark"); - if(req.getParam("action").length() > 0 && originalBookmark.length() > 0) { + if(!req.getParam("action").isEmpty() && !originalBookmark.isEmpty()) { String action = req.getParam("action"); String bookmarkPath; try { diff --git a/src/freenet/clients/http/ConnectionsToadlet.java b/src/freenet/clients/http/ConnectionsToadlet.java index 667c43db714..081d307db6e 100644 --- a/src/freenet/clients/http/ConnectionsToadlet.java +++ b/src/freenet/clients/http/ConnectionsToadlet.java @@ -567,7 +567,7 @@ public void handleMethodGET(URI uri, final HTTPRequest request, ToadletContext c foafRow.addChild("td", String.valueOf(peersWithFriend.size())); HTMLNode locationCell=foafRow.addChild("td", "class", "peer-location"); for (PeerNodeStatus peerNodeStatus : peersWithFriend) { - String address=((peerNodeStatus.getPeerAddress() != null) ? (peerNodeStatus.getPeerAddress() + ':' + peerNodeStatus.getPeerPort()) : (l10n("unknownAddress"))); + String address=((peerNodeStatus.getPeerAddress() != null) ? peerNodeStatus.getPeerAddressAndPort() : (l10n("unknownAddress"))); locationCell.addChild("i", address); locationCell.addChild("br"); } @@ -669,7 +669,7 @@ public void handleMethodPOST(URI uri, final HTTPRequest request, ToadletContext } StringBuilder ref = null; - if (urltext.length() > 0) { + if (!urltext.isEmpty()) { // fetch reference from a URL BufferedReader in = null; try { @@ -687,7 +687,7 @@ public void handleMethodPOST(URI uri, final HTTPRequest request, ToadletContext } finally { Closer.close(in); } - } else if (reftext.length() > 0) { + } else if (!reftext.isEmpty()) { // read from post data or file upload // this slightly scary looking regexp chops any extra characters off the beginning or ends of lines and removes extra line breaks ref = new StringBuilder(reftext.replaceAll(".*?((?:[\\w,\\.]+\\=[^\r\n]+?)|(?:End))[ \\t]*(?:\\r?\\n)+", "$1\n")); @@ -732,13 +732,13 @@ public void handleMethodPOST(URI uri, final HTTPRequest request, ToadletContext } //The peer's additions results Map results=new HashMap(); - for(int i=0;i 0) + if(type != null && !type.isEmpty()) referer += "?type=" + type; } catch (MalformedURLException e) { referer = "/"; @@ -1314,7 +1314,7 @@ private static long[] parseRange(String hdrrange) throws HTTPRangeException { result[0] = Long.parseLong(range[0]); if (result[0] < 0) throw new HTTPRangeException("Negative 'from' value"); - if (range[1].trim().length() > 0) { + if (!range[1].trim().isEmpty()) { result[1] = Long.parseLong(range[1]); if (result[1] <= result[0]) throw new HTTPRangeException("'from' value must be less then 'to' value"); diff --git a/src/freenet/clients/http/HTTPRequestImpl.java b/src/freenet/clients/http/HTTPRequestImpl.java index 2effb497926..5d23bd9e1c4 100644 --- a/src/freenet/clients/http/HTTPRequestImpl.java +++ b/src/freenet/clients/http/HTTPRequestImpl.java @@ -123,7 +123,7 @@ public HTTPRequestImpl(String path, String encodedQueryString, String method) th this.data = null; this.parts = null; this.bucketfactory = null; - if ((encodedQueryString!=null) && (encodedQueryString.length()>0)) { + if ((encodedQueryString!=null) && !encodedQueryString.isEmpty()) { this.uri = new URI(path+ '?' +encodedQueryString); } else { this.uri = new URI(path); @@ -273,7 +273,7 @@ public static Map> parseUriParameters(String queryString, b Map> parameters = new HashMap>(); // nothing to do if there was no query string in the URI - if ((queryString == null) || (queryString.length() == 0)) { + if ((queryString == null) || queryString.isEmpty()) { return parameters; } @@ -444,9 +444,9 @@ public int[] getMultipleIntParam(String name) { // try parsing all values and put the valid Integers in a new list List intValueList = new ArrayList(); - for (int i = 0; i < valueList.size(); i++) { + for (String s : valueList) { try { - intValueList.add(Integer.valueOf(valueList.get(i))); + intValueList.add(Integer.valueOf(s)); } catch (Exception e) { // ignore invalid parameter values } @@ -501,7 +501,7 @@ private void parseMultiPartData() throws IOException { boundary = subparts[1]; } - if((boundary == null) || (boundary.length() == 0)) + if((boundary == null) || boundary.isEmpty()) return; if(boundary.charAt(0) == '"') boundary = boundary.substring(1); @@ -535,7 +535,7 @@ private void parseMultiPartData() throws IOException { contentType = null; // chomp headers while((line = lis.readLine(200, 200, true)) /* should be UTF-8 as we told the browser to send UTF-8 */ != null) { - if(line.length() == 0) + if(line.isEmpty()) break; String[] lineparts = line.split(":"); @@ -548,17 +548,17 @@ private void parseMultiPartData() throws IOException { continue; String[] valueparts = lineparts[1].split(";"); - for(int i = 0; i < valueparts.length; i++) { - String[] subparts = valueparts[i].split("="); - if(subparts.length != 2) + for (String valuepart : valueparts) { + String[] subparts = valuepart.split("="); + if (subparts.length != 2) continue; String fieldname = subparts[0].trim(); String value = subparts[1].trim(); - if(value.startsWith("\"") && value.endsWith("\"")) + if (value.startsWith("\"") && value.endsWith("\"")) value = value.substring(1, value.length() - 1); - if(fieldname.equalsIgnoreCase("name")) + if (fieldname.equalsIgnoreCase("name")) name = value; - else if(fieldname.equalsIgnoreCase("filename")) + else if (fieldname.equalsIgnoreCase("filename")) filename = value; } } diff --git a/src/freenet/clients/http/IntervalPusherManager.java b/src/freenet/clients/http/IntervalPusherManager.java index fd3795f11d5..ea7f1275275 100644 --- a/src/freenet/clients/http/IntervalPusherManager.java +++ b/src/freenet/clients/http/IntervalPusherManager.java @@ -31,7 +31,7 @@ public void run() { } // If there are more elements, it reschedules - if (elements.size() > 0) { + if (!elements.isEmpty()) { ticker.queueTimedJob(this, "Stats refresher", REFRESH_PERIOD, false, true); } } @@ -61,7 +61,7 @@ public IntervalPusherManager(Ticker ticker, PushDataManager pushDataManager) { */ public void registerUpdateableElement(BaseUpdateableElement element) { boolean needsStart = false; - if (elements.size() == 0) { + if (elements.isEmpty()) { needsStart = true; } elements.add(element); diff --git a/src/freenet/clients/http/LocalFileBrowserToadlet.java b/src/freenet/clients/http/LocalFileBrowserToadlet.java index 42cf7dc93c1..7110c9f7337 100644 --- a/src/freenet/clients/http/LocalFileBrowserToadlet.java +++ b/src/freenet/clients/http/LocalFileBrowserToadlet.java @@ -274,7 +274,7 @@ private void renderPage (Hashtable fieldPairs, String path, fina } } - if (path.length() == 0) { + if (path.isEmpty()) { if (lastSuccessful != null && lastSuccessful.isDirectory() && allowedDir(lastSuccessful)) { path = lastSuccessful.getAbsolutePath(); } else { diff --git a/src/freenet/clients/http/N2NTMToadlet.java b/src/freenet/clients/http/N2NTMToadlet.java index 2fb6e7a40b0..996944ea17e 100644 --- a/src/freenet/clients/http/N2NTMToadlet.java +++ b/src/freenet/clients/http/N2NTMToadlet.java @@ -156,7 +156,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, ToadletContext ctx) DarknetPeerNode[] peerNodes = node.getDarknetConnections(); if(request.isPartSet(LocalFileBrowserToadlet.selectFile)) { String fnam = request.getPartAsStringFailsafe("filename", 1024); - if(fnam != null && fnam.length() > 0) { + if(fnam != null && !fnam.isEmpty()) { filename = new File(fnam); if(!(filename.exists() && filename.canRead())) { peerTableInfobox.addChild("#", l10n("noSuchFileOrCannotRead")); diff --git a/src/freenet/clients/http/PproxyToadlet.java b/src/freenet/clients/http/PproxyToadlet.java index 00bba5e622a..74cb3d48a67 100644 --- a/src/freenet/clients/http/PproxyToadlet.java +++ b/src/freenet/clients/http/PproxyToadlet.java @@ -81,7 +81,7 @@ public void handleMethodPOST(URI uri, final HTTPRequest request, ToadletContext final PluginManager pm = node.getPluginManager(); - if(path.length()>0) + if(!path.isEmpty()) { // Plugins handle their own formPassword checking. try @@ -183,7 +183,7 @@ public void run() { ctx.sendReplyHeaders(302, "Found", headers, null, 0); return; } - if (request.getPartAsStringFailsafe("unloadconfirm", MAX_PLUGIN_NAME_LENGTH).length() > 0) { + if (!request.getPartAsStringFailsafe("unloadconfirm", MAX_PLUGIN_NAME_LENGTH).isEmpty()) { String pluginThreadName = request.getPartAsStringFailsafe("unloadconfirm", MAX_PLUGIN_NAME_LENGTH); String pluginSpecification = getPluginSpecification(pm, pluginThreadName); pm.killPlugin(pluginThreadName, MAX_THREADED_UNLOAD_WAIT_TIME, false); @@ -204,7 +204,7 @@ public void run() { infoboxContent.addChild("a", "href", "/plugins/", l10n("returnToPluginPage")); writeHTMLReply(ctx, 200, "OK", pageNode.generate()); return; - }if (request.getPartAsStringFailsafe("unload", MAX_PLUGIN_NAME_LENGTH).length() > 0) { + }if (!request.getPartAsStringFailsafe("unload", MAX_PLUGIN_NAME_LENGTH).isEmpty()) { PageNode page = pageMaker.getPageNode(l10n("plugins"), ctx); HTMLNode pageNode = page.outer; HTMLNode contentNode = page.content; @@ -224,7 +224,7 @@ public void run() { tempNode.addChild("input", new String[] { "type", "name", "value" }, new String[] { "submit", "cancel", NodeL10n.getBase().getString("Toadlet.cancel") }); writeHTMLReply(ctx, 200, "OK", pageNode.generate()); return; - } else if (request.getPartAsStringFailsafe("reload", MAX_PLUGIN_NAME_LENGTH).length() > 0) { + } else if (!request.getPartAsStringFailsafe("reload", MAX_PLUGIN_NAME_LENGTH).isEmpty()) { PageNode page = pageMaker.getPageNode(l10n("plugins"), ctx); HTMLNode pageNode = page.outer; HTMLNode contentNode = page.content; @@ -246,7 +246,7 @@ public void run() { writeHTMLReply(ctx, 200, "OK", pageNode.generate()); return; - } else if (request.getPartAsStringFailsafe("update", MAX_PLUGIN_NAME_LENGTH).length() > 0) { + } else if (!request.getPartAsStringFailsafe("update", MAX_PLUGIN_NAME_LENGTH).isEmpty()) { // Deploy the plugin update final String pluginFilename = request.getPartAsStringFailsafe("update", MAX_PLUGIN_NAME_LENGTH); @@ -261,7 +261,7 @@ public void run() { } return; - }else if (request.getPartAsStringFailsafe("reloadconfirm", MAX_PLUGIN_NAME_LENGTH).length() > 0) { + }else if (!request.getPartAsStringFailsafe("reloadconfirm", MAX_PLUGIN_NAME_LENGTH).isEmpty()) { boolean purge = request.isPartSet("purge"); String pluginThreadName = request.getPartAsStringFailsafe("reloadconfirm", MAX_PLUGIN_NAME_LENGTH); final String fn = getPluginSpecification(pm, pluginThreadName); diff --git a/src/freenet/clients/http/QueueToadlet.java b/src/freenet/clients/http/QueueToadlet.java index 1809f40afbe..3d3618667f5 100644 --- a/src/freenet/clients/http/QueueToadlet.java +++ b/src/freenet/clients/http/QueueToadlet.java @@ -216,7 +216,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, final ToadletContext } MultiValueTable responseHeaders = new MultiValueTable(); responseHeaders.put("Location", LocalFileInsertToadlet.PATH+"?key="+insertURI.toASCIIString()+ - "&compress="+String.valueOf(request.getPartAsStringFailsafe("compress", 128).length() > 0)+ + "&compress="+String.valueOf(!request.getPartAsStringFailsafe("compress", 128).isEmpty())+ "&compatibilityMode="+request.getPartAsStringFailsafe("compatibilityMode", 100)+ "&overrideSplitfileKey="+request.getPartAsStringFailsafe("overrideSplitfileKey", 65)); ctx.sendReplyHeaders(302, "Found", responseHeaders, null, 0); @@ -229,7 +229,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, final ToadletContext } } - if(request.isPartSet("delete_request") && (request.getPartAsStringFailsafe("delete_request", 128).length() > 0)) { + if(request.isPartSet("delete_request") && !request.getPartAsStringFailsafe("delete_request", 128).isEmpty()) { // Confirm box PageNode page = ctx.getPageMaker().getPageNode(l10n("confirmDeleteTitle"), ctx); HTMLNode inner = page.content; @@ -285,7 +285,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, final ToadletContext this.writeHTMLReply(ctx, 200, "OK", page.outer.generate()); return; - } else if(request.isPartSet("remove_request") && (request.getPartAsStringFailsafe("remove_request", 128).length() > 0)) { + } else if(request.isPartSet("remove_request") && !request.getPartAsStringFailsafe("remove_request", 128).isEmpty()) { // Remove all requested (i.e. selected) requests from the queue, regardless of // their status // FIXME optimise into a single database job. @@ -314,7 +314,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, final ToadletContext } writePermanentRedirect(ctx, "Done", path()); return; - } else if(request.isPartSet("remove_finished_uploads_request") && (request.getPartAsStringFailsafe("remove_finished_uploads_request", 128).length() > 0)) { + } else if(request.isPartSet("remove_finished_uploads_request") && !request.getPartAsStringFailsafe("remove_finished_uploads_request", 128).isEmpty()) { // Remove all finished single-file uploads String identifier = ""; try { @@ -343,7 +343,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, final ToadletContext writePermanentRedirect(ctx, "Done", path()); return; - } else if(request.isPartSet("remove_finished_downloads_request") && (request.getPartAsStringFailsafe("remove_finished_downloads_request", 128).length() > 0)) { + } else if(request.isPartSet("remove_finished_downloads_request") && !request.getPartAsStringFailsafe("remove_finished_downloads_request", 128).isEmpty()) { // Remove all finished downloads String identifier = ""; try { @@ -372,7 +372,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, final ToadletContext writePermanentRedirect(ctx, "Done", path()); return; } - else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe("restart_request", 128).length() > 0)) { + else if(request.isPartSet("restart_request") && !request.getPartAsStringFailsafe("restart_request", 128).isEmpty()) { boolean disableFilterData = request.isPartSet("disableFilterData"); @@ -392,7 +392,7 @@ else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe } writePermanentRedirect(ctx, "Done", path()); return; - } else if(request.isPartSet("panic") && (request.getPartAsStringFailsafe("panic", 128).length() > 0)) { + } else if(request.isPartSet("panic") && !request.getPartAsStringFailsafe("panic", 128).isEmpty()) { if(SimpleToadletServer.noConfirmPanic) { core.getNode().killMasterKeysFile(); core.getNode().panic(); @@ -403,7 +403,7 @@ else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe sendConfirmPanicPage(ctx); return; } - } else if(request.isPartSet("confirmpanic") && (request.getPartAsStringFailsafe("confirmpanic", 128).length() > 0)) { + } else if(request.isPartSet("confirmpanic") && !request.getPartAsStringFailsafe("confirmpanic", 128).isEmpty()) { core.getNode().killMasterKeysFile(); core.getNode().panic(); sendPanicingPage(ctx); @@ -456,7 +456,7 @@ else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe } else if(request.isPartSet("bulkDownloads")) { String bulkDownloadsAsString = request.getPartAsStringFailsafe("bulkDownloads", 262144); String[] keys = bulkDownloadsAsString.split("\n"); - if((bulkDownloadsAsString.isEmpty()) || (keys.length < 1)) { + if(bulkDownloadsAsString.isEmpty() || (keys.length < 1)) { writePermanentRedirect(ctx, "Done", path()); return; } @@ -481,7 +481,7 @@ else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe // trim leading/trailing space currentKey = currentKey.trim(); - if (currentKey.length() == 0) + if (currentKey.isEmpty()) continue; try { @@ -497,8 +497,8 @@ else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe } } - boolean displayFailureBox = failure.size() > 0; - boolean displaySuccessBox = success.size() > 0; + boolean displayFailureBox = !failure.isEmpty(); + boolean displaySuccessBox = !success.isEmpty(); PageNode page = ctx.getPageMaker().getPageNode(l10n("downloadFiles"), ctx); HTMLNode pageNode = page.outer; @@ -540,7 +540,7 @@ else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe handleChangePriority(request, ctx, "_bottom"); return; // FIXME factor out the next 3 items, they are very messy! - } else if (request.getPartAsStringFailsafe("insert", 128).length() > 0) { + } else if (!request.getPartAsStringFailsafe("insert", 128).isEmpty()) { final FreenetURI insertURI; String keyType = request.getPartAsStringFailsafe("keytype", 10); if ("CHK".equals(keyType)) { @@ -567,11 +567,11 @@ else if(request.isPartSet("restart_request") && (request.getPartAsStringFailsafe return; } final HTTPUploadedFile file = request.getUploadedFile("filename"); - if (file == null || file.getFilename().trim().length() == 0) { + if (file == null || file.getFilename().trim().isEmpty()) { writeError(l10n("errorNoFileSelected"), l10n("errorNoFileSelectedU"), ctx, false, true); return; } - final boolean compress = request.getPartAsStringFailsafe("compress", 128).length() > 0; + final boolean compress = !request.getPartAsStringFailsafe("compress", 128).isEmpty(); final String identifier = file.getFilename() + "-fred-" + System.currentTimeMillis(); final String compatibilityMode = request.getPartAsStringFailsafe("compatibilityMode", 100); final CompatibilityMode cmode; @@ -1088,7 +1088,7 @@ public void handleMethodGET(URI uri, final HTTPRequest request, final ToadletCon boolean countRequests = false; boolean listKeys = false; - if (requestPath.length() > 0) { + if (!requestPath.isEmpty()) { if(requestPath.equals("countRequests.html") || requestPath.equals("/countRequests.html")) { countRequests = true; } else if(requestPath.equals(KEY_LIST_LOCATION)) { @@ -1488,7 +1488,7 @@ else if(secondFinalized && !firstFinalized) navigationContent.addChild("li").addChild("a", "href", "#failedDirUpload", l10n("failedDU", new String[]{ "size" }, new String[]{ String.valueOf(failedDirUpload.size()) })); includeNavigationBar = true; } - if (failedUnknownMIMEType.size() > 0) { + if (!failedUnknownMIMEType.isEmpty()) { String[] types = failedUnknownMIMEType.keySet().toArray(new String[failedUnknownMIMEType.size()]); Arrays.sort(types); for(String type : types) { @@ -1496,7 +1496,7 @@ else if(secondFinalized && !firstFinalized) navigationContent.addChild("li").addChild("a", "href", "#failedDownload-unknowntype-"+atype, l10n("failedDUnknownMIME", new String[]{ "size", "type" }, new String[]{ String.valueOf(failedUnknownMIMEType.get(type).size()), type })); } } - if (failedBadMIMEType.size() > 0) { + if (!failedBadMIMEType.isEmpty()) { String[] types = failedBadMIMEType.keySet().toArray(new String[failedBadMIMEType.size()]); Arrays.sort(types); for(String type : types) { diff --git a/src/freenet/clients/http/ReceivedCookie.java b/src/freenet/clients/http/ReceivedCookie.java index 1749c621e44..1b160fd11f7 100644 --- a/src/freenet/clients/http/ReceivedCookie.java +++ b/src/freenet/clients/http/ReceivedCookie.java @@ -105,7 +105,7 @@ protected static ArrayList parseHeader(String httpHeader) throws key = new String(header, keyBeginIndex, keyEndIndex - keyBeginIndex).toLowerCase(); - if(key.length() == 0) + if(key.isEmpty()) throw new ParseException("Invalid cookie: Contains an empty key: " + httpHeader, i); // We're done parsing the key, continue to the next character. diff --git a/src/freenet/clients/http/SessionManager.java b/src/freenet/clients/http/SessionManager.java index b46da3822e9..67d2d776dd6 100644 --- a/src/freenet/clients/http/SessionManager.java +++ b/src/freenet/clients/http/SessionManager.java @@ -94,7 +94,7 @@ public SessionManager(URI myCookiePath) { * @param myCookieNamespace The name of the client application which uses this cookie. Must not be empty. Must be latin letters and numbers only. */ public SessionManager(String myCookieNamespace) { - if(myCookieNamespace.length() == 0) + if(myCookieNamespace.isEmpty()) throw new IllegalArgumentException("You must specify a cookie namespace or use the constructor " + "which allows specification of a cookie path."); diff --git a/src/freenet/clients/http/SimpleToadletServer.java b/src/freenet/clients/http/SimpleToadletServer.java index 149abfe97e7..fc1696c35db 100644 --- a/src/freenet/clients/http/SimpleToadletServer.java +++ b/src/freenet/clients/http/SimpleToadletServer.java @@ -1004,7 +1004,7 @@ public Toadlet findToadlet(URI uri) throws PermanentRedirectException { for(ToadletElement te: toadlets) { if(path.startsWith(te.prefix)) return te.t; - if(te.prefix.length() > 0 && te.prefix.charAt(te.prefix.length()-1) == '/') { + if(!te.prefix.isEmpty() && te.prefix.charAt(te.prefix.length()-1) == '/') { if(path.equals(te.prefix.substring(0, te.prefix.length()-1))) { URI newURI; try { diff --git a/src/freenet/clients/http/StatisticsToadlet.java b/src/freenet/clients/http/StatisticsToadlet.java index 551fad04dd6..0f37c9e0734 100644 --- a/src/freenet/clients/http/StatisticsToadlet.java +++ b/src/freenet/clients/http/StatisticsToadlet.java @@ -126,7 +126,7 @@ public void handleMethodGET(URI uri, HTTPRequest request, ToadletContext ctx) th final String requestPath = request.getPath().substring(path().length()); - if (requestPath.length() > 0) { + if (!requestPath.isEmpty()) { if(requestPath.equals("requesters.html") || requestPath.equals("/requesters.html")) { showRequesters(request, ctx); return; @@ -234,8 +234,11 @@ public int compare(PeerNodeStatus firstNode, PeerNodeStatus secondNode) { drawLoadBalancingBox(loadStatsInfobox, true); - HTMLNode newLoadManagementBox = nextTableCell.addChild("div", "class", "infobox"); - drawNewLoadManagementBox(newLoadManagementBox); + // New load management statistics + if(stats.enableNewLoadManagement(true) || stats.enableNewLoadManagement(false)) { + HTMLNode newLoadManagementBox = nextTableCell.addChild("div", "class", "infobox"); + drawNewLoadManagementBox(newLoadManagementBox); + } // Psuccess box HTMLNode successRateBox = nextTableCell.addChild("div", "class", "infobox"); @@ -1347,8 +1350,8 @@ public ThreadBunch(String name2, int i) { private int simpleHistogramDivisor(int[] a) { int max = 1; - for (int i = 0; i < a.length; i++) { - if (a[i] > max) max = a[i]; + for (int j : a) { + if (j > max) max = j; } return max; } @@ -1533,26 +1536,26 @@ private void addPeerCircle (HTMLNode circleTable, PeerNodeStatus[] peerNodeStatu double peerLocation; int histogramIndex; int peerCount = peerNodeStatuses.length; - for (int peerIndex = 0; peerIndex < peerCount; peerIndex++) { - peerNodeStatus = peerNodeStatuses[peerIndex]; + for (PeerNodeStatus nodeStatus : peerNodeStatuses) { + peerNodeStatus = nodeStatus; peerLocation = peerNodeStatus.getLocation(); - if(!peerNodeStatus.isSearchable()) continue; + if (!peerNodeStatus.isSearchable()) continue; if (!Location.isValid(peerLocation)) continue; - double[] foafLocations=peerNodeStatus.getPeersLocation(); - if (foafLocations!=null && peerNodeStatus.isRoutable()) { + double[] foafLocations = peerNodeStatus.getPeersLocation(); + if (foafLocations != null && peerNodeStatus.isRoutable()) { for (double foafLocation : foafLocations) { //one grey dot for each "Friend-of-a-friend" - peerCircleInfoboxContent.addChild("span", new String[] { "style", "class" }, new String[] { generatePeerCircleStyleString(foafLocation, false, 0.9), "disconnected" }, "."); + peerCircleInfoboxContent.addChild("span", new String[]{"style", "class"}, new String[]{generatePeerCircleStyleString(foafLocation, false, 0.9), "disconnected"}, "."); } } - histogramIndex = (int)(peerLocation * HISTOGRAM_LENGTH); + histogramIndex = (int) (peerLocation * HISTOGRAM_LENGTH); histogramIndex %= HISTOGRAM_LENGTH; // Map (unlikely) location 1.0 to 0.0 if (peerNodeStatus.isConnected()) { histogramConnected[histogramIndex]++; } else { histogramDisconnected[histogramIndex]++; } - peerCircleInfoboxContent.addChild("span", new String[] { "style", "class" }, new String[] { generatePeerCircleStyleString(peerLocation, false, (1.0 - peerNodeStatus.getPReject())), ((peerNodeStatus.isConnected())?"connected":"disconnected") }, ((peerNodeStatus.isOpennet())?"o":"x")); + peerCircleInfoboxContent.addChild("span", new String[]{"style", "class"}, new String[]{generatePeerCircleStyleString(peerLocation, false, (1.0 - peerNodeStatus.getPReject())), ((peerNodeStatus.isConnected()) ? "connected" : "disconnected")}, ((peerNodeStatus.isOpennet()) ? "o" : "x")); } peerCircleInfoboxContent.addChild("span", new String[] { "style", "class" }, new String[] { generatePeerCircleStyleString(myLocation, true, 1.0), "me" }, "x"); // diff --git a/src/freenet/clients/http/ToadletContextImpl.java b/src/freenet/clients/http/ToadletContextImpl.java index fafe3e08b6f..4a062681a8a 100644 --- a/src/freenet/clients/http/ToadletContextImpl.java +++ b/src/freenet/clients/http/ToadletContextImpl.java @@ -433,8 +433,8 @@ static void sendReplyHeaders(OutputStream sockOutputStream, int replyCode, Strin String key = e.nextElement(); Object[] list = mvt.getArray(key); key = fixKey(key); - for(int i=0;i 0){ + if(!request.getPartAsStringFailsafe("translation_update", 32).isEmpty()){ String key = request.getPartAsStringFailsafe("key", 256); this.base.setOverride(key, new String(BucketTools.toByteArray(request.getPart("trans")), StandardCharsets.UTF_8).trim()); @@ -267,7 +267,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, ToadletContext ctx) t redirectTo(ctx, TOADLET_URL+"?translation_updated="+key+ (toTranslateOnly ? "&toTranslateOnly" : "")); return; - } else if(request.getPartAsStringFailsafe("remove_confirmed", 32).length() > 0) { + } else if(!request.getPartAsStringFailsafe("remove_confirmed", 32).isEmpty()) { String key = request.getPartAsStringFailsafe("remove_confirm", 256).trim(); this.base.setOverride(key, ""); diff --git a/src/freenet/clients/http/WelcomeToadlet.java b/src/freenet/clients/http/WelcomeToadlet.java index f2c542928f2..3d1d23626b1 100644 --- a/src/freenet/clients/http/WelcomeToadlet.java +++ b/src/freenet/clients/http/WelcomeToadlet.java @@ -71,51 +71,50 @@ private void addCategoryToList(BookmarkCategory cat, HTMLNode list, boolean noAc } List items = cat.getItems(); - if (items.size() > 0) { + if (!items.isEmpty()) { // FIXME CSS noborder ... HTMLNode table = list.addChild("li").addChild("table", new String[]{"border", "style"}, new String[]{"0", "border: none"}); - for (int i = 0; i < items.size(); i++) { - BookmarkItem item = items.get(i); - HTMLNode row = table.addChild("tr"); - HTMLNode cell = row.addChild("td", "style", "border: none;"); - if (item.hasAnActivelink() && !noActiveLinks) { - String initialKey = item.getKey(); - String key = '/' + initialKey + (initialKey.endsWith("/") ? "" : "/") + "activelink.png"; - cell.addChild("div", "style", "height: 36px; width: 108px;").addChild("a", "href", '/' + item.getKey()).addChild("img", new String[]{"src", "alt", "style", "title"}, - new String[]{ key, "activelink", "height: 36px; width: 108px", item.getDescription()}); - } else { - cell.addChild("#", " "); - } - cell = row.addChild("td", "style", "border: none"); - - boolean updated = item.hasUpdated(); // We use it twice so copy for thread safety - String linkClass = updated ? "bookmark-title-updated" : "bookmark-title"; - cell.addChild( - "a", - new String[]{"href", "title", "class"}, - new String[]{'/' + item.getKey(), item.getDescription(), linkClass}, - item.getVisibleName()); - - String explain = item.getShortDescription(); - if(explain != null && explain.length() > 0) { - cell.addChild("#", " ("); - cell.addChild("#", explain); - cell.addChild("#", ")"); - } + for (BookmarkItem item : items) { + HTMLNode row = table.addChild("tr"); + HTMLNode cell = row.addChild("td", "style", "border: none;"); + if (item.hasAnActivelink() && !noActiveLinks) { + String initialKey = item.getKey(); + String key = '/' + initialKey + (initialKey.endsWith("/") ? "" : "/") + "activelink.png"; + cell.addChild("div", "style", "height: 36px; width: 108px;").addChild("a", "href", '/' + item.getKey()).addChild("img", new String[]{"src", "alt", "style", "title"}, + new String[]{key, "activelink", "height: 36px; width: 108px", item.getDescription()}); + } else { + cell.addChild("#", " "); + } + cell = row.addChild("td", "style", "border: none"); + + boolean updated = item.hasUpdated(); // We use it twice so copy for thread safety + String linkClass = updated ? "bookmark-title-updated" : "bookmark-title"; + cell.addChild( + "a", + new String[]{"href", "title", "class"}, + new String[]{'/' + item.getKey(), item.getDescription(), linkClass}, + item.getVisibleName()); + + String explain = item.getShortDescription(); + if (explain != null && !explain.isEmpty()) { + cell.addChild("#", " ("); + cell.addChild("#", explain); + cell.addChild("#", ")"); + } - if (updated) { - cell = row.addChild("td", "style", "border: none"); - cell.addChild(node.getClientCore().getAlerts().renderDismissButton( - item.getUserAlert(), path() + "#" + BOOKMARKS_ANCHOR)); - } - } + if (updated) { + cell = row.addChild("td", "style", "border: none"); + cell.addChild(node.getClientCore().getAlerts().renderDismissButton( + item.getUserAlert(), path() + "#" + BOOKMARKS_ANCHOR)); + } + } } List cats = cat.getSubCategories(); - for (int i = 0; i < cats.size(); i++) { - list.addChild("li", "class", "cat", cats.get(i).getVisibleName()); - addCategoryToList(cats.get(i), list.addChild("li").addChild("ul"), noActiveLinks, ctx); - } + for (BookmarkCategory bookmarkCategory : cats) { + list.addChild("li", "class", "cat", bookmarkCategory.getVisibleName()); + addCategoryToList(bookmarkCategory, list.addChild("li").addChild("ul"), noActiveLinks, ctx); + } } public boolean allowPOSTWithoutPassword() { @@ -167,7 +166,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, ToadletContext ctx) t if(!ctx.checkFullAccess(this)) return; - if (request.getPartAsStringFailsafe("updateconfirm", 32).length() > 0) { + if (!request.getPartAsStringFailsafe("updateconfirm", 32).isEmpty()) { if(!ctx.checkFormPassword(request)) return; // false for no navigation bars, because that would be very silly PageNode page = ctx.getPageMaker().getPageNode(l10n("updatingTitle"), ctx); @@ -179,7 +178,7 @@ public void handleMethodPOST(URI uri, HTTPRequest request, ToadletContext ctx) t writeHTMLReply(ctx, 200, "OK", pageNode.generate()); Logger.normal(this, "Node is updating/restarting"); node.getNodeUpdater().arm(); - } else if (request.getPartAsStringFailsafe("update", 32).length() > 0) { + } else if (!request.getPartAsStringFailsafe("update", 32).isEmpty()) { PageNode page = ctx.getPageMaker().getPageNode(l10n("nodeUpdateConfirmTitle"), ctx); HTMLNode pageNode = page.outer; HTMLNode contentNode = page.content; @@ -442,7 +441,7 @@ public void handleMethodGET(URI uri, HTTPRequest request, ToadletContext ctx) th } sendRestartingPage(ctx); return; - } else if (request.getParam("newbookmark").length() > 0) { + } else if (!request.getParam("newbookmark").isEmpty()) { PageNode page = ctx.getPageMaker().getPageNode(l10n("confirmAddBookmarkTitle"), ctx); HTMLNode pageNode = page.outer; HTMLNode contentNode = page.content; diff --git a/src/freenet/clients/http/bookmark/BookmarkCategory.java b/src/freenet/clients/http/bookmark/BookmarkCategory.java index b5f51559c55..f0ef5e1937e 100644 --- a/src/freenet/clients/http/bookmark/BookmarkCategory.java +++ b/src/freenet/clients/http/bookmark/BookmarkCategory.java @@ -114,13 +114,13 @@ private List toStrings(String prefix) { List subCategories = getSubCategories(); prefix += this.name + "/"; - for (int i = 0; i < items.size(); i++) { - strings.add(prefix + items.get(i).toString()); - } + for (BookmarkItem item : items) { + strings.add(prefix + item.toString()); + } - for (int i = 0; i < subCategories.size(); i++) { - strings.addAll(subCategories.get(i).toStrings(prefix)); - } + for (BookmarkCategory subCategory : subCategories) { + strings.addAll(subCategory.toStrings(prefix)); + } return strings; diff --git a/src/freenet/clients/http/bookmark/BookmarkManager.java b/src/freenet/clients/http/bookmark/BookmarkManager.java index 4040d7a2aec..eda1232384d 100644 --- a/src/freenet/clients/http/bookmark/BookmarkManager.java +++ b/src/freenet/clients/http/bookmark/BookmarkManager.java @@ -137,22 +137,22 @@ public void onFoundEdition(long edition, USK key, ClientContext context, boolean List items = MAIN_CATEGORY.getAllItems(); boolean matched = false; boolean updated = false; - for(int i = 0; i < items.size(); i++) { - if(!"USK".equals(items.get(i).getKeyType())) + for (BookmarkItem bookmarkItem : items) { + if (!"USK".equals(bookmarkItem.getKeyType())) continue; try { - FreenetURI furi = new FreenetURI(items.get(i).getKey()); + FreenetURI furi = new FreenetURI(bookmarkItem.getKey()); USK usk = USK.create(furi); - if(usk.equals(key, false)) { - if(logMINOR) Logger.minor(this, "Updating bookmark for "+furi+" to edition "+edition); + if (usk.equals(key, false)) { + if (logMINOR) Logger.minor(this, "Updating bookmark for " + furi + " to edition " + edition); matched = true; - BookmarkItem item = items.get(i); + BookmarkItem item = bookmarkItem; updated |= item.setEdition(edition, node); // We may have bookmarked the same site twice, so continue the search. } - } catch(MalformedURLException mue) { + } catch (MalformedURLException mue) { } } if(updated) { diff --git a/src/freenet/clients/http/geoip/IPConverter.java b/src/freenet/clients/http/geoip/IPConverter.java index 84e34cbb5f8..fb23f128195 100644 --- a/src/freenet/clients/http/geoip/IPConverter.java +++ b/src/freenet/clients/http/geoip/IPConverter.java @@ -285,8 +285,8 @@ public long ip2num(String ip) { if(split.length != 4) throw new NumberFormatException(); long num = 0; long coef = (256 << 16); - for (int i = 0; i < split.length; i++) { - long modulo = Integer.parseInt(split[i]) % 256; + for (String s : split) { + long modulo = Integer.parseInt(s) % 256; num += (modulo * coef); coef >>= 8; } @@ -412,10 +412,10 @@ private long decodeBase85(byte[] code) throws IPConverterParseException { long result = 0; if (code.length != 5) throw new IPConverterParseException(); - for (int i = 0; i < code.length; i++) { - if (code[i] < (byte)32 || base85inv[code[i] - 32] < (byte)0) + for (byte b : code) { + if (b < (byte) 32 || base85inv[b - 32] < (byte) 0) throw new IPConverterParseException(); - result = (result * base) + base85inv[code[i] - 32]; + result = (result * base) + base85inv[b - 32]; } return result; } diff --git a/src/freenet/clients/http/staticfiles/defaultbookmarks.dat b/src/freenet/clients/http/staticfiles/defaultbookmarks.dat index a96b9d210fe..cb2b74740ef 100644 --- a/src/freenet/clients/http/staticfiles/defaultbookmarks.dat +++ b/src/freenet/clients/http/staticfiles/defaultbookmarks.dat @@ -13,12 +13,12 @@ BookmarkCategory0.Content.Bookmark1.Name=Clean Spider BookmarkCategory0.Content.Bookmark1.Description=L10N:CleanSpider BookmarkCategory0.Content.Bookmark1.ShortDescription=L10N:CleanSpider BookmarkCategory0.Content.Bookmark1.hasAnActivelink=true -BookmarkCategory0.Content.Bookmark1.URI=USK@5ijbfKSJ4kPZTRDzq363CHteEUiSZjrO-E36vbHvnIU,ZEZqPXeuYiyokY2r0wkhJr5cy7KBH9omkuWDqSC6PLs,AQACAAE/clean-spider/129/ +BookmarkCategory0.Content.Bookmark1.URI=USK@5ijbfKSJ4kPZTRDzq363CHteEUiSZjrO-E36vbHvnIU,ZEZqPXeuYiyokY2r0wkhJr5cy7KBH9omkuWDqSC6PLs,AQACAAE/clean-spider/282/ BookmarkCategory0.Content.Bookmark2.Name=Index of Indexes BookmarkCategory0.Content.Bookmark2.ShortDescription=L10N:JFnikiIndex BookmarkCategory0.Content.Bookmark2.Description=L10N:JFnikiIndex BookmarkCategory0.Content.Bookmark2.hasAnActivelink=false -BookmarkCategory0.Content.Bookmark2.URI=USK@t-YmshUm43nS16QFieoZMfBdfieb9Opy0a2aMWsoH8o,7NqDX88r1R4SC~elmpW4SuKbnAOka~MKUuBufUWa2xQ,AQACAAE/jFniki.Index/10/Index_of_Indexes.html +BookmarkCategory0.Content.Bookmark2.URI=USK@t-YmshUm43nS16QFieoZMfBdfieb9Opy0a2aMWsoH8o,7NqDX88r1R4SC~elmpW4SuKbnAOka~MKUuBufUWa2xQ,AQACAAE/jFniki.Index/11/Index_of_Indexes.html BookmarkCategory1.Name=L10N:categorySoftware BookmarkCategory1.Content.BookmarkCategory=0 BookmarkCategory1.Content.Bookmark=8 @@ -105,7 +105,7 @@ BookmarkCategory2.Content.Bookmark7.hasAnActivelink=true BookmarkCategory2.Content.Bookmark7.Name=Freenet Statistics BookmarkCategory2.Content.Bookmark7.Description=L10N:statistics BookmarkCategory2.Content.Bookmark7.ShortDescription=L10N:statistics -BookmarkCategory2.Content.Bookmark8.URI=USK@lwR9sLnZD3QHveZa1FB0dAHgeck~dFNBg368mY09wSU,0Vq~4FXSUj1-op3QdzqjZsIvrNMYWlnSdUwCl-Z1fYA,AQACAAE/fetchpullstats/975/ +BookmarkCategory2.Content.Bookmark8.URI=USK@lwR9sLnZD3QHveZa1FB0dAHgeck~dFNBg368mY09wSU,0Vq~4FXSUj1-op3QdzqjZsIvrNMYWlnSdUwCl-Z1fYA,AQACAAE/fetchpullstats/1009/ BookmarkCategory2.Content.Bookmark8.hasAnActivelink=true BookmarkCategory2.Content.Bookmark8.Name=Fetch-pull stats BookmarkCategory2.Content.Bookmark8.Description=L10N:fetchpull @@ -120,7 +120,7 @@ BookmarkCategory2.Content.Bookmark10.Name=Infocalypse and pyFreenet BookmarkCategory2.Content.Bookmark10.Description=L10N:InfocalypsePyFreenet BookmarkCategory2.Content.Bookmark10.ShortDescription=L10N:InfocalypsePyFreenet BookmarkCategory2.Content.Bookmark10.hasAnActivelink=true -BookmarkCategory2.Content.Bookmark11.URI=USK@SYsHNvVtTUa5h12MnZ9Bvqhyk9yTma2~IKk2uFk1HMo,7k4bmQkXE-oxbjeUPKy1QZkPWfLDkNB8XR-2EpEs-eY,AQACAAE/opennet-seednodes-stats/11/ +BookmarkCategory2.Content.Bookmark11.URI=USK@SYsHNvVtTUa5h12MnZ9Bvqhyk9yTma2~IKk2uFk1HMo,7k4bmQkXE-oxbjeUPKy1QZkPWfLDkNB8XR-2EpEs-eY,AQACAAE/opennet-seednodes-stats/13/ BookmarkCategory2.Content.Bookmark11.Name=Opennet SeedNodes Uptime Statistics BookmarkCategory2.Content.Bookmark11.Description=L10N:SeedNodesUptimeStats BookmarkCategory2.Content.Bookmark11.ShortDescription=L10N:SeedNodesUptimeStats @@ -137,7 +137,7 @@ BookmarkCategory3.Content.Bookmark0.Name=ArneBab BookmarkCategory3.Content.Bookmark0.Description=L10N:Flog.ArneBab BookmarkCategory3.Content.Bookmark0.ShortDescription=L10N:Flog.ArneBab BookmarkCategory3.Content.Bookmark0.hasAnActivelink=true -BookmarkCategory3.Content.Bookmark0.URI=USK@sUm3oJISSEU4pl2Is9qa1eRoCLyz6r2LPkEqlXc3~oc,yBEbf-IJrcB8Pe~gAd53DEEHgbugUkFSHtzzLqnYlbs,AQACAAE/random_babcom/512/ +BookmarkCategory3.Content.Bookmark0.URI=USK@sUm3oJISSEU4pl2Is9qa1eRoCLyz6r2LPkEqlXc3~oc,yBEbf-IJrcB8Pe~gAd53DEEHgbugUkFSHtzzLqnYlbs,AQACAAE/random_babcom/524/ BookmarkCategory3.Content.Bookmark1.Name=Bombe BookmarkCategory3.Content.Bookmark1.Description=L10N:Flog.Bombe BookmarkCategory3.Content.Bookmark1.ShortDescription=L10N:Flog.Bombe diff --git a/src/freenet/clients/http/updateableelements/PushDataManager.java b/src/freenet/clients/http/updateableelements/PushDataManager.java index c170bedcc97..2da225e644e 100644 --- a/src/freenet/clients/http/updateableelements/PushDataManager.java +++ b/src/freenet/clients/http/updateableelements/PushDataManager.java @@ -224,8 +224,8 @@ public synchronized UpdateEvent getNextNotification(String requestId) { if (logMINOR) { Logger.minor(this, "Polling for notification:" + requestId); } - while (awaitingNotifications.get(requestId) != null && awaitingNotifications.get(requestId).size() == 0 || // No notifications - (awaitingNotifications.get(requestId) != null && awaitingNotifications.get(requestId).size() != 0 && isFirstKeepaliveReceived.containsKey(awaitingNotifications.get(requestId).get(0).requestId)==false)) { // Not asked us yet + while (awaitingNotifications.get(requestId) != null && awaitingNotifications.get(requestId).isEmpty() || // No notifications + (awaitingNotifications.get(requestId) != null && !awaitingNotifications.get(requestId).isEmpty() && isFirstKeepaliveReceived.containsKey(awaitingNotifications.get(requestId).get(0).requestId)==false)) { // Not asked us yet try { wait(); } catch (InterruptedException ie) { @@ -269,12 +269,12 @@ private synchronized boolean deleteRequest(String requestId) { for (BaseUpdateableElement element : new ArrayList(pages.get(requestId))) { pages.get(requestId).remove(element); // FIXME why can't we just unconditionally remove(requestId) at the end? - if (pages.get(requestId).size() == 0) { + if (pages.get(requestId).isEmpty()) { pages.remove(requestId); } String id = element.getUpdaterId(requestId); elements.get(id).remove(requestId); - if (elements.get(id).size() == 0) { + if (elements.get(id).isEmpty()) { elements.remove(id); } element.dispose(); @@ -354,7 +354,7 @@ public void run() { isKeepaliveReceived.put(entry.getKey(), false); } } - if (isKeepaliveReceived.size() != 0) { + if (!isKeepaliveReceived.isEmpty()) { if (logMINOR) { Logger.minor(this, "Cleaner is queued(2) time:" + System.currentTimeMillis()); } diff --git a/src/freenet/clients/http/wizardsteps/DATASTORE_SIZE.java b/src/freenet/clients/http/wizardsteps/DATASTORE_SIZE.java index 960218a136f..5cb72388b72 100644 --- a/src/freenet/clients/http/wizardsteps/DATASTORE_SIZE.java +++ b/src/freenet/clients/http/wizardsteps/DATASTORE_SIZE.java @@ -189,8 +189,8 @@ public static long maxDatastoreSize(Node node) { long freeSpace = storeDir.getUsableSpace(); File[] files = storeDir.listFiles(); - for (int i = 0; i < files.length; i++) { - freeSpace += files[i].length(); + for (File file : files) { + freeSpace += file.length(); } if (freeSpace < maxSize) { diff --git a/src/freenet/config/StringArrOption.java b/src/freenet/config/StringArrOption.java index b58f5656fb2..10de22bd7a6 100644 --- a/src/freenet/config/StringArrOption.java +++ b/src/freenet/config/StringArrOption.java @@ -20,7 +20,7 @@ public StringArrOption(SubConfig conf, String optionName, String[] defaultValue, @Override public String[] parseString(String val) throws InvalidConfigValueException { - if(val.length() == 0) return new String[0]; + if(val.isEmpty()) return new String[0]; String[] out = val.split(delimiter); try { @@ -49,12 +49,11 @@ public String toString(String[] arr) { if (arr == null) return null; StringBuilder sb = new StringBuilder(); - for (int i = 0 ; i < arr.length ; i++) { - String val = arr[i]; - if(val.length() == 0) + for (String val : arr) { + if (val.isEmpty()) sb.append(":").append(delimiter); else - sb.append(URLEncoder.encode(arr[i],false)).append(delimiter); + sb.append(URLEncoder.encode(val, false)).append(delimiter); } if(sb.length() > 0) sb.setLength(sb.length()-1); // drop surplus delimiter return sb.toString(); diff --git a/src/freenet/io/AddressIdentifier.java b/src/freenet/io/AddressIdentifier.java index 2b09accee94..ea435baec17 100644 --- a/src/freenet/io/AddressIdentifier.java +++ b/src/freenet/io/AddressIdentifier.java @@ -25,6 +25,7 @@ *
  • IPv4 unabridged (a.b.c.d)
  • *
  • IPv4 abridged (a.b.d or a.d)
  • *
  • IPv6 unabridged (a:b:c:d:e:f:g:h)
  • + *
  • IPv6 abridged (a::b:c:d:e)
  • * * * @author David Roden <droden@gmail.com> @@ -38,13 +39,30 @@ public class AddressIdentifier { String ipv4AddressRegex = byteRegex + "\\.(?>" + byteRegex + "\\.)?(?>" + byteRegex + "\\.)?" + byteRegex; ipv4Pattern = Pattern.compile(ipv4AddressRegex); - String wordRegex = "(?>[0-9a-fA-F]{1,4})"; + String wordRegex = "(?>[0-9a-f]{1,4})"; String percentScopeIDRegex = "(?>%[0-9]{1,3})?"; - String ipv6AddressRegex = wordRegex + "?:" + wordRegex + ':' + wordRegex + ':' + wordRegex + ':' + wordRegex + ':' + wordRegex + ':' + wordRegex + ':' + wordRegex; - String ipv6ISATAPAddressRegex = wordRegex + "?:" + wordRegex + ':' + wordRegex + ':' + wordRegex + ":(0){1,4}:5(efe|EFE):" + wordRegex + ':' + wordRegex + percentScopeIDRegex; - ipv6Pattern = Pattern.compile(ipv6AddressRegex); - ipv6PatternWithPercentScopeID = Pattern.compile(ipv6AddressRegex + percentScopeIDRegex); - ipv6ISATAPPattern = Pattern.compile(ipv6ISATAPAddressRegex); + /* + * ::(?>(?>X:){0,6}X)? + * X::(?>(?>X:){0,5}X)? + * X:X::(?>(?>X:){0,4}X)? + * X:X:X::(?>(?>X:){0,3}X)? + * (?>X:){4}:(?>(?>X:){0,2}X)? + * (?>X:){5}:(?>X:)?X? + * (?>X:){6}:X? + * (?>X:){7}(?>X|:) + */ + String ipv6AddressRegex = "::(?>(?>X:){0,6}X)?|X::(?>(?>X:){0,5}X)?|X:X::(?>(?>X:){0,4}X)?|X:X:X::(?>(?>X:){0,3}X)?|(?>X:){4}:(?>(?>X:){0,2}X)?|(?>X:){5}:(?>X:)?X?|(?>X:){6}:X?|(?>X:){7}(?>X|:)"; + ipv6AddressRegex = ipv6AddressRegex.replaceAll("X", wordRegex); + // case 0: :(?>(?>:X){1,3}:0{1,4}|:0{1,4}|):5EFE:X:X + // case 1: X:(?>:0{1,4}|:(?>X:){1,2}0{1,4}|):5EFE:X:X + // case 2: X:X:(?>:0{1,4}|:(?>X:)?0{1,4}|):5EFE:X:X + // case 3 and 4: X:X:X:(?>X:0{1,4}|:0{1,4}|X:|):5EFE:X:X + // case 5: (?>X:){4}0{1,4}:5EFE:(?>X:X|:X?|X::) + String ipv6ISATAPAddressRegex = ":(?>(?>:X){1,3}:0{1,4}|:0{1,4}|):5EFE:X:X|X:(?>:0{1,4}|:(?>X:){1,2}0{1,4}|):5EFE:X:X|X:X:(?>:0{1,4}|:(?>X:)?0{1,4}|):5EFE:X:X|X:X:X:(?>X:0{1,4}|:0{1,4}|X:|):5EFE:X:X|(?>X:){4}0{1,4}:5EFE:(?>X:X|:X?|X::)"; + ipv6ISATAPAddressRegex = ipv6ISATAPAddressRegex.replaceAll("X", wordRegex); + ipv6Pattern = Pattern.compile(ipv6AddressRegex, Pattern.CASE_INSENSITIVE); + ipv6PatternWithPercentScopeID = Pattern.compile("(?>" + ipv6AddressRegex + ")" + percentScopeIDRegex, Pattern.CASE_INSENSITIVE); + ipv6ISATAPPattern = Pattern.compile("(?>" + ipv6ISATAPAddressRegex + ")" + percentScopeIDRegex, Pattern.CASE_INSENSITIVE); } public enum AddressType { diff --git a/src/freenet/io/Inet4AddressMatcher.java b/src/freenet/io/Inet4AddressMatcher.java index f009466f609..410177d5cba 100644 --- a/src/freenet/io/Inet4AddressMatcher.java +++ b/src/freenet/io/Inet4AddressMatcher.java @@ -49,7 +49,7 @@ public class Inet4AddressMatcher implements AddressMatcher { * @param cidrHostname * The address range this matcher matches */ - public Inet4AddressMatcher(String cidrHostname) { + public Inet4AddressMatcher(String cidrHostname) throws IllegalArgumentException { int slashPosition = cidrHostname.indexOf('/'); if (slashPosition == -1) { address = convertToBytes(cidrHostname); diff --git a/src/freenet/io/Inet6AddressMatcher.java b/src/freenet/io/Inet6AddressMatcher.java index aea1e63ac9d..fdab182f167 100644 --- a/src/freenet/io/Inet6AddressMatcher.java +++ b/src/freenet/io/Inet6AddressMatcher.java @@ -19,8 +19,6 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.util.Arrays; -import java.util.StringTokenizer; - import freenet.io.AddressIdentifier.AddressType; /** @@ -40,7 +38,7 @@ public AddressType getAddressType() { private byte[] address; private byte[] netmask; - public Inet6AddressMatcher(String pattern) { + public Inet6AddressMatcher(String pattern) throws IllegalArgumentException { if (pattern.indexOf('/') != -1) { address = convertToBytes(pattern.substring(0, pattern.indexOf('/'))); String netmaskString = pattern.substring(pattern.indexOf('/') + 1).trim(); @@ -66,18 +64,72 @@ public Inet6AddressMatcher(String pattern) { } } - private byte[] convertToBytes(String address) { - StringTokenizer addressTokens = new StringTokenizer(address, ":"); - if (addressTokens.countTokens() != 8) { - throw new IllegalArgumentException(address + " is not an IPv6 address."); - } - byte[] addressBytes = new byte[16]; + private byte[] convertToBytes(String address) throws IllegalArgumentException { + String[] addressTokens = address.split(":", -1); // Don't let Java discard trailing empty string, to distinguish "1:2:3:4:5:6:7:" and "1:2:3:4:5:6:7::" + int tokenPosition = 0; + byte[] addressBytes = new byte[16]; // Part before :: + byte[] addressBytesEnd = new byte[16]; // Part after ::, in reverse order int count = 0; - while (addressTokens.hasMoreTokens()) { - int addressWord = Integer.parseInt(addressTokens.nextToken(), 16); - addressBytes[count * 2] = (byte) ((addressWord >> 8) & 0xff); - addressBytes[count * 2 + 1] = (byte) (addressWord & 0xff); - count++; + int endCount = -1; + if(address.startsWith(":")) { + if(address.startsWith("::")) { + if(address == "::") { + return addressBytes; // Return 0:0:0:0:0:0:0:0 + } + tokenPosition=2; // This is an empty token, could be mistaken as duplicate :: + endCount = 0; + } else { + throw new IllegalArgumentException(address + " is not an IPv6 address."); + } + } + while (tokenPosition < addressTokens.length) { + String token = addressTokens[tokenPosition]; + tokenPosition++; + if(!token.isEmpty() ) { + int addressWord; + try { + addressWord = Integer.parseInt(token, 16); + } catch(NumberFormatException e) { + throw new IllegalArgumentException(address + " is not an IPv6 address."); + } + // Enforce limits + if(addressWord < 0 || addressWord > 0xffff) { + throw new IllegalArgumentException(address + " is not an IPv6 address."); + } + if(endCount == -1) { + if(count >= 8) { + throw new IllegalArgumentException(address + " is not an IPv6 address."); + } + addressBytes[count * 2] = (byte) ((addressWord >> 8) & 0xff); + addressBytes[count * 2 + 1] = (byte) (addressWord & 0xff); + count++; + } else { + if(count + endCount >= 7) { + throw new IllegalArgumentException(address + " is not an IPv6 address."); + } + addressBytesEnd[endCount * 2] = (byte) ((addressWord >> 8) & 0xff); + addressBytesEnd[endCount * 2 + 1] = (byte) (addressWord & 0xff); + endCount++; + } + } else if(endCount == -1) { + if(count >= 8 || tokenPosition == addressTokens.length) { + // Catch the case "1:2:3:4:5:6:7:8::", let "1:2:3:4:5:6:7::" go + throw new IllegalArgumentException(address + " is not an IPv6 address."); + } + endCount = 0; + } else if(endCount > 0 || tokenPosition != addressTokens.length){ + throw new IllegalArgumentException(address + " is not an IPv6 address."); + } + } + if(endCount != -1) { // Copy the end part to the end of main part + for(int index = count; index < 8 - endCount; index++) { + addressBytes[index * 2] = 0; + addressBytes[index * 2 + 1] = 0; + } + for(int index = 0; index < endCount; index++) { + addressBytes[(8 - endCount + index) * 2] = addressBytesEnd[index * 2]; + addressBytes[(8 - endCount + index) * 2 + 1] = addressBytesEnd[index * 2 + 1]; + } } return addressBytes; } @@ -94,7 +146,7 @@ public boolean matches(InetAddress address) { return true; } - public static boolean matches(String pattern, InetAddress address) { + public static boolean matches(String pattern, InetAddress address) throws IllegalArgumentException { return new Inet6AddressMatcher(pattern).matches(address); } diff --git a/src/freenet/io/NetworkInterface.java b/src/freenet/io/NetworkInterface.java index 0dc10b87df3..4c9245cc712 100644 --- a/src/freenet/io/NetworkInterface.java +++ b/src/freenet/io/NetworkInterface.java @@ -161,9 +161,9 @@ public String[] setBindTo(String bindTo, boolean ignoreUnbindableIP6) { } finally { lock.unlock(); } - for (int serverSocketIndex = 0; serverSocketIndex < bindToTokenList.size(); serverSocketIndex++) { + for (String s : bindToTokenList) { InetSocketAddress addr = null; - String address = bindToTokenList.get(serverSocketIndex); + String address = s; try { ServerSocket serverSocket = createServerSocket(); addr = new InetSocketAddress(address, port); @@ -173,23 +173,23 @@ public String[] setBindTo(String bindTo, boolean ignoreUnbindableIP6) { try { acceptor.setSoTimeout(timeout); } catch (SocketException e) { - Logger.error(this, "Unable to setSoTimeout in setBindTo() on "+addr); + Logger.error(this, "Unable to setSoTimeout in setBindTo() on " + addr); } lock.lock(); try { acceptors.add(acceptor); runningAcceptors++; - executor.execute(acceptor, "Network Interface Acceptor for "+acceptor.serverSocket); + executor.execute(acceptor, "Network Interface Acceptor for " + acceptor.serverSocket); } finally { lock.unlock(); } } catch (IOException e) { - if(e instanceof SocketException && ignoreUnbindableIP6 && addr != null && + if (e instanceof SocketException && ignoreUnbindableIP6 && addr != null && addr.getAddress() instanceof Inet6Address) continue; - System.err.println("Unable to bind to address "+address+" for port "+port); - Logger.error(this, "Unable to bind to address "+address+" for port "+port); - if(brokenList == null) brokenList = new ArrayList(); + System.err.println("Unable to bind to address " + address + " for port " + port); + Logger.error(this, "Unable to bind to address " + address + " for port " + port); + if (brokenList == null) brokenList = new ArrayList(); brokenList.add(address); } } @@ -243,7 +243,7 @@ public Socket accept() { return null; if (WrapperManager.hasShutdownHookBeenTriggered()) return null; - if (acceptors.size() == 0) { + if (acceptors.isEmpty()) { return null; } socketCondition.awaitUninterruptibly(); @@ -429,7 +429,7 @@ public String getAllowedHosts() { public boolean isBound() { lock.lock(); try { - return this.acceptors.size() != 0; + return !this.acceptors.isEmpty(); } finally { lock.unlock(); } @@ -438,11 +438,11 @@ public boolean isBound() { public void waitBound() { lock.lock(); try { - if(acceptors.size() > 0) return; + if(!acceptors.isEmpty()) return; while (true) { Logger.error(this, "Network interface isn't bound, waiting"); boundCondition.awaitUninterruptibly(); - if(acceptors.size() > 0) { + if(!acceptors.isEmpty()) { Logger.error(this, "Finished waiting, network interface is now bound"); return; } diff --git a/src/freenet/io/comm/FreenetInetAddress.java b/src/freenet/io/comm/FreenetInetAddress.java index 8e696776020..27bf4120f39 100644 --- a/src/freenet/io/comm/FreenetInetAddress.java +++ b/src/freenet/io/comm/FreenetInetAddress.java @@ -83,7 +83,7 @@ public FreenetInetAddress(DataInput dis) throws IOException { _address = InetAddress.getByAddress(ba); String name = null; String s = dis.readUTF(); - if(s.length() > 0) + if(!s.isEmpty()) name = s; hostname = name; } @@ -114,7 +114,7 @@ public FreenetInetAddress(DataInput dis, boolean checkHostnameOrIPSyntax) throws _address = InetAddress.getByAddress(ba); String name = null; String s = dis.readUTF(); - if(s.length() > 0) + if(!s.isEmpty()) name = s; hostname = name; if(checkHostnameOrIPSyntax && null != hostname) { @@ -413,7 +413,7 @@ public static String getHostName(InetAddress primaryIPAddress) { if(primaryIPAddress == null) return null; String s = primaryIPAddress.toString(); String addr = s.substring(0, s.indexOf('/')).trim(); - if(addr.length() == 0) + if(addr.isEmpty()) return primaryIPAddress.getHostAddress(); else return addr; @@ -450,7 +450,7 @@ public FreenetInetAddress dropHostname() { } public boolean hasHostname() { - return hostname != null && hostname.length() > 0; + return hostname != null && !hostname.isEmpty(); } public boolean hasHostnameNoIP() { diff --git a/src/freenet/io/comm/IOStatisticCollector.java b/src/freenet/io/comm/IOStatisticCollector.java index 5745c2d524c..5ac8626a346 100644 --- a/src/freenet/io/comm/IOStatisticCollector.java +++ b/src/freenet/io/comm/IOStatisticCollector.java @@ -147,8 +147,7 @@ private void rotate() { lastrotate = now; Object[] keys = targets.keySet().toArray(); if(keys == null) return; // Why aren't we iterating there ? - for(int i = 0 ; i < keys.length ; i++) { - Object key = keys[i]; + for (Object key : keys) { if (targets.get(key).rotate() == false) targets.remove(key); } diff --git a/src/freenet/io/comm/MessageCore.java b/src/freenet/io/comm/MessageCore.java index 15bcf775aef..97bb55732d2 100644 --- a/src/freenet/io/comm/MessageCore.java +++ b/src/freenet/io/comm/MessageCore.java @@ -135,12 +135,11 @@ long removeTimedOutFilters(long nextTimeout) { if(!timedOutFilters.add(f)) Logger.error(this, "Filter "+f+" is in filter list twice!"); if(logMINOR) { - for (ListIterator it = _unclaimed.listIterator(); it.hasNext();) { - Message m = it.next(); + for (Message m : _unclaimed) { MATCHED status = f.match(m, true, tStart); if (status == MATCHED.MATCHED) { // Don't match it, we timed out; two-level timeouts etc may want it for the next filter. - Logger.error(this, "Timed out but should have matched in _unclaimed: "+m+" for "+f); + Logger.error(this, "Timed out but should have matched in _unclaimed: " + m + " for " + f); break; } } @@ -611,15 +610,14 @@ public int getUnclaimedFIFOSize() { public Map getUnclaimedFIFOMessageCounts() { Map messageCounts = new HashMap(); synchronized(_filters) { - for (ListIterator i = _unclaimed.listIterator(); i.hasNext();) { - Message m = i.next(); + for (Message m : _unclaimed) { String messageName = m.getSpec().getName(); Integer messageCount = messageCounts.get(messageName); if (messageCount == null) { - messageCounts.put(messageName, Integer.valueOf(1) ); + messageCounts.put(messageName, Integer.valueOf(1)); } else { messageCount = Integer.valueOf(messageCount.intValue() + 1); - messageCounts.put(messageName, messageCount ); + messageCounts.put(messageName, messageCount); } } } diff --git a/src/freenet/io/comm/RetrievalException.java b/src/freenet/io/comm/RetrievalException.java index a9200580e9a..2bf76677c34 100644 --- a/src/freenet/io/comm/RetrievalException.java +++ b/src/freenet/io/comm/RetrievalException.java @@ -56,7 +56,7 @@ public RetrievalException(int reason) { public RetrievalException(int reason, String cause) { _reason = reason; _cause = cause; - if (cause==null || cause.length()==0 || cause.equals("null")) + if (cause==null || cause.isEmpty() || cause.equals("null")) _cause=getErrString(reason); } diff --git a/src/freenet/io/xfer/BlockTransmitter.java b/src/freenet/io/xfer/BlockTransmitter.java index bec8c943fa1..e3631023127 100644 --- a/src/freenet/io/xfer/BlockTransmitter.java +++ b/src/freenet/io/xfer/BlockTransmitter.java @@ -127,7 +127,7 @@ public void run() { BitArray copy; synchronized(_senderThread) { if(_failed || _receivedSendCompletion || _completed) return; - if(_unsent.size() == 0) { + if(_unsent.isEmpty()) { // Wait for PRB callback to tell us we have more packets. return; } @@ -181,7 +181,7 @@ private boolean innerRun(int packetNo, BitArray copied) { boolean success = false; boolean complete = false; synchronized (_senderThread) { - if(_unsent.size() == 0 && getNumSent() == _prb._packets) { + if(_unsent.isEmpty() && getNumSent() == _prb._packets) { //No unsent packets, no unreceived packets sendAllSentNotification(); if(maybeAllSent()) { @@ -287,7 +287,7 @@ public int getPriority() { * @return True if everything has been sent and we are now just waiting for an * acknowledgement or timeout from the other side. */ public boolean maybeAllSent() { - if(blockSendsPending == 0 && _unsent.size() == 0 && getNumSent() == _prb._packets) { + if(blockSendsPending == 0 && _unsent.isEmpty() && getNumSent() == _prb._packets) { timeAllSent = System.currentTimeMillis(); if(logMINOR) Logger.minor(this, "Sent all blocks, none unsent on "+this); diff --git a/src/freenet/keys/FreenetURI.java b/src/freenet/keys/FreenetURI.java index 92944fe7edd..8f74748285b 100644 --- a/src/freenet/keys/FreenetURI.java +++ b/src/freenet/keys/FreenetURI.java @@ -131,8 +131,7 @@ public synchronized int hashCode() { if(docName != null) x ^= docName.hashCode(); if(metaStr != null) - for(int i = 0; i < metaStr.length; i++) - x ^= metaStr[i].hashCode(); + for (String s : metaStr) x ^= s.hashCode(); if(routingKey != null) x ^= Fields.hashCode(routingKey); if(cryptoKey != null) @@ -370,10 +369,10 @@ public FreenetURI(String URI, boolean noTrim) throws MalformedURLException { URI = URI.substring(atchar + 1); boolean validKeyType = false; - for(int i = 0; i < VALID_KEY_TYPES.length; i++) { - if (_keyType.equals(VALID_KEY_TYPES[i])) { + for (String type : VALID_KEY_TYPES) { + if (_keyType.equals(type)) { validKeyType = true; - _keyType = VALID_KEY_TYPES[i]; + _keyType = type; break; } } @@ -786,8 +785,8 @@ public String toString(boolean prefix, boolean pureAscii) { b.append(suggestedEdition); } if(metaStr != null) - for(int i = 0; i < metaStr.length; i++) { - b.append('/').append(URLEncoder.encode(metaStr[i], "/", pureAscii)); + for (String s : metaStr) { + b.append('/').append(URLEncoder.encode(s, "/", pureAscii)); } return b.toString(); } @@ -812,8 +811,8 @@ public String toShortString() { b.append(suggestedEdition); } if(metaStr != null) - for(int i = 0; i < metaStr.length; i++) { - b.append('/').append(URLEncoder.encode(metaStr[i], "/", false, " ")); + for (String s : metaStr) { + b.append('/').append(URLEncoder.encode(s, "/", false, " ")); } return b.toString(); } @@ -835,8 +834,7 @@ public byte[] getExtra() { public ArrayList listMetaStrings() { if(metaStr != null) { ArrayList l = new ArrayList(metaStr.length); - for(int i = 0; i < metaStr.length; i++) - l.add(metaStr[i]); + for (String s : metaStr) l.add(s); return l; } else return new ArrayList(0); } @@ -972,8 +970,7 @@ private void writeFullBinaryKey(DataOutputStream dos) throws IOException { dos.writeUTF(docName); if(metaStr != null) { dos.writeInt(metaStr.length); - for(int i = 0; i < metaStr.length; i++) - dos.writeUTF(metaStr[i]); + for (String s : metaStr) dos.writeUTF(s); } else dos.writeInt(0); } @@ -1025,7 +1022,7 @@ public String getPreferredFilename() { s = FileUtil.sanitize(s); if(logMINOR) Logger.minor(this, "Sanitized name " + i + " = " + s); - if(s.length() > 0) { + if(!s.isEmpty()) { if(out.length() > 0) out.append('-'); out.append(s); diff --git a/src/freenet/l10n/BaseL10n.java b/src/freenet/l10n/BaseL10n.java index ad1ef701ed4..2254eb850d4 100644 --- a/src/freenet/l10n/BaseL10n.java +++ b/src/freenet/l10n/BaseL10n.java @@ -133,12 +133,12 @@ public static LANGUAGE mapToLanguage(String whatever) { public static String[] valuesWithFullNames() { LANGUAGE[] allValues = values(); ArrayList result = new ArrayList(allValues.length); - for (int i = 0; i < allValues.length; i++) { + for (LANGUAGE allValue : allValues) { // We will return the full names sorted alphabetically. To ensure that the user // notices the special "UNLISTED" language code, we add it to the end of the list // after sorting, so now we skip it. - if(allValues[i] != UNLISTED) - result.add(allValues[i].fullName); + if (allValue != UNLISTED) + result.add(allValue.fullName); } Collections.sort(result); @@ -774,7 +774,7 @@ private void addHTMLSubstitutions(HTMLNode node, String value, int x; while(!value.isEmpty() && (x = value.indexOf("${")) != -1) { String before = value.substring(0, x); - if(before.length() > 0) + if(!before.isEmpty()) node.addChild("#", before); value = value.substring(x); int y = value.indexOf('}'); diff --git a/src/freenet/l10n/ISO639_3.java b/src/freenet/l10n/ISO639_3.java index 597eac09a3e..815a9fa703a 100644 --- a/src/freenet/l10n/ISO639_3.java +++ b/src/freenet/l10n/ISO639_3.java @@ -216,7 +216,7 @@ private static Hashtable loadFromTabFile() { for(String line = br.readLine(); line != null; line = br.readLine()) { line = line.trim(); - if(line.length() == 0) + if(line.isEmpty()) continue; final String[] tokens = line.split("[\t]"); diff --git a/src/freenet/l10n/freenet.l10n.en.properties b/src/freenet/l10n/freenet.l10n.en.properties index 4f48b36fbb9..9d2e547240a 100644 --- a/src/freenet/l10n/freenet.l10n.en.properties +++ b/src/freenet/l10n/freenet.l10n.en.properties @@ -281,6 +281,7 @@ ContentFilter.imageGifReadAdvice=GIF image - probably not dangerous ContentFilter.imageIcoReadAdvice=Icon file - probably not dangerous ContentFilter.imageJpegReadAdvice=JPEG image - probably not dangerous ContentFilter.imagePngReadAdvice=PNG image - probably not dangerous +ContentFilter.imageWebPReadAdvice=WebP image - probably not dangerous, unless you are using old browsers with known vulnerability ContentFilter.textCssReadAdvice=CSS (cascading style sheet, usually used with HTML) - probably not dangerous if filtered, but the filter is not a whitelist filter so take care ContentFilter.textHtmlReadAdvice=HTML - not dangerous if filtered ContentFilter.textPlainReadAdvice=Plain text - should not be dangerous unless you are running certain browsers (e.g. Internet Explorer) @@ -1621,6 +1622,10 @@ PproxyToadlet.unloadPluginTitle=Unload plugin? PproxyToadlet.unloadPluginWithName=Are you sure you wish to unload ${name}? PproxyToadlet.unloadPurge=Remove plugin from cache PproxyToadlet.versionTitle=Version +RIFFFilter.invalidTitle=Invalid RIFF file +RIFFFilter.data2GB=Data size is bigger than 2 GiB +RIFFFilter.dataTooBig=Chunk data size exceeds file size limit +RIFFFilter.invalidStream=The RIFF stream was found to be malformed, and was unable to sanitized. SaltedHashFreenetStore.shortResizeProgress=Datastore(${name}) resize in progress: ${processed}/${total} SaltedHashFreenetStore.shortRebuildProgressNew=Datastore(${name}) maintenance in progress: ${processed}/${total} (converting to new format) SaltedHashFreenetStore.shortRebuildProgress=Datastore(${name}) maintenance in progress: ${processed}/${total} (after an unclean shutdown) @@ -1940,7 +1945,7 @@ SimpleToadletServer.enableActivelinksLong=Should the Browse Freenet page show ic SimpleToadletServer.enableCachingForChkAndSskKeys=Allow caching for CHK and SSK keys (read warning) SimpleToadletServer.enableCachingForChkAndSskKeysLong=Allow the browser to cache CHK and SSK keys. WARNING: This will leave traces of all those keys in your browser’s cache so do not enable this if you are worried about your computer being seized! SimpleToadletServer.enableJS=Enable web interface use of JavaScript? -SimpleToadletServer.enableJSLong=Whether or not the web interface should use JavaScript "helpers". This setting should be turned to false in most cases. Note that freesites may not use JavaScript even if this is enabled. +SimpleToadletServer.enableJSLong=Whether or not the web interface should use JavaScript "helpers". Note that freesites may not use JavaScript even if this is enabled. SimpleToadletServer.enableWP=Enable web interface use of web pushing (experimental)? SimpleToadletServer.enableWPLong=Whether or not the web interface should use JavaScript web pushing to update displayed data without reloading. It requires that JavaScript is turned on. It is experimental and use at your own risk. SimpleToadletServer.enabled=Enable the web interface (FProxy)? @@ -2243,6 +2248,13 @@ UserAlertsToadlet.title=Status messages UserAlertsToadlet.noMessages=No messages VorbisBitstreamFilter.MalformedTitle=Malformed Vorbis Bitstream VorbisBitstreamFilter.MalformedMessage=The Vorbis bitstream is not correctly formatted, and could not be properly validated. +WebPFilter.animUnsupportedTitle=WebP animation is currently not supported +WebPFilter.animUnsupported=WebP animation is currently not supported by the filter, because it could contain frames using the lossless encoding. WebP lossless format has known buffer overflow exploit. When viewed on unpatched browsers and applications, it can damage the security of the system. Therefore, the content filter cannot ensure the safety of this animation. +WebPFilter.alphUnsupportedTitle=WebP alpha channel with lossless compression is currently not supported +WebPFilter.alphUnsupported=This image contains an alpha channel encoded with WebP lossless compression encoding. WebP lossless format has known buffer overflow exploit. When viewed on unpatched browsers and applications, it can damage the security of the system. Therefore, the content filter cannot ensure the safety of this image. +WebPFilter.invalidTitle=Invalid WebP file +WebPFilter.losslessUnsupportedTitle=WebP lossless format is currently not supported +WebPFilter.losslessUnsupported=WebP lossless format has known buffer overflow exploit. When viewed from unpatched browsers and applications, it can damage the security of the system. Therefore, the content filter cannot ensure the safety of this image. WelcomeToadlet.activityTitle=Current Activity WelcomeToadlet.arkFetchCount=ARK Fetchers: ${total} WelcomeToadlet.alertsSummary=Status messages summary (click for details or to change something) diff --git a/src/freenet/l10n/freenet.l10n.ja.properties b/src/freenet/l10n/freenet.l10n.ja.properties index 9f805522dc9..eb63ff95495 100644 --- a/src/freenet/l10n/freenet.l10n.ja.properties +++ b/src/freenet/l10n/freenet.l10n.ja.properties @@ -1,69 +1,73 @@ -Announcer.announceAlertIntro=Freenetに接続しています。接続には数分程度かかります。 +testing.test=test$(test1)test$(test2)test +Announcer.announceAlertIntro=Freenet に接続しています。接続には数分程度かかります。パフォーマンスは今後数時間で徐々に改善していきます。これは Freenet を数分以上停止するたびに発生しますので、可能なら 24 時間 Freenet を稼働させ続けて下さい。 Announcer.announceAlertTitle=ノードをアナウンス中 -Announcer.announceDetails=最近 ${recentSentAnnouncements} アナウンスを送信しました。 ${runningAnnouncements} ノードが稼働中で、${addedNodes} ノードを追加しました (${refusedNodes} ノードは拒絶しました)。 現在我々は ${connectedSeednodes} シードノードと接続しており、他の${disconnectedSeednodes}と接続を試みています。 -Announcer.announceAlertNoSeednodes=seednodes.fref ファイルがありません。したがってあなたのFreenetノードは自動でオープンネットを起動できません。いくつかのノードを手動で追加するか、シードノード・ファイルをhttp://downloads.freenetproject.org/alpha/opennet/からダウンロードしてください。 -Announcer.announceLoading=Freenetは、現在シードノード・ファイルをロードしています。シードノード・ファイルはネットワークの残りにアナウンスすることができます。アナウンスは数分を要します。 -Announcer.announceDisabledTooOldTitle=アナウンスは無効 (too old) -Announcer.announceDisabledTooOldUpdateDisabled=Freenetを自動更新させるには、${config}設定ページ${/config}で自動更新を有効にしてください。 -Announcer.announceDisabledTooOldShort=あなたのFreenetノードはネットワークに接続しようとしましたが、あなたのFreenetはデータの取り扱いには古すぎるバージョンです。更新をお願いします。 -Announcer.announceAlertShort=Freenetはネットワークに接続を試みています。しばらく動作は遅くなるでしょう。 -Announcer.coolingOff=ノード一覧を受信中です。${time}秒以内に十分な量のノード一覧を取得できなかった場合、別のノードからノード一覧の取得を試みます。 -Announcer.dontKnowAddress=Freenetは未だ我々のIPアドレスを特定できません。それが判明するまでアナウンスはできません。 -BMPFilter.InvalidBitDepthD=ビット深度フィールドが1、2、4、8、16または32に設定されていません。 +Announcer.announceDetails=最近 ${recentSentAnnouncements} アナウンスを送信しました。${runningAnnouncements} ノードが稼働中で、${addedNodes} ノードを追加しました (${refusedNodes} ノードから拒絶されました)。現在我々は ${connectedSeednodes} シードノードと接続しており、他の ${disconnectedSeednodes} と接続を試みています。 +Announcer.announceAlertNoSeednodes=seednodes.fref ファイルがありません。したがってあなたの Freenet ノードは自動でオープンネットを起動できません。いくつかのノードを手動で追加するか、シードノード・ファイルを http://downloads.freenetproject.org/alpha/opennet/ からダウンロードしてください。 +Announcer.announceLoading=Freenet は、現在ネットワーク全体へのアナウンスを試みるためにシードノード・ファイルを読み込んでいます。アナウンスには数分を要します。 +Announcer.announceDisabledTooOldTitle=アナウンスは無効 (古すぎます) +Announcer.announceDisabledTooOld=このノードは、現在の Freenet ネットワークに接続するには古すぎます。あなたのノードはより新しいバージョンの Freenet をピアからダウンロードして、その後更新のために再起動します。これにはいくらかの時間が必要です。このメッセージは更新の終了後に表示されなくなります。意味がないのでアナウンスは無効になりました。 +Announcer.announceDisabledTooOldUpdateDisabled=Freenet を自動で更新するには、${config}設定ページ${/config}で自動更新を有効にしてください。 +Announcer.announceDisabledTooOldShort=あなたの Freenet ノードはネットワークに接続しようとしましたが、あなたの Freenet はデータの取り扱いには古すぎるバージョンです。更新をお願いします。 +Announcer.announceAlertShort=Freenet はネットワークに接続を試みています。しばらく動作は遅くなるでしょう。 +Announcer.coolingOff=${time} 秒間、あなたの Freenet ノードは接続可能とアナウンスされたノードとの接続を待機します。十分な数のノードが集まらなかった場合は別のノードへの接続を試みます。 +Announcer.dontKnowAddress=Freenet は未だ我々の IP アドレスを把握できていません。それが判明するまでアナウンスはできません。 +BMPFilter.InvalidBitDepthD=ビット深度のフィールドが 1, 2, 4, 8, 16 または 32 に設定されていません。 BMPFilter.InvalidBitDepthT=無効なビット深度 -BMPFilter.InvalidBitMapInfoHeaderSizeD=Bitmap情報ヘッダのサイズが40ではありません -BMPFilter.InvalidBitMapInfoHeaderSizeT=無効なBitmap情報ヘッダサイズ +BMPFilter.InvalidBitMapInfoHeaderSizeD=ビットマップ情報ヘッダサイズが 40 ではありません +BMPFilter.InvalidBitMapInfoHeaderSizeT=無効なビットマップ情報ヘッダサイズ BMPFilter.InvalidDimensionD=画像が負の幅または高さ BMPFilter.InvalidDimensionT=無効な大きさ -BMPFilter.InvalidFileSizeD=イメージファイルサイズがヘッダーサイズ+イメージデータサイズと一致していません -BMPFilter.InvalidFileSizeT=無効なイメージファイルサイズ +BMPFilter.InvalidFileSizeD=画像ファイルサイズがヘッダーサイズ+画像データサイズと一致していません +BMPFilter.InvalidFileSizeT=無効な画像ファイルサイズ BMPFilter.InvalidImageDataSizeD=算出した画像データのサイズが実際のサイズと合致しません -BMPFilter.InvalidImageDataSizeT=無効なイメージデータサイズ +BMPFilter.InvalidImageDataSizeT=無効な画像データサイズ +BMPFilter.InvalidNoOfPlanesD=面の数が 1 つではありません。 +BMPFilter.InvalidNoOfPlanesT=無効な面の数 BMPFilter.InvalidOffsetD=データオフセットが負の値です BMPFilter.InvalidOffsetT=無効なオフセット BMPFilter.InvalidResolutionD=画像が負の解像度 BMPFilter.InvalidResolutionT= 無効な解像度 -BMPFilter.InvalidStartWordD=開始文字がBM, BA, CI, CP, IC, PTのいずれでもありません +BMPFilter.InvalidStartWordD=開始文字が BM, BA, CI, CP, IC, PT のいずれでもありません BMPFilter.InvalidStartWordT=無効な開始文字 -BMPFilter.notBMP=BMPをフィルタ出来ませんでした: +BMPFilter.notBMP=BMP をフィルターできませんでした: Bookmark.noName=名前無し BookmarkEditorToadlet.addBookmark=ブックマークに追加 -BookmarkEditorToadlet.addCategory=カテゴリを追加 +BookmarkEditorToadlet.addCategory=カテゴリーを追加 BookmarkEditorToadlet.addNewBookmark=ブックマークを新たに追加 -BookmarkEditorToadlet.addNewCategory=新たなカテゴリを追加 -BookmarkEditorToadlet.addedNewBookmark=ブックマークを新しく追加できました。 +BookmarkEditorToadlet.addNewCategory=カテゴリーを新たに追加 +BookmarkEditorToadlet.addedNewBookmark=ブックマークの追加に成功しました。 BookmarkEditorToadlet.addedNewBookmarkTitle=新たにブックマークが追加されました -BookmarkEditorToadlet.bookmarkDoesNotExist=ブックマーク"${bookmark}" は存在しません。 -BookmarkEditorToadlet.cancelCut=切断をキャンセル -BookmarkEditorToadlet.changesSaved=変更を保存できました。 +BookmarkEditorToadlet.bookmarkDoesNotExist=ブックマーク "${bookmark}" は存在しません。 +BookmarkEditorToadlet.cancelCut=切り取りをキャンセル +BookmarkEditorToadlet.changesSaved=変更の保存に成功しました。 BookmarkEditorToadlet.changesSavedTitle=変更は保存されました BookmarkEditorToadlet.confirmDelete=削除 -BookmarkEditorToadlet.addDefaultBookmarks=ブックマークセットを再追加 +BookmarkEditorToadlet.addDefaultBookmarks=既定のブックマークを再度追加 BookmarkEditorToadlet.cut=切り取り BookmarkEditorToadlet.delete=削除 BookmarkEditorToadlet.deleteBookmark=ブックマークを削除 -BookmarkEditorToadlet.deleteBookmarkConfirm=${bookmark}を本当に削除してもよろしいですか? -BookmarkEditorToadlet.deleteCategory=カテゴリを削除 -BookmarkEditorToadlet.deleteCategoryConfirm=${bookmark}以下のブックマークを削除してもよろしいですか? -BookmarkEditorToadlet.deleteSucceeded=ブックマークを削除できました。 +BookmarkEditorToadlet.deleteBookmarkConfirm=${bookmark} を削除しても本当によろしいですか? +BookmarkEditorToadlet.deleteCategory=カテゴリーを削除 +BookmarkEditorToadlet.deleteCategoryConfirm=${bookmark} とその配下のブックマークを削除してもよろしいですか? +BookmarkEditorToadlet.deleteSucceeded=ブックマークの削除に成功しました。 BookmarkEditorToadlet.deleteSucceededTitle=削除成功 BookmarkEditorToadlet.descLabel=ブックマークの詳細な説明 BookmarkEditorToadlet.edit=編集 BookmarkEditorToadlet.editBookmarkTitle=ブックマークを編集 -BookmarkEditorToadlet.editCategoryTitle=カテゴリを編集 +BookmarkEditorToadlet.editCategoryTitle=カテゴリーを編集 BookmarkEditorToadlet.error=エラー BookmarkEditorToadlet.explainLabel=短い説明 -BookmarkEditorToadlet.hasAnActivelinkLabel=freesiteにアクティブリンクはありますか? +BookmarkEditorToadlet.hasAnActivelinkLabel=freesite にアクティブリンクはありますか? BookmarkEditorToadlet.invalidKeyTitle=無効なキー -BookmarkEditorToadlet.invalidKeyWithReason=無効なFreenetキーです。 -BookmarkEditorToadlet.invalidKey=Freenetキーが無効です。 +BookmarkEditorToadlet.invalidKeyWithReason=無効な Freenet キーです。 +BookmarkEditorToadlet.invalidKey=Freenet キーが無効です。 BookmarkEditorToadlet.invalidNameTitle=無効な名前 BookmarkEditorToadlet.invalidName=その名前はブックマークに使うことができません。 BookmarkEditorToadlet.keyLabel=キー: BookmarkEditorToadlet.moveDown=下へ BookmarkEditorToadlet.moveUp=上へ BookmarkEditorToadlet.myBookmarksTitle=マイブックマーク -BookmarkEditorToadlet.myBookmarksExplanation=FreenetにホストされたWebサイトへのリンク、更新されると通知されます。 +BookmarkEditorToadlet.myBookmarksExplanation=Freenet にホストされた Web サイトへのリンク、サイトが更新されると通知されます。 BookmarkEditorToadlet.nameLabel=名前: BookmarkEditorToadlet.paste=貼り付け BookmarkEditorToadlet.pasteOrCancel=貼り付けアイコンをクリックするかキャンセルしてください。 @@ -72,100 +76,125 @@ BookmarkEditorToadlet.publicDescLabel=フレンドへの説明: BookmarkEditorToadlet.recommendToFriends=フレンドに勧める BookmarkEditorToadlet.save=保存 BookmarkEditorToadlet.share=共有 -BookmarkEditorToadlet.title=ブックマークエディタ -BookmarkEditorToadlet.urlDecodeError=URLデコードエラー +BookmarkEditorToadlet.title=ブックマークエディター +BookmarkEditorToadlet.urlDecodeError=URL デコードエラー BookmarkFeedUserAlert.addAsABookmark=ブックマークとして追加 +BookmarkFeedUserAlert.bookmarkURI=URI: BookmarkFeedUserAlert.bookmarkDescription=説明: BookmarkFeedUserAlert.delete=削除 BookmarkFeedUserAlert.peerName=名前: -BookmarkFeedUserAlert.title=${from} があなたにfreesiteを薦めています -BookmarkItem.bookmarkUpdated=ブックマークされたサイト ${name} が edition ${edition} にアップデートされました。 -BookmarkItem.bookmarkUpdatedTitle=ブックマークされたサイト ${name} が更新されました -BookmarkItem.bookmarkUpdatedWithLink=ブックマークされたサイト ${link}${name}${/link} が edition ${edition} にアップデートされました。 -BookmarkItem.bookmarkUpdatedShort=ブックマークされた freesite ${name} が更新されました +BookmarkFeedUserAlert.title=${from} があなたに freesite を薦めています +BookmarkItem.bookmarkUpdated=ブックマークされたサイト ${name} がエディション ${edition} に更新されました。 +BookmarkItem.bookmarkUpdatedTitle=ブックマークの更新: ${name} +BookmarkItem.bookmarkUpdatedWithLink=ブックマークされたサイト ${link}${name}${/link} がエディション ${edition} に更新されました。 +BookmarkItem.bookmarkUpdatedShort=ブックマークされた freesite の更新: ${name} BookmarkItem.deleteBookmarkUpdateNotification=通知の削除 BookmarkItem.unnamedBookmark=無名のブックマーク BookmarkManager.defaultBookmarks=既定のブックマーク BookmarkManager.list=ブックマークのリスト -BookmarkManager.listLong=ブックマークされたfreesiteのリスト +BookmarkManager.listLong=ブックマークされた freesite のリスト BookmarkManager.malformedBookmark=不正なブックマーク -Bookmarks.Defaults.Name.categoryIndexes=Freenet上のWebサイトのディレクトリ -Bookmarks.Defaults.Name.categorySoftware=Freenet関連のソフトウェア -Bookmarks.Defaults.Name.categoryBlogs=Freenetチームのブログ -Bookmarks.Defaults.Description.TUFI=カテゴリメニュー付きの1ページのインデックス -Bookmarks.Defaults.Description.AFK=カテゴリ分けされたfreenetサイトの目録 (古くなっているのでEnzoをご利用ください) -Bookmarks.Defaults.Description.Enzo=An index of Freenet sites with categories -Bookmarks.Defaults.Description.Gantros=An index of Freenet sites with categories -Bookmarks.Defaults.Description.Linkageddon=定期更新される大きな索引で、まさにあらゆるものへのリンクがあります。中には非常に不快なサイトもあります。サイトによっては正確な説明文が無いものもあります。ご注意ください。 -Bookmarks.Defaults.Description.TheFilteredIndex=An index without pornographic or shocking sites, maintained by NoXe -Bookmarks.Defaults.Description.Nerdageddon=An index which reuses the listings from other indexes and removes the most offensive content, as well as dropping a few sites the author considers boring -Bookmarks.Defaults.Description.ISF=説明付きの小さなフランス語インデックス -Bookmarks.Defaults.Description.FMS=スパム耐性のあるFreenet用掲示板システムFMSのオフィシャルFreesite -Bookmarks.Defaults.Description.Freemail=Freemailの公式サイト - Freenet経由のemail -Bookmarks.Defaults.Description.Publish=FreenetにWebサイトをパブリッシュするためのシンプルなガイド -Bookmarks.Defaults.Description.FreesiteHOWTO=Freesiteのパブリッシングのより詳細な解説 -Bookmarks.Defaults.Description.Sone=Freenet経由の高速匿名ソーシャルチャット -Bookmarks.Defaults.Description.freenetdocwiki=FreenetについてのWiki (編集にいくつかツールが必要です) +Bookmarks.Defaults.Name.categoryIndexes=Freenet 上の Web サイトのディレクトリー +Bookmarks.Defaults.Name.categoryStarting=開始地点 +Bookmarks.Defaults.Name.categoryDocumentation=Freenet 関連の文書 +Bookmarks.Defaults.Name.categorySoftware=Freenet 関連のソフトウェア +Bookmarks.Defaults.Name.categoryBlogs=Freenet チームのブログ +Bookmarks.Defaults.Description.sharesitedocumentation=第三者による Sharesite のスタイルガイドと使用方法に関する総合的な解説 +Bookmarks.Defaults.Description.CleanSpider=更新順に並べられた Freenet の Web サイトへのリンクとその統計の一覧 +Bookmarks.Defaults.Description.JFnikiIndex=共同で編集されたカテゴリーごとのサイトとリンク集の一覧。JFniki 分散 wiki プラグインを使用 +Bookmarks.Defaults.Description.FFS=Freenet でできること (エントリーページ) +Bookmarks.Defaults.Description.FMS=スパム耐性のある Freenet 用掲示板システム FMS の公式 freesite +Bookmarks.Defaults.Description.Fniki=古い Freenet ベースの wiki +Bookmarks.Defaults.Description.Freemail=Freemail の公式サイト - Freenet 経由の電子メール +Bookmarks.Defaults.Description.unofficialfmsguide=Freenet Message System のチュートリアルと解説 +Bookmarks.Defaults.Description.statistics=ArneBab によってメンテナンスされている pyProbes プロジェクトによってプライバシーを保護したまま収集された、匿名化された使用統計 +Bookmarks.Defaults.Description.fetchpull=Freenet のレイテンシーとデータの寿命に関する統計 +Bookmarks.Defaults.Description.PrivacyAndSoftware=Freenet 使用時にあなたのプライバシーを守るためのテクニック +Bookmarks.Defaults.Description.freenetprojectorg=Freenet 公式サイトのニュースと文書のミラー +Bookmarks.Defaults.Description.Shoeshop=Freenet 経由で Sneakernet を提供するためのプラグイン: サイトとキーを fblob としてダウンロード・アップロード +Bookmarks.Defaults.Description.FLIP=Freenet 経由で IRC を提供するための外部プログラム +Bookmarks.Defaults.Description.InfocalypsePyFreenet=ソースコード管理のためのツールと Freenet を Python から制御するためのライブラリー +Bookmarks.Defaults.Description.Publish=Freenet に Web サイトを公開するためのシンプルなガイド +Bookmarks.Defaults.Description.FreesiteHOWTO=freesite の公開に関するより詳細な解説 +Bookmarks.Defaults.Description.Sone=Freenet 経由の高速匿名ソーシャルチャット +Bookmarks.Defaults.Description.freenetdocwiki=Freenet についての wiki (編集にいくつかツールが必要です) Bookmarks.Defaults.Description.FSNG=ソーシャルネットワーキングツールを使うための図解付きガイド -Bookmarks.Defaults.Description.jSite=Freesite(FreenetのWebサイト)を更新するためのツール -Bookmarks.Defaults.Description.Flog.Toad=Toadのflog -Bookmarks.Defaults.Description.Flog.Bombe=Bombeのflog -Bookmarks.Defaults.Description.Flog.Xor=FreetalkとWeb Of Trustの基幹開発者のflog -Bookmarks.Defaults.Description.Flog.Operhiem1=Flog of the Freenet release manager -Bookmarks.Defaults.Description.Flog.ArneBab=ArneBab's notes -Bookmarks.Defaults.ShortDescription.Linkageddon=FreenetのWebサイトの全てを網羅し、最後の更新日でソートされているが、不快なサイトも含まれているため注意してクリックしてください! -Bookmarks.Defaults.ShortDescription.TheFilteredIndex=An index without pornographic or shocking sites -Bookmarks.Defaults.ShortDescription.Nerdageddon=An index with the most offensive content removed -Bookmarks.Defaults.ShortDescription.AFK=FreenetのWebサイトの多くを網羅し、カテゴリでソートされており、あなたが欲しいものを簡単に見つけることが出来ます。(古い、Enzoを使用) -Bookmarks.Defaults.ShortDescription.Enzo=FreenetのWebサイトの多くを網羅し、カテゴリでソートされており、あなたが欲しいものを簡単に見つけることが出来ます -Bookmarks.Defaults.ShortDescription.Gantros=FreenetのWebサイトの多くを網羅し、カテゴリでソートされており、あなたが欲しいものを簡単に見つけることが出来ます -Bookmarks.Defaults.ShortDescription.TUFI=古いFreenetのサイト -Bookmarks.Defaults.ShortDescription.ISF=フランス語サイトのインデックス -Bookmarks.Defaults.ShortDescription.FMS=Freenet経由の掲示板 -Bookmarks.Defaults.ShortDescription.Freemail=Freenet経由のEメール -Bookmarks.Defaults.ShortDescription.Publish=FreenetでWebサイトをパブリッシュする方法(英語) -Bookmarks.Defaults.ShortDescription.FreesiteHOWTO=WebサイトをFreenetにパブリッシュするもう一つのガイド(英語) -Bookmarks.Defaults.ShortDescription.Sone=Freenet経由のソーシャルチャット -Bookmarks.Defaults.ShortDescription.freenetdocwiki=Freenetドキュメンテーションwiki(英語) -Bookmarks.Defaults.ShortDescription.FSNG=Freenetでの匿名の電子メール、フォーラム、チャット、ソーシャルツールをセットアップする方法をステップバイステップでガイドします。強くお勧めします! -Bookmarks.Defaults.ShortDescription.jSite=FreenetにWebサイトをアップロードするための基礎ツール -Bookmarks.Defaults.ShortDescription.Flog.Toad=チーフFreenet開発者の個人的なブログ -Bookmarks.Defaults.ShortDescription.Flog.Bombe=Sone開発者の個人的なブログ -Bookmarks.Defaults.ShortDescription.Flog.Xor=Freetalk開発者のブログ -Bookmarks.Defaults.ShortDescription.Flog.Operhiem1=Freenet release manager's blog -Bookmarks.Defaults.ShortDescription.Flog.ArneBab=Maintainer of pyFreenet and infocalypse (and stuff) +Bookmarks.Defaults.Description.jSite=freesite (Freenet の Web サイト) を更新するためのツール +Bookmarks.Defaults.Description.Sharesite=最小限の手間で簡単な freesite を公開するためのプラグイン +Bookmarks.Defaults.Description.Flog.Toad=Toad の flog +Bookmarks.Defaults.Description.Flog.Bombe=Bombe の flog +Bookmarks.Defaults.Description.Flog.Xor=Freetalk と Web Of Trust の主要開発者の flog +Bookmarks.Defaults.Description.Flog.Operhiem1=以前の Freenet リリースマネージャーの flog +Bookmarks.Defaults.Description.Flog.ArneBab=ArneBab の Sharesite +Bookmarks.Defaults.ShortDescription.JFnikiIndex=共同で編集されたリンク集の一覧 +Bookmarks.Defaults.ShortDescription.sharesitedocumentation=第三者による Sharesite に関する文書 +Bookmarks.Defaults.ShortDescription.CleanSpider=厳密なフィルタリングが施され、自動化されたリンク集 +Bookmarks.Defaults.ShortDescription.FFS=Freenet を始める +Bookmarks.Defaults.ShortDescription.FMS=Freenet 経由の掲示板 +Bookmarks.Defaults.ShortDescription.Fniki=Freenet に関する古い wiki +Bookmarks.Defaults.ShortDescription.Freemail=Freenet 経由の電子メール +Bookmarks.Defaults.ShortDescription.unofficialfmsguide=FMS (Freenet 経由の掲示板) の非公式ガイド +Bookmarks.Defaults.ShortDescription.statistics=Freenet の使用に関する統計 +Bookmarks.Defaults.ShortDescription.fetchpull=Freenet のパフォーマンスに関する統計 +Bookmarks.Defaults.ShortDescription.PrivacyAndSoftware=Freenet ユーザーのためのベストプラクティス +Bookmarks.Defaults.ShortDescription.freenetprojectorg=Freenet プロジェクトの公式サイト +Bookmarks.Defaults.ShortDescription.Shoeshop=Sneakernet +Bookmarks.Defaults.ShortDescription.FLIP=IRC チャット +Bookmarks.Defaults.ShortDescription.InfocalypsePyFreenet=DVCS と Python ライブラリー +Bookmarks.Defaults.ShortDescription.Publish=Freenet で Web サイトを公開する方法 +Bookmarks.Defaults.ShortDescription.FreesiteHOWTO=Web サイトを Freenet に公開するもう一つのガイド +Bookmarks.Defaults.ShortDescription.Sone=Freenet 経由のソーシャルチャット +Bookmarks.Defaults.ShortDescription.freenetdocwiki=Freenet ドキュメンテーション wiki +Bookmarks.Defaults.ShortDescription.FSNG=Freenet での匿名の電子メール、掲示板、チャット、ソーシャルツールをセットアップする方法をステップバイステップでガイドします。強くお勧めします! +Bookmarks.Defaults.ShortDescription.jSite=Freenet に Web サイトをアップロードするための基礎ツール +Bookmarks.Defaults.ShortDescription.Sharesite=サイトのリストを管理するプラグイン。あなたはサイトのタイトルと本文を準備してインサートボタンを押すだけでいいのです。残りはプラグインがやってくれます。 +Bookmarks.Defaults.ShortDescription.Flog.Toad=以前のチーフ Freenet 開発者の個人的なブログ +Bookmarks.Defaults.ShortDescription.Flog.Bombe=Sone 開発者の個人的なブログ +Bookmarks.Defaults.ShortDescription.Flog.Xor=Freetalk と Web of Trust の開発者のブログ +Bookmarks.Defaults.ShortDescription.Flog.Operhiem1=以前の Freenet リリースマネージャーのブログ +Bookmarks.Defaults.ShortDescription.Flog.ArneBab=現在の Freenet リリースマネージャー BooleanOption.parseError=認識できないブーリアン: ${val} - true か false のどちらかを選んでください -ChatForumsToadlet.title=Freenet上の他の人々と会話 -CSSTokenizerFilter.deletedDisallowedString=削除された禁止文字列 -CSSTokenizerFilter.deletedUnofficialIdent=削除された非公式のident -CSSTokenizerFilter.invalidURLContents=無効なURLのコンテンツ() -CSSTokenizerFilter.unknownAtIdentifierLabel=不明 @識別子: +ChatForumsToadlet.title=Freenet 上の他の人々と会話 +ChatForumsToadlet.frost=${frost-freenet}Frost${/frost-freenet} (${frost-web}Web リンク${/frost-web}) - \n独自の Freenet 掲示板クライアント。深刻なスパムとサービス拒否の問題があるのでこれ以外のものの使用を強く推奨します。FMS と同様にこれは Freenet の一部ではないため、追加でインストールして実行する必要があります。 +ChatForumsToadlet.fms=${fms}FMS${/fms} - Freenet Message System は活発にメンテナンスされ、大きめのコミュニティーを持つ掲示板クライアントです。これは Freenet の一部ではないため、追加でインストールして実行する必要があります。 +ChatForumsToadlet.fsng=${fsng}Freenet ソーシャルネットワーキングガイド${/fsng} - この非公式ガイドはこれらや他の Freenet 経由でのコミュニケーションツールを準備するうえでとても有用かもしれません。 +ChatForumsToadlet.sone=${sone}Sone${/sone} - 個人とフォロワーを中心とした話し合いのシステム。これは Freenet のプラグインです。WebOfTrust プラグインが必要です。 +ChatForumsToadlet.content2=Freenet チームは FMS や Sone を作成したり内容を確認したりしていないので、その品質について保証することはできません。Freenet を閲覧することで発見できる数多くのプラグインやアプリケーション (wiki など) があります。 +CSSTokenizerFilter.deletedDisallowedString=削除された禁止 string +CSSTokenizerFilter.deletedUnmatchedChar=無視された合致しない char: +CSSTokenizerFilter.deletedUnofficialIdent=削除された非公式の ident +CSSTokenizerFilter.deletedUnofficialIdentWithURL=削除された非公式の url 付き ident +CSSTokenizerFilter.invalidURLContents=無効な url() の内容 +CSSTokenizerFilter.supplementalCharsNotSupported=0xFFFF を越えた UCS-4 の文字はサポートされていません! +CSSTokenizerFilter.unknownAtIdentifierLabel=不明な @identifier: ConfigToadlet.appliedFailureExceptions=あなたの設定はこれらを除いて適用されました: ConfigToadlet.appliedFailureTitle=設定は適用されませんでした -ConfigToadlet.appliedSuccess=正常に設定されました。 +ConfigToadlet.appliedSuccess=正常に設定が適用されました。 ConfigToadlet.appliedTitle=設定が適用されました ConfigToadlet.apply=適用 -ConfigToadlet.confirmReset=本当にこのページの全設定をそれぞれの既定値にリセットしますか? -ConfigToadlet.confirmResetTitle=既定値にリセットしますか? +ConfigToadlet.confirmReset=本当にこのページの全設定をそれぞれの既定値にリセットしますか? +ConfigToadlet.confirmResetTitle=既定値にリセットしますか? ConfigToadlet.console=端末インターフェース -ConfigToadlet.defaultIs=デフォルト: '${default}' -ConfigToadlet.fproxy=Webインターフェース -ConfigToadlet.fullTitle=Freenetノード設定 +ConfigToadlet.defaultIs=規定値: '${default}' +ConfigToadlet.false=false +ConfigToadlet.fcp=FCP +ConfigToadlet.fproxy=Web インターフェース +ConfigToadlet.fullTitle=Freenet ノード設定 ConfigToadlet.logger=ログ ConfigToadlet.needRestartTitle=ノードの再起動が必要です -ConfigToadlet.needRestart=いくつかの設定を有効にするためには再起動が必要です。すぐにFreenetを再起動してください。 -ConfigToadlet.needRestartShort=いくつかの設定を有効にするためには再起動が必要です。すぐにFreenetを再起動してください。 +ConfigToadlet.needRestart=いくつかの設定を有効にするためには再起動が必要です。すぐに Freenet を再起動してください。 +ConfigToadlet.needRestartShort=いくつかの設定を有効にするためには再起動が必要です。すぐに Freenet を再起動してください。 ConfigToadlet.restartNode=今すぐ再起動 ConfigToadlet.selectDirectory=ディレクトリを選択 -PageMaker.modeSimple=シンプルインターフェース -PageMaker.modeSimpleTooltip=シンプルなインターフェイスはすべてのユーザーが使用できます +PageMaker.modeSimple=シンプルなインターフェース +PageMaker.modeSimpleTooltip=シンプルなインターフェースはすべてのユーザーが使用できます PageMaker.modeAdvanced=高度なインターフェース -PageMaker.modeAdvancedTooltip=高度なインターフェースはFreenetユーザーや開発者を経験したユーザーが使用できます +PageMaker.modeAdvancedTooltip=高度なインターフェースは経験豊かな Freenet ユーザーや開発者のみに必要なものです ConfigToadlet.node=重要な設定 ConfigToadlet.node.install=インストール設定 ConfigToadlet.node.load=負荷管理 ConfigToadlet.node.opennet=オープンネット -ConfigToadlet.node.scheduler=リクエスト計画 +ConfigToadlet.node.scheduler=リクエストのスケジューリング ConfigToadlet.node.testnet=テストネットモード ConfigToadlet.node.updater=自動更新 ConfigToadlet.pluginmanager=プラグイン @@ -174,431 +203,677 @@ ConfigToadlet.resetToDefaults=既定値に戻す ConfigToadlet.returnToNodeConfig=設定ページに戻る ConfigToadlet.shortTitle=設定 ConfigToadlet.ssl=SSL (要再起動) -ConfigToadlet.title=Freenetノード設定 -ConfigToadlet.title.node=帯域幅などのコア設定 -ConfigToadlet.title.node.install=インストール設定 - 読取専用プログラムのディレクトリの場所など -ConfigToadlet.title.node.load=あなたのFreenetノードを通るトラフィックの量の調整に関する設定 +ConfigToadlet.title=Freenet ノード設定 +ConfigToadlet.title.node=帯域幅などの重要な設定 +ConfigToadlet.title.node.install=読み取り専用のプログラムディレクトリーの場所などのインストール設定 +ConfigToadlet.title.node.load=あなたの Freenet ノードを通るトラフィックの量の調整に関する設定 ConfigToadlet.title.node.opennet=フレンドではないノードとの接続に関連した設定 ConfigToadlet.title.node.scheduler=動作させるローカルリクエストの選択に関連した設定 ConfigToadlet.title.node.updater=自動更新システムの設定 -ConfigToadlet.title.ssl=SSLを設定 -ConfigToadlet.title.fcp=Freenetクライアントプロトコルを設定(クライアントアプリケーションがFreenetと対話するのに使用されます) -ConfigToadlet.title.fproxy=Webインターフェースの設定 -ConfigToadlet.title.logger=トラブルシューティング目的でFreenetが保持する情報の量を設定 -ConfigToadlet.title.console=端末インターフェースを設定 -ConfigToadlet.title.toadletsymlinker=Webインターフェースのエイリアスを設定 -ConfigToadlet.toadletsymlinker=Webインターフェースのエイリアス +ConfigToadlet.title.ssl=SSL の設定 +ConfigToadlet.title.fcp=Freenet クライアントプロトコルの設定 (クライアントアプリケーションが Freenet と対話するのに使用されます) +ConfigToadlet.title.fproxy=Web インターフェースの設定 +ConfigToadlet.title.logger=トラブルシューティング目的で Freenet が保持する情報の量の設定 +ConfigToadlet.title.console=端末インターフェースの設定 +ConfigToadlet.title.toadletsymlinker=Web インターフェースのエイリアスの設定 +ConfigToadlet.toadletsymlinker=Web インターフェースのエイリアス +ConfigToadlet.true=true ConfigToadlet.undo=保存していない変更を元に戻す -ConfigurablePersister.doesNotExistCannotCreate=ファイルが存在しないため作成出来ません -ConfigurablePersister.existsCannotReadWrite=ファイルは存在しますが読み取り/書き込みが出来ません -ConnectivityToadlet.byIPTitle=IPアドレスによる ${ip} へのパケット - ${status} (最小トンネル生存時間 ${tunnelLength}) +ConfigToadlet.wrapper=Java の設定 +ConfigurablePersister.doesNotExistCannotCreate=ファイルが存在せず作成もできません +ConfigurablePersister.existsCannotReadWrite=ファイルは存在しますが読み書きができません +ConnectivityToadlet.byIPTitle=IP アドレスごとの ${ip} へのパケット - ${status} (最小トンネル生存時間 ${tunnelLength}) ConnectivityToadlet.title=インターネット接続状況 ConnectivityToadlet.connectivity=あなたのインターネット接続の状態 (ポートフォワーディングなど) ConnectivityToadlet.connectivityTitle=インターネット接続 -ConnectivityToadlet.firstSendLeadTime=最初の送信への始動 -ConnectivityToadlet.firstReceiveLeadTime=最初の受信までのオンライン +ConnectivityToadlet.firstSendLeadTime=最初の送信を行うまで +ConnectivityToadlet.firstReceiveLeadTime=最初の受信が発生するまで ConnectivityToadlet.localRemoteTitle=ローカル/リモート ConnectivityToadlet.addressTitle=アドレス ConnectivityToadlet.sentReceivedTitle=送受信パケット +ConnectivityToadlet.byPortTitle=ポートごとの ${port} へのパケット - ${status} (最小トンネル生存時間 ${tunnelLength}) ConnectivityToadlet.local=ローカル ConnectivityToadlet.remote=リモート -ConnectivityToadlet.noreply=無返信 -ConnectivityToadlet.summaryTitle=接続 +ConnectivityToadlet.noreply=無応答 +ConnectivityToadlet.summaryTitle=接続性 ConnectivityToadlet.status.DEFINITELY_PORT_FORWARDED=ポートフォワードされています ConnectivityToadlet.status.MAYBE_PORT_FORWARDED=おそらくポートフォワードされています -ConnectivityToadlet.status.MAYBE_NATED=おそらくNATの後ろ -ConnectivityToadlet.status.DEFINITELY_NATED=NATの後ろ +ConnectivityToadlet.status.MAYBE_NATED=おそらく NAT の後ろにあります +ConnectivityToadlet.status.DEFINITELY_NATED=NAT の後ろにあります ConnectivityToadlet.status.DONT_KNOW=状況不明 -ConnectionsToadlet.nodeStatus.CONNECTED=接続 +ConnectionsToadlet.nodeStatus.CONNECTED=接続済み ConnectionsToadlet.nodeStatus.BACKED_OFF=接続撤回 ConnectionsToadlet.nodeStatus.NO_LOAD_STATS=負荷統計無し ConnectionsToadlet.nodeStatus.TOO_NEW=新しすぎ ConnectionsToadlet.nodeStatus.TOO_OLD=古すぎ -ConnectionsToadlet.nodeStatus.DISCONNECTED=接続解除 -ConnectionsToadlet.nodeStatus.NEVER_CONNECTED=接続されたことがない +ConnectionsToadlet.nodeStatus.DISCONNECTED=切断済み +ConnectionsToadlet.nodeStatus.NEVER_CONNECTED=接続したことがない ConnectionsToadlet.nodeStatus.DISABLED=無効 -ConnectionsToadlet.nodeStatus.LISTEN_ONLY=聴き取りのみ -ConnectionsToadlet.nodeStatus.LISTENING=リスニング +ConnectionsToadlet.nodeStatus.LISTEN_ONLY=受信のみ +ConnectionsToadlet.nodeStatus.LISTENING=待ち受け中 ConnectionsToadlet.nodeStatus.BURSTING=バースト中 ConnectionsToadlet.nodeStatus.CLOCK_PROBLEM=時刻に問題 ConnectionsToadlet.nodeStatus.CONNECTION_ERROR=接続エラー -ConnectionsToadlet.nodeStatus.DISCONNECTING=接続を解除中 +ConnectionsToadlet.nodeStatus.DISCONNECTING=切断中 ConnectionsToadlet.nodeStatus.UNKNOWN_STATUS=状況不明 ConnectionsToadlet.nodeStatus.BUSY=ビジー -ConnectionsToadlet.nodeStatus.ROUTING_DISABLED=ルーティングでないトラフィック -ContentDataFilter.unknownCharset=あなたが表示しようとしているページには未知の文字セットがあります。これはページをフィルタリングすることができないことを意味し、あなたの匿名性を損なう可能性があります。 -ContentDataFilter.unknownCharsetTitle=不明な文字セット +ConnectionsToadlet.nodeStatus.ROUTING_DISABLED=ルーティングされていないトラフィック +ContentDataFilter.unknownCharset=あなたが表示しようとしているページには不明な文字セットがあります。これはページをフィルタリングすることができないことを意味し、あなたの匿名性を損なう可能性があります。 +ContentDataFilter.unknownCharsetTitle=不明な文字セット! ContentDataFilter.warningUnknownCharsetTitle=警告: 不明な文字セット (${charset}) -ContentFilter.applicationPdfReadAdvice=Adobe(R) PDFドキュメント - 非常に危険! -ContentFilter.audioMP3ReadAdvice=MP3 音楽/音声ファイル - おそらく危険ではないが非暗号化のコンテンツのURLをメタデータに含む可能性あり; フィルタはそれらを消去します -ContentFilter.EOFMessage=予期しないファイルの終端(EOF) -ContentFilter.EOFDescription=フィルタはアクセスしようとしたファイルのデータを可能な量より多く要求しました。ファイルは不正であるか破損しているかもしれません。 -ContentFilter.imageBMPReadAdvice=BMP画像 - おそらく危険ではない -ContentFilter.imageGifReadAdvice=GIF画像 - おそらく危険ではない -ContentFilter.imageIcoReadAdvice=Iconファイル - おそらく危険ではない -ContentFilter.imageJpegReadAdvice=JPEG画像 - おそらく危険ではない -ContentFilter.imagePngReadAdvice=PNG画像 - おそらく危険ではない -ContentFilter.textCssReadAdvice=CSS (カスケーディングスタイルシート, たいていHTMLに使用される) - フィルタされていればおそらく危険ではないが, フィルタはホワイトリストではないので注意されたし -ContentFilter.textHtmlReadAdvice=HTML - フィルタされていれば安全 -ContentFilterToadlet.displayResultLabel=ブラウザに結果を表示 +ContentFilter.applicationPdfReadAdvice=Adobe(R) PDF 文書 - 非常に危険! +ContentFilter.audioM3UReadAdvice=MP3 音楽/音声ファイル - おそらく危険ではないが、暗号化されていない内容の URL をメタデータに含む可能性あり; フィルターはそれらを削除します +ContentFilter.audioMP3ReadAdvice=MP3 音楽/音声ファイル - おそらく危険ではないが、暗号化されていない内容の URL をメタデータに含む可能性あり; フィルターはそれらを削除します +ContentFilter.EOFMessage=予期しないファイルの終端 +ContentFilter.EOFDescription=フィルターはアクセスしようとしたファイルのデータを利用可能な量より多く要求しました。ファイルは不正であるか破損しているかもしれません。 +ContentFilter.audioFLACReadAdvice=FLAC 音声フォーマット - 危険です。Freenet 以外へのアルバムアートのリンクを含んでいるかもしれません。そのようなリンクは匿名性を侵害します。 +ContentFilter.audioFLACWriteAdvice=FLAC 音声フォーマット - おそらく危険ではありません。 +ContentFilter.containerOggReadAdvice=Ogg コンテナー - コーデックによりますがおそらく危険ではありません。ですが匿名でないサイトへのリンクを含めることができます +ContentFilter.containerOggWriteAdvice=Ogg コンテナー - コーデックによりますがおそらく危険ではありません。ですが使用したエンコーダーの名前とバージョンがしばしば含まれます +ContentFilter.imageBMPReadAdvice=BMP 画像 - おそらく危険ではありません +ContentFilter.imageGifReadAdvice=GIF 画像 - おそらく危険ではありません +ContentFilter.imageIcoReadAdvice=Icon ファイル - おそらく危険ではありません +ContentFilter.imageJpegReadAdvice=JPEG 画像 - おそらく危険ではありません +ContentFilter.imagePngReadAdvice=PNG 画像 - おそらく危険ではありません +ContentFilter.textCssReadAdvice=CSS (カスケーディングスタイルシート, たいてい HTML に使用される) - フィルターされていればおそらく危険ではありませんが、フィルターは許可リスト方式ではないので注意が必要です +ContentFilter.textHtmlReadAdvice=HTML - フィルターされていれば安全です +ContentFilter.textPlainReadAdvice=プレーンテキスト - あなたが特定のブラウザー (Internet Explorer など) を使用しているのでない限り危険ではないはずです +ContentFilterToadlet.displayResultLabel=ブラウザーに結果を表示 ContentFilterToadlet.errorBadRequest=リクエストは無効です。 -ContentFilterToadlet.errorBadRequestTitle=バッドリクエスト -ContentFilterToadlet.errorMustSpecifyFilterOperationTitle=ファイルをフィルタリングする際に適用するフィルタの種類を指定する必要があります! -ContentFilterToadlet.errorMustSpecifyResultHandling=ブラウザで結果を出力するには「ブラウザに結果を表示」を使用してください。結果を出力したファイルをダウンロードするには「ディスクに結果を保存」を使用してください。 -ContentFilterToadlet.errorMustSpecifyResultHandlingTitle=ファイルをフィルタリングするときは、結果をどうするかを指定する必要があります! +ContentFilterToadlet.errorBadRequestTitle=不良なリクエスト +ContentFilterToadlet.errorMustSpecifyFilterOperation=READ で読み込みフィルターを、WRITE で書き込みフィルターを適用できます。両方を適用するには BOTH を使用してください。 +ContentFilterToadlet.errorMustSpecifyFilterOperationTitle=ファイルをフィルタリングする際には適用するフィルターの種類を指定する必要があります! +ContentFilterToadlet.errorMustSpecifyResultHandling=ブラウザーで結果を出力するには DISPLAY を使用してください。出力したファイルをダウンロードするには SAVE を使用してください。 +ContentFilterToadlet.errorMustSpecifyResultHandlingTitle=ファイルをフィルタリングするときは、結果をどうするかを指定する必要があります! +ContentFilterToadlet.errorNoFileOrCannotRead=Freenet は次のファイルを読み込めませんでした。"${file}" +ContentFilterToadlet.errorNoFileOrCannotReadTitle=ファイルは存在しないか読み込めません +ContentFilterToadlet.errorNoFileSelected=フィルターするファイルが選択されていません。 ContentFilterToadlet.errorNoFileSelectedTitle=ファイルが選択されていません -ContentFilterToadlet.errorUnsafeContent=コンテンツフィルタは、ファイルを表示するのに安全ではないと判断しました。 +ContentFilterToadlet.errorUnsafeContent=コンテンツフィルターはファイルの表示が安全ではないと判断しました。 ContentFilterToadlet.errorUnsafeContentTitle=安全ではないコンテンツ -ContentFilterToadlet.filterFile=ファイルに対してコンテンツフィルタをテスト +ContentFilterToadlet.filterFile=ファイルに対してコンテンツフィルターをテスト ContentFilterToadlet.filterFileBrowseButton=ファイルを参照 -ContentFilterToadlet.filterFileBrowseLabel=ディスクからファイルをフィルタ -ContentFilterToadlet.filterFileFilterLabel=ファイルをフィルタ -ContentFilterToadlet.filterFileUploadLabel=またはブラウザを介してファイルをフィルタ -ContentFilterToadlet.mimeTypeLabel=このMIMEタイプのファイルとして扱う -ContentFilterToadlet.mimeTypeText=ここを空白にすると、FreenetはMIMEタイプを自動検出します。 -ContentFilterToadlet.pageTitle=コンテンツフィルタをテスト +ContentFilterToadlet.filterFileBrowseLabel=ディスクからファイルをフィルター +ContentFilterToadlet.filterFileFilterLabel=ファイルをフィルター +ContentFilterToadlet.filterFileUploadLabel=またはブラウザを介してファイルをフィルター +ContentFilterToadlet.mimeTypeLabel=この MIME タイプのファイルとして扱う +ContentFilterToadlet.mimeTypeText=ここを空欄にすると、Freenet は MIME タイプを自動検出します。 +ContentFilterToadlet.pageTitle=コンテンツフィルターをテスト ContentFilterToadlet.saveResultLabel=ディスクに結果を保存 -ContentFilterToadlet.selectFile=フィルタ -ContentFilterToadlet.tryAgainFilterFilePage=ファイルをフィルタリングするために${link}再試行${/link}してください。 +ContentFilterToadlet.selectFile=フィルター +ContentFilterToadlet.tryAgainFilterFilePage=ファイルをフィルターするために${link}再試行${/link}してください。 DarknetAddRefToadlet.title=フレンドと接続 DarknetAddRefToadlet.explainBoxTitle=Freenet を実行しているフレンドと接続すべき理由 -DarknetAddRefToadlet.explainBox1=「フレンド」と接続することで、Freenet のセキュリティを向上させることができます。フレンドとは、その人も Freent を実行しているとあなたが実際に知っている人々のことです。フレンドはネット上だけでの知り合いでも構いませんが、全く付き合いが無い見知らぬ人を追加してはなりません。見知らぬ人をフレンドとして追加しても、セキュリティは大して向上しませんし、もし多くの人々が同じように赤の他人を追加してしまった場合、ネットワーク全体に問題が生じてしまうからです。十分な数、すなわち、常にオンラインのフレンドを最低5人追加すれば、あなたはフレンドにのみ接続するよう設定し、ネットワークのセキュリティレベルを「高」に高めることができます。これを「ダークネット」モードと呼びます。ダークネットにおいては、攻撃者はあなたが Freenet を実行していることすら探り出すのがより困難になり、あなたの匿名性を破ろうとする攻撃の多くがはるかに難しいものとなります。Freenet はインターネット越しに直接あなたのフレンドへ暗号化されたコネクションを張りますので、あなたがすでに容易に接触できる人々(家族、同僚、実生活における友人、オンラインの友人)のみ追加するようにしてください。 -DarknetAddRefToadlet.explainInstallerWindows=最新の Windows インストーラは ${filename} からか、${get-windows}ここをクリック${/get-windows}することで入手できます。 -DarknetAddRefToadlet.explainBox2=フレンドと接続するには、彼らとノードレファレンス(noderef)を交換する必要があります。noderef とは、相手が実行している Freenet (「Freenet ノード」と言います)があなたの Freenet ノードへ接続するのに必要な情報が記載された小さなファイルです。2つのノードを接続させるには、あなたは彼らの noderef を追加し、彼らはあなたの noderef を追加しなければなりません。あなたの noderef はこのページの下のほうにあります。 +DarknetAddRefToadlet.explainBox1=「フレンド」と接続することで、Freenet のセキュリティを向上させることができます。フレンドとは、その人も Freent を実行しているとあなたが実際に知っている人々のことです。フレンドはネット上だけでの知り合いでも構いませんが、全く付き合いが無い見知らぬ人を追加してはなりません。見知らぬ人をフレンドとして追加しても、セキュリティは大して向上しませんし、もし多くの人々が同じように赤の他人を追加してしまった場合、ネットワーク全体に問題が生じてしまうからです。十分な数、すなわち、常にオンラインのフレンドを最低5人追加すれば、あなたはフレンドにのみ接続するよう設定し、ネットワークのセキュリティレベルを「高」に高めることができます。これを「ダークネット」モードと呼びます。ダークネットにおいては、攻撃者はあなたが Freenet を実行していることすら探り出すのがより困難になり、あなたの匿名性を破ろうとする攻撃の多くがはるかに難しいものとなります。Freenet はインターネット越しに直接あなたのフレンドへ暗号化されたコネクションを張りますので、あなたがすでに容易に接触できる人々 (家族、同僚、実生活における友人、オンラインの友人) のみ追加するようにしてください。 +DarknetAddRefToadlet.explainInstallerWindows=最新の Windows 向けインストーラーは ${filename} からか、${get-windows}ここ${/get-windows} をクリックすることで入手できます。 +DarknetAddRefToadlet.explainInstallerWindowsNotYet=Freenet は Windows 向けインストーラーをダウンロードするようにはなっていませんが、 Freenet 経由で ${link}ここ${/link} から入手できます。 +DarknetAddRefToadlet.explainInstallerNonWindows=最新の非 Windows 環境向けインストーラーは ${filename} からか ${get-nonwindows}ここ${/get-nonwindows} をクリックすることで入手できます。これは Java で開く必要のある jar ファイルです; うまくいけばあなたのフレンドはダブルクリックでそれを実行できますが、うまくいかない場合はコマンドラインを開いて "java -jar ${shortfilename}" と入力してみてください。 +DarknetAddRefToadlet.explainInstallerNonWindowsNotYet=Freenet は非 Windows 環境向けインストーラーをダウンロードするようにはなっていませんが、Freenet経由で ${link}ここ${/link} から入手できます。これは Java で開く必要のある jar ファイルです; うまくいけばあなたのフレンドはダブルクリックでそれを実行できますが、うまくいかない場合はコマンドラインを開いて "java -jar ${shortfilename}" と入力してみてください。 +DarknetAddRefToadlet.explainBox2=フレンドと接続するには、彼らと noderef を交換する必要があります。noderef とは、相手が実行している Freenet (Freenet ノードと言います) があなたの Freenet ノードへ接続するのに必要な情報が記載された小さなファイルです。2 つのノードを接続させるには、あなたは彼らの noderef を追加し、彼らはあなたの noderef を追加しなければなりません。あなたの noderef はこのページの下のほうにあります。 DarknetConnectionsToadlet.addAnotherFriend=他のフレンドを追加 +DarknetConnectionsToadlet.goFriendConnectionStatus=フレンドページでこのフレンドと接続しているかどうかを確認する DarknetConnectionsToadlet.activityTitle=現在の活動状況 DarknetConnectionsToadlet.add=追加 DarknetConnectionsToadlet.addPeerTitle=フレンドと接続 -DarknetConnectionsToadlet.addOpennetPeerTitle=見知らぬ人と手動で接続する(非推奨です!) -DarknetConnectionsToadlet.alreadyInReferences=そのレファレンスは既に持っています。 -DarknetConnectionsToadlet.backedOff=接続 - バックオフ中: これらのピアは接続していますが、私たちはそのピアとの間でバックオフしているため、彼らにリクエストを配送していません。 -DarknetConnectionsToadlet.backedOffShort=バックオフ +DarknetConnectionsToadlet.addOpennetPeerTitle=見知らぬ人と手動で接続する (非推奨です!) +DarknetConnectionsToadlet.alreadyInReferences=その参照は既に持っています。 +DarknetConnectionsToadlet.backedOff=接続 - 接続撤回中: これらのピアは接続していますが、私たちはそのピアとの間で接続を撤回しているため、彼らにリクエストを配送していません。 +DarknetConnectionsToadlet.backedOffShort=接続撤回 DarknetConnectionsToadlet.bracketedMoreDetailed=(より詳しく) -DarknetConnectionsToadlet.bursting=未接続 - バースト中: ピアのユーザがBurstOnlyを設定しているため、このノードは彼らのピアとの接続を短期間に留めようとします。 +DarknetConnectionsToadlet.bursting=未接続 - バースト中: ピアのユーザーが「バーストのみ」を設定しているため、このノードは彼らとの接続を短時間に留めようとします。 DarknetConnectionsToadlet.burstingShort=バースト中 -DarknetConnectionsToadlet.busy=ビジー: これらのピアは接続していますがこちらのリクエストを捌ける余裕が無いため、Freenetは彼らにリクエストを配送しません。 +DarknetConnectionsToadlet.busy=ビジー: これらのピアは接続していますがこちらのリクエストを捌く余裕がないため、Freenet は彼らにリクエストを配送していません。 DarknetConnectionsToadlet.busyShort=ビジー +DarknetConnectionsToadlet.cantFetchNoderefURL=${url} からノード参照を取得できません。もう一度実行してください。 +DarknetConnectionsToadlet.cantParseTryAgain=渡されたテキストをノード参照として解釈できません: (${error}) もう一度実行してください。 +DarknetConnectionsToadlet.cantParseWrongEnding=ノード参照を解釈できません: ノード参照の末尾は「End」であるべきですが、次のもので終了しています: ${end} DarknetConnectionsToadlet.changeMyName=変更 +DarknetConnectionsToadlet.changeTrustButton=信頼を変更 +DarknetConnectionsToadlet.changeVisibilityButton=可視性を変更 +DarknetConnectionsToadlet.clockProblem=あなたの時計とノードの時計とは 24 時間以上ずれています。更新やクライアントに問題が生じる可能性があるため接続を無効にしました。 +DarknetConnectionsToadlet.clockProblemShort=時計の問題 +DarknetConnectionsToadlet.confirmRemoveNode=Are you sure you wish to remove "${name}"? Before it has at least one week downtime, it's not recommended to do so, as it may be down only temporarily, and many users cannot run their nodes 24x7. DarknetConnectionsToadlet.confirmRemoveNodeTitle=確認してください +DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=ノードの削除 DarknetConnectionsToadlet.connected=接続: ノードに正常に接続しました DarknetConnectionsToadlet.connectedShort=接続 -DarknetConnectionsToadlet.darknetFnpPort=Darknet FNP: ${port}/UDP (友達などのこのポートに接続することが出来る信頼されたピアとの接続に使用されている) +DarknetConnectionsToadlet.countTitle=回数 +DarknetConnectionsToadlet.darknetFnpPort=ダークネット FNP: ${port}/UDP (信頼できるピア、すなわちフレンドとの接続に使用されます; 可能ならこのポートをフォワードしてください) +DarknetConnectionsToadlet.disabled=未接続かつ無効: あなたが Freenet にこれらのピアに接続しないよう命じたため +DarknetConnectionsToadlet.disabledShort=無効 DarknetConnectionsToadlet.enterDescription=説明を入力: +DarknetConnectionsToadlet.foafReachableThroughTitle=Reachable Through +DarknetConnectionsToadlet.connError=接続に失敗 (不具合のあるノード?) +DarknetConnectionsToadlet.routingDisabled=ルーティングされていないトラフィック (ノードに接続していますがトラフィックをルーティングすることを拒否しています) +DarknetConnectionsToadlet.routingDisabledShort=ルーティングされていないトラフィック +DarknetConnectionsToadlet.noLoadStats=どの程度リクエストを送信できるか分からないので送信できません +DarknetConnectionsToadlet.noLoadStatsShort=負荷統計なし DarknetConnectionsToadlet.myName=このノードのニックネーム: ${name} DarknetConnectionsToadlet.disconnectingShort=切断中 +DarknetConnectionsToadlet.disconnecting=切断中 (現在ノードを削除中です。このことを相手ノードに伝える必要があり、これには少しかかります) DarknetConnectionsToadlet.connErrorShort=接続エラー +DarknetConnectionsToadlet.failedToAddNodeInternalError=渡されたテキストをノード参照として解釈できません。次のことを開発者に報告してください: DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=ノードの追加に失敗: 内部エラー DarknetConnectionsToadlet.failedToAddNodeTitle=ノードの追加に失敗 -DarknetConnectionsToadlet.fcpDisabled=FCPは無効 (ThawといったFreenetクライアントのため) -DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (ThawといったFreenetクライアントのため) -DarknetConnectionsToadlet.forceRemove=強制除外 -DarknetConnectionsToadlet.fproxyDisabled=FProxyは無効 (このWebインターフェース) -DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/TCP (このWebインターフェース) -DarknetConnectionsToadlet.fullTitle=${counts} フレンド (信用されたピア) -DarknetConnectionsToadlet.go=GO +DarknetConnectionsToadlet.fcpDisabled=FCP は無効 (Freenet クライアント用) +DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (Freenet クライアント用) +DarknetConnectionsToadlet.fileReference=または、ここからノード参照ファイルを探してください: +DarknetConnectionsToadlet.forceRemove=強制削除 +DarknetConnectionsToadlet.fproxyDisabled=FProxy は無効 (この Web インターフェース) +DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/TCP (この Web インターフェース) +DarknetConnectionsToadlet.fullTitle=${counts} フレンド (信頼するピア) +DarknetConnectionsToadlet.go=Go +DarknetConnectionsToadlet.idleTime=ノードに接続、もしくは最後に確認してからの時間 +DarknetConnectionsToadlet.idleTimeTitle=接続 / アイドル +DarknetConnectionsToadlet.invalidSignature=渡された参照の署名を検証できません。 (${error}) +DarknetConnectionsToadlet.ipAddress=IP:ポート 形式でのノードのネットワークアドレス DarknetConnectionsToadlet.ipAddressTitle=アドレス -DarknetConnectionsToadlet.myReferenceHeader=${linkref}自分のノードレファレンス${/linkref} (${linktext}テキストファイルとして入手${/linktext}) +DarknetConnectionsToadlet.listenOnly=未接続かつ待ち受けのみ: ユーザーが「受信のみ」を設定しているため、このノードはこれらのピアへの接続を試みません。 +DarknetConnectionsToadlet.listenOnlyShort=受信のみ +DarknetConnectionsToadlet.listening=未接続だが待ち受け中: ユーザーが「バーストのみ」を設定しているため、このノードはこれらのピアへの接続を頻繁には試みません。 +DarknetConnectionsToadlet.listeningShort=待ち受け中 +DarknetConnectionsToadlet.locationTitle=場所 +DarknetConnectionsToadlet.myFriends=自分のフレンド (自分が追加した信頼するピア) +DarknetConnectionsToadlet.myReferenceHeader=${linkref}自分のノード参照${/linkref} (${linktext}テキストファイルとして入手${/linktext}) +DarknetConnectionsToadlet.nameClickToMessage=ノードの名前。名前のリンクをクリックすると N2NTM (ノード間テキストメッセージ) を送信できます。 DarknetConnectionsToadlet.nameTitle=名前 -DarknetConnectionsToadlet.nodePortsTitle=あなたのFreenetノードによって使用されているポート -DarknetConnectionsToadlet.notConnectedShort=切断 -DarknetConnectionsToadlet.opennetFnpPort=Opennet FNP: ${port}/UDP (見知らぬ人などのこのポートに接続することが出来る信頼出来ないピアとの接続に使用されている) -DarknetConnectionsToadlet.pasteReference=ノードレファレンスを直接入力: -DarknetConnectionsToadlet.peersEnable=選択したピアを有効 -DarknetConnectionsToadlet.peersDisable=選択したピアを無効 +DarknetConnectionsToadlet.neverConnected=接続したことがない: Freenet はこれらのピアに接続したことがありません。 +DarknetConnectionsToadlet.neverConnectedShort=接続したことがない +DarknetConnectionsToadlet.noderefLink=noderef +DarknetConnectionsToadlet.noPeersWithHomepageLink=ピアが追加されていないため Freenet は動作できません。${link}ノードのホームページ${/link} へ行き上部の情報ボックスでどのようにするのか確認してください。 +DarknetConnectionsToadlet.noRefOrURL=ノード参照と URL のどちらも検出できませんでした。もう一度実行してください。 +DarknetConnectionsToadlet.nodePortsTitle=あなたの Freenet ノードによって使用されているポート +DarknetConnectionsToadlet.notConnected=未接続: まだ接続していませんが、このノードは継続的に接続を試みています +DarknetConnectionsToadlet.notConnectedShort=切断済み +DarknetConnectionsToadlet.noTrustLevelAddingFriendTitle=フレンドのノードの信頼度合いを設定しなければなりません +DarknetConnectionsToadlet.noTrustLevelAddingFriend=信頼度合いを設定しなければなりません - 低、通常、高。これは単純にあなたがフレンドをどの程度信頼しているかです。高い信頼度合いはより良い性能をもたらしますが、フレンドがあなたを攻撃しようとした際、例えば Freenet であなたが何をしているのか調べようとした場合のセキュリティが低下します。フレンドとの間に軽い付き合いしかない場合は低に設定すべきかもしれません; あなたがフレンドを完全に信頼する場合は高に設定すべきでしょう。もしあなたがフレンドはコンピューターを適切に運用せず、絶えずウイルス等に侵入されていると知っているのであれば、通信相手がフレンドではなくコンピューターに侵入した誰かかもしれないので信頼度合いを少し下げるべきでしょう! +DarknetConnectionsToadlet.noVisibilityLevelAddingFriendTitle=フレンドのノードの可視性を設定しなければなりません +DarknetConnectionsToadlet.noVisibilityLevelAddingFriend=フレンドの可視性を次の中から設定しなければなりません - はい (他のフレンドもはいに設定することで、お互いに接続することができます)、名前のみ (ピアの名前のみ見ることができ、お互いに知っている場合のみ接続できます)、いいえ (他のフレンドはこのノードを認識できません)。あなたのフレンドを他のフレンドから認識できるようにすることで、性能が改善し、あなたが Freenet にいる際にあなたの知り合いと Freenet との接続が容易になります。 +DarknetConnectionsToadlet.opennetFnpPort=オープンネット FNP: ${port}/UDP (信頼していないピア、すなわち見知らぬ人との接続に使用されます; 可能ならこのポートをフォワードしてください) +DarknetConnectionsToadlet.pasteReference=ノード参照を直接入力: +DarknetConnectionsToadlet.peersEnable=選択したピアを有効に +DarknetConnectionsToadlet.peersDisable=選択したピアを無効に +DarknetConnectionsToadlet.peersSetBurstOnly=選択したピアで「バーストのみ」を設定 (あなたが静的な IP アドレスを持ち、あなたもピアも NAT されていない場合のみ設定してください) +DarknetConnectionsToadlet.peersClearBurstOnly=選択したピアで「バーストのみ」をクリア +DarknetConnectionsToadlet.peersSetListenOnly=選択したピアで「受信のみ」を設定 (推奨されません) +DarknetConnectionsToadlet.peersClearListenOnly=選択したピアで「受信のみ」をクリア +DarknetConnectionsToadlet.peersSetAllowLocal=選択したピアで「ローカルアドレスの許可」を設定 (同一 LAN 内の他のノードに接続する場合に有用です) +DarknetConnectionsToadlet.peersClearAllowLocal=選択したピアで「ローカルアドレスの許可」をクリア +DarknetConnectionsToadlet.peersSetIgnoreSourcePort=選択したピアで「ソースポートの無視」を設定 (邪悪な業務用ファイアウォールの背後にいる場合にお試しください; それ以外では推奨されません) +DarknetConnectionsToadlet.peersClearIgnoreSourcePort=選択したピアで「ソースポートの無視」をクリア +DarknetConnectionsToadlet.peersSetDontRoute=選択したピアで「ルートしない」を設定 (何をやっているのか理解していない場合は使用すべきではありません!) +DarknetConnectionsToadlet.peersClearDontRoute=選択したピアで「ルートしない」をクリア DarknetConnectionsToadlet.peerTrustTitle=どの程度このフレンドを信頼しますか? -DarknetConnectionsToadlet.peerTrustIntroduction=信頼レベルが高いと、あなたやあなたのフレンドの接続パフォーマンスが向上します。しかし、フレンドが実は信頼できない相手だったり、彼らのコンピュータがハックあるいは押収されてしまった場合、あなたはより脆弱な立場に置かれることになります。 -DarknetConnectionsToadlet.peerTrustExplain.LOW=このフレンドを信頼しません。できるだけ情報を共有しないようにしてください。パフォーマンスは低下します。しかし、このオプションですら、見知らぬ人との接続に比べれば依然としてほとんど全ての場合においてより安全であることに注意してください。 +DarknetConnectionsToadlet.peerTrustIntroduction=信頼レベルが高いと、あなたやフレンドの接続性能が向上します。しかし、フレンドが実は信頼できない相手だったり、彼らのコンピューターがハックあるいは押収されてしまった場合、あなたはより脆弱な立場に置かれることになります。 +DarknetConnectionsToadlet.peerTrustExplain.LOW=このフレンドを信頼しません。できるだけ情報を共有しないようにしてください。性能は低下します。しかし、この設定ですら、見知らぬ人との接続に比べれば依然としてほとんど全ての場合においてより安全であることに注意してください。 +DarknetConnectionsToadlet.peerTrustExplain.NORMAL=このフレンドを多少信頼します。いくらかの情報を共有しますが、同時に注意も払います。中程度の性能です。 +DarknetConnectionsToadlet.peerTrustExplain.HIGH=フレンドを完全に信頼します。フレンドがコンピューターを安全に保てると信頼します。最大限の性能のために可能な限り多くの情報を共有します。 DarknetConnectionsToadlet.peerTrust.LOW=低 DarknetConnectionsToadlet.peerTrust.NORMAL=標準 DarknetConnectionsToadlet.peerTrust.HIGH=高 +DarknetConnectionsToadlet.peerVisibilityTitle=あなたの他のフレンドがこのフレンドを認識し、接続できるようにしたいですか? +DarknetConnectionsToadlet.peerVisibilityIntroduction=もしあなたが他のフレンドがこのフレンドを認識できるようにして、かつこのフレンドが他のフレンドを認識できるようにした場合、性能は劇的に向上するでしょう。しかし、あなたは他のフレンドがこのフレンドについて知ることを望まないかもしれません (ですがあなたのインターネット接続を把握できる人なら誰でもあなたに結び付けることができることに留意してください) 。また、このフレンドもあなたの他のフレンドから認識されることを拒否することができます。 DarknetConnectionsToadlet.peerVisibility.NO=いいえ DarknetConnectionsToadlet.peerVisibility.YES=はい DarknetConnectionsToadlet.peerVisibility.NAME_ONLY=名前のみ +DarknetConnectionsToadlet.peerVisibilityExplain.NO=私のフレンドにこのフレンドのことを教えず、またこのフレンドがその人のフレンドに私について教えることを許可しません: これは秘密の関係です。 +DarknetConnectionsToadlet.peerVisibilityExplain.NAME_ONLY=このフレンドに私の他のフレンドのニックネームのみ教え、私の他のフレンドにこのフレンドのニックネームのみを教えます。彼らがお互いを知っている場合は互いに接続できます。 +DarknetConnectionsToadlet.peerVisibilityExplain.YES=私の他のフレンドにこのフレンドについて教え、このフレンドに私の他のフレンドについて教えます。彼らは私がオフラインであってもすぐにお互い接続でき、性能が劇的に改善します。 +DarknetConnectionsToadlet.privateNote=このピアに関する秘密のメモ +DarknetConnectionsToadlet.privateNoteTitle=秘密のメモ DarknetConnectionsToadlet.referenceCopyWarning=${bold}そのまま${/bold}ノード参照をコピーする必要があります。それを変更すると、${bold}役に立たなく${/bold}なります。 -DarknetConnectionsToadlet.returnToAddAFriendPage=再試行 (フレンドを追加ページへ戻る) +DarknetConnectionsToadlet.remove=削除する! +DarknetConnectionsToadlet.removePeers=選択したピアを削除 +DarknetConnectionsToadlet.returnToAddAFriendPage=再試行 (フレンドの追加ページへ戻る) +DarknetConnectionsToadlet.secondDegreeAlsoOurs=${count} 個のロケーションはおそらく私たちのピアです (太字) +DarknetConnectionsToadlet.secondDegreeConnectionsCountTitle=${count} 個の二次的な接続 +DarknetConnectionsToadlet.secondDegreeTrivialHiddenCount=${count} 個の隠れている可能性のある重複していない接続 +DarknetConnectionsToadlet.secondDegreeNonTrivialCount=${count} 個が 1 つ以上のピアを経由して到達可能 +DarknetConnectionsToadlet.seedServers=私たちがシードノードとして使用しているノード。 +DarknetConnectionsToadlet.seedServersShort=シードノード +DarknetConnectionsToadlet.seedClients=私たちをシードノードとして使用しているノード。 +DarknetConnectionsToadlet.seedClientsShort=シード中 +DarknetConnectionsToadlet.selectAction=-- 行動を選択 -- +DarknetConnectionsToadlet.sendMessageTitle=ノード間テキストメッセージを送信 +DarknetConnectionsToadlet.sendMessageToPeers=選択したピアにノード間テキストメッセージを送信 +DarknetConnectionsToadlet.sendConfidentialMessage=機密メッセージを送信 +DarknetConnectionsToadlet.separator=-- -- -- DarknetConnectionsToadlet.statusTitle=状態 -DarknetConnectionsToadlet.tmciDisabled=TMCIは無効 (シンプルなtelnetベースのコマンドラインインターフェース) -DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (シンプルなtelnetベースのコマンドラインインターフェース) +DarknetConnectionsToadlet.tmciDisabled=TMCI は無効 (シンプルな telnet ベースのコマンドラインインターフェース) +DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (シンプルな telnet ベースのコマンドラインインターフェース) +DarknetConnectionsToadlet.tooNew=接続しましたが新しすぎます: これらのピアの最小必須ビルドはこのノードのビルド番号よりも高いです。 DarknetConnectionsToadlet.tooNewShort=新しすぎる +DarknetConnectionsToadlet.tooOld=接続しましたが古すぎます: このノードの最小必須ビルドはこれらのピアのビルド番号よりも高いです。このノードはリクエストを彼らにルーティングしません。 DarknetConnectionsToadlet.tooOldShort=古すぎる +DarknetConnectionsToadlet.triedToAddSelf=あなたはあなた自身をリモートピアとして追加できません。 +DarknetConnectionsToadlet.trustTitle=信頼度合い +DarknetConnectionsToadlet.trustMessage=より高い信頼度合い = より多い情報共有、よりよい性能、ですがフレンドに悪意があったりコンピューターの押収や侵害があった場合にセキュリティーを損ないます DarknetConnectionsToadlet.unknownAddress=(不明なアドレス) -DarknetConnectionsToadlet.urlReference=または、ノードレファレンスの URL をここに入力: +DarknetConnectionsToadlet.updateChangedPrivnotes=秘密のメモを更新 +DarknetConnectionsToadlet.urlReference=または、ノード参照の URL か鍵をここへ入力: DarknetConnectionsToadlet.versionTitle=バージョン -DarknetConnectionsToadlet.returnToPrevPage=前のページに戻る +DarknetConnectionsToadlet.reportOfNodeAddition=フレンドを追加 +DarknetConnectionsToadlet.returnToPrevPage=前のページへ戻る +DarknetConnectionsToadlet.peerAdditionCode.OK=正常に追加されました +DarknetConnectionsToadlet.peerAdditionCode.TRY_TO_ADD_SELF=自分を追加しようとしました +DarknetConnectionsToadlet.peerAdditionCode.WRONG_ENCODING=エンコーディングが間違っています +DarknetConnectionsToadlet.peerAdditionCode.CANT_PARSE=解釈できません DarknetConnectionsToadlet.peerAdditionCode.INTERNAL_ERROR=内部エラー DarknetConnectionsToadlet.peerAdditionCode.INVALID_SIGNATURE=無効な署名 +DarknetConnectionsToadlet.peerAdditionCode.ALREADY_IN_REFERENCE=すでに追加済みです +DarknetConnectionsToadlet.resultName=結果 +DarknetConnectionsToadlet.numOfResults=数 +DarknetConnectionsToadlet.visibilityTitle=フレンドからの可視性 +DarknetConnectionsToadlet.visibilityMessageSimple=他のフレンドからこのフレンドを認識できるか (私と彼らの設定のうち、厳しい方を使用します。上級モードで詳しく確認できます) +DarknetConnectionsToadlet.visibilityMessageAdvanced=他のフレンドからこのフレンドを認識できるか (私と彼らの設定のうち、厳しい方を使用します。ブラケットの中を確認してください) +DataStoreTooSmallAlert.title=あなたのデータストアは推奨値より小さいです +DataStoreTooSmallAlert.description=最低でも ${size} GiB のディスク容量をネットワークへ提供することが推奨されます。誰もがより多くの容量を提供すれば、ネットワークはより多くのファイルをより長く保持できます。 +DataStoreTooSmallAlert.current=現在のデータストアのサイズ: ${size} +DataStoreTooSmallAlert.available=利用可能なディスク容量の合計: ${size} +DataStoreTooSmallAlert.submit=データストアのサイズ設定へ行く +DiskSpaceUserAlert.title=いくらかのディスク容量を空けてください! +DiskSpaceUserAlert.notEnoughSpaceIn=次の場所に十分な空き容量がありません。${where} +DiskSpaceUserAlert.action=いくつかのファイルを削除もしくは移動してください。または設定ページでディスク容量の限度を設定できます (上級モードでの重要な設定にある"空きディスク容量の最小値"など) 。 +DiskSpaceUserAlert.explanation.OK= +DiskSpaceUserAlert.explanation.PERSISTENT=いくらかのディスク容量を空けるまで新しいダウンロードは開始しません。 +DiskSpaceUserAlert.explanation.TRANSIENT=いくらかのディスク容量を空けるまで Freenet の閲覧や新しいダウンロードの開始等は不安定になります。 +DiskSpaceUserAlert.explanation.PERSISTENT_COMPLETION=いくらかのディスク容量を空けるまでダウンロードは完了しません。 DownloadFeedUserAlert.delete=削除 -DownloadFeedUserAlert.fileDescription=詳細: +DownloadFeedUserAlert.fileDescription=詳細: +DownloadFeedUserAlert.fileURI=URI: DownloadFeedUserAlert.title=${from} があなたにファイルを薦めています -FileInsertWizardToadlet.filterFileLabel=アップロードされたファイルがどのように見えるかを確認するために、事前にコンテンツフィルタを実行することができます: -FileInsertWizardToadlet.insertCanonicalTitle=正規のキーでインサート -FileInsertWizardToadlet.insertCanonical=これは常にファイルとキーを結びますので、ファイル共有に便利です。しかしながら、もしも悪い者はあなたがインサートしているファイルを予言できるならば、より簡単にあなたを追跡するためにキーを使うことができるだろう。 -FileInsertWizardToadlet.insertCanonicalAdvanced=(コンテンツから派生した暗号化キーをCHK@に挿入します) -FileInsertWizardToadlet.insertIntro=ファイルをアップロードする前に、求めるセキュリティに応じていくつかのアップロード(インサート)方法があります: -FileInsertWizardToadlet.insertRandomTitle=ランダムの安全なキーでインサート -FileInsertWizardToadlet.insertRandom=これは最も安全を重視する設定ですが、そのキーはあなたまたは誰かがする他のインサートのキーとは毎回異なります。もしもあなたが機密データのオリジナルの出所になるときは使ってください。 -FileInsertWizardToadlet.insertRandomAdvanced=(ランダムに生成した暗号キーをランダムなSSKに挿入します) -FileInsertWizardToadlet.insertSpecificKeyTitle=キーを指定 -FileInsertWizardToadlet.previewFilterFile=ファイルをフィルタ -FileInsertWizardToadlet.splitfileCryptoKeyLabel=(オプション) 分割ファイルの暗号化キー (16進数) +DroppedOldPeersUserAlert.droppingOldFriendTitle=警告: ${count} 個の接続が新しい暗号プロトコルを原因としてドロップしました。(あなたのフレンドは ${buildDate} 以降に更新または接続していません) +DroppedOldPeersUserAlert.droppingOldFriendFull=フレンドが ${buildDate} 以降に更新を行っていないため、Freenet は ${count} 個の接続をドロップしました。ビルド ${buildNumber} には Freenet の暗号に重要な変更が加えられており、古い暗号プロトコルは攻撃に脆弱なため、とても古いノードとの後方互換性を維持できませんでした。古いノードの参照は次のファイルに保存されました。${filename} +DroppedOldPeersUserAlert.droppingOldFriendList=ドロップしたピア: +FileInsertWizardToadlet.filterFileLabel=アップロードされたファイルがどのように見えるかを確認するために、事前にコンテンツフィルターを実行することができます: +FileInsertWizardToadlet.insertCanonicalTitle=正規の鍵でインサート +FileInsertWizardToadlet.insertCanonical=これは同一のファイルに対して常に同じ鍵を生成するので、ファイル共有に便利です。しかし、もしあなたがインサートしようとしているファイルを悪意ある人物が予測できるのであれば、彼らはずっと簡単にあなたを追跡できるかもしれません。 +FileInsertWizardToadlet.insertCanonicalAdvanced=(コンテンツから算出した暗号鍵とともに CHK@ へインサートします) +FileInsertWizardToadlet.insertIntro=以前にこのファイルをアップロードしたことがあるかどうかや求めるセキュリティーに応じていくつかのアップロード (インサート) 方法があります: +FileInsertWizardToadlet.insertRandomTitle=ランダムで安全な鍵でインサート +FileInsertWizardToadlet.insertRandom=これは最初の選択肢よりずっと安全ですが、鍵はあなたや他の誰かが同一のファイルをインサートする際の鍵とは常に異なるものになります。あなたが機密データの元々の出所になる際に使用してください。 +FileInsertWizardToadlet.insertRandomAdvanced=(ランダムに生成された鍵とともにランダムな SSK へインサートします) +FileInsertWizardToadlet.insertSpecificKeyTitle=鍵を指定 +FileInsertWizardToadlet.insertSpecificKey=インサートしたい鍵を具体的に知っている場合はここで指定してください。それが SSK, USK, KSK のどれかである場合、「ランダムで安全な鍵でインサート」の通りデータはランダムに暗号化されます。 +FileInsertWizardToadlet.previewFilterFile=ファイルをフィルター +FileInsertWizardToadlet.splitfileCryptoKeyLabel=(任意) 分割ファイルの暗号鍵 (16 進数) FileInsertWizardToadlet.pageTitle=ファイルを Freenet へアップロード -FirstTimeWizardToadlet.homepageTitle=Freenet 初回設定ウィザード! -FirstTimeWizardToadlet.autodetectedSuggestedLimit=(オヌヌメ) +FirstTimeWizardToadlet.homepageTitle=Freenet 初回設定 +FirstTimeWizardToadlet.autodetectedSuggestedLimit=(推奨) FirstTimeWizardToadlet.autoUpdate=自動更新 -FirstTimeWizardToadlet.autoUpdateAutodeploy=Freenetを自動的に最新に保つ +FirstTimeWizardToadlet.autoUpdateAutodeploy=Freenet を自動的に最新に保つ FirstTimeWizardToadlet.autoUpdateNoAutodeploy=新しいバージョンが利用可能なときは通知する -FirstTimeWizardToadlet.autoUpdateLong=Freenetは自動的に最新のバージョンを保つことができます。どうしますか: -FirstTimeWizardToadlet.bandwidthCapPrompt=あなたのインターネット接続には月あたりの通信量制限はありますか? +FirstTimeWizardToadlet.autoUpdateLong=Freenet は自動的に最新のバージョンに保つことができます。どうしますか: +FirstTimeWizardToadlet.bandwidth=帯域幅 +FirstTimeWizardToadlet.bandwidthMonthlyLimitTitle=月ごとの通信量の上限があります。 +FirstTimeWizardToadlet.bandwidthMonthlyLimit=Freenet に次の量を使用させる +FirstTimeWizardToadlet.bandwidthMonthlyLimitBaseUnit=GiB/月 +FirstTimeWizardToadlet.bandwidthDownLimitBaseUnit=KiB/s ダウンロード +FirstTimeWizardToadlet.bandwidthUpLimitBaseUnit=KiB/s アップロード +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeeds=一般的なインターネット接続速度 +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeedsConnectionType=接続の種類 +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeedsDownloadLimit=ダウンロード制限 +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeedsUploadLimit=アップロード制限 +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeedsDetected=検出 +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeedsDetectedUnavailable=利用できません +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeeds4Mbit=4 Mbps +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeeds6Mbit=6 Mbps (平均的な ADSL1) +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeedsKibps=KiB/s +FirstTimeWizardToadlet.bandwidthCommonInternetConnectionSpeedsMibs=Mbps +FirstTimeWizardToadlet.bandwidthCapPrompt=あなたのインターネット接続には月あたりの通信量上限はありますか? FirstTimeWizardToadlet.bandwidthLimitMonthlyTitle=月間データ上限 +FirstTimeWizardToadlet.bandwidthLimitMonthly=Freenet はデータ上限に達しないように設定できます。毎月どの程度の通信を Freenet に許可しますか?指定された上限を守るために Freenet が非常に低速になる可能性があります。帯域幅制限は Freenet が常時オンラインであると仮定して設定されるため、実際の使用量はそれよりも少なくなるかもしれません。これらの上限は ${bold}${coreSettings}${/bold} ページでいつでも調節できます。 FirstTimeWizardToadlet.bandwidthLimitRateTitle=転送レート制限 -FirstTimeWizardToadlet.bandwidthConnectionHeader=接続タイプ -FirstTimeWizardToadlet.bandwidthDetected=検知された速度 (半分を使用) -FirstTimeWizardToadlet.bandwidthConnectionDialUp=ダイヤルアップモデム (おすすめしません!) +FirstTimeWizardToadlet.bandwidthLimitRate=あなたのインターネット接続はどの程度の速度ですか?Freenet がその半分以上を使用することはありません。この設定は ${bold}${coreSettings}${/bold} ページで後から変更できます。毎秒 1 メガビット (1 Mbps) は 毎秒 125 キロバイト (125 KB/s) に等しいことに注意してください。 +FirstTimeWizardToadlet.bandwidthConnectionHeader=接続の種類 +FirstTimeWizardToadlet.bandwidthDetected=検出された速度 (その半分を使用) +FirstTimeWizardToadlet.bandwidthConnectionDialUp=ダイヤルアップモデム (おすすめしません!) FirstTimeWizardToadlet.bandwidthConnectionISDN=ISDN (稀) -FirstTimeWizardToadlet.bandwidthConnectionSlow256=256kbps セミブロードバンド -FirstTimeWizardToadlet.bandwidthConnectionSlow512=512kbps 低速ブロードバンド -FirstTimeWizardToadlet.bandwidthConnection1M=1 メガビット -FirstTimeWizardToadlet.bandwidthConnection2M=2 メガビット -FirstTimeWizardToadlet.bandwidthConnection4M=4 メガビット -FirstTimeWizardToadlet.bandwidthConnection6M=6 メガビット (ADSL1の平均) -FirstTimeWizardToadlet.bandwidthConnection8M=8 メガビット (高速 ADSL1) -FirstTimeWizardToadlet.bandwidthConnection12M=12 メガビット (低速 ADSL2) -FirstTimeWizardToadlet.bandwidthConnection20M=20 メガビット (高速 ADSL2, 高速ケーブル通信) -FirstTimeWizardToadlet.bandwidthConnection100M=100 メガビット (光回線) +FirstTimeWizardToadlet.bandwidthConnectionSlow256=256 Kbps セミブロードバンド +FirstTimeWizardToadlet.bandwidthConnectionSlow512=512 Kbps 低速ブロードバンド +FirstTimeWizardToadlet.bandwidthConnection1M=1 Mbps +FirstTimeWizardToadlet.bandwidthConnection2M=2 Mbps +FirstTimeWizardToadlet.bandwidthConnection4M=4 Mbps +FirstTimeWizardToadlet.bandwidthConnection6M=6 Mbps (平均的な ADSL1) +FirstTimeWizardToadlet.bandwidthConnection8M=8 Mbps (高速な ADSL1) +FirstTimeWizardToadlet.bandwidthConnection12M=12 Mbps (低速な ADSL2) +FirstTimeWizardToadlet.bandwidthConnection20M=20 Mbps (高速な ADSL2, 高速なケーブルテレビ) +FirstTimeWizardToadlet.bandwidthConnectionVDSL=VDSL (20/5) +FirstTimeWizardToadlet.bandwidthConnection100M=100 Mbps (光回線) FirstTimeWizardToadlet.bandwidthCurrent=現在の帯域幅制限 FirstTimeWizardToadlet.bandwidthCustom=帯域幅制限を手動で入力する FirstTimeWizardToadlet.bandwidthDownloadHeader=ダウンロード上限 +FirstTimeWizardToadlet.bandwidthMonthlyLow=あなたが要求した ${requested} GB/月 の上限は低すぎます。最小限の通信量上限を設定した場合、Freenet は常時オンラインの時で ${minimum} GB/月 程度を使用する可能性があります。Freenet を常時オンラインにしないのであれば、上限をより高く設定できます。このまま最小限の上限を使用するには ${useMinimum} をクリックしてください。 +FirstTimeWizardToadlet.bandwidthMonthlyUseMinimum=最小限を使用 FirstTimeWizardToadlet.bandwidthUploadHeader=アップロード上限 FirstTimeWizardToadlet.bandwidthSelect=選択 FirstTimeWizardToadlet.bandwidthPerSecond=毎秒 FirstTimeWizardToadlet.bandwidthMonthlyNetTransfer=月間転送量 -FirstTimeWizardToadlet.bandwidthCouldNotParse=上限 "${limit}"を解釈できませんでした。 もう一度入力してください。 -FirstTimeWizardToadlet.browserWarningPageTitle=ブラウザのセキュリティ勧告 -FirstTimeWizardToadlet.browserWarningShort=Freenetを利用する際は必ず別窓でブラウザ(もしくはプライバシー/シークレット モード)を使用してください! -FirstTimeWizardToadlet.browserWarningShortRelativelySafe=セキュリティのために、プライバシーモード、もしくは隔離したブラウザを使用するべきです。 -FirstTimeWizardToadlet.browserWarningIncognitoShort=Freenetへのアクセスにシークレットブラウジングモードを使用しています(よいことです) -FirstTimeWizardToadlet.browserWarning=ブラウザのプライバシー/プライベートモードを使わない場合は、普通のWebにアクセスするのとFreenetには、別のブラウザを使うことを${bold}強く${/bold}おすすめします。特にブラウザの履歴を盗む攻撃は、最近訪問したFreesiteを特定し、匿名性を破壊しようとする悪意のあるウェブサイトを動かしてしまいます。FreenetのWebインターフェースにアクセスするのに別のブラウザを使用してください。たとえばWindowsでは(システムトレイの)ウサギのアイコンの、Freenetをブラウズするボタンをクリックすると、(インストールされているならば)自動的にGoogle Chromeをシークレットブラウジングモードで開きます。 -FirstTimeWizardToadlet.browserWarningMaybeSafe=あなたは比較的安全な、十分新しいブラウザを使用しています。しかしながらブラウザがFreenet上の閲覧の履歴を保存します。プライバシー/シークレットモードを使ってこれを防ぐことができます。手動で削除することもできますが、多くの場合追跡できるデータを残します。 -FirstTimeWizardToadlet.browserWarningIncognito=Google Chromeのシークレットブラウジングモードか、それに類似した機能があるブラウザをお使いの場合は問題ありませんが、その種の機能をサポートしないブラウザでFreenetにアクセスするのは極力避けてください。どうしてもそのようなブラウザを使わざるを得ない場合には、それがあなたが普段インターネット・ブラウジングにお使いのブラウザとは別のブラウザであることを確認してください。さもなくば、あなたが何度も訪問したウェブサイトの運営者には、あなたがFreenet上で何を見ていたかが漏洩してしまう恐れがあります。 -FirstTimeWizardToadlet.browserWarningIncognitoMaybeSafe=あなたは最近のブラウザの、プライバシー/シークレットモードを使っているようです(タイトルバーをご確認ください)。これは比較的安全です。古いブラウザ(Firefox4以前)では、プライバシーモードでない限りはWebの閲覧とFreenetに同じブラウザを使用しないでください。 -FirstTimeWizardToadlet.browserWarningFirefoxMightHaveClobberedTabs=FreenetはFirefoxをプライバシーモードで起動しようと試みました。これはブラウザが閲覧の履歴を残すのを阻害します。バージョンによっては開いていたブラウザウウィンドウが全て閉じます。ツールメニューの「プライベートブラウジングを終了」で復帰することができます。Firefoxがプライバシーモードにあるときはタイトルバーかタブにその旨が表示されます。もし自動で起動しない場合は手動でプライバシーモードで起動して${url}を開くか、別のブラウザ(もしくはブラウザプロファイル)をFreenet専用に使用してください。 -FirstTimeWizardToadlet.browserWarningOldFirefox=比較的古いバージョン(3以前)のFirefoxを使用しているようです。Firefox 4以降には重要なプライバシーの強化:CSS履歴漏れの修正が行なわれています。可能な限りブラウザを更新してください。 -FirstTimeWizardToadlet.browserWarningOldFirefoxNewerHasPrivacyMode=より新しいバージョンのFirefoxは、プライバシーモードもサポートしているため、助けになることでしょう。 -FirstTimeWizardToadlet.browserWarningSuggestion=${bold}"Microsoft Internet Explorerを除く"${/bold}ほとんどのWebブラウザでFreenetは正しく動作します。例えば、FirefoxやOpera、Safari、Chrome、Linxは動作することが分かっています。できる限りどれかをインストールし、このページのURLをアドレスバーからコピーして、新たなブラウザでそれを開いてください。 -FirstTimeWizardToadlet.browserWarningIncognitoSuggestion=Microsoft Internet Explorerを除くほとんどのWebブラウザでFreenetは正しく動作します。たとえばFirefoxやOpera、Safari、Chrome、Lynxは正しく動作することが確認されています。 -FirstTimeWizardToadlet.chooseNodeName=ノード名が必要です! -FirstTimeWizardToadlet.chooseNodeNameLong=下のフィールドにノードの名前を入力してください(ニックネームは出来ればemailアドレスとともに書くことをお勧めします)。これはあなたのフレンド(あなたが手動で追加した、信用するピア)が、他のノードからあなたのノードを見分けられるようにするためのものです。これは見知らぬ人(自動的に追加された、信用していないピア)には見ることができません。しかし、このノードは彼らと接続しているため、いかなるフレンドも見知らぬ人も、たやすくあなたをIPアドレスにより特定できますが、何をリクエストしているかは簡単には分かりません。 -FirstTimeWizardToadlet.connectToStrangers=見知らぬ人と接続しますか? -FirstTimeWizardToadlet.connectToStrangersLong=Freenetを稼動するには、少なくとも他に5のノードと接続しなければなりません。理想的には、あなたが知っており、信用している人が稼動しているノードであるべきです。Freenetを稼動している十分な友人を知らない場合、同じように見知らぬ人のノードと接続することができます。しかしながら、見知らぬ人と接続することは、あなたがFreenetを稼動していることを誰かに察知されることになったり、ある程度のセキュリティリスクを増やすことになります。Freenetの利用を秘密にしておきたければ、このことは面倒を引き起すでしょう。 -FirstTimeWizardToadlet.enableOpennet=十分なフレンドを追加したとき、見知らぬ人との接続は後で無効にできます。しかしながら、その合間に見知らぬ人にいくつかの情報を暴露しているでしょう。Freenetは未だ実験システムであり、我々はいかなるセキュリティ上の保証も行いません。 -FirstTimeWizardToadlet.enableUPnP=Enable Universal Plug and Play (UPnP). Set this if you have a router on your local network. Don't set it if you are directly connected to your ISP e.g. via dial-up modem, or have untrusted people on your local network (e.g. some student accommodation). -FirstTimeWizardToadlet.opennetYes=自動的にFreenetに、接続する見知らぬ人を探させます。 -FirstTimeWizardToadlet.opennetNo=少なくとも5人のFreenetを利用しているユーザがいて、フレンドのページで彼らの情報を追加します。 +FirstTimeWizardToadlet.bandwidthCouldNotParse=上限 "${limit}" を解釈できませんでした。 もう一度入力してください。 +FirstTimeWizardToadlet.bandwidthErrorSettingTitle=帯域幅制限の設定エラー +FirstTimeWizardToadlet.storage=ストレージ +FirstTimeWizardToadlet.storageLimitDescription=GiB のストレージを Freenet に割り当てる。 +FirstTimeWizardToadlet.requirePassword=Freenet 起動時にパスワードの入力を要求する。 +FirstTimeWizardToadlet.password=パスワード: +FirstTimeWizardToadlet.confirmPassword=パスワードを確認: +FirstTimeWizardToadlet.browserWarningPageTitle=ブラウザーのセキュリティー勧告 +FirstTimeWizardToadlet.browserWarningShort=Freenet 用に必ず別のブラウザー (またはプライベート/シークレットモード) を使用してください! +FirstTimeWizardToadlet.browserWarningShortRelativelySafe=セキュリティーを改善するためにプライベートモードか別のブラウザーを使用すべきです +FirstTimeWizardToadlet.browserWarningIncognitoShort=Freenet へのアクセスにシークレットモードを使用しています (よいことです) +FirstTimeWizardToadlet.browserWarning=シークレット/プライベートモードを使用しない場合は、Freenet へのアクセスに普段 Web を閲覧するブラウザーとは別のブラウザーを使用することを ${bold}強く${/bold} 推奨します。特に閲覧履歴を盗む攻撃は、あなたが最近訪れた Freenet ベースのサイト ("freesite") を悪意ある Web サイトが特定することを可能にし、匿名性が破壊されます。Freenet の Web インターフェースにアクセスする際は別のブラウザーを使用してください。例えば Windows 環境では、(システムトレイの) ウサギアイコンにある Freenet を閲覧するボタンをクリックすると、利用可能な場合は Google Chrome をシークレットブラウジングモードで自動的に開きます。 +FirstTimeWizardToadlet.browserWarningMaybeSafe=あなたは比較的安全な、十分新しいブラウザーを使用しています。しかしながらブラウザーは Freenet の閲覧履歴を保存します。プライベート/シークレットモードを使ってこれを防ぐことができます。手動で削除することもできますが、これは多くの場合追跡できるデータを残します。 +FirstTimeWizardToadlet.browserWarningIncognito=あなたはブラウザーのプライベート/シークレットモードを使用しているようです (タイトルバーを確認してください) 。これは比較的安全ですが、プライベートモードでない限りは Web と Freenet の閲覧に同じブラウザを使用しないでください。 +FirstTimeWizardToadlet.browserWarningIncognitoMaybeSafe=あなたは最近のブラウザーの、プライベート/シークレットモードを使っているようです (タイトルバーを確認してください) 。これは比較的安全です。古いブラウザー (Firefox 4 以前) では、プライベートモードでない限りは Web と Freenet の閲覧に同じブラウザーを使用しないでください。 +FirstTimeWizardToadlet.browserWarningFirefoxMightHaveClobberedTabs=Freenet は Firefox をプライベートモードで起動しようとしました。これはブラウザーが Freenet の閲覧履歴を保存することを防ぎます。バージョンによってはすでに開いてあったブラウザーのウィンドウやタブがすべて閉じてしまいます。ツールメニューの「プライベートブラウジングを終了」で復帰することができます。Firefox がプライベートモードの時はタイトルバーかタブにその旨が表示されます。自動で起動しない場合は手動でプライベートモードを起動して ${url} を開くか、別のブラウザー (かプロファイル) を Freenet 専用にしてください。 +FirstTimeWizardToadlet.browserWarningOldFirefox=比較的古いバージョン (3 以前) の Firefox を使用しているようです。Firefox 4 以降には重要なプライバシーの強化である CSS 履歴漏れの修正が行なわれています。可能な限りブラウザを更新してください。 +FirstTimeWizardToadlet.browserWarningOldFirefoxNewerHasPrivacyMode=より新しいバージョンの Firefox はプライベートモードもサポートしているため、助けになることでしょう。 +FirstTimeWizardToadlet.browserWarningSuggestion=Microsoft Internet Explorerを除くほとんどの Web ブラウザーで Freenet は正しく動作します。例えば、Firefox やOpera、Safari、Chrome、Lynx は動作することが知られています。できる限りどれかをインストールし、このページの URL をアドレスバーからコピーして、新たなブラウザーでそれを開いてください。 +FirstTimeWizardToadlet.browserImeWarning=サードパーティー製の IME (インプットメソッドエディター、一般的なアジアの言語の入力に使用される) を使用している場合は Freenet 用にそれらを無効にして OS 付属の IME を使用してください。サードパーティーの IME はあなたのキー入力を記録し外部のサーバーに送信しているという報告があります。 +FirstTimeWizardToadlet.browserVoiceRecognitionWarning=音声認識もまたデバイス上での監視に使用されます。 +FirstTimeWizardToadlet.browserWarningIncognitoSuggestion=Microsoft Internet Explorer を除くほとんどの Web ブラウザーで Freenet は正しく動作します。たとえば Firefox やOpera、Safari、Chrome、Lynx は正しく動作することが知られています。 +FirstTimeWizardToadlet.chooseNodeName=ノード名が必要です! +FirstTimeWizardToadlet.chooseNodeNameLong=下のフィールドにノードの名前を入力してください。(ニックネームは出来れば電子メールアドレスとともに書くことをお勧めします) これはあなたのフレンド (あなたが手動で追加した、信頼するピア) が、他のノードからあなたのノードを見分けられるようにするためのものです。これは見知らぬ人 (自動的に追加された、信頼していないピア) からは見ることができません。注意点として、このノードは彼らと接続しているため、いかなるフレンドや見知らぬ人もたやすくあなたをIPアドレスにより判別できますが、何をリクエストしているのかは簡単には分かりません。 +FirstTimeWizardToadlet.connectToStrangers=見知らぬ人と接続しますか? +FirstTimeWizardToadlet.connectToStrangersLong=Freenet を稼動するには、少なくとも他に 5 のノードと接続しなければなりません。理想的には、あなたが知っており、信頼している人が稼動しているノードであるべきです。Freenet を稼動している十分な人数のフレンドを知らない場合、代わりに見知らぬ人のノードと接続することができます。しかしながら、見知らぬ人と接続することは、あなたが Freenet を稼動していることを誰かに察知されることになったり、セキュリティリスクを増やすことになります。Freenet の利用を秘密にしておきたければ、このことは面倒を引き起すでしょう。 +FirstTimeWizardToadlet.enableOpennet=十分な数のフレンドを追加すれば、あとから見知らぬ人との接続を無効にできます。とはいえ、それまでの間にいくらかの情報を見知らぬ人に暴露してしまっています。Freenet はいまだ実験的なシステムであり、そのセキュリティーは保証されていません。 +FirstTimeWizardToadlet.enableUPnP=ユニバーサルプラグアンドプレイ (UPnP) を有効にする。あなたのローカルネットワークにルーターがある場合はこれを設定してください。あなたがダイアルアップモデムなどを経由して ISP に直接接続しているか、ローカルネットワークに信頼していない人がいる (学生寮など) 場合は使用しないでください。 +FirstTimeWizardToadlet.opennetYes=自動的に Freenet に、接続する見知らぬ人を探させます。 +FirstTimeWizardToadlet.opennetNo=少なくとも 5 人の既に Freenet を使用しているフレンドがいて、彼らの情報をフレンドページに追加します。 FirstTimeWizardToadlet.bandwidthLimit=帯域幅制限 FirstTimeWizardToadlet.continue=続ける FirstTimeWizardToadlet.currentPrefix=現在のサイズ: FirstTimeWizardToadlet.currentSpeed=現在の制限: FirstTimeWizardToadlet.datastoreSize=データストア容量 -FirstTimeWizardToadlet.highNetworkThreatLevelWarning=${bold}留意せよ:${/bold}高セキュリティモードではFreenetはフレンド以外には接続しません。フレンドは${bold}${friends}${/bold}メニューの${bold}${addAFriend}${/bold}ページで追加した、あなたが信用する人物です。高セキュリティモードでは少なくとも一人以上のフレンドを追加しなければ、Freenetは動作しません。できれば3人以上、効率のために5から10人以上を追加するべきでしょう。Freenetは他のノードとの接続そのものを隠蔽することはできず、それを経由して転送されるデータのみを隠蔽できます。信用していない人物や現実生活で公に関係を持ちたくない人物とは接続しないでください。 -FirstTimeWizardToadlet.highNetworkThreatLevelCheckbox=少なくとも一人のFreenetユーザを信用し、${bold}${addAFriend}${/bold}ページで彼らをフレンドに追加します。 -FirstTimeWizardToadlet.isNetworkTrusted=あなたのローカルネットワークは信用できますか? -FirstTimeWizardToadlet.isNetworkTrustedLong=あなたのローカルネットワークは信用できますか?ここで「はい」を撰択すると、あなたのノードが提供する全てのサービスは、そのネットワークの誰からもアクセスできるように解放されます。ウィザードが完了したら、設定のページから、選択的なアクセスコントロールを設定できます。 +FirstTimeWizardToadlet.datastoreSizeLong=データストアの容量を選択してください。推奨値は 1GiB から 20 GiB の間です。小さなデータストアはファイルのダウンロードに支障をきたし、大きなデータストアはネットワークに有益ですが、ファイルシステムへの高負荷によって、特にインストール後数時間の間、コンピューターの動作が重くなるかもしれません。データストアはキャッシュのように動作します; ネットワークのためにデータを保持すれば人気のファイルをリクエストした際により良いダウンロード速度を得られます。より多くの容量はコミュニティーとあなたのノードの動作速度、特にダウンロード速度にとって良い影響をもたらします。 +FirstTimeWizardToadlet.enableAutoUpdater=最初の起動時に自動更新を有効にしますか? +FirstTimeWizardToadlet.enableAutoUpdaterLong=最初の起動時に自動更新を有効にするかどうか。自動更新が利用できない環境向けにカスタム設定から無効にできます。 +FirstTimeWizardToadlet.highNetworkThreatLevelWarning=${bold}留意せよ:${/bold} 「高」セキュリティーモードでは Freenet はあなたのフレンドとだけ接続します。フレンドは ${bold}${friends}${/bold} の ${bold}${addAFriend}${/bold} ページであなたが追加した、あなたが信頼する人たちです。「高」セキュリティーモードでは Freenet は最低 1 人のフレンドを追加するまで動作せず、少なくとも 3 人、より良いパフォーマンスのためには 5 から 10 人を追加するべきです。Freenet が隠せるのは転送の中身のみで、他への接続そのものは隠せません。あなたが信頼していなかったり、現実生活で公に結び付けられたくない人とは接続しないでください。 +FirstTimeWizardToadlet.highNetworkThreatLevelCheckbox=少なくとも一人の Freenet ユーザを信頼し、${bold}${addAFriend}${/bold} ページで彼らをフレンドに追加します。 +FirstTimeWizardToadlet.isNetworkTrusted=あなたのローカルネットワークは信頼できますか? +FirstTimeWizardToadlet.isNetworkTrustedLong=あなたのローカルネットワークは信頼できますか?「はい」と答えた場合、あなたのノードが提供するすべてのサービスがネットワーク内のアクセスを希望するすべての人に公開されます。ウィザード終了後に設定ページから選択的なアクセス制御をおこなうことができます。 FirstTimeWizardToadlet.noNetworkIF=追加のネットワークインターフェースが見つかりませんでした -FirstTimeWizardToadlet.noNetworkIFLong=追加のネットワークインターフェースが見付かりませんでした。あなたのコンピュータからしか接続できなくなるでしょう。 -FirstTimeWizardToadlet.iDoTrust=${interface} (${ip})に接続した人を信用しますか? +FirstTimeWizardToadlet.noNetworkIFLong=Freenet hasn't found any additional network interface. It will assume that you will connect to it from your computer and only from it. +FirstTimeWizardToadlet.iDoTrust=${interface} (${ip}) に接続した人を信頼しますか? +FirstTimeWizardToadlet.loadUPnPPlugin=最初の起動時に UPnP プラグインを読み込みますか? +FirstTimeWizardToadlet.loadUPnPPluginLong=最初の起動時に UPnP プラグインを読み込むかどうか。UPnP 対応ルーターが利用できない環境向けにカスタム設定から無効にできます。 FirstTimeWizardToadlet.memory.64M=64MiB - 絶望的なとき FirstTimeWizardToadlet.memory.128M=128MiB - 最低限 -FirstTimeWizardToadlet.memory.192M=192MiB - 合理的でデフォルト -FirstTimeWizardToadlet.memory.512M=512MiB - 大容量のRAMを持っている場合 -FirstTimeWizardToadlet.memoryLimit=メモリ使用 -FirstTimeWizardToadlet.networkThreatLevelConfirmTitle.HIGH=フレンドを追加しなければFreenetは接続できません! -FirstTimeWizardToadlet.networkThreatLevelConfirmTitle.MAXIMUM=フレンドを追加しなければFreenetは接続できません! -FirstTimeWizardToadlet.networkThreatLevelIntroOpennet=Freenetは見知らぬ人と接続し、セキュリティは比較的低下します。望むならば後でフレンドを追加できます。あなたを追跡しようとする人への対策はどの程度考えていますか? -FirstTimeWizardToadlet.networkThreatLevelIntroDarknet=Freenetはあなたのフレンドとのみ接続するため他人に通信の内容を追跡するのを非常に困難なものとします。どの程度あなたを追跡しようとする人への対策を予定していますか? -FirstTimeWizardToadlet.networkThreatLevelHeaderOpennet=インターネット経由であなたを攻撃しようとする攻撃者に対する防御(見知らぬ人との接続) -FirstTimeWizardToadlet.networkThreatLevelHeaderDarknet=インターネット越しにあなたを攻撃しようとする見知らぬ人に対する防御(フレンドとのみ接続する) -FirstTimeWizardToadlet.networkSecurityPageTitle=ネットワークセキュリティ -FirstTimeWizardToadlet.opennetChoicePageTitle=Freenetを誰と接続させるべき? -FirstTimeWizardToadlet.opennetChoiceTitle=Freenetで誰と接続するべきですか? -FirstTimeWizardToadlet.opennetChoiceIntroduction=Freenetは、チャットの文章やダウンロード、閲覧などであなたを追跡し特定することを防ぐように設計されています。Freenetは、あなたが直接接続している人をあなたが知っているときのみ、強力な防御を提供できます。 +FirstTimeWizardToadlet.memory.192M=192MiB - 合理的な標準 +FirstTimeWizardToadlet.memory.256M=256MiB - 少なくとも 1GiB の RAM が利用可能な場合 +FirstTimeWizardToadlet.memory.512M=512MiB - 大容量の RAM が利用可能な場合 +FirstTimeWizardToadlet.memoryLimit=メモリーの使用量 +FirstTimeWizardToadlet.memoryLimitLong=Freenet にどの程度の量のメモリーの使用を許可しますか?キューに多くのダウンロードやアップロードがある場合、Freenet はより多くのメモリーを必要とします。RAM が本当に不足している場合を除き、128MiB 以上に設定することを提案します。メモリーを 1GiB かそれより多く搭載している場合は少なくとも 256MiB に設定すべきです。この設定は Freenet の再起動後に適用されます。 +FirstTimeWizardToadlet.networkThreatLevelConfirmTitle.HIGH=フレンドを追加しなければ Freenet は接続できません! +FirstTimeWizardToadlet.networkThreatLevelConfirmTitle.MAXIMUM=フレンドを追加しなければ Freenet は接続できません! +FirstTimeWizardToadlet.networkThreatLevelIntroOpennet=Freenet は見知らぬ人と接続し、セキュリティーは比較的低下します。望むならば後でフレンドを追加できます。あなたを追跡しようとする人への対策はどの程度考えていますか? +FirstTimeWizardToadlet.networkThreatLevelIntroDarknet=Freenet はあなたのフレンドとのみ接続するため、あなたを追跡するのはとても困難になります。あなたを追跡しようとする人への対策はどの程度考えていますか? +FirstTimeWizardToadlet.networkThreatLevelHeaderOpennet=インターネット経由であなたを攻撃しようとする攻撃者に対する防御 (見知らぬ人と接続する) +FirstTimeWizardToadlet.networkThreatLevelHeaderDarknet=インターネット経由であなたを攻撃しようとする攻撃者に対する防御 (フレンドとのみ接続する) +FirstTimeWizardToadlet.networkSecurityPageTitle=ネットワークセキュリティー +FirstTimeWizardToadlet.networkSecurityIKnowSomeoneWhoRunsFreenet=Freenet を稼働させている人を知っています。 +FirstTimeWizardToadlet.networkSecurityFreenetWillConnectToStrangers=Freenet は見知らぬ人と接続します。セキュリティーを改善するために、信頼できるフレンドへの接続を後から追加できます。 +FirstTimeWizardToadlet.networkSecurityIWantToConnectToUntrustedStrangers=パフォーマンスを改善するために信頼できない見知らぬ人と接続したいです。 +FirstTimeWizardToadlet.opennetChoicePageTitle=Freenet で誰と接続するべきですか? +FirstTimeWizardToadlet.opennetChoiceTitle=Freenet で誰と接続するべきですか? +FirstTimeWizardToadlet.opennetChoiceIntroduction=Freenet はチャットの文章やダウンロード、閲覧などであなたを追跡し特定することを防ぐように設計されています。Freenet はあなたが直接接続している人をあなたが知っているときのみ強力な防御を提供できます。 FirstTimeWizardToadlet.opennetChoiceConnectFriends=フレンドとのみ接続する -FirstTimeWizardToadlet.opennetChoiceConnectStrangers=見知らぬ人との接続 -FirstTimeWizardToadlet.opennetChoiceConnectFriendsPRO=Freenet上のあらゆる通信を追跡することが非常に困難になります。 -FirstTimeWizardToadlet.opennetChoiceConnectFriendsCON=Freenetを利用するためには、少なくとも ${minfriends} 人のフレンドが必要です。 -FirstTimeWizardToadlet.opennetChoiceConnectStrangersPRO=Freenetを使用している人を知る必要はありません。 -FirstTimeWizardToadlet.opennetChoiceConnectStrangersCON=あなたのメッセージやファイルなどは、とっても簡単に追跡し、あなたを特定できます。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetToggle=Freenetは十分な匿名性を提供し、非常に遮断しにくいです: (クリックして見る) +FirstTimeWizardToadlet.opennetChoiceConnectStrangers=見知らぬ人と接続する +FirstTimeWizardToadlet.opennetChoiceConnectFriendsPRO=Freenet 上のあらゆる通信をあなたまで追跡することが非常に困難になります。 +FirstTimeWizardToadlet.opennetChoiceConnectFriendsCON=少なくとも ${minfriends} 人の Freenet を使用しているフレンドが必要です。 +FirstTimeWizardToadlet.opennetChoiceConnectStrangersPRO=Freenet を使用している人を知る必要はありません。 +FirstTimeWizardToadlet.opennetChoiceConnectStrangersCON=あなたのメッセージやファイルなどをあなたまで追跡するのがとても容易になります。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetToggle=Freenet は十分な匿名性を提供し、非常に遮断しにくいです: (クリックして見る) +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetStupid=あなたの正体を明らかにしてしまうような行動をとらないでください。例えば実名を使ったり、家の住所を掲示板に投稿したり、個人的に繋がりのある人について話したりなどです。それ以外に個人を特定しうる情報には通っている学校などの常識的なものの他にも IP アドレスや Freenet のポート番号、場合によっては Freenet のログや統計も含まれます。問題が発生した場合には助けを求める前に新しいアイデンティティーを作成すべきです。 FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetFriends=フレンドとのみ接続します。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetTrustworthy=あなたのフレンドは信用に足ります(しかし見知らぬ人は常にフレンドより格下です) -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetNoSuspect=潜在的な攻撃者はまだあなたが誰でどこにいるかは知りも疑いもしません: 彼らはただあなたがFreenetの特定のアイデンティティであることだけを知っています。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetSSK=ファイルは常に安全にアップロードされます。Freenetが方法を指示します。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetOS=あなたのフレンドはコンピュータを安全に保ちます。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetBigPriv=あなたは巨大なネットワーク(たとえば見知らぬ人への接続を有効にしたときに得られる主なFreenet)もしくは攻撃者の知らないプライベートなネットワークの一部です。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetDistant=見知らぬ人とあなたとは、特段には近過ぎません。たとえばあなたのフレンドが見知らぬ人と接続するならば、とても強い攻撃者に対しては安全でなくなるでしょう。ほとんどの利用者はこの点を心配する必要はありませんが、見知らぬ人無しにフレンドのみで接続するほど安全になります。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetBugs=Freenetには深刻なバグは存在しません。しかしすべてのある程度のサイズのプログラムにはバグがあります。Freenetの匿名性に影響するような深刻なバグが出ないことを望みますが、それを見落すこともありえます。ご留意ください。 -FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetFoot2=おそらく今、あなたは見知らぬ人とただ連携するために接続したいことでしょう。しかしながら"本気の"攻撃者があなたのアップロード/ダウンロード/会話などを追跡できるかもしれないため、あなたが危険なファイルをアップロードしようとしているのならば、この撰択を行なわないでください。いずれは、各々のフレンドとのみ接続していただきたく思います。その方がはるかに安全です。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetTrustworthy=あなたのフレンドは信用に足ります (しかし見知らぬ人は常にフレンドより格下です) +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetNoSuspect=潜在的な攻撃者はまだあなたが誰でどこにいるかは知りも疑いもしません: 彼らはただあなたが Freenet の特定のアイデンティティーであることだけを知っています。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetChangeID=たまにはあなたの匿名のアイデンティティーを変更してください (フォーラムなどで) +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetSSK=ファイルは常に安全にアップロードされます。Freenet が方法を指示します。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetOS=あなたのフレンドはコンピュータを安全に保つべきです。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetBigPriv=あなたは大きなネットワーク (見知らぬ人との接続を有効にして得られるメインの Freenet )、もしくは攻撃者の知らないプライベートなネットワークの一部です。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetDistant=見知らぬ人とあなたとは、特段には近過ぎません。たとえばあなたのフレンドが見知らぬ人と接続するならば、とても強い攻撃者に対しては安全でなくなるかもしれません。ほとんどの利用者はこの点を心配しすぎる必要はありませんが、見知らぬ人無しにフレンドのみで接続すればより安全になります。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetBugs=Freenet には深刻なバグは存在しません。しかしすべてのある程度のサイズのプログラムにはバグがあります。Freenet の匿名性に影響するような深刻なバグが出ないことを望みますが、それを見落すこともありえます。ご留意ください。 +FirstTimeWizardToadlet.opennetChoiceHowSafeIsFreenetFoot2=おそらく今は、単に接続済みとなるために見知らぬ人と接続したいことでしょう。しかし、"本気の"攻撃者はあなたのアップロード・ダウンロード・会話などを追跡できるかもしれないので、危険なコンテンツをアップロードしようとしているのならば見知らぬ人とは接続しないでください。いずれはすべてのユーザーが各々のフレンドとのみ接続することを望みます。そのほうがはるかに安全です。 FirstTimeWizardToadlet.opennetChoicePro=利点 -FirstTimeWizardToadlet.opennetChoiceCon=不利益 -FirstTimeWizardToadlet.friendsSecurityPageTitle=フレンド間のセキュリティ -FirstTimeWizardToadlet.physicalSecurityPageTitle=物理的なセキュリティ +FirstTimeWizardToadlet.opennetChoiceCon=欠点 +FirstTimeWizardToadlet.friendsSecurityPageTitle=フレンドとのセキュリティー +FirstTimeWizardToadlet.physicalSecurityPageTitle=物理的なセキュリティー FirstTimeWizardToadlet.plugins=プラグイン -FirstTimeWizardToadlet.pluginsLong=プラグインは特定方面にFreenetを強化する補強オプションです。ユーザによってはセキュリティの問題を含むものもあります。下をご覧ください。 -FirstTimeWizardToadlet.presetTitleLow=どのFreenetユーザとも接続する: (低いセキュリティ) -FirstTimeWizardToadlet.presetChooseLow=低セキュリティを選択する -FirstTimeWizardToadlet.presetLow=Freenetの稼動が合法である比較的自由な国に住んでいる場合は、このオプションを選ぶことができます。BitTorrentやGnutellaのような従来のP2Pソフトウェアよりもはるかに安全ですが、そこそこのリソースを持つ攻撃者があなたのFreenetでの行動を追跡するかもしれません。Freenetを稼動させている友人がいるのならば、彼らをフレンドとして登録し、彼らとのみ接続することでセキュリティを向上することができます。 -FirstTimeWizardToadlet.presetTitleHigh=フレンドとのみ接続する: (高セキュリティ) -FirstTimeWizardToadlet.presetChooseHigh=高セキュリティを選択 -FirstTimeWizardToadlet.presetHigh=あなたが接続する人を数人知っているならば、この設定により大いにセキュリティが向上したあなたのFreenetダークネットを作成できます。数人知っているだけではあまり有用ではありませんが、彼らのうち数人が他のノードを知っていたなら、もしくは低セキュリティが選択されていたならば、あなたは巨大なネットワークを持つことができます。 +FirstTimeWizardToadlet.pluginsLong=プラグインは特定方面に Freenet を強化する任意の拡張です。ユーザーの状況によってはセキュリティーの問題を含むものもあります。以下をご覧ください。 +FirstTimeWizardToadlet.presetTitleLow=どの Freenet ユーザーとも接続する: (低セキュリティー) +FirstTimeWizardToadlet.presetChooseLow=低セキュリティーを選択する +FirstTimeWizardToadlet.presetLow=Freenet の稼動が合法であるような比較的自由な国に住んでいる場合は、この設定を選ぶことができます。BitTorrent や Gnutella のような従来の P2P ソフトウェアよりかはずっと安全ですが、そこそこのリソースを持つ攻撃者があなたの Freenet での行動を追跡するかもしれません。Freenet を稼動させている友人がいるのならば、彼らをフレンドとして登録し、彼らとのみ接続することでセキュリティーを向上することができます。 +FirstTimeWizardToadlet.presetTitleHigh=フレンドとのみ接続する: (高セキュリティー) +FirstTimeWizardToadlet.presetChooseHigh=高セキュリティーを選択する +FirstTimeWizardToadlet.presetHigh=あなたが接続する人を何人か知っているのならば、この設定によりセキュリティーを大幅に向上させるためにあなた用の Freenet ダークネットを作成できます。知り合いが少ししかいない場合はあまり有用ではありませんが、その内の誰かが他の人を知っているか、もしくは低セキュリティーを選択している場合は巨大なネットワークの一員となれます。 FirstTimeWizardToadlet.presetTitleNone=詳細な設定: (カスタム) -FirstTimeWizardToadlet.presetNone=きめ細かな設定をお望みならば、このオプションによりあなたが必要なプライバシーにそった設定ができます。他の二つのオプションより少し時間がかかるでしょう。 -FirstTimeWizardToadlet.presetChooseNone=セキュリティを手動で設定する +FirstTimeWizardToadlet.presetNone=きめ細かな設定をお望みならば、これの選択によりあなたが必要とするプライバシーにそった設定ができます。他の二つの選択肢より少し時間がかかるでしょう。 +FirstTimeWizardToadlet.presetChooseNone=セキュリティーを手動で設定する FirstTimeWizardToadlet.step1Title=フレンドと見知らぬ人 FirstTimeWizardToadlet.step2Title=ノードに名前を付ける FirstTimeWizardToadlet.step3Title=帯域幅制限 FirstTimeWizardToadlet.step4Title=データストア容量 FirstTimeWizardToadlet.stepMiscTitle=更新とプラグイン -FirstTimeWizardToadlet.tenPercentDisk=(= ディスク空き容量の10%) -FirstTimeWizardToadlet.fivePercentDisk=(= ディスクの空き容量の5%) -FirstTimeWizardToadlet.backToSecurityLevels=パスワードを設定せずにウィザードに戻る -FProxyToadlet.abortToHomepage=中止してFreenetホームページに戻る +FirstTimeWizardToadlet.backToSecurityLevels=パスワードを設定せずにウィザードに戻る。 +FirstTimeWizardToadlet.valid.downloadLimit=ダウンロード制限は少なくとも ${limit} KiB であるべきです +FirstTimeWizardToadlet.valid.number.prefix.downloadLimit=ダウンロード制限エラー +FirstTimeWizardToadlet.valid.uploadLimit=アップロード制限は少なくとも ${limit} KiB であるべきです +FirstTimeWizardToadlet.valid.uploadLimitMax=アップロード制限は ${limit} KiB よりも少なくあるべきです +FirstTimeWizardToadlet.valid.number.prefix.uploadLimit=アップロード制限エラー +FirstTimeWizardToadlet.valid.bandwidthMonthlyLimit=月ごとの制限は少なくとも ${limit} GiB であるべきです +FirstTimeWizardToadlet.valid.number.prefix.bandwidthMonthlyLimit=月ごとの制限エラー +FirstTimeWizardToadlet.valid.number.prefix.storageLimit=ストレージ制限エラー +FLAC.InvalidFLACStreamTitle=不正な FLAC ストリーム +FLAC.InvalidFLACStreamMessage=FLAC ストリームが破損、もしくは異常であることが確認されました。サニタイズできません。 +FProxyToadlet.abortToHomepage=中断して FProxy のホームページに戻る FProxyToadlet.addFriendTitle=フレンドを追加 -FProxyToadlet.addFriend=セキュリティを向上させるためFreenetを稼動させているフレンドと接続する +FProxyToadlet.addFriend=セキュリティーを向上させるため Freenet を稼動させているフレンドと接続する FProxyToadlet.alertsTitle=メッセージ FProxyToadlet.alerts=詳細な状態警告とフレンドからのメッセージ -FProxyToadlet.backToFProxy=${link}ここをクリック${/link}するとFreenetホームページに移動します。 -FProxyToadlet.backToReferrer=${link}ここをクリック${/link}すると参照ページに戻ります。 +FProxyToadlet.backToFProxy=${link}ここをクリック${/link}すると Freenet ホームページに移動します。 +FProxyToadlet.backToReferrer=${link}ここをクリック${/link}すると元のページに戻ります。 FProxyToadlet.blocksDetail=ブロック: ${fetched} / ${required} (合計 ${total} 失敗 ${failed} 致命的失敗 ${fatallyfailed}) -FProxyToadlet.cantBindPort=Webインターフェースをポートにバインドできません! -FProxyToadlet.categoryBrowsing=ブラウジング -FProxyToadlet.categoryTitleBrowsing=Freenet を閲覧します -FProxyToadlet.categoryChat=ディスカッション +FProxyToadlet.cantBindPort=Web インターフェースをポートにバインドできません! +FProxyToadlet.categoryBrowsing=閲覧 +FProxyToadlet.categoryTitleBrowsing=Freenet を閲覧する +FProxyToadlet.categoryChat=議論 FProxyToadlet.categoryTitleChat=Freenet 上の掲示板で他の人々と話しましょう FProxyToadlet.categoryStatus=ステータス -FProxyToadlet.categoryTitleStatus=ステータス情報を見る +FProxyToadlet.categoryTitleStatus=ステータス情報 FProxyToadlet.categoryQueue=ファイル共有 FProxyToadlet.categoryTitleQueue=アップロードとダウンロード FProxyToadlet.categoryConfig=設定 FProxyToadlet.categoryTitleConfig=Freenet を設定する FProxyToadlet.categoryFriends=フレンド -FProxyToadlet.categoryTitleFriends=Freenetの効率とセキュリティを改善するためにフレンドと接続する +FProxyToadlet.categoryTitleFriends=Freenetのパフォーマンスとセキュリティーを改善するためにフレンドと接続する FProxyToadlet.chatForumsTitle=フォーラム -FProxyToadlet.chatForums=チャットフォーラムで匿名で他のFreenetユーザと話す方法 -FProxyToadlet.config=あなたのノードを設定 +FProxyToadlet.chatForums=チャットフォーラムで匿名で他の Freenet ユーザーと話す方法 +FProxyToadlet.config=あなたのノードを設定する FProxyToadlet.configTitle=設定 -FProxyToadlet.contentTypeLabel=コンテンツタイプ: +FProxyToadlet.contentTypeLabel=コンテンツの種類: FProxyToadlet.dangerousContentTitle=潜在的に危険なコンテンツ -FProxyToadlet.dangerousRSS=FreenetはダウンロードしようとしたファイルがRSSであろうことを検知しました。RSSはFreenetでは詳細なフィルタができず、webバグ(あなたのIPアドレスを悪質なサイトに暴露し、あなたの匿名性を破壊するかもしれない、インラインイメージなど)を含んでいるかもしれません。Firefox 2.0とInternet Explorer 7.0はファイルをコンテンツタイプが"${type}"であるにも拘らず、RSSとして開きます。 -FProxyToadlet.dangerousRSSSubtitle=RSSフィードは危険になりうる -FProxyToadlet.dangerousRSSTitle=潜在的に危険なコンテンツ(RSS) -FProxyToadlet.diagnostic=開発者に送信する診断 -FProxyToadlet.diagnosticTitle=診断 +FProxyToadlet.dangerousRSS=Freenet は取得しようとしたファイルが RSS であろうことを検知しました。RSS は Freenet では適切なフィルターができず、webバグ (あなたの IP アドレスを悪意のあるサイトの作者に暴露し、あなたの匿名性を破壊するかもしれない、インラインイメージなど) を含んでいるかもしれません。Firefox 2.0 と Internet Explorer 7.0 はファイルをコンテンツの種類が "${type}" であるにも拘らず、RSS として開きます。 +FProxyToadlet.dangerousRSSSubtitle=RSS フィードは危険になりえます +FProxyToadlet.dangerousRSSTitle=潜在的に危険なコンテンツ (RSS) +FProxyToadlet.diagnostic=開発者に送信する診断情報 +FProxyToadlet.diagnosticTitle=診断情報 FProxyToadlet.downloadInBackgroundToDiskButton=ダウンロード -FProxyToadlet.downloadInBackgroundToDisk=バックグラウンドでファイルを${dir}にダウンロードします。${page}ダウンロードページ${/page}で進行状況を確認できます。 +FProxyToadlet.downloadInBackgroundToDisk=バックグラウンドでファイルをダウンロードして ${dir} へ保存します。ダウンロードが完了すると通知され、${page}ダウンロードページ${/page}で進行状況を確認できます。 FProxyToadlet.downloadInBackgroundToTempSpaceButton=取得 -FProxyToadlet.downloadInBackgroundToTempSpace=バックグラウンドでファイルをフェッチします。ファイルは${page}ダウンロードページ${/page}から${bold}のみ${/bold}アクセスでき、 Freenetをアンインストールしたり、パニックボタンを作動したり、マスターパスワードを紛失すると喪失します。フェッチが完了すると通知されます。 -FProxyToadlet.downloadToDiskWarningNotFiltered=${bold}警告${/bold}: ディスクにダウンロードしたファイルはフィルタリングされません。もしウィルス、トロイの木馬などを含む実行ファイルだった場合、あなたのIPアドレスを明かし、お使いのWebブラウザや他のソフトウェアの匿名性を突破させる可能性があるため注意してください。 -FProxyToadlet.downloadToDiskSecurityWarning=${bold}警告${/bold}: これは暗号化されていないファイルをディスクに保管します。ディスク汎暗号化を利用していない場合はセキュリティ上のリスクが発生します。 +FProxyToadlet.downloadInBackgroundToTempSpace=バックグラウンドでファイルを取得します。ファイルは${page}ダウンロードページ${/page}から${bold}のみ${/bold}アクセスでき、 Freenet をアンインストールしたり、パニックボタンを作動させたり、マスターパスワードを紛失すると喪失します。取得が完了すると通知されます。 +FProxyToadlet.downloadToDiskWarningNotFiltered=${bold}警告${/bold}: ディスクにダウンロードしたファイルはフィルターされません。Web ブラウザーや他のソフトウェアによって匿名性が喪失し、あなたの IP アドレスを明かし、それが実行ファイルである場合はウイルスやトロイの木馬を含む可能性があるので、ダウンロードしたファイルを開くときは注意してください。 +FProxyToadlet.downloadToDiskSecurityWarning=${bold}警告${/bold}: これは暗号化されていないファイルをディスクに保存します。ディスク全体を暗号化していない場合はセキュリティー上のリスクとなるかもしれません。 FProxyToadlet.downloadsTitle=ダウンロード FProxyToadlet.downloads=Freenet からダウンロード中のファイル FProxyToadlet.errorIsFatal= 致命的エラーです。再試行では問題の解決は不可能だと思われます。 FProxyToadlet.errorWithReason=エラー: ${error} -FProxyToadlet.expectedKeyButGot=Freenetキーを見込んでいましたが、得たものは: -FProxyToadlet.expectedMimeType=予想タイプ: ${mime} +FProxyToadlet.expectedKeyButGot=Freenet 鍵を見込んでいましたが、得たものは: +FProxyToadlet.expectedMimeType=予想される種類: ${mime} FProxyToadlet.explanationTitle=説明 FProxyToadlet.fetchingPageTitle=ページをダウンロード中 -FProxyToadlet.fetchingPageBox=Freenet はあなたがリクエストしたページをダウンロードしています -FProxyToadlet.fetchingPageOptions=あなたのオプション -FProxyToadlet.fetchLargeFileAnywayAndDisplay=ブラウザでファイルを開きます。ファイルが大きい場合はしばらくかかることがあります。 -FProxyToadlet.fetchLargeFileAnywayAndDisplayButton=ディスプレイ +FProxyToadlet.fetchingPageBox=Freenet はあなたが要求したページをダウンロードしています +FProxyToadlet.fetchingPageOptions=あなたの選択 +FProxyToadlet.fetchLargeFileAnywayAndDisplay=ブラウザーでファイルを開きます。これにはしばらくかかる可能性があり、ファイルは大きいかもしれません。 +FProxyToadlet.fetchLargeFileAnywayAndDisplayButton=表示 FProxyToadlet.fileInformationTitle=ファイル情報 FProxyToadlet.filenameLabel=ファイル名: -FProxyToadlet.filterFile=コンテンツフィルタを通してファイルを実行 -FProxyToadlet.filterFileTitle=ファイルをフィルタ -FProxyToadlet.filterData=データをフィルタする: -FProxyToadlet.filterDataMessage=これを選択するとあなたのリクエストはコンテンツフィルタを経由して処理されます。フィルタはあなたのコンピュータを害したり、あなたの匿名性を暴露しうるすべてのものを妨害します。これをチェックしておくことを強くおすすめします。 +FProxyToadlet.filterFile=コンテンツフィルターにファイルを経由させる +FProxyToadlet.filterFileTitle=ファイルをフィルターする +FProxyToadlet.filterData=データをフィルターする: +FProxyToadlet.filterDataMessage=これを選択するとあなたのリクエストはコンテンツフィルターを経由して処理されます。フィルターはあなたのコンピュータを害したり、あなたの匿名性を破壊しうるすべてのものを妨害します。これを選択しておくことを強くおすすめします。 FProxyToadlet.friends=フレンドのノードとの接続 FProxyToadlet.friendsTitle=フレンドへの接続 FProxyToadlet.goBack=戻る FProxyToadlet.goBackToPrev=前のページに戻る FProxyToadlet.help=ヘルプ -FProxyToadlet.insertFreesiteTitle=Freesite をアップロード +FProxyToadlet.insertFreesiteTitle=freesite をアップロード FProxyToadlet.insertFreesite=ウェブサイトを Freenet 上に匿名でアップロードする -FProxyToadlet.invalidKeyTitle=無効なキー -FProxyToadlet.invalidKeyWithReason=キーが無効です: ${reason} +FProxyToadlet.invalidKeyTitle=無効な鍵 +FProxyToadlet.invalidKeyWithReason=無効な鍵: ${reason} FProxyToadlet.largeFile=大きなファイル -FProxyToadlet.largeFileExplanationAndOptions=あなたがリクエストしたFreenetキーは大きなファイルを参照しています。このサイズのファイルは、Freenetノードにあまりに長い探索時間が発生するため、ブラウザに直接ダウンロードできません。これらのオプションが使用できます: +FProxyToadlet.largeFileExplanationAndOptions=あなたが要求した Freenet 鍵は大きなファイルを参照しています。このサイズのファイルは Freenet ノードが取得するのにとても長い時間がかかるため、一般にブラウザに直接送ることができません。以下の選択肢があります: FProxyToadlet.mayChange= (変更されるかも) -FProxyToadlet.mimeType=コンテンツタイプ: ${mime} +FProxyToadlet.mimeType=コンテンツの種類: ${mime} FProxyToadlet.notFoundTitle=見つかりません -FProxyToadlet.openAsText=${link}ここをクリック${/link}するとファイルをプレインテキストで開きます (危険ではないでしょうが文字化けするかもしれません)。 -FProxyToadlet.openAsThawIndex=${link}ここをクリック${/link}するとファイルをthawインデックスブラウザで開きます(上の警告を読んで!)。 -FProxyToadlet.openForce=${link}ここをクリック${/link}するとフィルタリングすることなく${mime}のファイルを開きます(推奨されません: 上記の警告を読んでください!)。 -FProxyToadlet.openForceDisk=${link}ここをクリック${/link}するとブラウザにファイルをディスクにダウンロードさせます。 -FProxyToadlet.openRSSAsRSS=${link}ここをクリック${/link}するとファイルをRSSで開きます(FreenetはRSSをまだフィルタする方法が無いため、サイトの作者が悪意をもってした場合これは${bold}危険${/bold}です。) -FProxyToadlet.openRSSForce=${link}ここをクリック${/link}するとファイルを${mime}として開きます。(IE7 or FF2ではこれは${bold}危険になりえます${/bold}) +FProxyToadlet.openAsText=${link}ここをクリック${/link}するとファイルをプレーンテキストで開きます (危険ではないでしょうが文字化けするかもしれません)。 +FProxyToadlet.openAsThawIndex=${link}ここをクリック${/link}するとファイルを thaw インデックスブラウザーで開きます (上の警告を読んで!)。 +FProxyToadlet.openForce=${link}ここをクリック${/link}するとフィルターすることなく ${mime} としてファイルを開きます("推奨されません": 上記の警告を読んでください!)。 +FProxyToadlet.openForceDisk=${link}ここをクリック${/link}するとブラウザーにファイルをディスクにダウンロードさせます。 +FProxyToadlet.openPossRSSForceDisk=${link}ここをクリック${/link}するとブラウザーにファイルをディスクにダウンロードさせようとします (これは${bold}危険になりえます${/bold})。 +FProxyToadlet.openPossRSSAsPlainText=${link}ここをクリック${/link}するとファイルをプレーンテキストとして開きます (これは IE 7 を実行している場合${bold}危険になりえます${/bold})。 +FProxyToadlet.openRSSAsRSS=${link}ここをクリック${/link}するとファイルを RSS として開きます (Freenet は RSS をまだフィルターできないため、サイトの作者に悪意がある場合これは${bold}危険${/bold}です)。 +FProxyToadlet.openRSSForce=${link}ここをクリック${/link}するとファイルを ${mime} として開きます (IE7 か FF2 ではこれは${bold}危険になりえます${/bold})。 FProxyToadlet.opennet=信用する理由のないノードとの接続 FProxyToadlet.opennetTitle=見知らぬ人との接続 -FProxyToadlet.openWithKeyExplorer=${link}ここをクリック${/link}するとFreenet URIをキーエクスプローラで開きます。 -FProxyToadlet.openWithSiteExplorer=${link}ここをクリック${/link}するとサイトエクスプローラでFreenet URIを開きます。 -FProxyToadlet.options=あなたのオプションは: +FProxyToadlet.openWithKeyExplorer=${link}ここをクリック${/link}すると Freenet URI を鍵エクスプローラーで開きます。 +FProxyToadlet.openWithSiteExplorer=${link}ここをクリック${/link}すると Freenet URI をサイトエクスプローラーで開きます。 +FProxyToadlet.options=あなたの選択は: FProxyToadlet.pathNotFound=指定されたパスは存在しません。 -FProxyToadlet.pathNotFoundTitle=パスが見付かりませんでした +FProxyToadlet.pathNotFoundTitle=パスが見つかりませんでした FProxyToadlet.plugins=プラグインの設定 FProxyToadlet.pluginsTitle=プラグイン -FProxyToadlet.progressCheckingStore=リクエストされたファイルがローカルキャッシュに存在するかを確認した後、Freenetからダウンロードを行います。 +FProxyToadlet.progressCheckingStore=このページかファイルがローカルキャッシュに存在するか確認した後、Freenet からダウンロードを行います。 FProxyToadlet.lastRefresh=最終更新は {0} 前です -FProxyToadlet.progressDownloading=あなたのコンピュータはこのページかファイルをFreenetからダウンロードしています。ページ/ファイルのサイズ・流通度によって数秒から数分かかります - Freenetでよくアクセスされるほど、可用性とダウンロードスピードが向上します。 -FProxyToadlet.progressNotFinalized=ファイルのサイズを決定するのに十分なブロックをダウンロードするまで、進捗状況バーがジャンプします。 -FProxyToadlet.progressOptionZero=お待ちください。ファイルがダウンロードされるかFreenetがファイルのダウンロードを諦めたとき、ページが更新されます。 代替案: +FProxyToadlet.progressDownloading=このページかファイルを Freenet からダウンロード中です。ファイルサイズと人気度によって数秒から数分かかります - Freenet でよくアクセスされるほど可用性とダウンロード速度が向上します。 +FProxyToadlet.progressNotFinalized=ファイルのサイズを決定するのに十分なブロックをダウンロードするまで、進捗状況バーが大きく変動します。 +FProxyToadlet.progressOptionZero=お待ちください。ファイルがダウンロードされるか Freenet がファイルの捜索を諦めるまでページは更新されます。代替案: FProxyToadlet.uploadsTitle=アップロード FProxyToadlet.uploads=Freenet へアップロード中のファイル FProxyToadlet.uploadFileWizardTitle=ファイルをアップロード FProxyToadlet.uploadFileWizard=Freenet へファイルをアップロード FProxyToadlet.retryNow=今すぐ再試行 -FProxyToadlet.seclevelsTitle=セキュリティレベル -FProxyToadlet.seclevels=Freenetによって供給されるセキュリティのレベルを設定 +FProxyToadlet.seclevelsTitle=セキュリティーレベル +FProxyToadlet.seclevels=Freenet によって提供されるセキュリティーのレベルを設定 FProxyToadlet.sizeLabel=サイズ: FProxyToadlet.sizeUnknown=サイズ: 不明 -FProxyToadlet.stats=あなたのFreenetノードの詳細な統計情報 +FProxyToadlet.stats=あなたの Freenet ノードの詳細な統計情報 FProxyToadlet.statsTitle=統計 FProxyToadlet.timeElapsedLabel=経過時間: -FProxyToadlet.unableToRetrieve=Freenetはこのファイルを検索できませんでした。 -FProxyToadlet.unableToSafelyDisplay=Freenetは、このファイルが安全であることを保証することはできません: それはお使いのブラウザの匿名性を突破しあなたのIPアドレスを明かす原因となります! -FProxyToadlet.unknownMIMEType=コンテンツタイプ: 不明 -FProxyToadlet.welcome=Freesite (Freenet 上に匿名でホストされているウェブサイト)を閲覧または検索する -FProxyToadlet.welcomeTitle=Freenet を閲覧 -FProxyToadlet.imageinitializing=初期化 -FcpServer.allowedHosts=許可するhosts (設定前に必ず警告文をお読みください。) -FcpServer.allowedHostsFullAccess=フルアクセスを許可するhosts -FcpServer.allowedHostsFullAccessLong=FCPサーバーへのフルアクセスを許可するIPアドレスを指定します。許可されたIPアドレスを使用するクライアントは、Freenet nodeを再起動することや、設定を変更したりすること、ディスクへ直接I/Oアクセスを行う事等が可能になります。 -FcpServer.allowedHostsLong=FCPサーバーへのアクセスを許可するIPアドレスを指定します。コンマを使用して複数指定ができます。IPアドレスには、CIDR表記が利用可能です。 (警告: FCPへのアクセスを許可された人は、このFreenet nodeがアクセスしたすべてのファイルをアップロード、ダウンロードする事が可能になります。但し、ファイルを上書きすることはできません。) -FcpServer.assumeDownloadDDAIsAllowed=download DDAが許可されているものとする -FcpServer.assumeDownloadDDAIsAllowedLong=download DDAが許可されているものとするかどうかを指定します。このオプションがfalseに指定された場合、DDA accessを行う前に、必ずTestDDARequestを発行しなくてはなりません。 -FcpServer.assumeUploadDDAIsAllowed=upload DDAが許可されているものとする -FcpServer.assumeUploadDDAIsAllowedLong=upload DDAが許可されているものとするかどうかを指定します。このオプションがfalseに指定された場合、DDA accessを行う前に、必ずTestDDARequestを発行しなくてはなりません。 -FcpServer.bindTo=バインドするIPアドレス -FcpServer.bindToLong=FCP server にバインドするIPアドレスを指定します。 -FcpServer.isEnabled=FCPを使う -FcpServer.isEnabledLong=Freenet Client Protocol server機能を使用します。 +FProxyToadlet.unableToRetrieve=Freenet はこのファイルを取得できませんでした。 +FProxyToadlet.unableToSafelyDisplay=Freenet はこのファイルの安全性を保証できません: あなたのブラウザーは IP アドレスを明かし、匿名性が破壊されるかもしれません。 +FProxyToadlet.unknownMIMEType=コンテンツの種類: 不明 +FProxyToadlet.welcome=freesite と呼ばれる Freenet 上に匿名でホストされているウェブサイトを閲覧または検索する +FProxyToadlet.welcomeTitle=Freenet を閲覧する +FProxyToadlet.imageinitializing=初期化中 +FcpServer.allowedHosts=許可するホスト (警告をお読みください!) +FcpServer.allowedHostsFullAccess=フルアクセスを許可するホスト +FcpServer.allowedHostsFullAccessLong=Freenet ノードへのフルアクセスが許可された IP アドレス。これらの IP アドレスのクライアントは Freenet を再起動したり設定変更したり等するかもしれません。"全ての" クライアントに直接のディスク I/O が許可されることにご注意ください! +FcpServer.allowedHostsLong=FCP サーバーへの接続が許可された IP アドレス。コンマで分けられた単一の IP アドレスのリストか 192.168.0.0/24 のような CIDR マスク IP が利用できます。警告!FCP にアクセス可能な誰もが Freenet ノードがアクセスできるファイルをどれでもアップロードでき、ファイルをディスクにダウンロードできます (ですがノードは既存のファイルの上書きをしないように試みます)。 +FcpServer.assumeDownloadDDAIsAllowed=ダウンロード DDA が許可されているものとしますか? +FcpServer.assumeDownloadDDAIsAllowedLong=ダウンロード DDA が許可されているものとしますか?false の場合、DDA アクセスを行う前に TestDDARequest を発行する必要があります。 +FcpServer.assumeUploadDDAIsAllowed=アップロード DDA が許可されているものとしますか? +FcpServer.assumeUploadDDAIsAllowedLong=アップロード DDA が許可されているものとしますか?false の場合、DDA アクセスを行う前に TestDDARequest を発行する必要があります。 +FcpServer.bindTo=バインドする IP アドレス +FcpServer.bindToLong=FCP サーバーにバインドする IP アドレスを指定します。 +FcpServer.cannotStartOrStopOnTheFly=すぐに FCP サーバーを起動・停止できません +FcpServer.couldNotChangeBindTo=FCP バインドアドレスを変更できません: IP アドレスのうちいくつかを次へバインドできません: ${failedInterfaces}。 IP アドレスを打ち間違えた、もしくはネットワーク接続が落ちていませんか? +FcpServer.enablePersistentDownload=永続的なダウンロードを有効にしますか? +FcpServer.enablePersistentDownloadLong=Persistence=forever を FCP リクエストで有効にするかどうか。ノードの再起動後も残るリクエストをサポートするかどうかを意味します; それらはディスクに書き込まれる必要があるため、一部の人にとってはセキュリティーリストとなりえます。 +FcpServer.isEnabled=FCPを有効にしますか? +FcpServer.isEnabledLong=Freenet Client Protocol サーバーを有効にします FcpServer.portNumber=FCP ポート -FcpServer.portNumberLong=FCPサーバがリッスンするTCPポート -FcpServer.ssl=SSLを使う -FcpServer.sslLong=FCP server上で、SSLを使用します。このオプションを有効にするには、'Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files'が必要です。 -FcpServer.maxMessageQueueLength=各接続で保持するFCP messages数 -FcpServer.neverDropAMessage=FCP messageを廃棄しない -FcpServer.neverDropAMessageLong=このオプションを有効にした場合、メモリ不足に陥った時であっても、全てのFCP接続のメッセージを保持します。使用するべきではありませんが、デバッグ時には役に立つでしょう。 +FcpServer.portNumberLong=FCP サーバーがリッスンする TCP ポート +FcpServer.ssl=SSL を有効にしますか? +FcpServer.sslLong=FCP サーバー上で SSL を有効にします。'Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files' が必要になるでしょう。 +FcpServer.maxMessageQueueLength=各接続で保持する FCP メッセージ数 +FcpServer.maxMessageQueueLengthLong=このキューの長さを超えるものは "FCP メッセージを破棄しないようにする" 設定によってメッセージが破棄されるか ERROR が出力されます。 +FcpServer.neverDropAMessage=FCP メッセージを破棄しないようにしますか? +FcpServer.neverDropAMessageLong=この設定を有効にした場合、メモリー不足に陥った時であっても、全ての FCP 接続のメッセージを保持します。使用するべきではありませんが、デバッグ時には場合によって役に立つでしょう。 FetchException.longError.10=ファイルがアーカイブにない +FetchException.longError.11=Too many path components - not a manifest? Try removing one +FetchException.longError.12=Internal temp files error, maybe disk full or permissions problem? +FetchException.longError.13=Data not found +FetchException.longError.14=Route not found - could not find enough nodes to be sure the data doesn't exist +FetchException.longError.15=A node was overloaded or timed out +FetchException.longError.16=Too many redirects - loop? FetchException.longError.17=内部エラー、おそらくバグ FetchException.longError.18=ファイルは見つかったが、データの受信中にファイルを失った +FetchException.longError.19=Splitfile error +FetchException.longError.1=Too many levels of recursion into archives FetchException.longError.20=無効なURI FetchException.longError.21=大きすぎる +FetchException.longError.22=Metadata too big +FetchException.longError.23=Too many blocks per segment +FetchException.longError.24=Give more path components in URI +FetchException.longError.25=Cancelled +FetchException.longError.26=Archive restarted +FetchException.longError.27=Permanent redirect: use the new URI +FetchException.longError.28=Some of the data was found, but not enough to fetch the key. +FetchException.longError.29=Wrong content type: The key was not in the list of allowed content types provided by the client +FetchException.longError.2=Don't know what to do with splitfile +FetchException.longError.30=The request was terminated by a node because it had recently received a request for the same key and that request had failed +FetchException.longError.31=The page (or file) appears to be corrupt, but might be dangerous; you should not open this page unless you know what you are doing. Normally Freenet can filter pages of this type, but this page is so broken that we are unable to make it safe. If you open it anyway it won't be filtered, so it may give away your IP address. +FetchException.longError.32=The data is of an unknown type which might be dangerous +FetchException.longError.33=The data is of a type known to be dangerous, so the content filter has stopped the request +FetchException.longError.34=The hashes in the metadata do not match the actual data. The data may have been corrupted during download, or it may have been broken when it was inserted for example if the node inserting was broken or the data changed on disk mid-insert. +FetchException.longError.35=Splitfile decoding produced a data block that wasn't in the original list of keys. It is likely that the insert was corrupted, but it is possible that this is a bug or hardware failure on your computer. +FetchException.longError.36=The file claims to have a safe MIME type but is being downloaded to disk with a file extension not compatible with that type. For example, "virus.exe" claiming to be a text file would trigger this error. This might just be a bad filename, but it might be a malicious file trying to get past the content filter. +FetchException.longError.37=There is not enough disk space to start a download or to start the next stage of a download. Please free up some disk space and restart the request. +FetchException.longError.3=Don't know what to do with metadata +FetchException.longError.4=Failed to parse metadata +FetchException.longError.5=Failure in extracting files from an archive +FetchException.longError.6=Failed to decode a block +FetchException.longError.7=Too many levels of split metadata +FetchException.longError.8=Request was restarted too many times due to archives changing +FetchException.longError.9=Too many redirects (too much recursion) +FetchException.shortError.10=Not in archive +FetchException.shortError.11=Too many path components +FetchException.shortError.12=Temporary files error +FetchException.shortError.13=Data not found +FetchException.shortError.14=Route not found +FetchException.shortError.15=Timeout or overload +FetchException.shortError.16=Too many redirects FetchException.shortError.17=内部エラー +FetchException.shortError.18=Transfer failed +FetchException.shortError.19=Splitfile error +FetchException.shortError.1=Too deep archive recursion +FetchException.shortError.20=Invalid URI FetchException.shortError.21=大きすぎる FetchException.shortError.22=大きすぎるメタデータ +FetchException.shortError.23=Too many blocks per segment +FetchException.shortError.24=Not enough path components +FetchException.shortError.25=Cancelled by caller +FetchException.shortError.26=Archive restarted FetchException.shortError.27=新しいURI FetchException.shortError.28=十分なデータが見つからない +FetchException.shortError.29=Wrong content type +FetchException.shortError.2=Unknown splitfile metadata +FetchException.shortError.30=Data not found (recently failed) +FetchException.shortError.31=Content sanitization failed FetchException.shortError.32=コンテンツフィルタは未知の種類を検出しました FetchException.shortError.33=コンテンツフィルタは危険な種類を検出しました +FetchException.shortError.34=Content does not match hashes in metadata +FetchException.shortError.35=Splitfile decode error +FetchException.shortError.36=Filename doesn't match MIME type for filtered download to disk +FetchException.shortError.37=Not enough disk space +FetchException.shortError.3=Unknown metadata +FetchException.shortError.4=Invalid metadata +FetchException.shortError.5=Archive failure +FetchException.shortError.6=Block decode error +FetchException.shortError.7=Too many metadata levels +FetchException.shortError.8=Too many archive restarts +FetchException.shortError.9=Too much recursion +FetchException.unsafeContentDetails=If you are the original author of the file, you may be interested in the details of why we think it is corrupt (but no matter how trivial this is, it does NOT make the file safe!): FileOffer.askUserTitle=ダイレクトファイル転送 FileOffer.offeredFileHeader=ノード ${name} がファイルを推薦しています: FileOffer.offeredFileShort=あなたのフレンド ${node} がファイル ${filename} を推薦しています。 @@ -618,6 +893,13 @@ FileOffer.succeededReceiveHeader=${node} からの ${filename} の転送は成 FileOffer.succeededReceiveShort=${node} から ${filename} の受信に成功しました。 GIFFilter.invalidHeader=ファイルは有効なGIFヘッダを含んでいません。 GIFFilter.invalidHeaderTitle=無効なヘッダ +GIFFilter.notGif=The file you tried to fetch is not a valid GIF. It might be some other file format, and your browser may do something dangerous with it, therefore we have blocked it. +GIFFilter.unexpectedEOF=The GIF file ended before it was read completely. The file may be truncated, damaged or malicious. +GIFFilter.unexpectedEOFTitle=File ended unexpectedly +GIFFilter.noData=The filtered GIF file does not contain valid image data. The file may be truncated, damaged or malicious. +GIFFilter.noDataTitle=No valid image data +GIFFilter.unterminatedGif=The GIF file does not end with a termination character. It may be truncated, damaged, or malicious. +GIFFilter.unterminatedGifTitle=Unterminated GIF file GenericReadFilterCallback.bogusBaseHref=アクセスできない基底ハイパーテキスト参照 GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=絶対的Freenet URIとして解析できませんでした GenericReadFilterCallback.couldNotParseFormURIWithError=フィルタがURIから解析できませんでした: ${error} @@ -629,19 +911,63 @@ GenericReadFilterCallback.invalidFormURIAttemptToEscape=ディレクトリ構造 GenericReadFilterCallback.malformedAbsoluteURL=不正な URL (絶対): ${error} GenericReadFilterCallback.malformedRelativeURL=不正な URL (相対): ${error} GenericReadFilterCallback.protocolNotEscaped=プロトコルがエスケープされていません: ${protocol} +HTMLFilter.couldNotParseStyle=Could not match input style +HTMLFilter.deletedUnknownStyle=deleted unknown style +HTMLFilter.failedToParseLabel=Corrupt or malicious web page (unable to filter the page)! +HTMLFilter.invalidMetaType=Invalid content type in meta tag, not a known HTML format. +HTMLFilter.metaOutsideHead= tag outside . This is not allowed and can cause problems with different character sets / languages. +HTMLFilter.multipleCharsetsInMeta=Multiple charset declarations. This is confusing, invalid, unsafe and not allowed. +HTMLFilter.textBeforeHTML=Invalid HTML document: Text before tag. We only allow valid HTML documents and not fragments because this makes for more reliable filtering (particularly avoiding charset ambiguity). +HTMLFilter.tooManyNestedStyleOrScriptTags=Too many nested style or script tags - ambiguous or invalid parsing +HTMLFilter.tooManyNestedStyleOrScriptTagsLong=Too many nested tags - ambiguous or invalid parsing, can't reliably filter so removing the inner tags - garbage may appear in browser HTMLFilter.unknownTag=不明なタグ ${tag} +HTMLFilter.wrongCharsetInMeta=A meta tag indicates the wrong charset InsertContext.CompatibilityMode.COMPAT_CURRENT=現在 (最新、最も効率的) InsertContext.CompatibilityMode.COMPAT_UNKNOWN=不明 +InsertContext.CompatibilityMode.COMPAT_1250_EXACT=Pre-1250 (exact) +InsertContext.CompatibilityMode.COMPAT_1250=Pre-1250 (with even splitting) +InsertContext.CompatibilityMode.COMPAT_1251=1251 +InsertContext.CompatibilityMode.COMPAT_1255=1255 +InsertContext.CompatibilityMode.COMPAT_1416=1416 +InsertContext.CompatibilityMode.COMPAT_1468=1468 InsertFreesiteToadlet.title=Freesite をアップロード InsertFreesiteToadlet.content1=ウェブサイトを匿名で Freenet へアップロードすることができます(これを「Freesite をインサートする」と言います)。いったんアップロードされれば、人々が折に触れてアクセスし続ける限り、コンテンツは Freenet 上にずっと残ります。コンテンツはネットワーク全体に分散されますので、あなたのコンピュータの電源がオフになっていても利用することができます。最も重要なこと: Freenet のセキュリティレベルが適切に設定されていれば、誰がその Freesite をアップロードしたのか探り出すのは極めて困難となります。 InsertFreesiteToadlet.contentFlogHelper=単純なブログを作りたいだけならば、FlogHelper の利用をお勧めします。FlogHelper は${plugins}プラグインのページ${/plugins}から読み込むことができ、その後メニューから利用できます。 -InsertFreesiteToadlet.content2=If you want to upload a website you have mirrored from somewhere, or something larger or more complex, you will need a tool called jSite. Get it from ${jsite-http}our web site${/jsite-http}, or you can get version ${jsite-freenet-version} ${jsite-freenet}from Freenet${/jsite-freenet} (${jsite-info}more information${/jsite-info}). +InsertFreesiteToadlet.content2=If you want to upload a website you have mirrored from somewhere, or something larger or more complex, you will need a tool called jSite. Get version ${jsite-freenet-version} ${jsite-freenet}from Freenet${/jsite-freenet} (${jsite-info}more information${/jsite-info}). InsertFreesiteToadlet.content3=jSite をダウンロードし、KompoZer (フリー)のような HTML エディタであなたのウェブサイトを作成したら、以下で挙げるような Freenet 上でホストされているチュートリアルのどれかをざっと読んでみてください: InsertFreesiteToadlet.contentThingamablog=他に、ユーザフレンドリなブログ生成ソフトである Thingamablog を使うこともできます。Freenet と互換性のあるバージョンの Thingamablog は${thingamablog}ここ${/thingamablog}、あるいは${thingamablog-freenet}Freenet上${/thingamablog-freenet}から入手できます。 InsertFreesiteToadlet.publishExplanation=Freesite をインサートする方法に関する短いチュートリアル InsertFreesiteToadlet.freesiteHowtoExplanation=Freesite をインサートする方法に関する、もう一つのより長いチュートリアル IPDetectorPluginManager.direct=インターネットに直接接続されているようです。おめでとうございます。これで他のFreenetノードにも接続できるはずです。 IPDetectorPluginManager.directTitle=直接なインターネット接続を検出 +IPDetectorPluginManager.fullCone=Your internet connection appears to be behind a "full cone" NAT (router). Congratulations, your node should be able to connect to any other Freenet node. +IPDetectorPluginManager.fullConeTitle=Full cone NAT detected +IPDetectorPluginManager.noConnectivity=Your internet connection does not appear to support UDP. Unless this detection is wrong, it is unlikely that Freenet will work on your computer at present. +IPDetectorPluginManager.noConnectivityTitle=No UDP connectivity +IPDetectorPluginManager.noConnectivityshort=Severe connection problems: No UDP connectivity, Freenet will not work! +IPDetectorPluginManager.portRestricted=Your internet connection appears to be behind a port-restricted NAT (router). You will be able to connect to most other users, but not those behind symmetric NATs. +IPDetectorPluginManager.portRestrictedTitle=Port restricted cone NAT detected +IPDetectorPluginManager.restricted=Your internet connection appears to be behind a "restricted cone" NAT (router). You should be able to connect to most other users. +IPDetectorPluginManager.restrictedTitle=Restricted cone NAT detected +IPDetectorPluginManager.suggestForwardPort= You may want to forward the port (UDP port number ${port}) manually. (See http://wiki.freenetproject.org/FirewallAndRouterIssues ). +IPDetectorPluginManager.suggestForwardTwoPorts= You may want to forward the ports (UDP port numbers ${port1} and ${port2}) manually. (See http://wiki.freenetproject.org/FirewallAndRouterIssues ). +IPDetectorPluginManager.suggestForwardPortWithLink= You may want to ${link}forward the port${/link} (UDP port number ${port}) manually (or you may already have done so, Freenet cannot easily detect this). +IPDetectorPluginManager.suggestForwardTwoPortsWithLink= You may want to ${link}forward the ports${/link} (UDP port numbers ${port1} and ${port2}) manually (or you may already have done so, Freenet cannot easily detect this). +IPDetectorPluginManager.symmetric=Your internet connection appears to be behind a symmetric NAT or firewall. You will probably only be able to connect to users directly connected to the internet or behind restricted cone NATs. +IPDetectorPluginManager.symmetricTitle=Symmetric firewall detected +IPDetectorPluginManager.seriousConnectionProblems=Serious connection problems: +IPDetectorPluginManager.connectionProblems=Connection problems: +IPDetectorPluginManager.forwardPortShortMaybeForwarded=Please forward UDP port ${port} (you may have already done this). +IPDetectorPluginManager.forwardPortShortNotForwarded=Please forward UDP port ${port} (it is probably not forwarded). +IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=Please forward UDP ports ${port1} and ${port2} (you may have already done this). +IPDetectorPluginManager.forwardTwoPortsShortNotForwarded=Please forward UDP ports ${port1} and ${port2} (they appear not to be forwarded). +IPDetectorPluginManager.forwardPortMaybeForwarded=Your node appears to be behind some sort of NAT (see the connectivity page for details). You should forward UDP (not TCP) port ${port} if possible to improve connectivity. It is possible you have already done this; it takes a while for Freenet to detect a port forward. See ${link}here${/link} for some more information. +IPDetectorPluginManager.forwardPortNotForwarded=Your node appears to be behind some sort of NAT (see the connectivity page for details). You should forward UDP (not TCP) port ${port} if possible to improve connectivity. It appears that the port has not been forwarded, although Freenet cannot be sure. See ${link}here${/link} for some more information. It may take up to 24 hours for Freenet to recognise that you have successfully forwarded the ports. +IPDetectorPluginManager.maybeAlreadyForwarded=You may have already done this (it is hard for Freenet to detect). +IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=Your node appears to be behind some sort of NAT (see ${connectivity}the connectivity page${/connectivity} for details). You should forward UDP (not TCP) ports ${port1} and ${port2} if possible to improve connectivity. It is possible you have already done this; it takes a while for Freenet to detect a port forward. See ${link}here${/link} for some more information. +IPDetectorPluginManager.forwardTwoPortsNotForwarded=Your node appears to be behind some sort of NAT (see ${connectivity}the connectivity page${/connectivity} for details). You should forward UDP (not TCP) ports ${port1} and ${port2} if possible to improve connectivity. It appears that the ports have not been forwarded, although Freenet cannot be sure. See ${link}here${/link} for some more information. +IPDetectorPluginManager.portForwardHelpURL=http://wiki.freenetproject.org/FirewallAndRouterIssues +IPDetectorPluginManager.symmetricPS=Your node is behind a symmetric NAT, which is especially problematic, so if you don't forward the port(s), you may not be able to connect to most nodes! IPUndetectedUserAlert.detecting=Freenetは現在あなたの外部IPアドレスを検知しようと試みています。数分以上かかる場合は何か異常があるかもしれません。 IPUndetectedUserAlert.detectingShort=Freenetは現在あなたの外部IPアドレスの検出を試みています。 IPUndetectedUserAlert.detectingWithConfigLink=Freenetは現在あなたの外部IPアドレスの検出を試みています。もしこれが数分以上かかる場合、何かトラブルがあるため一時的アドレスヒントの${link}パラメータを設定${/link}できます。 @@ -651,22 +977,57 @@ IPUndetectedUserAlert.noIPMaybeFromPeers=Freenetはあなたの${number}人の IPUndetectedUserAlert.noDetectorPlugins=FreenetはあなたのIPアドレスを検知できません! UPnPプラグインをロードしてください! IPUndetectedUserAlert.unknownAddress=Freenetはあなたの外部IPアドレス(もしくはルータやファイアウォールのIPアドレス)を確定できませんでした。レファレンスをフレンドと交換することは可能ですが、しかしながらこれはフレンドがルータやファイアウォールの背後にいる場合は常には動作しません。このような形態で他のフレンドと接続し次第、Freenetはあなたの外部IPアドレスを検出できるようになります。設定ページの「一時的なIPアドレスのヒント」で現在のIPアドレスをノードに告知することができます。代わりにあなたが静的IPアドレスかドメイン名を持っている場合、「IPアドレスの上書き」オプションでFreenetにこの事を伝えてください。 IPUndetectedUserAlert.unknownAddressTitle=外部アドレスが不明 +IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet was unable to determine your external IP address (or the IP address of your router or firewall). You can still exchange references with your friends, however this may not always work if your friend is behind a router or firewall. As soon as you have connected to one other user in this way, Freenet will be able to determine your external IP address. You can determine your current IP address and tell your node with the 'Temporary IP address hint' on ${link}the config page${/link}, or enter it below. Alternatively if you have a static IP address or domain name, please tell Freenet about it using the "IP address override" option. IPUndetectedUserAlert.unknownAddressShort=FreenetはあなたのIPアドレスを確定できませんでした。接続に問題があるかもしれません。 IPUndetectedUserAlert.suggestForwardPort=また、以下のポート: ${port} (UDP)をルータでフォワードすることはあなたのノードへの接続を容易にするのに良い策でしょう。 IPUndetectedUserAlert.suggestForwardTwoPorts=また、これらのポート: ${port1} と ${port2} (UDP)をルータでフォワードすることはあなたのノードへの接続を容易にするのに良い策です。 InsertException.longError.10=ユーザーによってキャンセルされました +InsertException.longError.11=Path component (most likely a '/') used in the URI +InsertException.longError.12=Binary blob format error +InsertException.longError.13=Too many files in a single folder on a freesite insert +InsertException.longError.14=Uploading files larger than 64TB not supported at present +InsertException.longError.1=Caller supplied a URI we cannot use +InsertException.longError.2=Internal bucket error: out of disk space/permissions problem? InsertException.longError.3=内部エラー +InsertException.longError.4=A downstream node timed out or was severely overloaded +InsertException.longError.5=Could not propagate the insert to enough nodes (normal on small networks, try fetching it anyway) +InsertException.longError.6=Fatal errors in a splitfile insert +InsertException.longError.7=Could not insert splitfile: ran out of retries (nonfatal errors) +InsertException.longError.8=Insert could not leave this Freenet node at all +InsertException.longError.9=Insert collided with different, pre-existing data at the same key InsertException.shortError.10=キャンセルされました +InsertException.shortError.11=Meta string used in the key +InsertException.shortError.12=Binary blob format error +InsertException.shortError.13=Too many files in a single folder +InsertException.shortError.14=File is too large InsertException.shortError.1=不正なURI InsertException.shortError.2=一時ファイルエラー InsertException.shortError.3=内部エラー +InsertException.shortError.4=Timeout or overload InsertException.shortError.5=経路が見つかりません +InsertException.shortError.6=Some blocks failed fatally +InsertException.shortError.7=Some blocks ran out of retries +InsertException.shortError.8=Request could not leave the node +InsertException.shortError.9=Collided with existing data InvalidAddressOverrideUserAlert.unknownAddress=設定されているipAddressOverrideの値が無効です。値の書式が、ホストネーム、IPv4アドレス、IPv6アドレスいずれの書式にも一致しません。(注: この関数の現在の実装では、IPv6アドレスの書式をチェックしています。) InvalidAddressOverrideUserAlert.unknownAddressTitle=無効なIPアドレス上書き値 InvalidAddressOverrideUserAlert.unknownAddressWithConfigLink=Freenetは現在設定されているipAddressOverrideの値が無効であることを検出しました。有効なホスト名/IPv4アドレス/IPv6アドレス(現在のIPv6の構文を検証する関数の現在の実装の意見による)の構文に合致していないという事を意味します。「IPアドレス上書き」を${link}訂正${/link}することができます。 InvalidAddressOverrideUserAlert.unknownAddressShort=あなたのipAddressOverrideはインチキです。修正してください。 IntOption.parseError=指定された値は32ビット整数として解釈できませんでした: ${val} +JavaEOLAlert.body=Your Java version ${current} is at its "End Of Life" and is no longer receiving updates to fix security problems. Freenet will require version ${new} or higher in a future update, so it will stop working with this one. Please upgrade your Java installation. JavaEOLAlert.title=Javaのバージョンが古いためFreenetは動作を停止します +JPEGFilter.notJpeg=The file you tried to fetch is not a JPEG. It might be some other file format, and your browser may do something dangerous with it, therefore we have blocked it. +KnownUnsafeContentTypeException.dangerousInlines=This type of content can contain inline images or videos, and can therefore load content from the non-anonymous open Web, exposing your IP address. +KnownUnsafeContentTypeException.dangerousInlinesLabel=Dangerous inlines: +KnownUnsafeContentTypeException.dangerousLinks=This type of content can contain links to the non-anonymous Web; if you click on them (and they may be disguised), this may expose your IP address. +KnownUnsafeContentTypeException.dangerousLinksLabel=Dangerous links: +KnownUnsafeContentTypeException.dangerousMetadata=This type of content can contain metadata which may be displayed by some browsers or other software, which may contain dangerous links or inlines. +KnownUnsafeContentTypeException.dangerousMetadataLabel=Dangerous metadata: +KnownUnsafeContentTypeException.dangerousScripts=This type of content can contain dangerous scripts which when executed may compromise your anonymity by connecting to the open Web or otherwise breach security. +KnownUnsafeContentTypeException.dangerousScriptsLabel=Dangerous scripting: +KnownUnsafeContentTypeException.knownUnsafe=This is a potentially dangerous content type. If Freenet lets it through, your browser may do bad things leading to compromise of your anonymity, and your IP address being exposed in connection with this page. In particular: +KnownUnsafeContentTypeException.noFilter=Since there is no built-in filter for this data, you should take the utmost of care! +KnownUnsafeContentTypeException.title=Known dangerous type: ${type} LocalFileInsertToadlet.checkPathExist=指定したパスが存在することを確認してください。 LocalFileInsertToadlet.checkPathIsDir=指定したパスがディレクトリであることを確認してください。 LocalFileInsertToadlet.checkPathReadable=指定したパスがFreenetを実行しているユーザで読み取り可能であることを確認してください。 @@ -678,39 +1039,87 @@ LocalFileInsertToadlet.listing=リスト中のディレクトリ: ${path} LocalFileInsertToadlet.listingTitle=${path} のリスト LocalFileInsertToadlet.sizeHeader=サイズ LogConfigHandler.detaildPriorityThreshold=優先度の詳細な敷居値 +LogConfigHandler.detaildPriorityThresholdLong=Detailed priority thresholds, example freenet:normal,freenet.node:minor LogConfigHandler.dirName=ログ ディレクトリ LogConfigHandler.dirNameLong=ログファイルを置くディレクトリ LogConfigHandler.enabled=ログを有効にしますか LogConfigHandler.enabledLong=falseに設定することで、ログを完全に無効化します LogConfigHandler.maxBacklogNotBusy=ログ書き込みの最長時間 (milliseconds) +LogConfigHandler.maxBacklogNotBusyLong=Maximum time between writing logs if log writing load is not heavy. (milliseconds) +LogConfigHandler.maxCachedBytes=Max cached log bytes in RAM +LogConfigHandler.maxCachedBytesLong=Maximum number of bytes of logging cached in RAM +LogConfigHandler.maxCachedLines=Max cached log lines in RAM +LogConfigHandler.maxCachedLinesLong=Maximum number of lines of logging cached in RAM LogConfigHandler.maxZippedLogsSize=古いログに使うディスクの最大容量 LogConfigHandler.maxZippedLogsSizeLong=古いログに使うディスクの最大容量 LogConfigHandler.minLoggingPriority=メッセージログの低優先度 +LogConfigHandler.minLoggingPriorityLong=Minimum priority at which messages are logged. Options are debug, minor, normal, warning, error, in order of diminishing verbosity. Generally you only need to change this if something is broken and you need to gather more information for the developers. If you are worried about your computer being seized, set this to ERROR to minimise any possible information leakage. LogConfigHandler.rotationInterval=ログローテーション間隔 +LogConfigHandler.rotationIntervalLong=Log rotation interval - period after which logs are rotated. We keep the last two log files (current and prev), plus lots of compressed logfiles up to maxZippedLogsSize LoggerHook.unrecognizedPriority=解釈できない優先度名: ${name}. LongOption.parseError=指定された値は64ビット整数として解釈できません : ${val} +MainJarUpdater.ConfirmMultiFileUpdater.title.wrapper-update-unix=Please update the wrapper files +MainJarUpdater.ConfirmMultiFileUpdater.text.wrapper-update-unix=Freenet has downloaded an update to the Java Service Wrapper binaries. These are a set of files involved in running and updating Freenet. Updating these files may fix some important bugs especially on Linux/FreeBSD, particularly a bug that often causes Freenet to restart repeatedly after an update. We strongly recommend that you allow Freenet to update these files as soon as is convenient. +MeaningfulNodeNameUserAlert.noNodeNick=Please set a name for your node so that your friends can identify your node, e.g. if you send them a message or a file. This will only be visible to your Friends who you manually connect to via the Add a Friend page, and possibly to their Friends. Your node's nickname will not be visible to strangers, that is, Freenet connections added automatically in the lower security levels. +MeaningfulNodeNameUserAlert.noNodeNickTitle=Please set a name for your Freenet node. +MeaningfulNodeNameUserAlert.noNodeNickShort=Please set a name for your Freenet node. +MP3Filter.bogusMP3NoFrames=Doesn't look like an MP3. +MP3Filter.bogusMP3NoFramesExplanation=This does not look like an MP3 file. It might be corrupt or somebody might be trying to mask some other kind of (potentially dangerous) file as an mp3 file to breach your anonymity. +MP3Filter.freeBitrateNotSupported=Free format bitstream MP3 files not supported by filter +MP3Filter.freeBitrateNotSupportedExplanation=The file appears to be an mp3 file with the "freeformat" bitstream extension, which allows non-standard bitrates. These are not supported by most players and so are relatively rare. Nonetheless the file is probably safe if you are careful and your player doesn't do silly things, like rendering web URLs as links. +N2NTMToadlet.composingMessageLabel=Composing N2NTM to send to the following peers: +N2NTMToadlet.delayed=Backed off: Sending of message possibly delayed to peer N2NTMToadlet.delayedTitle=遅延 +N2NTMToadlet.failed=Message not sent to peer: peer not connected N2NTMToadlet.failedTitle=失敗 N2NTMToadlet.friends=フレンズ +N2NTMToadlet.mayAttachFile=You may attach a file, but you don't have to. +N2NTMToadlet.noSuchFileOrCannotRead=Unable to send the file: Either it does not exist or it can't be read. +N2NTMToadlet.peerName=Peer Name N2NTMToadlet.peerNotFoundTitle=ピアが見つかりません +N2NTMToadlet.peerNotFoundWithHash=The peer with the hash code "${hash}" could not be found. +N2NTMToadlet.processingSend=Send Node to Node Text Message Processing +N2NTMToadlet.queued=Queued: Peer not connected, so message queued for when it connects +N2NTMToadlet.queuedTitle=Queued N2NTMToadlet.returnToFriends=フレンドリストに戻る -N2NTMToadlet.tooLong=N2NTMs are limited to 1024 characters +N2NTMToadlet.sendMessage=Send Node to Node Text Message +N2NTMToadlet.sendMessageShort=Send message +N2NTMToadlet.sendStatus=N2NTM Send Status +N2NTMToadlet.sent=Message sent to peer +N2NTMToadlet.sentTitle=Sent +N2NTMToadlet.sizeWarning=Please note that browser-based uploading has a limit of ${limit}. +N2NTMToadlet.tooLong=N2NTMs are limited to 131,072 characters N2NTMToadlet.tooLongTitle=長すぎる +N2NTMToadlet.tooLarge=The file you have uploaded through your browser is ${attempt}, but the limit is ${limit}. Please upload from disk. +N2NTMToadlet.unsentMessageText=Text of the unsent message: +N2NTMToadlet.uploadFailed=Failed to upload file. N2NTMUserAlert.delete=削除 +N2NTMUserAlert.header=From: ${from} (${composed}) N2NTMUserAlert.headerShort=${from} からのメッセージ N2NTMUserAlert.reply=返信 N2NTMUserAlert.title=${number} から ${peername} (${peer})へのノード間メッセージ +Node.acceptSeedConnectionsShort=Be a seednode? +Node.acceptSeedConnections=If true, the node will accept connections from new insecure-mode nodes and help to bootstrap them onto the network. This allows any node with your noderef to connect, but only for purposes of announcement: it can only do requests to nodes that it gets through the announcement (possibly including this node if we don't have many Strangers). Node.alwaysAllowLocalAddresses=常にローカルアドレス経由での接続を許容しますか? Node.alwaysAllowLocalAddressesLong=Trueに設定すると、Freenetはローカル(localhost, LAn)アドレス経由のノードとパブリックIPと同様に接続しようとします。これがセットされていなくても、特定のダークネットピア(オープンネットでない)には有効にできます。 もしあなたが同じLANのノードと接続したく、ニセのレファレンスであなたのノードがUDPパケットをLANのマシンに送信する危険を無視する場合セットしてください。 Node.assumeNATed=ポートがフォワードされていないものとして扱います。 +Node.assumeNATedLong=Should Freenet assume the port is NATed and not forwarded, and always send handshakes aggressively (every 10-30 seconds), regardless of any evidence to the contrary? Node.bandwidthLimitMustBePositiveOrMinusOne=ダウンロード帯域幅上限は正または-1でなければなりません。 +Node.bandwidthMinimum=The requested bandwidth limit of ${limit} bytes/second is too low. Bandwidth limits must be at least ${minimum} bytes/second because lower limits than this cannot properly connect to the network. Node.bindTo=バインドするIPアドレス Node.bindToLong=バインドするIPアドレス Node.bwlimitMustBePositive=アップロード帯域幅上限は正でなければなりません。 +Node.cachingFreenetStoreMaxSize=Maximum size of the in-memory write cache for each store (there are 9 such stores). +Node.cachingFreenetStoreMaxSizeLong=Maximum size of the in-memory write cache for each store (there are 9 such stores). 0 for no in-memory cache (e.g. if you have a solid-state disk). Keys are of various sizes, so e.g. if the limit is between 2K and 32K it will only be used for storing small keys (SSKs and public keys). +Node.cachingFreenetStorePeriod=Maximum time blocks will be kept in the in-memory datastore cache before being written to the store on disk (in milliseconds). Node.clientCacheType=クライアントキャッシュの種類? +Node.clientCacheTypeLong=If you set this to none there will be less evidence if your computer is seized, but your node will need to re-fetch every page you visit every time you visit it, reducing performance and making your requests more visible on the network; if you set it to ram, cached pages will only be remembered until shutting down this Freenet node and will take up RAM; the first-time wizard sets it to salt-hash, which stores visited freesites on disk, but encrypted and possibly passworded according to the physical security level (so securely deleting master.keys will wipe the client cache). +Node.clientCacheSize=Client cache size (bytes, MB, GB, TB, etc) +Node.clientCacheSizeLong=Set the size of the client cache. This is used to cache freesites you visit so that they won't need to be requested next time, and therefore will load faster and won't be visible on the network. If the client cache type is "none", this option is ignored; if it is "ram", this option is the size in RAM of the client cache (part of the overall maximum memory limit, so increase that if you need to); if it is "salt-hash", this option is the size of the client-cache on disk. Node.connectToSeednodesCannotBeChangedMustDisableOpennetOrReboot=シードノードへの接続の設定: オープンネット稼働中では無効化できません。無効にしてからオープンネットを有効にしなおすか、Freenetを再起動してください。 Node.databaseMemory=データストア最大メモリ使用(絶対: bdbjeインデックスのみ!) Node.databaseMemoryLong=bjbjeインデックスデータストア・タイプでのみ有効です。データストア・インデックスを支援するデータベースによるメモリ使用の最大値。0は無制限(最大メモリ - 30% に制限)を意味します。 +Node.deadlockTitle=Deadlocking likely due to buggy JVM/kernel combination Node.defragDatabaseOnStartup=次回起動時に、ダウンロードデータベースをデフラグしますか? Node.defragDatabaseOnStartupLong=trueの場合、次回起動時(またはパスワード入力後)にデータベースのデフラグを行います。 Node.defragOnce=一度のみデフラグする (上のオプションもセットしてください!) @@ -723,17 +1132,42 @@ Node.enableARKs=ARKsを有効にしますか? (オフにしないでください Node.enableARKsLong=ARKsを有効にしますか? (オフにしないでください!) Node.enableOpennetFailedTitle=オープンネットを有効にできませんでした Node.enableOpennetFailed=Freenetがオープンネットの有効化に失敗し、見知らぬ人に接続できません。これを修正するか、バグを報告するか、あるいはフレンドとだけ接続するようにする必要があります。 詳細: ${message} +Node.enableNewLoadManagementRT=Enable new load management (for realtime requests)? (EXPERIMENTAL!) +Node.enableNewLoadManagementRTLong=Turn this on to test the new load management code for realtime requests. This is highly experimental and may severely break your node or dramatically reduce or increase its performance! Good luck, and tell us what happens! +Node.enableNewLoadManagementBulk=Enable new load management (for bulk requests)? (EXPERIMENTAL!) +Node.enableNewLoadManagementBulkLong=Turn this on to test the new load management code for bulk requests. This is highly experimental and may severely break your node or dramatically reduce or increase its performance! Good luck, and tell us what happens! Node.enablePacketCoalescing=パケットの埋め合わせをしますか? Node.enablePacketCoalescingLong=パケット合体を有効にしますか? パケット合体は帯域幅の効率性を向上し、CPU使用を減少させ、少ないコストでメッセージ待ち時間でトラフィック解析への耐性を上昇させます。する事がわかっていない場合はオフにしないでください。 Node.enablePerNodeFailureTables=ノードごとの障害テーブルを有効にしますか? Node.enablePerNodeFailureTablesLong=過去10分以内にリクエストに失敗したノードの自動的な迂回を有効にしますか? Node.enableRoutedPing=FNPRoutedPingを有効にしますか? Node.enableRoutedPingLong=FNPRoutedPingを有効にしますか? シミュレーションでのみ有効で、実際のネットワークでは使えません。オフにしてください。 +Node.enableDiagnostics=Enable Diagnostics? +Node.enableDiagnosticsLong=By enabling Diagnostics the node will keep detailed information of its inner-workings (such as CPU usage per thread) which can help to troubleshoot problems. The collected data is kept in memory (i.e. not persisted on disk) and it's not sent to anybody over the network. +Node.enableSwapping=Enable location swapping? +Node.enableSwappingLong=Enable location swapping? +Node.enableSwapQueueing=Enable queueing of swap requests? +Node.enableSwapQueueingLong=Enable queueing of swap requests? Node.enableULPRDataPropagation=ULPRデータ伝播を有効にしますか? +Node.enableULPRDataPropagationLong=Enable fast propagation of recently requested keys to those nodes which have asked for them when the data is eventually found? (Ultra-Lightweight Persistent Requests; this is particularly important for chat clients). This also enables RecentlyFailed, which will squash requests which have recently failed. +Node.errorApplyingConfig=Error while applying the new config : ${error} Node.forceBigShrink=大規模ストアシュリンクを行う(bdbjeインデックスストア・タイプのみ) Node.forceBigShrinkLong=突然(次回のノードの再起動を待たずして)大規模なストアのシュリンク(10%を超える)を行うかどうか。オンラインシュリンクは最も最近使用したデータを保護しないので、この機能はおすすめできません;すぐに結果が欲しい場合にのみ使用してください。bdbjeインデックスストアのタイプ固有です。 Node.inBWLimit=ダウンロード帯域幅制限 +Node.inBWLimitLong=Download bandwidth limit. Freenet will try not to exceed this, but it is not very accurate. If set to -1 the download bandwidth limit will be 4x the upload bandwidth limit. Without units this is in bytes/second, and SI and IEC units are accepted, so things like 10 KiB/s or 1.5 Mbps (meaning 10 kibibytes/sec and 1.5 megabits/sec respectively) are okay. +Node.amountOfDataToCheckCompressionRatio=Amount of data to check compression ratio +Node.amountOfDataToCheckCompressionRatioLong=The data amount after compression of which we will check whether we have got the desired effect. +Node.minimumCompressionPercentage=Minimum compression percentage +Node.minimumCompressionPercentageLong=The minimal desired compression effect, %. +Node.maxTimeForSingleCompressor=Maximum desired time for single compressor +Node.maxTimeForSingleCompressorLong=If the operation time of one of the compressors is longer than this setting, the subsequent compressors will not be used. +Node.connectionSpeedDetection=Offer upgrade of the connection speed +Node.connectionSpeedDetectionLong=Offer upgrade of the connection speed if auto-detected speed is much higher than the set speed Node.invalidStoreSize=ストアサイズは最低32MBである必要があります +Node.invalidMinStoreSize=Store size must be at least 32MB +Node.invalidMinStoreSizeWithCaches=Store size must be at least 40MB +Node.invalidMaxStoreSize=Storage limit should be no more than ${maxStoreSize} GiB +Node.invalidMemoryCacheSize=Memory cache size must be at least 0. We won't actually cache any keys unless it is at least ~ 1200 bytes, and we won't cache CHKs unless it is ~ 33KB. Node.l10nLanguage=Freenet がメッセージを表示するのに使う言語 Node.l10nLanguageLong=この設定でメッセージの表示に利用する言語を変更します。 Node.masterKeyFile=マスターキーファイルの場所 @@ -744,34 +1178,76 @@ Node.maxOpennetPeers=オープンネットのピアの最大数 Node.maxOpennetPeersLong=オープンネットのピアの最大数(は0から${default}までの間でなければなりません。実際の上限値は、フレンズの数と帯域幅の制限に依存し、統計ページに表示されます。)。 Node.maxOpennetPeersMustBeTwentyOrLess=${maxpeers}以下でなければなりません。 Node.mustBePositive=設定値は正の値である必要があります +Node.nodeDir=Node-reference directory Node.nodeDirLong=ノード関連の情報(ノードアイデンティティ、ピアなど)用ディレクトリへのパス +Node.outputBwlimitMustBeLessThan=Upload limit must be less than ${max} bytes/second. +Node.cfgDir=Config directory +Node.cfgDirLong=Path of directory for user-editable config (e.g. language overrides). Node.userDir=ユーザーデータのディレクトリ Node.userDirLong=ユーザーデータ(ブックマーク・ダウンロードリストなど)のディレクトリへのパス。 Node.runDir=ランタイム保管ディレクトリ +Node.runDirLong=Path of directory for run-time state. This can be cleared out when Freenet is not running. Node.pluginDir=プラグインディレクトリ Node.pluginDirLong=プラグイン用のディレクトリのバス。 Node.probeBandwidthShort=帯域幅制限の調査リクエストに応答する +Node.probeBandwidthLong=If true Freenet will respond to requests for the outgoing bandwidth limit. This is to improve knowledge of network conditions and allow simulations to better reflect the actual network. It will add a small amount of random noise to make the information less identifiable but still useful for diagnostics. If false it will respond with a refusal. Node.probeBuildShort=ビルドの調査リクエストに応答する +Node.probeBuildLong=If true Freenet will respond to probe requests for the build. This is to measure update propagation. If false it will respond with a refusal. +Node.probeIdentifierShort=Randomly assigned identifier for probe requests +Node.probeIdentifierLong=This identifier is only used in probe requests for an identifier. If set to -1 it will select a new random value. Node.probeRespondIdentifierShort=識別子の調査リクエストに応答する +Node.probeRespondIdentifierLong=If true Freenet will respond to probe requests for an identifier and very low-precision uptime information. It will add a small amount of random noise to the uptime information to make it less identifiable but still useful for diagnostics. This is useful for estimations of network size and churn. If false it will respond with a refusal. Node.probeLinkLengthsShort=リンク長の調査リクエストに応答する +Node.probeLinkLengthsLong=If true Freenet will respond to probe requests for link lengths. This is to improve knowledge of network conditions, and allow simulations to better reflect the actual network. It will add a small amount of random noise to make the information less identifiable but still useful for diagnostics. If false it will respond with a refusal. Node.probeLocationShort=ロケーションの調査リクエストに応答する +Node.probeLocationLong=If true Freenet will respond to probe requests for low-precision location. This is to allow measurement of the network location distribution, and contains no information other than location. If false it will respond with a refusal. +Node.peersOffersDismissed=Dismiss peers' offers +Node.peersOffersDismissedLong=Do not check *.fref files in a peers-offers/ folder, don't ask user whether to connect to them. +Node.datastoreTooSmallDismissed=Dismiss datastore too small alert +Node.datastoreTooSmallDismissedLong=The version at which the datastore too small user alert was last dismissed. Do not show user alert again while running this version. Node.respondOverallBulkOutputCapacityUsage=全体の容量の使用状況と非常におおよその帯域幅の制限の調査リクエストに応答する +Node.respondOverallBulkOutputCapacityUsageLong=If true Freenet will respond to probe requests for the overall capacity usage (bandwidth liability, this is a guesstimate of how much bandwidth would be used if all running requests succeeded), and a rough idea of the bandwidth limit (as an integer, divided by 10KB/s, min 1 max 10). Node.probeStoreSizeShort=ストアサイズの調査リクエストに応答する +Node.probeStoreSizeLong=If true freenet will respond to probe requests for store size. This is to improve knowledge of network conditions, and allow simulations to better reflect the actual network. It will add a small amount of random noise to make the information less identifiable but still useful for diagnostics. If false it will respond with a refusal. Node.probeUptimeShort=稼働時間の調査リクエストに応答する Node.probeUptimeLong=trueの場合、freenetは48時間または7日間の稼働率に関する調査要求に応答します。これは、ネットワークの状態についての知識を深め、実際のネットワークをよりよく反映したシミュレーションを可能にするためです。情報を識別しにくくするために少量のランダムなノイズを加えますが、診断には役立ちます。falseの場合は拒否で応答します。 Node.probeRejectStatsShort=拒否されたさまざまな種類の要求の割合の調査リクエストに応答する +Node.probeRejectStatsLong=If true, Freenet will respond to probe requests for the proportion of various kinds of requests which are being rejected. +Node.trafficClass=The TrafficClass value to pass to Socket.setTrafficClass() for both darknet and opennet. +Node.trafficClassLong=The TrafficClass value to pass to Socket.setTrafficClass() for both darknet and opennet. The value set won't be taken into account until the node restarts. Node.nodeName=このFreenetノードのニックネーム Node.nodeNameLong=ノードのニックネーム。これはあなたのフレンドのみへ見えるようになる。 +Node.maxPacketSize=Maximum packet size (aka MTU) Node.maxPacketSizeLong=UDP/IPヘッダが28バイトと仮定した場合の、Freenetが送信するUDPパケットの最大サイズ。我々はインターフェースのMTUが検出できた場合それを利用しますが、ほとんどどこかで妨害されるため、不幸にも簡単にはパスMTUを検出することはできません。 Node.notUsingWrapperTitle=ラッパーを使用していません! +Node.notUsingWrapper=You are running Freenet without the wrapper. This is not recommended. Freenet will not be able to restart itself, so auto-updating won't work, and if Java crashes, it won't get restarted either. Also Freenet can't generate stack dumps in some places so debugging will be marginally harder. +Node.notUsingWrapperShort=Freenet is running without the wrapper. This is not recommended. +Node.oneConnectionPerIP=Limit to one connection per address? (friends) (NOT RECOMMENDED) +Node.oneConnectionPerIPLong=Automatically drop friend connections when other friends have the same (external) IP address. Node.opennetEnabled=インセキュアモード(自動で信頼していないノードと接続する)を有効にしますか? Node.opennetEnabledLong=インセキュアモード(別名オープンネット)を有効にしますか? 有効にされた場合、あなたのFreenetノードは自動的にノードレファレンスを他の信頼していないノード(フレンドの対極である見知らぬ人)と交換します。つまりこれはもはやあなたはプライベートなノードを稼動していないという事になり、多くの攻撃が非常に容易になります。あなたがFreenetを稼動している人物を十分に知っている場合、信用できるフレンドとのみ接続し、これをオフにするべきです。 Node.outBWLimit=アップロード帯域幅制限 +Node.outBWLimitLong=Hard upload bandwidth limit. Freenet should almost never exceed this. Normally you should set this to no more than half your internet connection's upload bandwidth, which is usually much less than your download bandwidth. Without units this is in bytes/second, and SI and IEC units are accepted, so things like 10 KiB/s or 1.5 Mbps (meaning 10 kibibytes/sec and 1.5 megabits/sec respectively) are okay. +Node.paddDataPackets=Pad data packets sent by this Freenet node with random data of random length? (READ WARNING BEFORE TURNING OFF!) +Node.paddDataPacketsLong=Pad data packets sent by this Freenet node with random-length content? For security, on a single node, turning this off is bad; if a large part of the network starts doing it, we become very vulnerable to a passive attacker. However, it should improve performance, particularly the payload percentage. You have been warned! +Node.passOpennetPeersThroughDarknet=Relay opennet noderefs through darknet peers? +Node.passOpennetPeersThroughDarknetLong=If true, opennet noderefs (NEVER our own darknet noderef) will be relayed through our darknet peers. So a node (this node, or its peers) can get opennet peers from its darknet peers. This is useful because it allows us to bootstrap new opennet peers after having lost our peers due to downtime, for example. However, it may make traffic analysis slightly easier, so turn it off if you are paranoid. Node.port=ダークネットポート番号 (UDP) +Node.portLong=UDP port used by Freenet to communicate with your Friends' nodes. This port should be forwarded in your router if possible. We use a separate port for connections to Strangers. Node.opennetPort=オープンネットポート番号 (UDP) +Node.opennetPortLong=UDP port used by Freenet to communicate with Strangers i.e. freenet nodes running in opennet mode. This port should be forwarded in your router if possible. We use a separate port for connections to your Friends' nodes. Node.publishOurPeersLocation=ピアのロケーションを、ピアに送信してもよろしいですか? +Node.publishOurPeersLocationLong=Shall we send our peers' locations to our peers? Doing so helps routing but gives some information away to a potential attacker. +Node.pleaseSetPeersVisibilityAlertTitle=Please set the visibility mode for your friends Node.pleaseSetPeersVisibilityAlert=Freenetは今やあなたのフレンドのフレンドに、効率を改善し、あなたの接続をより信頼できるものとするために接続できますが、ピアのうち、どれがこれを適用するのに安全か知る必要があります。フレンドへの接続ページに行き、フレンドの可視性モードを設定してください。Freenetがあなたのフレンドと接続し、彼らがあなたのフレンドに接続することができるようにするために、ほとんどYESにするべきですが、フレンドを知られたくないノードにはNOを設定してください。 +Node.showFriendsVisibilityAlert=Show an alert when friends' visibility settings are missing? +Node.routeAccordingToOurPeersLocation=Shall we take the locations of the peers of our peers into account for routing purposes? +Node.routeAccordingToOurPeersLocationLong=Doing so helps routing but might help a potential attacker. Node.skipWrapperWarning="ラッパーを使用していません"警告をスキップしますか? +Node.skipWrapperWarningLong=If true, the "not using the wrapper" warning will not be shown. Note that this will only hide the warning from the next restart on. +Node.slashdotCacheLifetime=How long to keep data in the recent requests cache? +Node.slashdotCacheLifetimeLong=How long to keep data in the recent requests cache (milliseconds, use k for seconds)? Note that this goes away on restart anyway. +Node.slashdotCacheSize=Maximum size of the recent requests cache (in bytes, KB MB GB TB etc) Node.slashdotCacheSizeLong=最近のリクエストのキャッシュの最大サイズ(時間制限もあるということを心得よ) Node.storeDirectory=ストアディレクトリ Node.storeDirectoryLong=他のFreenetユーザに提供されるデータ(キー、ブロック、など)を保持するデータストアファイルのディレクトリへのパス @@ -779,35 +1255,111 @@ Node.storeMaxMemTooHigh=BDBにあなたのRAMの80%以上を与えることは Node.storePreallocate=データストアのための領域の事前割り当て Node.storePreallocateLong=データストアのための領域の事前割り当て Node.storeSaltHashResizeOnStart=ノードのスタート時にストアをリサイズする(saltハッシュのみ) +Node.storeSaltHashResizeOnStartLong=Resize store on node start (salt-hash only). If this is true, Freenet will complete resizing the datastore during startup. This will complete much faster than doing it "on the fly", but on the other hand your Freenet node will not be available for some time while it completes the resize. +Node.storeSize=Freenet datastore size (bytes, MB, GB, TB, etc) +Node.storeSizeLong=Size of the Freenet datastore, which includes the store and cache, and stores data passing through your node. Freenet uses disk space for many other things, such as temporary files and your downloads, which are separate. Node.storeType=データストアの種類 Node.storeTypeLong=データストアの種類。 Currently this can be salt-hash (this is the default, stores data on disk with a lossy hashtable and a Bloom filter), bdb-index (old store format, not recommended), or ram (FOR TESTING ONLY, keep the index and the data in memory, not on disk). Only use ram if you know what you are doing and have enough RAM to store all your data (and note it will not be saved on shutdown)! 変更はFreenetが再起動するまで効力がありません。 +Node.storeBloomFilterSize=Bloom filter size (total) in bytes +Node.storeBloomFilterSizeLong=Bloom filter size (total) in bytes. Usually 1/2048th the size of data store is more than enough. Set this to zero to disable bloom filter. Set this to -1 to reset to default. +Node.storeBloomFilterCounting=Use counting bloom filter? Node.storeBloomFilterCountingLong=2ビット計数ブルームフィルタを使用しますか? (よくわからない場合は触らないでください) Node.storeUseSlotFilters=スロットフィルタを使用しますか? (強くお勧めします) +Node.storeUseSlotFiltersLong=This greatly reduces disk I/O for the salted-hash store, at a memory and disk cost of around 4 bytes for every key i.e. 1/3000th of the store size. This is strongly recommended, unless your RAM is small and you have a fast SSD. +Node.storeSaltHashSlotFilterPersistenceTime=Persistence interval for slot filters +Node.storeSaltHashSlotFilterPersistenceTimeLong=How often should the slot filters be written for the store? -1 = write immediately. 0 = write at shutdown. >0 = write every n milliseconds. So e.g. 60000 = every minute. Note that if Freenet is shut down uncleanly, and this is not set to write immediately, the slot filter will be rebuilt on the next start-up, which will cause a significant amount of disk access. +Node.slotFilterPersistenceTimeError=Slot filter persistence time must be -1, 0, or positive. Node.swapRInterval=スワップ要求送信間隔 (ms) +Node.swapRIntervalLong=Interval in milliseconds between sending swap requests. Node.throttleLocalTraffic=ローカルのトラフィックを抑制しますか? +Node.throttleLocalTrafficLong=Throttle local traffic? If enabled, even LAN and localhost traffic will be subject to bandwidth limiting. Node.useSlashdotCache=30分間全てのリクエストをキャッシュしますか? +Node.useSlashdotCacheLong=Replies to requests with high HTL are not eligible to be stored in the datastore. If this option is true, they will be stored in the recent requests cache, a special short-term cache. If this option is false then only ULPR responses (i.e. delayed answers to requests) will be stored in this cache. This is enabled by default unless network security level is MAXIMUM, as it is important for performance when a key becomes popular suddenly. However, it does have some security impact, in that if an attacker can get close to the target within 30 minutes (unlikely in most cases), this mechanism may help him to confirm his guesses. Node.usingGCJTitle=GCJ下でFreenetを実行するのは、お勧めできません。 +Node.usingGCJ=You are running Freenet under GCJ (a free Java compiler). This is buggy and likely to cause problems. We recommend switching to OpenJDK (which is also free, and less likely to have odd bugs). +Node.usingOracleTitle=You are running Freenet under the official Oracle Java Virtual Machine. Please switch to OpenJDK if possible. +Node.usingOracle=You are running Freenet under the official Oracle Java Virtual Machine. The official JVM has deliberately crippled encryption code because of export restrictions, so we have to use the built-in Freenet encryption code, which may be slower. You should switch to OpenJDK if possible (e.g. install it through your package manager). +Node.withAnnouncement=Allow Freenet to bootstrap itself using seednodes? Node.withAnnouncementLong=あなたのFreenetノードにシードノードを利用したブートストラップを許可しますか? オープンネット(見知らぬ人のネットワーク、低/標準ネットワークセキュリティ・レベルでの自動Freenet接続)に参加するには、Freenetで運ばれる公共ノードの小さなリストを使ってコンタクトします。明らかにこれは幾分危険をはらんでいますが、オープンネットを使用するなら必要になるでしょう: しばらくあなたのノードがダウンすると - 特にNATされていて、もしくはIPアドレスが変動した場合 - もう一度シードが必要になるでしょう。良いセキュリティが必要ならば、フレンドと接続してネットワークセキュリティ・レベルを高にする必要があります。 Node.writeLocalToDatastore=データストアへローカルや近くのリクエストを書き込みますか? +Node.writeLocalToDatastoreLong=Whether to write data returned by high HTL (local and nearby) requests to the main persistent datastore. We strongly recommend you keep this option disabled unless you don't care about either datastore seizure or store probing attacks. +NodeClientCore.alwaysCommit=Commit after every database job? +NodeClientCore.alwaysCommitLong=If this option is false, we commit the database to disk every 30 seconds. If it is true we commit it after every database job. This will reduce performance but will ensure that no progress is lost on an unclean shutdown, and slightly reduce memory usage. Normally this should be false, to reduce disk access. +NodeClientCore.maxArchiveSize=Maximum size of any given archive +NodeClientCore.maxArchiveSizeLong=Maximum size of any given archive NodeClientCore.couldNotFindOrCreateDir=ディレクトリを発見または作成ができません NodeClientCore.downloadAllowedDirs=ダウンロードを許可するディレクトリを指定 +NodeClientCore.downloadAllowedDirsLong=Semicolon separated list of directories to which downloading is allowed. "downloads" means downloadsDir, empty means no downloading to disk allowed, "all" means downloading to anywhere is allowed. WARNING! If this is set to "all" any user with access to FCP can download any file to anywhere on your computer! NodeClientCore.downloadsDir=通常のダウンロードディレクトリ NodeClientCore.downloadsDirLong=デフォルトでダウンロードしたファイルが保存されるディレクトリ +NodeClientCore.encryptPersistentTempBuckets=Encrypt the persistent temporary buckets? +NodeClientCore.encryptPersistentTempBucketsLong=Encrypt the persistent temporary buckets? In some cases (if you use hard-drive and swap encryption) it might not make sense to encrypt persistent temporary buckets. +NodeClientCore.encryptTempBuckets=Encrypt the temporary buckets? +NodeClientCore.encryptTempBucketsLong=Encrypt the temporary buckets? In some cases (if you use hard-drive and swap encryption) it might not make sense to encrypt temporary buckets. +NodeClientCore.fileForClientStats=File to store client statistics in +NodeClientCore.fileForClientStatsLong=File to store client throttling statistics in (used to decide how often to send requests) +NodeClientCore.lazyStartDatastoreChecker=Start the datastore checker thread on demand? +NodeClientCore.lazyStartDatastoreCheckerLong=Start the datastore checker thread on demand? Useful mainly for simulations, or if threads are extremely costly. Most nodes should have this turned off. +NodeClientCore.lazyStartDatastoreCheckerMustRestartNode=You must restart Freenet to change the "start the datastore checker on demand" setting. +NodeClientCore.maxUSKFetchers=Maximum number of temporary USK fetchers +NodeClientCore.maxUSKFetchersLong=Maximum number of temporary background fetches for recently visited USKs (e.g. freesites). Note that clients and plugins (e.g. WebOfTrust) can subscribe to USKs, which does not count towards the limit. +NodeClientCore.maxUSKFetchersMustBeGreaterThanZero=Must be greater than zero +NodeClientCore.memoryLimitedJobThreadLimit=Max FEC threads +NodeClientCore.memoryLimitedJobThreadLimitLong=Maximum number of threads used for memory-intensive operations such as FEC decoding/encoding (i.e. decoding a big file from blocks downloaded from the network using Forward Error Correction). +NodeClientCore.memoryLimitedJobThreadLimitMustBe1Plus=You must allow FEC decodes at least 1 thread +NodeClientCore.memoryLimitedJobMemoryLimit=Max memory used for FEC threads +NodeClientCore.memoryLimitedJobMemoryLimitLong=Maximum amount of memory used for memory-intensive operations such as FEC decoding/encoding (i.e. decoding a big file from blocks downloaded from the network using Forward Error Correction). +NodeClientCore.memoryLimitedJobMemoryLimitMustBeAtLeast=FEC decodes need at least ${min} memory (as a single large segment will need this much memory to decode/encode) NodeClientCore.minDiskFreeLongTerm=Minimum free disk space +NodeClientCore.minDiskFreeLongTermLong=Minimum amount of free disk space over the long term. RAM buckets for downloads in progress are counted toward this limit. NodeClientCore.minDiskFreeShortTerm=Minimum free disk space during decode +NodeClientCore.minDiskFreeShortTermLong=Minimum free disk space over a brief period, when doing disk-intensive but short-lived operations such as finishing a download. We recommend that this is smaller than the long-term limit. +NodeClientCore.movingTempDirOnTheFlyNotSupported=Moving temp directory on the fly not supported at present +NodeClientCore.persistentTempDir=Persistent temp files directory +NodeClientCore.persistentTempDirLong=Path of directory to put persistent temp files in. Persistent means that this should be kept even when Freenet is not running. +NodeClientCore.pluginStoresDir=Plugin data folder +NodeClientCore.pluginStoresDirLong=Path to directory to store plugins' data in. Note that not all plugins use this mechanism, some create their own files. +NodeClientCore.maxRAMBucketSize=Maximum size of a RAMBucket (bytes, KB MB etc allowed) +NodeClientCore.maxRAMBucketSizeLong=Maximum size of a RAMBucket (bigger buckets will be kept as files on the disk) +NodeClientCore.ramBucketPoolSize=Amount of RAM to dedicate to temporary buckets (bytes, KB MB etc allowed) +NodeClientCore.ramBucketPoolSizeLong=Amount of RAM to dedicate to temporary buckets. The tradeoff is more memory usage against more IOs. NodeClientCore.startingUpTitle=Freenetは起動中です NodeClientCore.startingUp=起動プロセスが完了するまで少し時間が掛かります。その間、Freenetは動作が遅くなり多少動作しない可能性があります。 NodeClientCore.startingUpShort=Freenetは起動中であり、多少遅くなったり動作しない可能性があります。 +NodeClientCore.tempDir=Temp files directory. This can be cleared out when Freenet is not running. +NodeClientCore.tempDirLong=Name of directory to put temporary files in NodeClientCore.uploadAllowedDirs=アップロードを許可するディレクトリを指定 +NodeClientCore.uploadAllowedDirsLong=Semicolon separated list of directories from which uploading is allowed. Empty means no uploading from disk allowed, "all" means uploading from anywhere (including system files etc!) is allowed. WARNING! If this is set to "all" any file on your computer can be uploaded by any user with access to FCP. +NodeClientCore.useAIMDsRT=Use AIMDs for real-time requests? (EXPERTS ONLY) +NodeClientCore.useAIMDsRTLong=Enable originator-level throttling of request starters based on TCP-style Additive Increase Multiplicative Decrease rate estimation (for realtime requests). This enables or disables a key part of the old load management system. EXPERTS ONLY!!! +NodeClientCore.useAIMDsBulk=Use AIMDs for bulk requests? (EXPERTS ONLY) +NodeClientCore.useAIMDsBulkLong=Enable originator-level throttling of request starters based on TCP-style Additive Increase Multiplicative Decrease rate estimation (for bulk requests). This enables or disables a key part of the old load management system. EXPERTS ONLY!!! NodeIPDectector.inclLocalAddress=ローカルアドレスを noderef に含める NodeIPDectector.inclLocalAddressLong=ノード参照にローカルな(LANとlocalhost)アドレスを含めるかどうか。これはallowLocalAddresses=trueがそれぞれの参照の両側にセットされていない限り無効になります。(上級モードにてフレンドのページでこのフラグをセットできます) NodeIPDectector.ipOverride=IP アドレスのオーバーライド NodeIPDectector.ipOverrideLong=IPアドレスの上書き(通常は不要です) - あなたが静的IPアドレスもしくはドメイン名を持っていてファイアウォールの後ろに居る場合にセットしてください。 NodeIPDectector.tempAddressHint=一時的な IP アドレスのヒント NodeIPDectector.tempAddressHintLong=IPアドレスが何であるかの一時的なヒント; 使用後に消去されます +NodeIPDetector.maybeSymmetric=It looks like your node may be behind a symmetric NAT. You may have connection problems: If you are behind a symmetric NAT you will probably only be able to connect to peers which are open to the internet. +NodeIPDetector.maybeSymmetricTitle=Connection problems +NodeIPDetector.maybeSymmetricShort=Connection problems: You may be behind a symmetric NAT. NodeIPDetector.unknownHostErrorInIPOverride=不明なホスト: ${error} +NodeStat.aggressiveGC=AggressiveGC modificator +NodeStat.aggressiveGCLong=Allows the user to tweak the time in between GC and forced finalization. SHOULD NOT BE CHANGED unless you know what you're doing! -1 means: disable forced call to System.gc() and System.runFinalization() +NodeStat.ignoreLocalVsRemoteBandwidthLiability=Treat local requests as remote requests for bandwidth liability limiting? +NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=Enable this for significantly lower bandwidth usage and slightly more security against request starting timing attacks (mostly you don't need to worry about them as correlation attacks are probably easier) +NodeStat.freeHeapBytesThreshold=Free heap bytes threshold +NodeStat.freeHeapBytesThresholdLong=Freenet will try to keep its free heap bytes above the threshold by refusing new requests +NodeStat.freeHeapPercentThreshold=Free heap percent threshold +NodeStat.freeHeapPercentThresholdLong=Freenet will try to keep its free heap percentage (of max heap bytes allowed) above the threshold by refusing new requests NodeStat.maxPingTime=最大ping時間? +NodeStat.maxPingTimeLong=Freenet will reject all requests if the average ping time to its peers goes above this level. Ping times have proven a reliable indicator of both system and network load, but if your internet connection is unusually slow, you should increase this. Measured in milliseconds. +NodeStat.subMaxPingTime=Start rejecting requests at what ping time? +NodeStat.subMaxPingTimeLong=Freenet will start to reject some requests when the average ping time to its peers goes beyond this time. Increase it if your internet connection is unusually slow. Measured in milliseconds. NodeStat.memCheck=メモリーチェックを有効にする +NodeStat.memCheckLong=Enable the memory check (writes a message in logfile, mandatory for aggressiveGCModificator to have any effect!) +NodeStat.statsPersister=File to store node statistics in +NodeStat.statsPersisterLong=File to store node statistics in (not client statistics, and these are used to decide whether to accept requests so please don't delete) NodeStat.threadLimit=スレッド制限 NodeStat.threadLimitLong=Freenet は、スレッドの使用量が多すぎるときに新しいリクエストを拒否することで、スレッドの使用量を指定された値に制限しようとします。 NodeStats.allRequests=全リクエスト @@ -824,6 +1376,7 @@ NodeStats.localHeader=ローカル NodeStats.localCHKs=ローカルCHKs NodeStats.localSSKs=ローカルSSKs NodeStats.mustBePercentValueNotFull=値は0から99までの百分率である必要があります。 +NodeStats.pSuccess=P(Success) NodeStats.realTimeHeader=実時間 NodeStats.remoteHeader=リモート NodeStats.remoteCHKs=リモートCHKs @@ -834,11 +1387,19 @@ NodeStats.timeoutFractions=キュー中のタイムアウト NodeStats.transfersTimedOut=転送タイムアウト NodeStats.unsuccessfulHeader=不成功 NodeStats.valueTooLow=値は設定に対して低すぎます、増加させてください! +MainJarUpdater.fetchingDependencies=Fetching jars required by the new build +MainJarUpdater.fetchingFromUOM=Fetching directly from a more up to date node ("Update Over Mandatory") NodeUpdateManager.enabled=自動的にダウンロードする NodeUpdateManager.enabledLong=新しいversionのFreenetのnodeを自動的にダウンロードするかどうか。trueを選択した場合、新しいversionのFreenetのnodeが自動的にダウンロードされます。しかし、新しいversionのFreenetのnodeが確実にインストールされるとは限りません。Freenet nodeがwrapperを介して動作していない場合、起動時にfalseに変更されます。 NodeUpdateManager.installNewVersions=自動的にインストールする NodeUpdateManager.installNewVersionsLong=ダウンロードされた新しいversionのFreenetのnodeを自動的にインストールするかどうか。 +NodeUpdateManager.invalidRevocationURI=Invalid revocation URI: ${error} +NodeUpdateManager.invalidUpdateURI=Invalid update URI: ${error} +NodeUpdateManager.noUpdateWithoutWrapper=Cannot update because not running under the Java Service Wrapper NodeUpdateManager.revocationURI=Freenetはどこで失効キーを探す必要がありますか? +NodeUpdateManager.revocationURILong=URI for the revocation key. If this is found it means the auto-update system has been compromised, and Freenet will display its contents and disable the auto-updater. +NodeUpdateManager.updateCatastropheTitle=Catastrophic Update Failure! +NodeUpdateManager.updateFailed=Update Failed: ${reason} NodeUpdateManager.updateFailedTitle=更新失敗! NodeUpdateManager.updateFailedShort=更新失敗: ${reason} NodeUpdateManager.updateSeednodes=自動的にシードノードを更新しますか? @@ -846,41 +1407,109 @@ NodeUpdateManager.updateSeednodesLong=Freenet経由で自動的にseednodes.fref NodeUpdateManager.updateInstallers=Freenet経由で最新のインストーラをダウンロードしますか? NodeUpdateManager.updateInstallersLong=Freenet経由で最新のインストーラをダウンロードしますか? これらは「フレンドを追加」のページからリンクされます。 NodeUpdateManager.updateURI=Freenetはどこでアップデートを探す必要がありますか? -NodeUpdateManager.updateURILong=Where should your Freenet node look for updates? This should be a Freenet URI where updates can be downloaded from. The default URI ends in /update/(version number). To download the source code for an update, you can copy the key below, and change "update" to "update-source". Similarly, "fullchangelog" gives you the long, developer-friendly list of changes, and "installer", "wininstaller", "seednodes" and "iptocountryv4" give other files. +NodeUpdateManager.updateURILong=Where should your Freenet node look for updates? This should be a Freenet URI where updates can be downloaded from. The default URI ends in /jar/(version number). To download the source code for an update, you can copy the key below, and change "jar" to "update-source". Similarly, "changelog" gives you the user-facing list of changes, "fullchangelog" gives you the long, developer-friendly list of changes, and "installer", "wininstaller", "seednodes" and "iptocountryv4" give other files. +NodeUpdateManager.updateURIMustBeAUSK=Update URI must be a USK! +NodeUpdateManager.updateURIMustHaveNoMetaStrings=Update URI must not have extra path components, e.g. USK@blah,blah,blah/update/1430 not USK@blah,blah,blah/update/1430/ +NodeUpdateManager.updateFailedInternalError=FAILED TO UPDATE FREENET. INTERNAL ERROR: ${reason} NotEnoughNiceLevelsUserAlert.title=十分なNiceレベルが利用できません! NotEnoughNiceLevelsUserAlert.short=十分なniceレベルが利用できません! Freenetをより低いniceレベルで稼動してください。 NotEnoughNiceLevelsUserAlert.content=あなたのノードは高niceレベルで動作していることが検知されました。十分なレベルが利用可能でないと十分に機能できません。niceレベルを下げてください。あなたのノードは(run.shのPRIORITY を見て値を下げよ)で動作しています。現在あなたのノードは${available}レベルで動作していますが${required}レベルが必要です。 +M3UFilter.notM3u=The file you tried to fetch is not an M3U file or it is invalid. It might be some other file format, and your browser may do something dangerous with it, therefore we have blocked it. +OpennetManager.oneConnectionPerIP=Limit to one connection per address? (strangers) +OpennetManager.oneConnectionPerIPLong=Don't allow more than one stranger connection per address? This will make it slightly harder for an attacker to connect more than once to your node as different identities, in order to dominate your routing or make harvesting easier. Also prevents having the same node connected on as a friend and stranger simultaneously. +OpennetConnectionsToadlet.successTimeTitle=Last success +OpennetConnectionsToadlet.successTime=Last time there was a successful CHK fetch from the node +OpennetConnectionsToadlet.fullTitle=${counts} Strangers (Untrusted Peers) +OpennetConnectionsToadlet.peersListTitle=My Opennet Peers (untrusted peers added by Freenet in low/normal network security level) +OggBitstreamFilter.MalformedTitle=Malformed Ogg Bitstream +OggBitstreamFilter.MalformedMessage=The Ogg bitstream is not correctly formatted, and could not be properly validated. +OggPage.ValidSubpageTitle=Ogg Page has Valid Subpage +OggPage.ValidSubpageMessage=An element in the Ogg bitstream was found to contain another valid element. This is not a feature of any currently supported bitstream formats. It is likely the bitstream has been maliciously altered in an attempt to bypass the content filter. If this is the case, this file is dangerous, and should not be opened. +OggFilter.EmptyOutputTitle=No Valid Ogg Bitstreams +OggFilter.EmptyOutputDescription=The ContentFilter was unable to find any bitstreams in the file which could be safely validated. PNGFilter.invalidHeader=あなたがフェッチしようとしたファイルはPNGではありません。ファイルは有効なPNGヘッダを持っていません。ファイルは他のフォーマットである可能性があり、それによりブラウザが危険をもたらす可能性があります。そのためファイルをブロックしました。 +PNGFilter.invalidHeaderTitle=Not a PNG - invalid header +PeerManagerUserAlert.connErrorTitle=Some peers cannot connect +PeerManagerUserAlert.connError=${count} of your peers cannot connect for an unknown reason, possibly because of a buggy node or a corrupt node reference. PeerManagerUserAlert.clockProblemTitle=時計の問題 +PeerManagerUserAlert.clockProblem=${count} of your nodes are unable to connect because their system clock is more than 24 hours different to yours. Please check whether your computer has the correct time. Incorrect time will cause many node and client mechanisms to fail. +PeerManagerUserAlert.noConns=This node has not been able to connect to any other nodes so far; it will not be able to function normally. Hopefully some of your peers will connect soon; if not, try to get some more peers. You need at least 3 peers at any time, and should aim for 5-10. +PeerManagerUserAlert.noConnsTitle=No open connections +PeerManagerUserAlert.noPeersDarknet=Your Freenet node has no friends to connect to, therefore it will not be able to work normally. You need at least 3 connected friends at all times, and ideally 5-10. These should be people you know who also run Freenet. Alternatively you could set the network security level to NORMAL or LOW to enable connecting to strangers and quickly get some connections. PeerManagerUserAlert.noPeersTitle=友達がいません +PeerManagerUserAlert.oneConn=This node only has one connection. Performance will be impaired, and you have no anonymity nor even plausible deniability if that one person is malicious. Your node is attached to the network like a "leaf" and does not contribute to the network's health. Try to get at least 3 (ideally more like 5-10) connected peers at any given time. +PeerManagerUserAlert.onlyFewConnsTitle=Only ${count} open connection(s) PeerManagerUserAlert.outdatedUpdateTitle=Freenetは更新を必要としています! 「自動更新」設定ページでアップデートを有効にしてください。 PeerManagerUserAlert.outdatedUpdate=お使いのFreenetが古いようです。それが更新されるまで正常に動作しない場合があります。Freenetは、他のFreenetのノードからアップデートをダウンロードすることによって自動的に更新することができますが、これは現在無効になっています。あなたは「自動更新」設定ページの更新を有効にする必要があります。その後、アップデートが動作するまで1、2時間かかることがあります。最後の手段として、update.shまたはupdate.cmdスクリプトを使用することができますが、これは安全性が低くなりますのでお勧め出来ません。 +PeerManagerUserAlert.tooHighBwlimitDelayTime=This node has to wait too long for available bandwidth (${delay}ms > ${max}ms). Increase your output bandwidth limit and/or remove some peers to improve the situation. +PeerManagerUserAlert.tooHighBwlimitDelayTimeTitle=bwlimitDelayTime too high +PeerManagerUserAlert.tooHighPingTime=Freenet is having trouble talking with its peers quickly enough (${ping}ms > ${max}ms). Your upload bandwidth limit may be too low, in which case you should increase it, or too high, in which case you should decrease it. Normally you should not allow Freenet more than half your upload bandwidth. Also, this problem can be caused by high processor usage (by other applications or because Freenet's memory limit in wrapper.conf is too low), excessive swapping or by network problems outside of Freenet's control, or possibly by bugs in Freenet. You should try to resolve this as Freenet will work very badly until it is fixed. PeerManagerUserAlert.tooHighPingTimeTitle=インターネット接続に問題あり:Pingがとても長いです +PeerManagerUserAlert.tooManyConns=There are too many connections (${count} > ${max}). Adding large numbers of nodes automatically does not produce a small-world topology, hurts routing, and risks producing single points of failure. PeerManagerUserAlert.tooManyConnsTitle=開いている接続数が多すぎです +PeerManagerUserAlert.tooManyDisconnected=This node has too many disconnected peers (${count} > ${max}). This will have a slight impact on your performance as disconnected peers also consume a small amount of bandwidth and CPU. Consider "cleaning up" your peer list. Note that ideally you should connect to nodes run by people you know. Even if not, adding lots of nodes automatically is bad as it does not produce an optimal topology. +PeerManagerUserAlert.tooManyDisconnectedTitle=Too many disconnected peers +PeerManagerUserAlert.tooManyNeverConnected=Many of this node's peers have never connected even once: ${count}. You should not add peers unless you know that they have also added your reference. Otherwise they will not connect. +PeerManagerUserAlert.tooManyNeverConnectedTitle=Many peers have not connected once yet +PeerManagerUserAlert.tooManyNeverConnectedWithLink=Many of this node's peers have never connected even once: ${count}. You should not add peers unless you know that they have also added ${link}your reference${/link}. Otherwise they will not connect. +PeerManagerUserAlert.tooOldNeverConnectedPeers=One or more of your node's peers have never connected in the two weeks since they were added. Consider removing them since they are marginally affecting performance (wasting packets talking to nodes that aren't there). +PeerManagerUserAlert.tooOldNeverConnectedPeersTitle=Never connected peer(s) too old +PeerManagerUserAlert.twoConns=This node has only two connections. Performance and security will not be very good, and your node is not doing any routing for other nodes. Your node is embedded like a 'chain' in the network and does not contribute (much) to the network's health. Try to get at least 3 (ideally more like 5-10) connected peers at any given time. +PeersOffersUserAlert.title=Connect to a trusted peer added by you +PeersOffersUserAlert.text=Would you like to connect to this peer(s) added by you to 'peers-offers' folder? +PeersSayKeyBlownAlert.intro=One or more of your peers says that the auto-update system has been compromised! This means that an attacker may know the private key for the auto-update system and can therefore cause your node to run code of his choice (if you update)! The auto-update system has been disabled to prevent this. It is also possible that your peers are deliberately lying about it. +PeersSayKeyBlownAlert.fetching=Your node is attempting to download the revocation certificate to find out more details. +PeersSayKeyBlownAlert.failedFetch=Your node has been unable to download the revocation certificate. Possible causes include an attack on your node to try to get you to update despite the key being compromised, or your nodes lying about the key being compromised. Please contact the developers or other Freenet users to sort out this mess. +PeersSayKeyBlownAlert.connectedSayBlownLabel=These connected nodes say that the auto-update key has been compromised (we are trying to download the revocation certificate from them): +PeersSayKeyBlownAlert.disconnectedSayBlownLabel=These nodes told us that the auto-update key has been compromised, but then disconnected, so we could not fetch the revocation certificate: +PeersSayKeyBlownAlert.failedTransferSayBlownLabel=These nodes told us that the auto-update key has been compromised, but then failed to transfer the revocation certificate: +PeersSayKeyBlownAlert.titleWithCount=Auto-update key compromised according to ${count} peer(s)! +PeersSayKeyBlownAlert.short=According to some of your peers it is not safe to auto-update. Auto-update has been disabled until we know if they are lying. PluginConfig.configFile=プラグイン設定ファイル PluginConfig.configFileLong=プラグイン設定を保管するファイルへのパス/ファイル名 PluginConfig.installDir=プラグインインストール・ディレクトリ PluginConfig.installDirLong=プラグインをインストールするディレクトリ +PluginJarUpdater.pluginUpdatedShortText=A new version of the ${name} plugin is available! +PluginJarUpdater.pluginUpdatedText=Click below to update to the latest version (${newVersion}) of ${name}. +PluginJarUpdater.pluginUpdatedTitle=A new version of the ${name} plugin is available! +PluginJarUpdater.updatePlugin=Update plugin after final security checks +PluginJarUpdater.willDeployAfterRevocationCheck=The plugin ${name} will be deployed as soon as we have finished double-checking that the auto-update system has not been compromised. +PluginManager.alwaysLoadPluginsFromCentralServer=Always load plugins over the web? (NOT RECOMMENDED!) +PluginManager.alwaysLoadPluginsFromCentralServerLong=If true, always download plugins over the web from our web server rather than over Freenet. This is more reliable but dangerous: While we use SSL, wiretappers may still be able to identify which plugin you download, and correlate it with when a new identity is created e.g. on Freemail; certainly they could tell you use Freenet. +PluginManager.cannotSetOnceLoaded=Cannot set the plugins list once loaded PluginManager.deleteFailedPluginButton=次回の起動時に再試行しない PluginManager.loadedOnStartup=起動時にロードするプラグイン PluginManager.loadedOnStartupLong=クラスパス, ノード開始時にプラグインをロードするための名前とロケーション PluginManager.loadedPlugins=起動時にロードするプラグイン PluginManager.loadedPluginsLong=Freenetの起動時に起動するプラグインのリスト +PluginManager.pluginReqNewerJVM=The plugin ${name} seems to require a later Java version. Please install at least Oracle Java 1.8, or remove the plugin. PluginManager.pluginReqNewerJVMTitle=より新しいバージョンのJavaをプラグイン ${name} は要求しています。 PluginManager.pluginLoadingFailedTitle=プラグインをロードできませんでした! PluginManager.pluginLoadingFailedShort=プラグイン${name}をロードできませんでした! PluginManager.pluginLoadingFailed=プラグイン ${name} はロードできませんでした PluginManager.pluginLoadingFailedStillTryingOverFreenet=我々はまだFreeenetからプラグインをロードしようとしています。 PluginManager.pluginLoadingFailedWithMessage=プラグイン ${name} をロードできませんでした: ${message} +PluginManager.officialPluginLoadFailedSuggestTryAgainFreenet=Freenet経由で再トライできますが、web経由でフェッチすることもできます。 +PluginManager.officialPluginLoadFailedSuggestTryAgainHTTPS=Freenetからプラグインをフェッチできますが、web経由で再トライすることもできます。 PluginManager.officialPluginLoadFailedTryAgainFreenet=Freenetからプラグインを読み込む +PluginManager.officialPluginLoadFailedTryAgain=Web経由で我々のサーバからプラグインをロードする (匿名ではありません!) PluginToadlet.addPluginTitle=プラグインを追加 PluginToadlet.failedToLoadPlugin=プラグインのロードに失敗しました。 PluginToadlet.failedToLoadPluginCheckClass=リクエストされたプラグインが読み込めませんでした。プラグインのクラス名と、URLを指定している場合はそのURLを確認してください。 PluginToadlet.failedToLoadPluginTitle=プラグインのロードに失敗 +PluginToadlet.internalNameTitle=Internal Name PluginToadlet.loadPluginCommand=プラグインをロード PluginToadlet.noWebInterface=このプラグインにはウェブインターフェイスがないので、表示するものがありません。 PluginToadlet.noWebInterfaceTitle=プラグインにウェブインターフェイスがない PluginToadlet.pluginList=プラグインリスト +PluginToadlet.pluginListTitle=Plugins currently loaded +PluginToadlet.pluginNameTitle=Plugin Name +PluginToadlet.pluginNotFound=The requested plugin could not be found. +PluginToadlet.pluginNotFoundTitle=Plugin not found +PluginToadlet.returnToPluginsWithLinks=Please ${link}return${/link} to the list of plugins. +PluginToadlet.unsupportedMethod=Unsupported method. +PluginToadlet.unsupportedMethodTitle=Unsupported Method +PluginToadlet.visit=Visit PproxyToadlet.changeReloadOnStartup=変更 PproxyToadlet.classNameTitle=クラス名 PproxyToadlet.downloadNotAllowedFromRemoteServer=プラグインのダウンロードは我々のサーバからのみ許可されています。 @@ -895,20 +1524,77 @@ PproxyToadlet.loadLabelDeprecated=非推奨(廃止予定) PproxyToadlet.loadLabelExperimental=実験的 PproxyToadlet.loadOfficialPlugin=公式プラグインを追加 PproxyToadlet.loadOfficialPluginText=これらの公式プラグインのいずれもロードできます。これらのプラグインはプライバシーの漏洩とは無縁であることを我々は信じていますが、バグの可能性も拭えないことから保証はできかねます。非公式プラグインもロードできます。下を見てください。 +PproxyToadlet.loadOfficialPluginLabel=非公式プラグインをロード: PproxyToadlet.loadOtherPlugin=非公式プラグインを追加 PproxyToadlet.loadOtherPluginText=ここにロードしたいプラグインのファイル名かインターネットアドレス(URL)を入力できます。他のプラグインは上にリストされたものよりも外部でプライバシー流出について我々に検証されてすらいないため、ここでリモートプラグインをロードすることは、基本的にあなたの責任となります。 PproxyToadlet.loadOtherURLLabel=プラグインURL PproxyToadlet.noPlugins=プラグインがロードされていません +PproxyToadlet.noVersion=N/A +PluginManager.changePluginManagerEnabledInConfig=You must shut down Freenet and edit freenet.ini to change the plugins enabled setting. Add a line "pluginmanager.enabled=false" to disable plugin support, or "pluginmanager.enabled=true" to enable it. +PluginManager.enabled=Enable plugins? +PluginManager.enabledLong=Enable plugins? This should be enabled for nearly all nodes, but can be disabled for simulations. +PluginManager.pluginDesc.Freemail=Old version (v0.1) of email over Freenet. Requires an email client (e.g. Thunderbird). The only reason to install this is if you want to talk to people using the old Freemail, since the new Freemail isn't compatible with the old Freemail. Note that you can have both loaded at the same time as they use different ports to talk to your email client. +PluginManager.pluginDesc.Freemail_wot=Email over Freenet. Requires the WebOfTrust plugin. Has a basic web interface, or you can use an email client; see FSNG for details on how to set this up. +PluginManager.pluginDesc.HelloWorld=Test plugin. Does nothing useful, only for developers of new plugins. +PluginManager.pluginDesc.HelloFCP=FCP test plugin. Does nothing useful, only for developers of new plugins. +PluginManager.pluginDesc.JSTUN=Uses centralised STUN servers to detect your IP address and connectivity. It is important, especially on darknet, for Freenet to know what your IP address is (but it may be able to pick it up from your peers, especially if you have a lot of connections or are using opennet). STUN is used by other applications but this is centralised so could be used to find your node. If you can use UPnP instead then do so, but if UPnP can't find your IP address reliably you could load this as well. +PluginManager.pluginDesc.KeyUtils=A useful tool for examining Freenet keys, e.g. to list the pages in a freesite. +PluginManager.pluginDesc.MDNSDiscovery=Announces Freenet on your local network (LAN) so that clients can automatically connect to it. Not used much at the moment. +PluginManager.pluginDesc.SNMP=Enables you to remotely monitor your Freenet node's status via tools such as MRTG. +PluginManager.pluginDesc.TestGallery=Simple gallery page plugin, not currently used. +PluginManager.pluginDesc.ThawIndexBrowser=Lets you browse Thaw file indexes, and download files from them, from within the Freenet web interface, without having to install Thaw. +PluginManager.pluginDesc.UPnP=Talks to your router to discover your IP address and try to automatically forward your UDP ports to improve connectivity. You should have this enabled unless your LAN is untrusted. This is usually safe, unlike JSTUN. +PluginManager.pluginDesc.Freereader=Tool to insert RSS and ATOM feeds as freesites. +PluginManager.pluginDesc.Library=Tool to search Freenet using old or new format search indexes. +PluginManager.pluginDesc.Spider=Tool to create and automatically upload new format freesite search indexes, by automatically following links from your bookmarks. Causes very heavy load on your Freenet node, don't use it unless you have a powerful computer! Requires that the Library plugin also be loaded. +PluginManager.pluginDesc.Freetalk=Experimental anonymous forum. Currently has severe performance and reliability problems. Requires WebOfTrust. +PluginManager.pluginDesc.WebOfTrust=Allows you to create an anonymous identity. These identities can trust each other, or not, and hence avoid spam and DoS attacks. Backend for chat and social applications over Freenet. +PluginManager.pluginDesc.WebOfTrustTesting=Very new versions of the Web of Trust plugin, for testing purposes. Compiled by developer "xor". ATTENTION: These are not compiled on a high security computer. There is no key revocation mechanism for their update USK - if it gets hacked, you are in trouble. Updates will be installed at every restart of Freenet, even if auto-updating is disabled in configuration! Can only be fetched over Freenet, not from our central servers. Please unload WebOfTrust first before trying to load this plugin. +PluginManager.pluginDesc.FlogHelper=Easy to use tool for creating a blog on Freenet. Uses WebOfTrust to automatically announce your new flog so it should show up on the freesite indexes. +PluginManager.pluginDesc.Sharesite=Tool to publish and update single-page sites. Based on the ShareWiki plugin. +PluginManager.pluginDesc.UPnP2=Talks to your router to discover your IP address and try to automatically forward your UDP ports to improve connectivity. You should have this enabled unless your LAN is untrusted. This is usually safe, unlike JSTUN. +PluginManager.pluginDesc.KeepAlive=Tool to keep some keys within Freenet accessible. PluginManager.pluginName.Freemail=Freemail v0.1 (古い!) +PluginManager.pluginName.Freemail_wot=Freemail +PluginManager.pluginName.HelloWorld=HelloWorld +PluginManager.pluginName.HelloFCP=HelloFCP +PluginManager.pluginName.JSTUN=JSTUN +PluginManager.pluginName.KeyUtils=KeyUtils +PluginManager.pluginName.MDNSDiscovery=MDNSDiscovery +PluginManager.pluginName.SNMP=SNMP +PluginManager.pluginName.TestGallery=TestGallery +PluginManager.pluginName.ThawIndexBrowser=ThawIndexBrowser +PluginManager.pluginName.UPnP=UPnP +PluginManager.pluginName.Freereader=Freereader +PluginManager.pluginName.Library=Library +PluginManager.pluginName.Spider=Spider +PluginManager.pluginName.Freetalk=Freetalk +PluginManager.pluginName.WebOfTrust=WebOfTrust +PluginManager.pluginName.WebOfTrustTesting=WebOfTrust Testing Versions +PluginManager.pluginName.FlogHelper=FlogHelper +PluginManager.pluginName.Sharesite=Sharesite +PluginManager.pluginName.UPnP2=UPnP2 +PluginManager.pluginName.KeepAlive=KeepAlive PproxyToadlet.pluginFilename=名前 +PproxyToadlet.pluginGroup.communication=Communication +PproxyToadlet.pluginGroup.connectivity=Connectivity +PproxyToadlet.pluginGroup.example=Example +PproxyToadlet.pluginGroup.file-transfer=File Transfer +PproxyToadlet.pluginGroup.index=Indexing PproxyToadlet.pluginGroup.technical=技術面 PproxyToadlet.pluginGroupTitle=${pluginGroup} プラグイン +PproxyToadlet.pluginVersion=version PproxyToadlet.pluginNotFoundReload=リロードする為、指定したプラグインは配置できませんでした。 PproxyToadlet.pluginNotFoundReloadTitle=プラグインが見付かりません (リロード中) PproxyToadlet.pluginNotFoundUpdatingTitle=プラグインが見付かりませんでした (アップデート中) PproxyToadlet.pluginNotFoundUpdating=あなたがアップデートしようとしたプラグインはロードされていません! +PproxyToadlet.pluginSourceChoice=Freenetか我々の中央サーバからプラグインをフェッチすることができます: +PproxyToadlet.pluginSourceFreenet=Fetch over Freenet. This is difficult to trace, safe, and may be slow. +PproxyToadlet.pluginSourceHTTPS=Web経由で我々の中央サーバからフェッチします。 +PproxyToadlet.pluginSourceHTTPSWarning=WARNING: This will give away the fact that you are running Freenet, and won't work if our website is blocked! It may even be possible for a wiretapper to tell what you are trying to load, and thus connect it with when e.g. a Freemail identity was created. PproxyToadlet.pluginUnloaded=プラグインはアンロードされました PproxyToadlet.pluginUnloadedWithName=プラグイン ${name} はアンロードされました。 +PproxyToadlet.pluginFilesWarning=WARNING: If this plugin stored files on disk, they have NOT been deleted. PproxyToadlet.plugins=プラグイン PproxyToadlet.reloadOnStartupShort=起動時にリロード PproxyToadlet.reload=リロード @@ -918,6 +1604,7 @@ PproxyToadlet.reloadWarning=いくつかのプラグインは正常にリロー PproxyToadlet.reloadPurgeWarning=リロード前にキャッシュからプラグインを除去します。Freenetからロードされたプラグインをアップデートしたい時にセットする必要があります。プラグインがインターネットからロードされていた場合はまたダウンロードされます! PproxyToadlet.refreshOnStartup=起動時にサーバからリロードする PproxyToadlet.returnToPluginPage=プラグインページに戻る +PproxyToadlet.startedAtTitle=Started at PproxyToadlet.startingPluginsTitle=プラグインを始動中 PproxyToadlet.startingPluginName=プラグイン名 PproxyToadlet.startingPluginStatus=現在の状況 @@ -940,6 +1627,9 @@ SaltedHashFreenetStore.longRebuildProgressNew=データストア(${name}) をメ SaltedHashFreenetStore.longRebuildProgress=データストア(${name}) をメンテナンスしています: ${processed}/${total}。Freenetはある時点で正常にシャットダウンされなかったため、データストアの「スロットフィルタ」インデックスを再構築しています。これには多少のディスクアクセスを要しますが、インデックスを再構築するデータストアのサイズによっては、しばらくの間、余分なディスクアクセスを伴います。あなたのFreenetノードはこのプロセスの間に通常よりも遅くなることがありますが、Freenetを再起動しないでください。 SaltedHashFreenetStore.cleanerAlertTitle=データストアの保守を実行中 QueueToadlet.awaitingCompression=待機中 +QueueToadlet.awaitingPasswordTitleDownloads=Password required to access the download queue +QueueToadlet.awaitingPasswordTitleUploads=Password required to access the upload queue +QueueToadlet.badMIMETypeIntro=The following downloads are of type ${type}. Freenet does not have any built in support for making this type safe, and we know that it can contain many dangerous things that can compromise your anonymity. If you are sure you want to download these files anyway, check the box next to each download, and click Restart. QueueToadlet.backToUploadsPage=アップロードのページに戻る QueueToadlet.backToDownloadsPage=ダウンロードのページに戻る QueueToadlet.bulkDownloadSelectOptionDisk=ディスクに @@ -947,6 +1637,7 @@ QueueToadlet.bulkDownloadSelectOptionDirect=一時領域へ QueueToadlet.DUinProgress=ディレクトリアップロード進行中 (${size}) QueueToadlet.DinProgress=ダウンロード進行中 (${size}) QueueToadlet.UinProgress=アップロード進行中 (${size}) +QueueToadlet.cancelSelected=Cancel QueueToadlet.compatModeLabel=互換モード QueueToadlet.compatibilityMode=互換モード QueueToadlet.change=変更 @@ -956,6 +1647,7 @@ QueueToadlet.completedDU=ディレクトリアップロード完了 (${size}) QueueToadlet.completedDinDownloadDirectory=ダウンロードディレクトリへの完了したダウンロード (${size}) QueueToadlet.completedDinTempDirectory=一時領域への取り込み完了 (${size}) QueueToadlet.completedDtoDisk=ディスクへのダウンロード完了 (${size}) +QueueToadlet.completedDtoTemp=Completed fetches to temp (${size}) QueueToadlet.completedU=アップロード完了 (${size}) QueueToadlet.completedUDirectory=ディレクトリアップロード完了 (${size}) QueueToadlet.compressing=圧縮中 @@ -973,34 +1665,79 @@ QueueToadlet.downloadSucceededTitle=ダウンロードが成功しました: $ QueueToadlet.downloadsSucceededTitle=${nr} 個のダウンロード成功 QueueToadlet.downloadSucceeded=ファイル ${origlink}${filename}${/origlink} のダウンロードが成功しました。ファイル(サイズ ${size})を開くには${link}ここをクリック${/link}してください。 QueueToadlet.enqueuedSuccessfully=以下の ${number} キーはうまくキューに追加されました: +QueueToadlet.enqueuedFailure=The following ${number} keys could not be enqueued: +QueueToadlet.errorAccessDenied=Error: Access Denied! +QueueToadlet.errorAccessDeniedFile=Freenet's current configuration prohibits you from uploading the file "${file}". +QueueToadlet.errorDToDisk=Cannot download to disk +QueueToadlet.errorDToDiskConfig=Freenet's current configuration does not allow you to download files to the downloads directory. +QueueToadlet.errorDownloadNotCompleted=Download Not Completed +QueueToadlet.errorDownloadNotFound=Download Not Found +QueueToadlet.errorDownloadNotFoundExplanation=The download could not be found. Maybe it was already deleted? QueueToadlet.errorInvalidURI=無効なURI +QueueToadlet.errorInvalidURIToD=The URI is invalid and can not be downloaded. +QueueToadlet.errorInvalidURIToU=You did not specify a valid URI to insert the file to. +QueueToadlet.tooManyFilesInOneFolder=Cannot start insert: Too many files in one folder (directory). QueueToadlet.errorMustSpecifyKeyTypeTitle=ファイルをアップロードするときに、どのキータイプを使用するか指定する必要があります! +QueueToadlet.errorMustSpecifyKeyType=You must specify what key type to use when uploading a file! Use SSK if you are not sure as it is more secure. Use CHK if you want it to be the same key every time (good for filesharing) but only if you don't care about security. +QueueToadlet.errorNoFileOrCannotRead=The file does not exist or it cannot be read +QueueToadlet.errorNoFileSelected=No file selected +QueueToadlet.errorNoFileSelectedU=You did not select a file to upload. +QueueToadlet.errorNoKey=No key specified to download +QueueToadlet.errorNoKeyToD=You did not specify a key to download. +QueueToadlet.failedD=Failed downloads (${size}) +QueueToadlet.failedDUnknownMIME=Failed downloads: unknown type ${type} (${size}) +QueueToadlet.failedDBadMIME=Failed downloads: known dangerous type ${type} (${size}) +QueueToadlet.failedDU=Failed directory uploads (${size}) +QueueToadlet.failedToRemove=Failed to remove ${id}: ${message} +QueueToadlet.failedToRemoveId=Failed to remove: ${id} +QueueToadlet.failedToRemoveAll=Failed to remove all requests. Either delete them manually, or shutdown and delete the client database file (client.dat) manually. +QueueToadlet.failedToRemoveRequest=Failed to remove request +QueueToadlet.failedToRestart=Failed to restart: ${id} +QueueToadlet.failedToRestartRequest=Failed to restart request +QueueToadlet.failedU=Failed uploads (${size}) +QueueToadlet.fcpIsMissing=FCP server is missing +QueueToadlet.fileName=Local path +QueueToadlet.files=Files QueueToadlet.filterData=フィルタ: QueueToadlet.filterDataMessage=これを選択するとあなたのリクエストはコンテンツフィルタを経由して処理されます。フィルタはあなたのコンピュータを害したり、あなたの匿名性を暴露しうるすべてのものを妨害します。これをチェックしておくことを強くおすすめします。 +QueueToadlet.follow=Follow Redirect QueueToadlet.globalQueueIsEmpty=グローバルキューにダウンロード/アップロードキューは挿入されていません。 QueueToadlet.identifier=識別子 +QueueToadlet.insertAs=Insert as: QueueToadlet.insertFile=Freenet へファイルをアップロードする QueueToadlet.insertFileLabel=またはブラウザからファイルをアップロードする (低速) QueueToadlet.insertFileCompressLabel=圧縮する QueueToadlet.insertFileInsertFileLabel=ファイルをアップロード QueueToadlet.insertFileBrowseLabel=ディスクからファイルをアップロードする QueueToadlet.insertFileBrowseButton=ファイルを参照 +QueueToadlet.insertFileResetForm=Reset Form QueueToadlet.key=キー QueueToadlet.lastActivity=最後の進行 QueueToadlet.lastActivity.unknown=不明 QueueToadlet.lastActivity.ago=${time} 前 +QueueToadlet.lastFailure=Last Failure +QueueToadlet.lastFailure.never=never +QueueToadlet.lastFailure.ago=${time} ago QueueToadlet.legend=凡例 +QueueToadlet.mimeProblemFetchAnyway=You can ask Freenet to fetch the files anyway by clicking Restart (READ THE WARNING ABOVE FIRST!). QueueToadlet.mimeType=コンテンツの種類 QueueToadlet.noTaskOnGlobalQueue=現在グローバルキューに挿入されたキュータスクは存在しません。 QueueToadlet.none=なし +QueueToadlet.openKeyList=Open key list as text QueueToadlet.overriddenCryptoKeyInCompatCell=ランダムな暗号キー QueueToadlet.panicButtonTitle=パニックボタン +QueueToadlet.panicButtonNoConfirmation=Click to remove all downloads/uploads and clear all incriminating data without confirmation! +QueueToadlet.panicButtonWithConfirmation=Click to remove all downloads/uploads and clear all incriminating data! QueueToadlet.confirmPanicButtonPageTitle=パニックボタンを確定 +QueueToadlet.confirmPanicButton=Clicking yes below will wipe the cache of recently visited sites, delete the master keys file, remove all downloads and uploads and remove any residual evidence of old downloads and uploads, and then restart Freenet. Are you sure? QueueToadlet.confirmPanicButtonYes=はい、すべてを削除します +QueueToadlet.confirmPanicButtonNo=No, don't delete anything QueueToadlet.persistence=持続性 QueueToadlet.persistenceForever=永遠に QueueToadlet.persistenceNone=なし +QueueToadlet.persistenceReboot=reboot QueueToadlet.persistenceBrokenTitle=ダウンロード/アップロードキューデータベースが壊れています! +QueueToadlet.persistenceBrokenShortAlert=Download/upload queue broken due to database corruption! Click for details on how to fix! QueueToadlet.persistenceBroken=Freenetは永続的なダウンロードとアップロードを格納したデータベースの読み込みに失敗しました。これは通常、停電などによるディスク上のデータの破損が原因で発生します。この問題は、 ${TEMPDIR} ディレクトリと ${DBFILE} ファイルにあります。Freenetをシャットダウンした後、削除したりバックアップから復元してください。また、ディスク領域が不足しているかどうかも確認してください。Freenetがシャットダウンしている間に、このメッセージが発生する場合があります。 QueueToadlet.pleaseEnableFCP=このページにアクセスするには、FCPサーバーを有効にする必要があります QueueToadlet.panicButton=パニック! @@ -1013,36 +1750,62 @@ QueueToadlet.priority5=非常に低 QueueToadlet.priority6=一時停止中 QueueToadlet.priority=優先度 QueueToadlet.progress=ステータス +QueueToadlet.progressbarAccurate=This progress value is accurate +QueueToadlet.progressbarNotAccurate=This progress value is likely to change as the download finds more blocks +QueueToadlet.uploadProgressbarNotAccurate=This progress value is likely to change as the upload encodes more blocks QueueToadlet.reason=理由 +QueueToadlet.remove=Remove from list +QueueToadlet.removeFilesFromList=Remove from list +QueueToadlet.removeFinishedDownloads=Remove all finished downloads +QueueToadlet.removeFinishedUploads=Remove all finished uploads QueueToadlet.requestNavigation=リクエストのナビゲーションと総計 QueueToadlet.restart=再起動する +QueueToadlet.restartSelected=Restart QueueToadlet.returnToQueuePage=${link}キューページ${/link}に戻ります。 QueueToadlet.tryAgainUploadFilePage=ファイルをアップロードするために${link}再試行${/link}してください。 +QueueToadlet.recommend=Recommend +QueueToadlet.recommendAFileToFriends=Recommend a file to friends +QueueToadlet.recommendDescription=Description of the file: +QueueToadlet.recommendToFriends=Recommend to friends +QueueToadlet.recommendFilesToFriends=Recommend files to friends QueueToadlet.browseToChange=参照先を変更 QueueToadlet.siteUploadSucceededTitle=Freesite のインサートが成功しました: ${filename} QueueToadlet.sitesUploadSucceededTitle=${nr} 個のFreesiteのインサート成功 QueueToadlet.siteUploadSucceeded=あなたの Freesite ${filename} (${files} ファイル、サイズ合計 ${size}) の Freenet へのアップロードが成功しました。サイトのホームページを開くには${link}ここをクリック${/link}してください。 QueueToadlet.size=サイズ QueueToadlet.shuttingDownTitle=Freenet が終了しています +QueueToadlet.shuttingDown=The download/upload queue is not available because Freenet is shutting down. +QueueToadlet.starting=STARTING QueueToadlet.title=ダウンロードとアップロード QueueToadlet.titleUploads=アップロード QueueToadlet.titleDownloads=ダウンロード QueueToadlet.totalQueuedDownloads=ダウンロードキューの合計: ${size} QueueToadlet.totalQueuedUploads=アップロードキューの合計: ${size} +QueueToadlet.totalSize=Total Size QueueToadlet.unknown=不明 QueueToadlet.uploadSucceededTitle=インサートが成功しました: ${filename} QueueToadlet.uploadsSucceededTitle=${nr} 個のインサート成功 QueueToadlet.uploadSucceeded=ファイル ${filename} (サイズ ${size})の Freenet へのアップロードは成功しました。${link}ここをクリック${/link}してファイルを開くことができます。 QueueToadlet.warningUnsafeContent=安全でない可能性のあるコンテンツ QueueToadlet.warningUnsafeContentExplanation=ダウンロードしようとしているファイルは、現在Freenetのコンテンツフィルタによってフィルタリングされていません。それが意味するのは、そのファイルを開くことで、あなたの匿名性が損なわれる可能性があるということです。 +QueueToadlet.wipD=Running Downloads (${size}) +QueueToadlet.wipDU=Running Directory Uploads (${size}) +QueueToadlet.wipU=Running Uploads (${size}) +RevocationChecker.revocationFetchFailedMaybeInternalError=The auto-update system has failed due to an unexpected error: "${detail}". This might be because the auto-update key has been compromised (e.g. the keys have been stolen), so we have turned off auto-update as it may not be safe. However it might also be due to a local problem such as running out of disk space. If this is true, please fix the problem and restart Freenet. If this message does not go away, please check the website ( https://freenetproject.org/ ) and seek help. It might be useful to try fetching the key manually, but bear in mind it might have been inserted by the person who stole the keys: ${key} +RevocationChecker.revocationFetchFailedFatally=The auto-update system has been compromised! The private key may have been stolen, so auto-update has been turned off permanently. The file that should explain what has happened cannot be fetched due to an unexpected error: "${detail}". Please try fetching the revocation key manually (the key might have been inserted incorrectly e.g. be too big; for safety's sake we have to turn off auto-update straight away rather than wait for the whole revocation key): ${key} RequestStatus.unknownFilename=不明なファイル名 RequestStarterGroup.schedulerSSKInserts=スケジューラの優先ポリシー (SSK挿入) RequestStarterGroup.schedulerSSKRequests=スケジューラの優先ポリシー (SSKリクエスト) RequestStarterGroup.schedulerCHKInserts=スケジューラの優先ポリシー (CHK挿入) RequestStarterGroup.schedulerCHKRequests=スケジューラの優先ポリシー (CHKリクエスト) +RequestStarterGroup.scheduler=Priority policy of the scheduler: hard (strictly by priority) or soft (randomize the priorities a bit) RequestStarterGroup.schedulerLong=スケジューラが使用する優先ポリシー方式を設定します。 +RevocationKeyFoundUserAlert.text=The Freenet auto-update system appears to have been compromised! A trusted member of the Freenet team has uploaded a special signed message to Freenet to say that the keys for the auto-updater have been stolen, leaked, or somebody has them who shouldn't. We have turned off auto-update to prevent malware from being installed on your computer. Please check the website ( https://freenetproject.org/ ) for updates (if you can do so safely), but be careful as that may not be secure either. The thief might even have the keys for the message below, so please don't blindly follow instructions given without confirmation. Sorry we messed up! RevocationKeyFoundUserAlert.textDetail=メッセージは次のとおりです: ${message} +RevocationKeyFoundUserAlert.textDisabled=The auto-updater has been disabled. This might be because of a local problem, such as running out of disk space, or the auto-updating system may have been compromised. RevocationKeyFoundUserAlert.textDisabledDetail=理由は次のとおりです: ${message} +RevocationKeyFoundUserAlert.title=URGENT: The Freenet auto-update system has been compromised! +RevocationKeyFoundUserAlert.titleDisabled=The auto-updater may have been compromised! We have turned it off for now, please click for more details. SecurityLevels.title=セキュリティレベル SecurityLevels.tooltip=あなたのFreenetノードのセキュリティの度合いを設定する SecurityLevels.networkThreatLevelShort=インターネット経由であなたを攻撃する見知らぬ人に対する防御 @@ -1079,6 +1842,8 @@ SecurityLevels.maxSecurityYouNeedFriends=${bold}あなたは既にFreenetを稼 SecurityLevels.maximumNetworkThreatLevelCheckbox=はい、最高のセキュリティを求め、Freenetが試験的で私を追跡できることと、この設定で大幅にパフォーマンスを低下させることを承知しています。 SecurityLevels.physicalThreatLevelShort=ファイルの保護 SecurityLevels.physicalThreatLevel=あなたのコンピュータが盗難・奪取され、Freenetでの行動を見られる事にどの程度の懸念を持っていますか? +SecurityLevels.physicalThreatLevelFDE=We strongly recommend you encrypt your hard disk using full disk encryption software (${link}Wikipedia${/link}). This will provide the best protection, especially if you use third party apps and plugins such as Sone and FMS, but may take some time to set up. Otherwise, you can set a password for your downloads, uploads, and cache of recently visited Freenet websites. +SecurityLevels.physicalThreatLevelFDELink=https://en.wikipedia.org/wiki/Comparison_of_disk_encryption_software SecurityLevels.physicalThreatLevelSwapfile=また、可能であれば、スワップ領域を暗号化するべきです(これは、${operatingSystem}がメモリ不足に陥ったときに、余分な領域を確保するために使用する一時ファイルです)。これは、フルディスク暗号化よりも簡単に設定できるかもしれません。 SecurityLevels.physicalThreatLevelSwapfileWindows=Windowsのバージョンによってはコマンド"fsutil behavior set encryptpagingfile 1"でスワップファイルを暗号化できます。 SecurityLevels.physicalThreatLevel.name.LOW=なし @@ -1092,26 +1857,38 @@ SecurityLevels.physicalThreatLevel.choice.HIGH=パスワードを使用してフ SecurityLevels.physicalThreatLevel.desc.HIGH=パスワードを使用してファイルを暗号化します。ダウンロードキューと最近訪れたサイトのキャッシュにアクセスするためにパスワードを入力する必要があります。パニックボタンの使用が可能です。 SecurityLevels.physicalThreatLevel.name.MAXIMUM=最高 SecurityLevels.physicalThreatLevel.choice.MAXIMUM=保存されないキーファイルを使用してファイルを暗号化する。 +SecurityLevels.physicalThreatLevel.desc.MAXIMUM=Freenet will keep the encryption keys in RAM only, and will never store the keys to disk. All downloads and uploads will persist only until restart, and Freenet will refuse to write files to disk. You should take care to avoid saving content from Freenet to disk accidentally. Please consider installing full disk encryption software (https://en.wikipedia.org/wiki/Comparison_of_disk_encryption_software), especially if you are going to use third party plugins and apps over Freenet such as FMS and Sone! SecurityLevels.physicalThreatLevelEnd=標準的なセキュリティ上の予防策に従うこと(最新版に保つ、ウイルス対策をする、信用しないファイルを開かない)を忘れないでください。そしてFreenetが稼働中のスイッチが入った状態でコンピュータが奪取された場合、どんな暗号化もあなたを助けてくれないでしょう。 +OperatingSystemName.Windows=Windows +OperatingSystemName.Linux=Linux +OperatingSystemName.MacOS=MacOS +OperatingSystemName.FreeBSD=FreeBSD +OperatingSystemName.GenericUnix=UNIX OperatingSystemName.Unknown=あなたのオペレーティングシステム SecurityLevels.userAlertShortText=セキュリティ・レベル: ネットワーク: ${network}, フレンド: ${friends}, 物理: ${physical} SecurityLevels.userAlertNetworkThreatLevel=インターネット越しにあなたを攻撃する見知らぬ人に対する防御: ${level} SecurityLevels.userAlertPhysicalThreatLevel=コンピュータが奪取されたときの防御: ${level} SecurityLevels.userAlertExtro=これらの設定は${link}設定ページ${/link}で変更できます。 SecurityLevels.passwordPageTitle=マスターパスワードを入力してください +SecurityLevels.passwordSubmit=Ok SecurityLevels.passwordWrongTitle=パスワードが違います SecurityLevels.enterPasswordTitle=キャッシュされたコンテンツとキューされたダウンロード・アップロードにアクセスするためのマスターパスワードを入力してください。 SecurityLevels.passwordWrong=不正なパスワードが入力されました。クライアント・キャッシュへのアクセスのため、ブラウジングパフォーマンスの向上のために正しいパスワードを入力してください。 SecurityLevels.enterPassword=ダウンロード/アップロードへのアクセスを有効にし、最近訪れたfreesiteのキャッシュを有効にしてパフォーマンスを改善するために、マスターパスワードを入力してください。 SecurityLevels.setPasswordLabel=パスワードを設定 +SecurityLevels.confirmPasswordLabel=Confirm password +SecurityLevels.passwordLabel=Password SecurityLevels.setPassword=パスワードはできる限り長く、多くの文字種が含まれたものにしてください。 パスワード: SecurityLevels.passwordNotZeroLength=パスワードは少なくとも一文字の長さが必要です。つまり空白は使用できません。 +SecurityLevels.passwordsDoNotMatch=The password pair provided does not match. +SecurityLevels.passwordTooLong=Password is too long. Max password length is 1024. SecurityLevels.passwordForDecryptTitle=旧パスワードを入力してください SecurityLevels.passwordForDecrypt=クライアント・キャッシュを開錠するために、旧パスワードが必要です。 SecurityLevels.cantWriteNewMasterKeysFileTitle=新しいmaster.keysファイルに書き込みできせん! SecurityLevels.cantWriteNewMasterKeysFile=何かがおかしいです - ディスクの空き容量がないかハードディスクに問題があります。詳細はエラーメッセージを確認してください: SecurityLevels.oldPasswordLabel=旧パスワード: SecurityLevels.newPasswordLabel=新しいパスワード: +SecurityLevels.confirmNewPasswordLabel=Confirm Password: SecurityLevels.setPasswordTitle=新しいマスターパスワードを設定してください SecurityLevels.changePasswordButton=パスワードを変更 SecurityLevels.changePasswordTitle=マスターパスワードを変更 @@ -1119,37 +1896,97 @@ SecurityLevels.backToSecurityLevels=パスワードを設定または変更せ SecurityLevels.passwordFileCorruptedTitle=マスターパスワードファイルが壊れています SecurityLevels.passwordFileCorrupted=マスターパスワードファイル ${file} は破損しています。ファイルを削除してクライアント・キャッシュとダウンロード/アップロードキューを喪失するか、バックアップからそれらを修復することができます。 SecurityLevels.wrongOldPassword=あなたは間違った古いパスワードを入力しました。パスワードを忘れた場合はmaster.keysファイルを削除して、新しいパスワードを設定してください。なお、master.keysファイルを削除した場合、旧パスワードで保護されていたサイトのキャッシュやダウンロードキューを服務全てのデータにアクセスできなくなります。 +SecurityLevels.cantDeletePasswordFileTitle=Unable to delete master password file! +SecurityLevels.cantDeletePasswordFile=Freenet was not able to delete the master password file ${filename}. You must securely delete it by hand, otherwise if your computer is seized the attacker will be able to decrypt your cache of recently visited sites and your downloads and uploads. Please delete ${filename} manually. SecurityLevels.cantDeletePasswordFileButton=再試行 SecurityLevels.warningMaximumWillDeleteQueue=このオプションを選択した場合、再起動時にダウンロード/アップロードキューが削除されます。 SecurityLevelsToadlet.fullTitle=セキュリティレベル SecurityLevels.statusBarPrefix=セキュリティレベル: StringArrOption.parseError=文字列配列として値を解釈できません: ${error} +ShortOption.unrecognisedShort=The value specified can't be parsed as a 16-bit integer : ${val} +SimpleHelpToadlet.CHK=CHK = Content Hash Key - A static key derived by a mathematical hash of a file. +SimpleHelpToadlet.SSK=SSK = Signed Subspace Key - +SimpleHelpToadlet.USK=USK = Updateable Subspace Key - +SimpleHelpToadlet.connectivityText=Testing. Test. Blah blah blah, etc etc etc +SimpleHelpToadlet.connectivityTitle=Connectivity +SimpleHelpToadlet.definitionsTitle=Definitions +SimpleHelpToadlet.descriptionText=This page should provide basic info for you to get started with Freenet. There are many other places for more in-depth information such as the offical Freenet website http://freenetproject.org, the offical wiki http://wiki.freenetproject.org or various in-Freenet Freesites. SimpleHelpToadlet.descriptionTitle=説明 SimpleToadletServer.advancedMode=上級モードを有効化しますか? SimpleToadletServer.advancedModeLong=Webインターフェースの詳細オプションと情報の表示をデフォルトで有効にします。ほとんどの事例では、この設定をfalseにしてください。 SimpleToadletServer.allowedFullAccess=Freenetのウェブインターフェイスへ完全なアクセスができるホスト(警告を読め) SimpleToadletServer.allowedFullAccessLong=あなたのFreenetノードへの完全なアクセス(例えば、設定変更、再起動など)を許可されたホストです。警告: 完全なウェブインターフェイスを与える相手には十分注意してください! SimpleToadletServer.allowedHosts=Webインターフェースへの接続を許可するホスト名またはIPアドレス。 +SimpleToadletServer.allowedHostsLong=May be a comma-separated list of single IPs and CIDR masked IPs like 192.168.0.0/24. Note that these can access the hard disk within the limits set by other config options. They can also see your bookmarks. +SimpleToadletServer.bindTo=IP address to bind to +SimpleToadletServer.bindToLong=IP address to bind to +SimpleToadletServer.cannotChangePortOnTheFly=Cannot change web interface port number on the fly +SimpleToadletServer.couldNotChangeBindTo=Could not change web interface bind address: Some of the IP addresses given could not be bound to: ${failedInterfaces}. Maybe you mis-typed an IP address or a network connection is down? SimpleToadletServer.cssName=Webインターフェイスのテーマ SimpleToadletServer.cssNameLong=Freenet Webインターフェイス で使用するテーマを選択してください SimpleToadletServer.cssOverride=CSSを独自のものに上書きする(警告!) SimpleToadletServer.cssOverrideCantRead=与えられたCSSオーバーライドファイルを読み取ることができません: ${filename} +SimpleToadletServer.cssOverrideLong=That setting allows you to override Freenet's CSS with a custom file. WARNING: CSS can be dangerous, and this one won't be filtered! Use at your own risk. We will allow access to the CSS file from /static/override/ (plus the filename within the folder the file is in), so you can refer to images, @include other CSS files etc. If you make a nice theme, consider mailing devl@freenetproject.org to get it included in the main distribution. +SimpleToadletServer.cssOverrideNotInUploads=We can't let you set that setting: "${filename}" isn't in a directory from which uploads are allowed! +SimpleToadletServer.cssOverrideCantUseRootDir=You cannot put the override file in the root folder (${filename}). Please move it to a folder within that. This is for security. +SimpleToadletServer.disableProgressPage=Disable progress page when loading pages? +SimpleToadletServer.disableProgressPageLong=Set to not show a progress page when loading a page. NOTE: The progress page improves the browsing experience by giving feedback on fetch progress and allowing better use of the limited number of parallel connections most browsers will make to Freenet. SimpleToadletServer.doRobots=robots.txtを使用する SimpleToadletServer.doRobotsLong=/robots.txtを設置して、Google等の検索エンジンのクローリングボットやspider、wget等のアクセスを拒否するかどうか SimpleToadletServer.enableActivelinks=ブックマークされたページに印をつける SimpleToadletServer.enableActivelinksLong=BookmarkされたFreenetページに印をつけますか?この設定を有効にした場合、ページの読み込み速度が低下します。 +SimpleToadletServer.enableCachingForChkAndSskKeys=Allow caching for CHK and SSK keys (read warning) +SimpleToadletServer.enableCachingForChkAndSskKeysLong=Allow the browser to cache CHK and SSK keys. WARNING: This will leave traces of all those keys in your browser’s cache so do not enable this if you are worried about your computer being seized! SimpleToadletServer.enableJS=WebインターフェースでのJavaScriptの使用を可能にしますか? SimpleToadletServer.enableJSLong=WebインターフェースにJavaScriptの"helpers"を使用するかどうかを設定します。ほとんどの場合、この設定はfalseにしてください。この設定を有効にしても、freesiteではJavaScriptを使用しない場合がありますのでご注意ください。 SimpleToadletServer.enableWP=WebプッシュによるWebインターフェースの使用を可能にする(実験的) SimpleToadletServer.enableWPLong=Webインターフェイスで、JavaScriptのWebプッシュを使用して、再読み込みせずに表示データを更新するかどうかを指定します。JavaScriptがオンになっている必要があります。これは実験的なものであり、ご自身の責任において使用してください。 SimpleToadletServer.enabled=Web インターフェイス(FProxy)を使用する SimpleToadletServer.enabledLong=HTTPサービスを使用して、Web インターフェイスを使用可能にするかを指定します。Web インターフェイスを使用すれば、ブラウザを介してFreenetにアクセスする事が可能になります。 +SimpleToadletServer.enableExtendedMethodHandling=Enable extended HTTP method handling? +SimpleToadletServer.enableExtendedMethodHandlingLong=Enable this to allow HTTP methods other than GET and POST to be handled. Required for WebDAV and other HTTP extensions. +SimpleToadletServer.enableInlinePrefetch=Enable prefetching of inline images? +SimpleToadletServer.enableInlinePrefetchLong=This may help if your browser only uses a small number of connections to talk to Freenet. On the other hand it may not. +SimpleToadletServer.enablePersistentConnections=Enable persistent HTTP connections? (Read detailed description) +SimpleToadletServer.enablePersistentConnectionsLong=Don't enable this unless your browser is configured to use lots of connections even if they are persistent. +SimpleToadletServer.fetchKeyBoxAboveBookmarks=Put 'Visit a freesite or download a file' field on the top? +SimpleToadletServer.fetchKeyBoxAboveBookmarksLong=If true, 'Visit a freesite or download a file' field will be on the top of the homepage. +SimpleToadletServer.hasCompletedWizard=Have you completed the first-time configuration wizard yet? +SimpleToadletServer.hasCompletedWizardLong=Have you completed the first-time configuration wizard yet? If not, the web interface will redirect all your requests to it. +SimpleToadletServer.illegalCSSName=CSS name must not contain slashes or colons! +SimpleToadletServer.maxFproxyConnections=Maximum fproxy connections +SimpleToadletServer.maxFproxyConnectionsLong=Maximum number of fproxy connections we will serve at once. Each uses a thread. +SimpleToadletServer.metaRefreshSamePageInterval=Allow freesites to refresh themselves periodically: Minimum interval in seconds or -1 for disabled. +SimpleToadletServer.metaRefreshSamePageIntervalLong=Allow freesites to refresh themselves periodically with HTML meta refresh: Minimum interval in seconds or -1 for disabled. +SimpleToadletServer.metaRefreshRedirectInterval=Allow freesites to redirect to other freesites after a delay: Minimum interval in seconds or -1 for disabled. +SimpleToadletServer.metaRefreshRedirectIntervalLong=Allow freesites to redirect to other freesites after a delay with HTML meta refresh: Minimum interval in seconds or -1 for disabled. +SimpleToadletServer.embedM3uPlayerInFreesites=Embed an m3u player in Freesites? +SimpleToadletServer.embedM3uPlayerInFreesitesLong=Whether to embed a Javascript-based player checked by the Freenet team which turns video- and audio-tags with m3u-playlists into interactive streaming players. +SimpleToadletServer.panicButton=Show the panic button? +SimpleToadletServer.panicButtonLong=Shows a 'panic button' on the queue page that will remove all downloads and uploads, wipe the cache of recently visited freesites, and clear the master keys file. +SimpleToadletServer.noConfirmPanic=No confirmation on panic button? +SimpleToadletServer.noConfirmPanicLong=If true, the panic button will not ask for confirmation but will act immediately. +SimpleToadletServer.passthroughMaxSize=Maximum size for transparent pass-through in the web interface where we cannot show progress (e.g. images) +SimpleToadletServer.passthroughMaxSizeLong=Maximum size for images etc on the Freenet web interface. If an image, style sheet etc is larger than this threshold, it will fail, and if possible Freenet will show an error. This is to prevent your browser from waiting forever for a page full of enormous images. +SimpleToadletServer.passthroughMaxSizeProgress=Maximum size for transparent pass-through in the web interface where we can show a progress bar (e.g. HTML pages) +SimpleToadletServer.passthroughMaxSizeProgressLong=Maximum size of an HTML page or file, where Freenet can show a progress bar. If the file is larger than this it will ask you whether you want to download it in the background, e.g. to your downloads folder. SimpleToadletServer.port=Webインターフェイスで使用されるポート SimpleToadletServer.portLong=WebインターフェイスがListenするTCPポートを指定します。 +SimpleToadletServer.publicGatewayMode=Public gateway mode? (Only applies to allowed but non-full-access connections) +SimpleToadletServer.publicGatewayModeLong=Should we enable public gateway mode? For IPs which are allowed to access Freenet, but are not allowed full access, this option disables the download queue and anything else that might conceivably be abused to attack the Freenet node, while still allowing browsing freesites. They will also only see the default bookmarks, not your bookmarks. IP addresses with full access will be allowed to configure the node. You will still need to configure allowed addresses and bind address to get a true public gateway; you should do this after restarting. +SimpleToadletServer.publicGatewayModeNeedsRestart=Enabling or disabling public gateway mode requires that you restart Freenet. Until then, it will not apply, so you should not change your other fproxy settings. +SimpleToadletServer.refilterPolicy=What should fproxy do when a downloaded file matches the key being fetched, but it has already been filtered? +SimpleToadletServer.refilterPolicyLong=What should fproxy do when a downloaded file matches the key being fetched, but it has already been filtered? RE_FILTER = filter it anyway, since the filter may have been improved since the original download, ACCEPT_OLD = accept the old data (maximum performance), RE_FETCH = ignore the old data. +SimpleToadletServer.sendAllThemes=Send all themes to browser? +SimpleToadletServer.sendAllThemesLong=If set true, all available themes will be loaded by the browser when viewing the FProxy UI pages, and switchable using your browser's page style selection options. SimpleToadletServer.ssl=SSLを使用する SimpleToadletServer.sslLong=Web インターフェイスでSSLを使用するかどうかを指定します。このオプションを使用するには、'Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files'が必要です。 SSL.enable=SSLサポートを有効にしますか? +SSL.keyStore=Path to the key store +SSL.keyStorePass=Key store password +SSL.keyPass=Private key password SSL.version=SSLのバージョン +SSL.versionLong=Version of SSL, SSLv3 or TLSv1 (default SSLv3) StartupToadlet.entropyErrorTitle=Freenetは起動できるまでより多くのエントロピーを待っています StartupToadlet.entropyErrorContent=Freenetは現在お使いのコンピュータからより多くのエントロピー(ランダム性)を待っています。Freenetは安全に暗号鍵を生成するためにエントロピーを必要とします。Freenetはディスクを読み取ることによってエントロピーを収集しようとします。詳細はwrapper.logを参照してください。 StartupToadlet.isStartingUp=Freenetノードを起動中です。しばらくお待ちください。 @@ -1172,6 +2009,7 @@ StatisticsToadlet.avgTime=平均時間 StatisticsToadlet.bandwidthTitle=帯域幅 StatisticsToadlet.CACHE=キャッシュ StatisticsToadlet.capacity=容量 +StatisticsToadlet.CHK=CHK StatisticsToadlet.chkCache=キャッシュ (CHK) StatisticsToadlet.chkDetailTiming=詳細なタイミング (ローカルフェッチ) StatisticsToadlet.CLIENT=クライアント・キャッシュ @@ -1180,6 +2018,7 @@ StatisticsToadlet.clientRequesters.age=年齢 StatisticsToadlet.clientRequesters.class=クラス StatisticsToadlet.clientRequesters.priorityClass=優先度クラス StatisticsToadlet.clientRequesters.realtimeFlag=実時間フラグ? +StatisticsToadlet.clientRequesters.uri=URI StatisticsToadlet.count=カウント StatisticsToadlet.cpus=利用可能な CPU 数: ${count} StatisticsToadlet.cryptoUsingBuiltin=暗号化: Freenetの実装を使用する @@ -1189,6 +2028,7 @@ StatisticsToadlet.datastore=データストア StatisticsToadlet.databaseJobsByPriority=データベース・ジョブ StatisticsToadlet.debuggingBytes=デバッギングバイト: ${netColoring} ネットワークカラーリング, ${ping} ping, ${probe} 探査リクエスト, ${routed} ルートされたテストメッセージ StatisticsToadlet.distanceStats=距離統計情報 +StatisticsToadlet.falsePos=False Pos. StatisticsToadlet.foafBytes=友達の友達関係: ${total} StatisticsToadlet.fullTitle=統計 StatisticsToadlet.furthestSuccess=もっとも遠い成功 @@ -1225,6 +2065,7 @@ StatisticsToadlet.priority=優先度 StatisticsToadlet.PUB_KEY=公開鍵 StatisticsToadlet.queuedCount=キュー回数 StatisticsToadlet.readRequests=読取リクエスト +StatisticsToadlet.realGlobalWindow=Real global window StatisticsToadlet.requestOutput=リクエスト出力 (ペイロードを含まず): CHK ${chk} SSK ${ssk}. StatisticsToadlet.resendBytes=再送バイト: ${total} (${percent}%) StatisticsToadlet.routingBackoffReason=ルーティング撤回事由 @@ -1233,6 +2074,7 @@ StatisticsToadlet.routingDisabledShort=トラフィックがルーティング StatisticsToadlet.running=稼働中 StatisticsToadlet.runningBlockTransfers=ブロック転送: ${sends} 送信, ${receives} 受信 StatisticsToadlet.seedStats=シード統計 +StatisticsToadlet.seedTableIP=IP StatisticsToadlet.seedTableConnections=接続 StatisticsToadlet.seedTableAnnouncements=告知済 StatisticsToadlet.seedTableAccepted=受理 @@ -1241,6 +2083,9 @@ StatisticsToadlet.seedTableForwarded=送信された参照 StatisticsToadlet.seedTableVersion=バージョン StatisticsToadlet.SLASHDOT=スラッシュドット・キャッシュ StatisticsToadlet.statisticGatheringTitle=統計情報を収集しています +StatisticsToadlet.SSK=SSK +StatisticsToadlet.STORE=Store +StatisticsToadlet.storeJobsByPriority=Store checker jobs by priority StatisticsToadlet.successByHTLRT=HTLによる成功率 (リモート実時間フェッチ) StatisticsToadlet.successByHTLBulk=HTLによる成功率 (リモート・バルク・フェッチ) StatisticsToadlet.successfulReads=成功した読み取り @@ -1266,6 +2111,7 @@ StatisticsToadlet.waiting=待機中 StatisticsToadlet.writeRate=書き込みレート StatisticsToadlet.writes=書き込み StatusBar.alerts=メッセージ: +StatusBar.connectedPeers=We are currently connected to ${X} friends and ${Y} strangers. StatusBar.switchToAdvancedMode=上級モードに切り替え StatusBar.switchToSimpleMode=簡単モードに切り替え SymlinkerToadlet.symlinks=ToadletServerのSymlink @@ -1280,12 +2126,16 @@ TextModeClientInterfaceServer.allowedHostsLong=TMCIと接続することを許 TextModeClientInterfaceServer.bindTo=バインドするIPアドレス TextModeClientInterfaceServer.bindToLong=バインドするIPアドレス TextModeClientInterfaceServer.enableInputOutput=標準入出力で有効にしますか? +TextModeClientInterfaceServer.enableInputOutputLong=Enable text mode client interface on standard input/output? (enabled refers to providing a telnet-style server, this runs it over a socket) TextModeClientInterfaceServer.enabled=TMCIを有効にしますか? TextModeClientInterfaceServer.enabledLong=テキストモード・クライアントインターフェースを有効にする TextModeClientInterfaceServer.ssl=SSLを有効にしますか? TextModeClientInterfaceServer.sslLong=TMCIサーバでSSLを有効にします。動作させるためには'Java暗号拡張(JCE)無制限強度司法ポリシーファイル'が必要になります。 TextModeClientInterfaceServer.telnetPortNumber=TMCIポート TextModeClientInterfaceServer.telnetPortNumberLong=TMCIサーバがリッスンするポート +TimeSkewDetectedUserAlert.title=Wrong date and time +TimeSkewDetectedUserAlert.text=Your computer's clock seems to be wrong. Freenet cannot connect to the network correctly. Please set your computer's clock to the correct date and time, then restart Freenet. +TimeSkewDetectedUserAlert.shortText=Freenet cannot connect because your computer's clock is wrong. Toadlet.yes=はい Toadlet.no=いいえ Toadlet.back=前へ @@ -1295,10 +2145,23 @@ Toadlet.clickHere=ここをクリック Toadlet.internalErrorPleaseReport=内部エラー: 報告してください Toadlet.internalErrorTitle=内部エラー Toadlet.nodeHomepage=Freenetホームページ +Toadlet.notSupportedTitle=Not Supported +Toadlet.notSupportedWithClass=Your browser sent a request that Freenet (${class}) could not understand. +Toadlet.ok=Ok +Toadlet.permRedirectWithReason=Permanent redirect: ${reason} Toadlet.returnToNodeHomepage=Freenetホームページに戻る Toadlet.returnToQueuepage=キューページに戻る Toadlet.returnToPrevPage=前のページに戻る +Toadlet.tempRedirectWithReason=Temporary redirect: ${reason} +Toadlet.unauthorizedTitle=Unauthorized +Toadlet.unauthorized=You are not permitted access to this page. Toadlet.homepage=ホームページ +ToadletContextImpl.cannotParseContentLength=Content-length parse error: ${error} +ToadletContextImpl.cannotParseContentLengthWithError=Cannot parse the content-length: ${error} +ToadletContextImpl.headersLineTooLong=Line too long parsing headers +ToadletContextImpl.methodNotAllowed=HTTP Method Not Allowed +ToadletContextImpl.noContentLengthInPOST=No content-length in POST +ToadletContextImpl.noSuchToadlet=No Toadlet of that name ToadletContextImpl.parseErrorWithError=解析エラー: ${error} ToadletContextImpl.uriParseErrorTitle=URIの解析エラー TranslationToadlet.title=翻訳 @@ -1327,11 +2190,25 @@ TranslationToadlet.translationUpdateTitle=翻訳の更新 TranslationToadlet.translationUpdatedTitle=翻訳が更新されました! TranslationToadlet.updateTranslationCommand=翻訳を更新! UndetectableCharsetException.title=文字セットを検出できません。 ${charset} のように見えます。しかし違うかもしれません。 +UndetectableCharsetException.explanation=Detected first few bytes of charset declaration but is invalid, ignoring the style sheet as per CSS 2.1 section 4.4. +UnknownContentTypeException.explanation=Your Freenet node does not know anything about the type ${type}. This means that your browser might do something dangerous in response to downloading this file. For example, many formats can contain embedded images or videos, which are downloaded from the web; this is by no means innocuous, because they can ruin your anonymity and expose your IP address (if the attacker runs the web site or has access to its logs). Hyperlinks to the Web can also be a threat, for much the same reason, as can scripting, for this and other reasons. UnknownContentTypeException.title=不明で潜在的に危険なコンテンツタイプ: ${type} UnsupportedCharsetInFilterException.title=サポートされていないテキストの文字セット: ${charset}。 UnsupportedCharsetInFilterException.explanation=これは非常に珍しい文字セットで、Javaではサポートされていません。これはコンテンツフィルタを回避しようとしているか、単にデータを破損させようとしている可能性が高いです。 UpdateDeployContext.cannotUpdateNoMainJar=wrapper.confにfreenet.jarが見つかりません +UpdateDeployContext.updateCatastrophe=CATASTROPHIC ERROR: Deleted ${old} but cannot rename ${new} to ${old} therefore FREENET WILL NOT START! Please resolve the problem by renaming ${new} to ${old} manually. +UpdateDeployContext.updateFailedCannotDeleteOldConfig=Cannot delete ${old} so cannot rename over it. Update failed. +UpdateDeployContext.updateFailedNonStandardConfig=Not able to update because of non-standard config: written main=${main} - should not happen! Report this to the devs, include your wrapper.conf. +UpdatedVersionAvailableUserAlert.armed=Your node will automatically restart as soon as it has finished downloading and verifying the new version of Freenet. +UpdatedVersionAvailableUserAlert.changelog=Release announcement UpdatedVersionAvailableUserAlert.devchangelog=開発者向けの詳細 +UpdatedVersionAvailableUserAlert.clickToUpdateASAP=Click below to update your node as soon as the update has been verified. +UpdatedVersionAvailableUserAlert.clickToUpdateNow=Click below to update your node immediately. +UpdatedVersionAvailableUserAlert.brokenDependencies=There has been some sort of problem fetching the jars required for the next version, so Freenet cannot update itself to build ${version}. However, if it finds a later version, it will try again. You can see more details in wrapper.log. +UpdatedVersionAvailableUserAlert.downloadedNewJar=Your node has downloaded a new version of Freenet, version ${version}. +UpdatedVersionAvailableUserAlert.fetchingNewNode=Your node is currently downloading a new version of Freenet (node version ${nodeVersion}). +UpdatedVersionAvailableUserAlert.fetchingUOM=Freenet is downloading a new version from your peers. Your copy of Freenet is seriously out of date, so your peers may not show up as connected, but we can still fetch the update from them. This can take up to an hour. In the meantime you may not be able to use Freenet normally. If all else fails you can try the update script ${updateScript} but it is much safer to wait for the update. +UpdatedVersionAvailableUserAlert.finalCheck=Your node is currently doing a final check to verify the security of the update (${count} of ${max}, maximum time remaining ${time}). UpdatedVersionAvailableUserAlert.notLatest=あなたのノードは最新のソフトウェアで実行されていないようです。 UpdatedVersionAvailableUserAlert.shortArmed=あなたのノードはFreenetの新しいバージョンをダウンロードしていて、それが終了したら再起動します。 UpdatedVersionAvailableUserAlert.shortReadyNotArmed=あなたのノードがFreenetの新しいバージョンをダウンロードしましたが、新しいビルドを使用するにはあなたの許可が必要です。 @@ -1341,16 +2218,29 @@ UpdatedVersionAvailableUserAlert.updateASAPButton=至急アップデート UpdatedVersionAvailableUserAlert.updateASAPQuestion=アップデートをダウンロードするとすぐにFreenetを自動的に再起動しますか? UpdatedVersionAvailableUserAlert.updateNowButton=今すぐアップデート! UpdatedVersionAvailableUserAlert.updateIsUrgent=すぐにアップデートしないと、あなたのFreenetノードが取り残され、ネットワークの他の部分と通信できなくなるかもしれません。 +UpgradeConnectionSpeedUserAlert.title=Upgrade connection speed +UpgradeConnectionSpeedUserAlert.text=It was detected that connection speed increased. Your current Upload bandwidth limit ${output} and Download bandwidth limit ${input}. Below are recommended values to upgrade. +UpgradeConnectionSpeedUserAlert.downloadLimit=Download limit: +UpgradeConnectionSpeedUserAlert.uploadLimit=Upload limit: +UpgradeConnectionSpeedUserAlert.upgraded=Changes were successfully applied. +UpgradeConnectionSpeedUserAlert.InvalidValue=Please put correct values into the ${type} limit. UserAlert.apply=適用 UserAlert.hide=隠す UserAlert.reset=リセット +UserAlertManager.alertsOnAlertsPage=See them on ${link}the alerts page${/link}. +UserAlertManager.alertsTitle=Outstanding alerts +UserAlertManager.clickForMore=Click on an item for more information or to get rid of it. UserAlertManager.criticalErrorCountLabel=致命的なエラー: UserAlertManager.dumpEventsButton=簡単な通知を削除 UserAlertManager.errorCountLabel=エラー: +UserAlertManager.feedTitle=Freenet UserAlertManager.minorCountLabel=重要ではない: +UserAlertManager.totalLabel=Total: UserAlertManager.warningCountLabel=警告: UserAlertsToadlet.title=ステータス・メッセージ UserAlertsToadlet.noMessages=メッセージはありません +VorbisBitstreamFilter.MalformedTitle=Malformed Vorbis Bitstream +VorbisBitstreamFilter.MalformedMessage=The Vorbis bitstream is not correctly formatted, and could not be properly validated. WelcomeToadlet.activityTitle=現在の活動 WelcomeToadlet.arkFetchCount=ARK フェッチャ: ${total} WelcomeToadlet.alertsSummary=状態メッセージ要約(詳細を見る、何かを変更するにはクリック) @@ -1362,12 +2252,15 @@ WelcomeToadlet.confirmExternalLinkTitle=警告: 外部リンク WelcomeToadlet.confirmExternalLinkWithURL=${url} にアクセスすることを確認してください。警告: あなたはフリーネットを離れています! このリンクをクリックすると、本当にあなたの匿名性を脅かします! クリックしないことを強くお勧めします。 WelcomeToadlet.confirmFIN=以下のFrostメッセージをインサートしますか? WelcomeToadlet.disabledAlert=無効にされた警告 +WelcomeToadlet.extVersion=Freenet-ext Build #${build} r${rev} WelcomeToadlet.fetch=取得 WelcomeToadlet.fetchKeyLabel=(そのキーを知っている場合)freesiteを探訪、またはファイルをダウンロード WelcomeToadlet.finInsertSuccessWithKey=メッセージは正常に${key}にインサートされました。 WelcomeToadlet.finInsertedTitle=インサート WelcomeToadlet.finTitle=Frostインスタントノードインサート +WelcomeToadlet.fromHeader=From WelcomeToadlet.goToExternalLink=指定したリンクに移動 +WelcomeToadlet.homepageFullTitle=Freenet WelcomeToadlet.ieWarning=あなたはMicrosoft Internet Explorerを利用しているようです。このことはFreenet中のいくつかのサイトではあなたの匿名性を侵害する可能性があります! WelcomeToadlet.ieWarningTitle=セキュリティリスク! WelcomeToadlet.insertCount=インサート: ${total} @@ -1375,6 +2268,8 @@ WelcomeToadlet.insertFailedTitle=インサート失敗 WelcomeToadlet.insertFailedWithMessage=インサートは以下のメッセージとともに失敗しました: ${message} WelcomeToadlet.insertSucceededTitle=インサート成功 WelcomeToadlet.insertedTitle=インサート +WelcomeToadlet.invalidURI=Invalid URI! +WelcomeToadlet.invalidURILong=This URI doesn't look like a valid freenet key! WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=キー ${link}${name}${/link} は正常に挿入されました。 WelcomeToadlet.keyRequestLabel=キー: WelcomeToadlet.messageHeader=メッセージ @@ -1400,6 +2295,7 @@ WelcomeToadlet.shutdownConfirmTitle=ノード・シャットダウン WelcomeToadlet.shutdownDone=Freenetノードはシャットダウン中です。 WelcomeToadlet.shutdownNode=Freenet をシャットダウン WelcomeToadlet.splitfileErrorLabel=分割ファイル特有のエラー: +WelcomeToadlet.startIndexHeader=Index to start at WelcomeToadlet.subjectHeader=題名 WelcomeToadlet.targetBoardHeader=ターゲットボード WelcomeToadlet.testnetWarning=テストネットモードで稼働中です。これは深刻にあなたの匿名性を損ないます! @@ -1414,6 +2310,7 @@ WelcomeToadlet.update=更新 WelcomeToadlet.updating=Freenetノードが更新され、自己再起動します。Freenetは更新の前に失効キーを取得しようとするため、再起動の工程には最大10分かかることがあります。 WelcomeToadlet.updatingTitle=ノード更新中 WelcomeToadlet.uriWouldHaveBeen=URIは: ${uri} +WelcomeToadlet.version=Freenet ${fullVersion} Build #${build} ${rev} WelcomeToadlet.versionHeader=バージョン情報とノードの制御 WrapperConfig.wrapper.java.maxmemory.short=最大メモリ使用量 (メガバイト単位) WrapperConfig.wrapper.java.maxmemory.long=Freenetが使用するメモリを制限します。Freenetは、キューに入れられたリクエストが多い場合や、チャットフォーラムや他のプラグインを使用している場合は、より多くのメモリを必要とし、より大きなデータストアや高速な接続を使用している場合は、それほど多く必要としません。変更は、Freenetが再起動されるまで有効になりません。 diff --git a/src/freenet/node/Announcer.java b/src/freenet/node/Announcer.java index 52953365556..c3532390abf 100644 --- a/src/freenet/node/Announcer.java +++ b/src/freenet/node/Announcer.java @@ -129,7 +129,7 @@ private void connectSomeSeednodes() { synchronized(this) { if(now - timeAddedSeeds < MIN_ADDED_SEEDS_INTERVAL) return; timeAddedSeeds = now; - if(seeds.size() == 0) { + if(seeds.isEmpty()) { registerEvent(STATUS_NO_SEEDNODES); /* * Developers might run nodes in empty directories instead of one made by an installer. diff --git a/src/freenet/node/DarknetPeerNode.java b/src/freenet/node/DarknetPeerNode.java index a8ddde3bb5a..135ff19e92e 100644 --- a/src/freenet/node/DarknetPeerNode.java +++ b/src/freenet/node/DarknetPeerNode.java @@ -1064,7 +1064,7 @@ public String getText() { sb.append(' '); sb.append(getName()); sb.append('\n'); - if(comment != null && comment.length() > 0) { + if(comment != null && !comment.isEmpty()) { sb.append(l10n("commentLabel")); sb.append(' '); sb.append(comment); @@ -1305,7 +1305,7 @@ private String describeFileText(String header) { sb.append(' '); sb.append(userToString()); sb.append('\n'); - if(comment != null && comment.length() > 0) { + if(comment != null && !comment.isEmpty()) { sb.append(l10n("commentLabel")); sb.append(' '); sb.append(comment); @@ -1333,7 +1333,7 @@ private void describeFile(HTMLNode div) { row.addChild("td").addChild("#", l10n("senderLabel")); row.addChild("td").addChild("#", getName()); row = table.addChild("tr"); - if(comment != null && comment.length() > 0) { + if(comment != null && !comment.isEmpty()) { row.addChild("td").addChild("#", l10n("commentLabel")); addComment(row.addChild("td")); } @@ -1520,7 +1520,7 @@ public void handleFproxyN2NTM(SimpleFieldSet fs, int fileNumber) { } } int newFileNumber = fileNumber; - if (merged.size() > 0) { + if (!merged.isEmpty()) { // update the text fs.putOverwrite("text", Base64.encodeUTF8(newText)); // persist the alert diff --git a/src/freenet/node/NewPacketFormat.java b/src/freenet/node/NewPacketFormat.java index 181653f5a61..9f40f51428e 100644 --- a/src/freenet/node/NewPacketFormat.java +++ b/src/freenet/node/NewPacketFormat.java @@ -169,7 +169,7 @@ List handleDecryptedPacket(NPFPacket packet, SessionKey sessionKey) { boolean dontAck = false; boolean wakeUp = false; - if(packet.getError() || (packet.getFragments().size() == 0)) { + if(packet.getError() || packet.getFragments().isEmpty()) { if(logMINOR) Logger.minor(this, "Not acking because " + (packet.getError() ? "error" : "no fragments")); dontAck = true; } @@ -192,7 +192,7 @@ List handleDecryptedPacket(NPFPacket packet, SessionKey sessionKey) { lossyMessages.add(msg); } // Handle them *before* the rest. - if(logMINOR && lossyMessages.size() > 0) Logger.minor(this, "Successfully parsed "+lossyMessages.size()+" lossy packet messages"); + if(logMINOR && !lossyMessages.isEmpty()) Logger.minor(this, "Successfully parsed "+lossyMessages.size()+" lossy packet messages"); for(Message msg : lossyMessages) pn.handleMessage(msg); } @@ -538,7 +538,7 @@ boolean maybeSendPacket(boolean ackOnly, SessionKey sessionKey) packet.onSent(data.length, pn); - if(packet.getFragments().size() > 0) { + if(!packet.getFragments().isEmpty()) { keyContext.sent(packet.getSequenceNumber(), packet.getLength()); } @@ -548,13 +548,13 @@ boolean maybeSendPacket(boolean ackOnly, SessionKey sessionKey) if(pn.shouldThrottle()) { pn.sentThrottledBytes(data.length); } - if(packet.getFragments().size() == 0) { + if(packet.getFragments().isEmpty()) { pn.onNotificationOnlyPacketSent(data.length); } synchronized(this) { if(timeLastSentPacket < now) timeLastSentPacket = now; - if(packet.getFragments().size() > 0) { + if(!packet.getFragments().isEmpty()) { if(timeLastSentPayload < now) timeLastSentPayload = now; } } @@ -894,7 +894,7 @@ NPFPacket createPacket(int maxPacketSize, PeerMessageQueue messageQueue, Session Logger.debug(this, "Sending packet length "+packet.getLength()+" for "+this); } - if(packet.getFragments().size() > 0) { + if(!packet.getFragments().isEmpty()) { keyContext.sent(sentPacket, seqNum, packet.getLength()); } diff --git a/src/freenet/node/NodeIPDetector.java b/src/freenet/node/NodeIPDetector.java index 533ff21050b..1e17e7ca552 100644 --- a/src/freenet/node/NodeIPDetector.java +++ b/src/freenet/node/NodeIPDetector.java @@ -440,7 +440,7 @@ public String get() { public void set(String val) throws InvalidConfigValueException { boolean hadValidAddressOverride = hasValidAddressOverride(); // FIXME do we need to tell anyone? - if(val.length() == 0) { + if(val.isEmpty()) { // Set to null overrideIPAddressString = val; overrideIPAddress = null; @@ -473,7 +473,7 @@ public void set(String val) throws InvalidConfigValueException { hasValidAddressOverride = true; overrideIPAddressString = nodeConfig.getString("ipAddressOverride"); - if(overrideIPAddressString.length() == 0) + if(overrideIPAddressString.isEmpty()) overrideIPAddress = null; else { try { @@ -506,7 +506,7 @@ public String get() { @Override public void set(String val) throws InvalidConfigValueException { - if(val.length() == 0) { + if(val.isEmpty()) { return; } if(overrideIPAddress != null) return; @@ -520,7 +520,7 @@ public void set(String val) throws InvalidConfigValueException { }); String ipHintString = nodeConfig.getString("tempIPAddressHint"); - if(ipHintString.length() > 0) { + if(!ipHintString.isEmpty()) { try { oldIPAddress = new FreenetInetAddress(ipHintString, false); } catch (UnknownHostException e) { diff --git a/src/freenet/node/PeerMessageQueue.java b/src/freenet/node/PeerMessageQueue.java index cb9f5f5c746..017a5d3bb3e 100644 --- a/src/freenet/node/PeerMessageQueue.java +++ b/src/freenet/node/PeerMessageQueue.java @@ -384,7 +384,7 @@ public long getNextUrgentTime(long t, long stopIfBeforeTime) { } else { if(nonEmptyItemsWithID != null) { for(Items items : nonEmptyItemsWithID) { - if(items.items.size() == 0) continue; + if(items.items.isEmpty()) continue; if(items.timeLastSent > 0) { t = Math.min(t, items.timeLastSent + timeout); if(t <= stopIfBeforeTime) return t; @@ -701,7 +701,7 @@ public boolean isEmpty() { } if(nonEmptyItemsWithID != null) { for(Items items : nonEmptyItemsWithID) { - if(items.items.size() == 0) continue; + if(items.items.isEmpty()) continue; return false; } } diff --git a/src/freenet/node/PeerNode.java b/src/freenet/node/PeerNode.java index 6cc1f63fea0..9365d0d6370 100644 --- a/src/freenet/node/PeerNode.java +++ b/src/freenet/node/PeerNode.java @@ -2757,8 +2757,7 @@ public synchronized SimpleFieldSet exportFieldSet() { SimpleFieldSet fs = new SimpleFieldSet(true); if(getLastGoodVersion() != null) fs.putSingle("lastGoodVersion", lastGoodVersion); - for(int i = 0; i < nominalPeer.size(); i++) - fs.putAppend("physical.udp", nominalPeer.get(i).toString()); + for (Peer peer : nominalPeer) fs.putAppend("physical.udp", peer.toString()); fs.put("auth.negTypes", negTypes); fs.putSingle("identity", getIdentityString()); fs.put("location", getLocation()); @@ -3021,7 +3020,7 @@ public void localRejectedOverload(String reason, boolean realTime) { node.getNodeStats().reportRoutingBackoff(reason, x, realTime); if(logMINOR) { String reasonWrapper = ""; - if(0 < reason.length()) + if(!reason.isEmpty()) reasonWrapper = " because of '" + reason + '\''; Logger.minor(this, "Backing off" + reasonWrapper + ": routingBackoffLength=" + routingBackoffLength + ", until " + x + "ms on " + peer); } @@ -3103,7 +3102,7 @@ public void transferFailed(String reason, boolean realTime) { node.getNodeStats().reportTransferBackoff(reason, x, realTime); if(logMINOR) { String reasonWrapper = ""; - if(0 < reason.length()) + if(!reason.isEmpty()) reasonWrapper = " because of '" + reason + '\''; Logger.minor(this, "Backing off (transfer)" + reasonWrapper + ": transferBackoffLength=" + transferBackoffLength + ", until " + x + "ms on " + peer); } diff --git a/src/freenet/node/PeerNodeStatus.java b/src/freenet/node/PeerNodeStatus.java index 17bd5acd00d..dc65ab0745c 100644 --- a/src/freenet/node/PeerNodeStatus.java +++ b/src/freenet/node/PeerNodeStatus.java @@ -347,6 +347,17 @@ public byte[] getPeerAddressBytes() { public int getPeerPort() { return peerPort; } + + /** + * @return the string representation of peerAddress and peerPort + */ + public String getPeerAddressAndPort() { + if(peerAddressBytes != null && peerAddressBytes.length == 16) { // IPv6 address have [] around + return '[' + peerAddress + "]:" + peerPort; + } else { + return peerAddress + ':' + peerPort; + } + } /** * @return the routingBackoffLength @@ -420,7 +431,7 @@ public int getSimpleVersion() { @Override public String toString() { - return statusName + ' ' + peerAddress + ':' + peerPort + ' ' + location + ' ' + version + " RT backoff: " + routingBackoffLengthRT + " (" + (Math.max(routingBackedOffUntilRT - System.currentTimeMillis(), 0)) + " ) bulk backoff: " + routingBackoffLengthBulk + " (" + (Math.max(routingBackedOffUntilBulk - System.currentTimeMillis(), 0)) + ')'; + return statusName + ' ' + getPeerAddressAndPort() + ' ' + location + ' ' + version + " RT backoff: " + routingBackoffLengthRT + " (" + (Math.max(routingBackedOffUntilRT - System.currentTimeMillis(), 0)) + " ) bulk backoff: " + routingBackoffLengthBulk + " (" + (Math.max(routingBackedOffUntilBulk - System.currentTimeMillis(), 0)) + ')'; } @Override diff --git a/src/freenet/node/TextModeClientInterface.java b/src/freenet/node/TextModeClientInterface.java index 5e5eddc2ce9..72e5e21711d 100644 --- a/src/freenet/node/TextModeClientInterface.java +++ b/src/freenet/node/TextModeClientInterface.java @@ -381,7 +381,7 @@ private boolean processLine(BufferedReader reader) throws IOException { // Now calculate filename String fnam = uri.getDocName(); fnam = sanitize(fnam); - if(fnam.length() == 0) { + if(fnam.isEmpty()) { fnam = "freenet-download-"+HexUtil.bytesToHex(BucketTools.hash(data), 0, 10); String ext = DefaultMIMETypes.getExtension(cm.getMIMEType()); if((ext != null) && !ext.isEmpty()) @@ -544,7 +544,7 @@ public void run() { else line = line.substring("PUT:".length()).trim(); String content; - if(line.length() > 0) { + if(!line.isEmpty()) { // Single line insert content = line; } else { @@ -592,7 +592,7 @@ else if(uline.startsWith("PUTSSKDIR:")) { line = line.trim(); - if(line.length() < 1) { + if(line.isEmpty()) { printHeader(w); outsb.append("\r\n"); w.write(outsb.toString()); @@ -772,7 +772,7 @@ else if(uline.startsWith("PUTSSKDIR:")) { } String content = null; - if(key.length() > 0) { + if(!key.isEmpty()) { // Filename BufferedReader in; outsb.append("Trying to add peer to node by noderef in ").append(key).append("\r\n"); @@ -1021,7 +1021,7 @@ public void relayedNoderef() { }); } else { - if(uline.length() > 0) + if(!uline.isEmpty()) printHeader(w); } outsb.append("\r\n"); @@ -1047,22 +1047,22 @@ private HashMap makeBucketsByName(String directory) { File filelist[] = thisdir.listFiles(); if(filelist == null) throw new IllegalArgumentException("No such directory"); - for(int i = 0 ; i < filelist.length ; i++) { - // Skip unreadable files and dirs - // Skip files nonexistant (dangling symlinks) - check last - if (filelist[i].canRead() && filelist[i].exists()) { - if (filelist[i].isFile()) { - File f = filelist[i]; + for (File file : filelist) { + // Skip unreadable files and dirs + // Skip files nonexistant (dangling symlinks) - check last + if (file.canRead() && file.exists()) { + if (file.isFile()) { + File f = file; - FileBucket bucket = new FileBucket(f, true, false, false, false); + FileBucket bucket = new FileBucket(f, true, false, false, false); - ret.put(f.getName(), bucket); - } else if(filelist[i].isDirectory()) { - HashMap subdir = makeBucketsByName(directory + filelist[i].getName()); - ret.put(filelist[i].getName(), subdir); - } + ret.put(f.getName(), bucket); + } else if (file.isDirectory()) { + HashMap subdir = makeBucketsByName(directory + file.getName()); + ret.put(file.getName(), subdir); + } + } } - } return ret; } diff --git a/src/freenet/node/simulator/RealNodeBusyNetworkTest.java b/src/freenet/node/simulator/RealNodeBusyNetworkTest.java index 8a51e7277ba..bc4f96b7d2f 100644 --- a/src/freenet/node/simulator/RealNodeBusyNetworkTest.java +++ b/src/freenet/node/simulator/RealNodeBusyNetworkTest.java @@ -140,9 +140,9 @@ public static void main(String[] args) throws Exception { clients[j].prefetch(key.getURI(), DAYS.toMillis(1), 32768, null); } long totalRunningRequests = 0; - for(int j=0;j maxPingTime) maxPingTime = pingTime; - if(pingTime < minPingTime) minPingTime = pingTime; - if(countConnected == countTotal) { + if (pingTime > maxPingTime) maxPingTime = pingTime; + if (pingTime < minPingTime) minPingTime = pingTime; + if (countConnected == countTotal) { countFullyConnected++; - if(countBackedOff == 0) countReallyConnected++; + if (countBackedOff == 0) countReallyConnected++; } else { - if(logMINOR) - Logger.minor(RealNodeTest.class, "Connection count for "+nodes[i]+" : "+countConnected+" partial "+countAlmostConnected); + if (logMINOR) + Logger.minor(RealNodeTest.class, "Connection count for " + node + " : " + countConnected + " partial " + countAlmostConnected); } - if(countBackedOff > 0) { - if(logMINOR) - Logger.minor(RealNodeTest.class, "Backed off: "+nodes[i]+" : "+countBackedOff); + if (countBackedOff > 0) { + if (logMINOR) + Logger.minor(RealNodeTest.class, "Backed off: " + node + " : " + countBackedOff); } } double avgPingTime = totalPingTime / nodes.length; diff --git a/src/freenet/node/updater/UpdateOverMandatoryManager.java b/src/freenet/node/updater/UpdateOverMandatoryManager.java index 7f140cbe243..ae9bca60be0 100644 --- a/src/freenet/node/updater/UpdateOverMandatoryManager.java +++ b/src/freenet/node/updater/UpdateOverMandatoryManager.java @@ -1665,7 +1665,7 @@ public boolean realTimeFlag() { public boolean isFetchingMain() { synchronized(this) { - return nodesSendingMainJar.size() > 0; + return !nodesSendingMainJar.isEmpty(); } } @@ -1906,7 +1906,7 @@ private boolean maybeFetch() { return false; } synchronized(this) { - if(peersFailed.size() != 0) { + if(!peersFailed.isEmpty()) { System.out.println("UOM trying peers which have failed downloads for "+saveTo.getName()+" because nowhere else to go ..."); peersFailed.clear(); tryEverything = true; diff --git a/src/freenet/node/useralerts/BookmarkFeedUserAlert.java b/src/freenet/node/useralerts/BookmarkFeedUserAlert.java index d6c7c7b1357..d782cd682d1 100644 --- a/src/freenet/node/useralerts/BookmarkFeedUserAlert.java +++ b/src/freenet/node/useralerts/BookmarkFeedUserAlert.java @@ -47,7 +47,7 @@ public String getText() { StringBuilder sb = new StringBuilder(); sb.append(l10n("peerName")).append(" ").append(name).append("\n"); sb.append(l10n("bookmarkURI")).append(" ").append(uri).append("\n"); - if(description != null && description.length() != 0) + if(description != null && !description.isEmpty()) sb.append(l10n("bookmarkDescription")).append(" ").append(description); return sb.toString(); } @@ -68,7 +68,7 @@ public HTMLNode getHTMLText() { new String[] { "/static/icon/bookmark-new.png", l10n("addAsABookmark"), l10n("addAsABookmark") }); alertNode.addChild("a", "href", "/freenet:" + uri.toString()).addChild("#", name); - if (description != null && description.length() != 0) { + if (description != null && !description.isEmpty()) { String[] lines = description.split("\n"); alertNode.addChild("br"); alertNode.addChild("br"); diff --git a/src/freenet/node/useralerts/DownloadFeedUserAlert.java b/src/freenet/node/useralerts/DownloadFeedUserAlert.java index 7605d65eac3..5ea6611ea57 100644 --- a/src/freenet/node/useralerts/DownloadFeedUserAlert.java +++ b/src/freenet/node/useralerts/DownloadFeedUserAlert.java @@ -42,7 +42,7 @@ public String getTitle() { public String getText() { StringBuilder sb = new StringBuilder(); sb.append(l10n("fileURI")).append(" ").append(uri).append("\n"); - if(description != null && description.length() != 0) + if(description != null && !description.isEmpty()) sb.append(l10n("fileDescription")).append(" ").append(description); return sb.toString(); } @@ -56,7 +56,7 @@ public String getShortText() { public HTMLNode getHTMLText() { HTMLNode alertNode = new HTMLNode("div"); alertNode.addChild("a", "href", "/" + uri).addChild("#", uri.toShortString()); - if (description != null && description.length() != 0) { + if (description != null && !description.isEmpty()) { String[] lines = description.split("\n"); alertNode.addChild("br"); alertNode.addChild("br"); diff --git a/src/freenet/pluginmanager/PluginInfoWrapper.java b/src/freenet/pluginmanager/PluginInfoWrapper.java index c798ffd0591..41f3ab2c16c 100644 --- a/src/freenet/pluginmanager/PluginInfoWrapper.java +++ b/src/freenet/pluginmanager/PluginInfoWrapper.java @@ -127,13 +127,13 @@ public synchronized String[] getPluginToadletSymlinks(){ } public synchronized boolean addPluginToadletSymlink(String linkfrom){ - if (toadletLinks.size() < 1) + if (toadletLinks.isEmpty()) toadletLinks = new HashSet(); return toadletLinks.add(linkfrom); } public synchronized boolean removePluginToadletSymlink(String linkfrom){ - if (toadletLinks.size() < 1) + if (toadletLinks.isEmpty()) return false; return toadletLinks.remove(linkfrom); } diff --git a/src/freenet/pluginmanager/PluginManager.java b/src/freenet/pluginmanager/PluginManager.java index 365430831c8..c15ba8f1a6d 100644 --- a/src/freenet/pluginmanager/PluginManager.java +++ b/src/freenet/pluginmanager/PluginManager.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -239,9 +240,15 @@ public void stop(long maxWaitTime) { while(true) { int delta = (int) (deadline - now); if(delta <= 0) { - String list = pluginList(loadedPlugins.getLoadedPlugins()); - Logger.error(this, "Plugins still shutting down at timeout:\n"+list); - System.err.println("Plugins still shutting down at timeout:\n"+list); + String list = ""; + try { + list = pluginList(loadedPlugins.getLoadedPlugins()); + Logger.error(this, "Plugins still shutting down at timeout:\n"+list); + System.err.println("Plugins still shutting down at timeout:\n"+list); + } catch (ConcurrentModificationException e) { + Logger.error(this, "Error during shutdown: "+ e); + Logger.error(this, "Plugins still shutting down at timeout:\n"+list); + } } else { for (PluginInfoWrapper pluginInfoWrapper : loadedPlugins.getLoadedPlugins()) { System.out.println("Waiting for plugin to finish shutting down: " + pluginInfoWrapper.getFilename()); @@ -363,7 +370,7 @@ public PluginInfoWrapper startPluginFreenet(final String filename, boolean store private PluginInfoWrapper realStartPlugin(final PluginDownLoader pdl, final String filename, final boolean store, boolean alwaysDownload) { if (!enabled) throw new IllegalStateException("Plugins disabled"); - if(filename.trim().length() == 0) + if(filename.trim().isEmpty()) return null; final PluginProgress pluginProgress = new PluginProgress(filename, pdl); loadedPlugins.addStartingPlugin(pluginProgress); @@ -630,7 +637,7 @@ void register(PluginInfoWrapper pi) { public void cancelRunningLoads(String filename, PluginProgress exceptFor) { Logger.normal(this, "Cancelling loads for plugin "+filename); - for (PluginProgress progress : new ArrayList(loadedPlugins.getStartingPlugins())) { + for (PluginProgress progress : loadedPlugins.getStartingPlugins()) { if ((progress != exceptFor) && filename.equals(progress.name)) { progress.kill(); loadedPlugins.removeStartingPlugin(progress); @@ -1001,7 +1008,7 @@ public List findAvailablePlugins() { } public OfficialPluginDescription isOfficialPlugin(String name) { - if((name == null) || (name.trim().length() == 0)) + if((name == null) || name.trim().isEmpty()) return null; List availablePlugins = findAvailablePlugins(); for(OfficialPluginDescription desc : availablePlugins) { @@ -1519,7 +1526,7 @@ public void run() { try { plug.setTheme(cssName); } catch (Throwable t) { - Logger.error(this, "Cought Trowable in Callback", t); + Logger.error(this, "Caught Throwable in Callback", t); } } }, "Callback"); @@ -1542,7 +1549,7 @@ public void run() { try { plug.setLanguage(lang); } catch (Throwable t) { - Logger.error(this, "Cought Trowable in Callback", t); + Logger.error(this, "Caught Throwable in Callback", t); } } }, "Callback"); @@ -1554,7 +1561,7 @@ public void run() { try { plug.setLanguage(lang); } catch (Throwable t) { - Logger.error(this, "Cought Trowable in Callback", t); + Logger.error(this, "Caught Throwable in Callback", t); } } }, "Callback"); @@ -1601,10 +1608,15 @@ public void addStartingPlugin(PluginProgress pluginProgress) { } } + /** + * @return a copy of the starting plugins. Do not modify this: modifications will get thrown away. + */ public Collection getStartingPlugins() { + Set startingPluginsCopy; synchronized (this) { - return startingPlugins; + startingPluginsCopy = new HashSet<>(startingPlugins); } + return startingPluginsCopy; } public void removeStartingPlugin(PluginProgress pluginProgress) { @@ -1613,10 +1625,15 @@ public void removeStartingPlugin(PluginProgress pluginProgress) { } } + /** + * @return a copy of the loaded plugins. Do not modify this: modifications will get thrown away. + */ public Collection getLoadedPlugins() { + Set loadedPluginsCopy; synchronized (this) { - return loadedPlugins; + loadedPluginsCopy = new HashSet<>(loadedPlugins); } + return loadedPluginsCopy; } public void removeLoadedPlugin(PluginInfoWrapper pluginInfoWrapper) { diff --git a/src/freenet/support/Fields.java b/src/freenet/support/Fields.java index 2b9258b2044..d3b03a0ea34 100644 --- a/src/freenet/support/Fields.java +++ b/src/freenet/support/Fields.java @@ -268,7 +268,7 @@ public static String numberList(long[] ls) { public static long dateTime(String date) throws NumberFormatException { - if(date.length() == 0) + if(date.isEmpty()) throw new NumberFormatException("Date time empty"); if((date.charAt(0) == '-') || (date.charAt(0) == '+')) { @@ -908,7 +908,7 @@ public static String trimLines(String str) { StringBuilder r = new StringBuilder(str.length()); for (String line : str.split("\n")) { line = line.trim(); - if (line.length() == 0) continue; + if (line.isEmpty()) continue; r.append(line); r.append('\n'); diff --git a/src/freenet/support/FileLoggerHook.java b/src/freenet/support/FileLoggerHook.java index 751654c76f9..edfb4881b37 100644 --- a/src/freenet/support/FileLoggerHook.java +++ b/src/freenet/support/FileLoggerHook.java @@ -284,7 +284,7 @@ public void run() { findOldLogFiles((GregorianCalendar)gc.clone()); currentFilename = new File(getHourLogName(gc, -1, true)); synchronized(logFiles) { - if((!logFiles.isEmpty()) && logFiles.getLast().filename.equals(currentFilename)) { + if(!logFiles.isEmpty() && logFiles.getLast().filename.equals(currentFilename)) { logFiles.removeLast(); } } @@ -636,7 +636,7 @@ public void findOldLogFiles(GregorianCalendar gc) { name = name.substring(0, name.length()-".log.gz".length()); } name = name.substring(prefix.length()); - if((name.length() == 0) || (name.charAt(0) != '-')) { + if(name.isEmpty() || (name.charAt(0) != '-')) { if(logMINOR) Logger.minor(this, "Deleting unrecognized: "+name+" ("+f.getPath()+ ')'); f.delete(); continue; @@ -869,7 +869,7 @@ private FileLoggerHook(String fmt, String dfmt, LogLevel threshold, String logRo } private void setLogFormat(String fmt) { - if ((fmt == null) || (fmt.length() == 0)) + if ((fmt == null) || fmt.isEmpty()) fmt = "d:c:h:t:p:m"; char[] f = fmt.toCharArray(); @@ -912,7 +912,7 @@ private void setLogFormat(String fmt) { } private void setDateFormat(String dfmt) { - if ((dfmt != null) && (dfmt.length() != 0)) { + if ((dfmt != null) && !dfmt.isEmpty()) { try { df = new SimpleDateFormat(dfmt); } catch (RuntimeException e) { diff --git a/src/freenet/support/HTMLNode.java b/src/freenet/support/HTMLNode.java index a24783c0722..9fe4d712164 100644 --- a/src/freenet/support/HTMLNode.java +++ b/src/freenet/support/HTMLNode.java @@ -180,7 +180,7 @@ public HTMLNode clone() { protected boolean checkNamePattern(String str) { // Workaround buggy java regexes, also probably slightly faster. - if(str.length() < 1) return false; + if(str.isEmpty()) return false; char c; c = str.charAt(0); if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { @@ -354,8 +354,7 @@ public String getFirstTag() { if (!"#".equals(name)) { return name; } - for (int childIndex = 0, childCount = children.size(); childIndex < childCount; childIndex++) { - HTMLNode childNode = children.get(childIndex); + for (HTMLNode childNode : children) { String tag = childNode.getFirstTag(); if (tag != null) { return tag; @@ -379,9 +378,8 @@ public StringBuilder generate(StringBuilder tagBuffer, int indentDepth ) { HTMLEncoder.encodeToBuffer(content, tagBuffer); return tagBuffer; } - - for(int childIndex = 0, childCount = children.size(); childIndex < childCount; childIndex++) { - HTMLNode childNode = children.get(childIndex); + + for (HTMLNode childNode : children) { childNode.generate(tagBuffer); } return tagBuffer; @@ -411,7 +409,7 @@ public StringBuilder generate(StringBuilder tagBuffer, int indentDepth ) { tagBuffer.append(OpenSuffix(name)); /*insert the contents*/ - if (children.size() == 0) { + if (children.isEmpty()) { if(content==null) { } else { HTMLEncoder.encodeToBuffer(content, tagBuffer); @@ -421,9 +419,8 @@ public StringBuilder generate(StringBuilder tagBuffer, int indentDepth ) { tagBuffer.append('\n'); tagBuffer.append(indentString(indentDepth+1)); } - for (int childIndex = 0, childCount = children.size(); childIndex < childCount; childIndex++) { - HTMLNode childNode = children.get(childIndex); - childNode.generate(tagBuffer,indentDepth+1); + for (HTMLNode childNode : children) { + childNode.generate(tagBuffer, indentDepth + 1); } } /* add a closing tag */ @@ -444,8 +441,7 @@ public String generateChildren(){ return content; } StringBuilder tagBuffer=new StringBuilder(); - for(int childIndex = 0, childCount = children.size(); childIndex < childCount; childIndex++) { - HTMLNode childNode = children.get(childIndex); + for (HTMLNode childNode : children) { childNode.generate(tagBuffer); } return tagBuffer.toString(); diff --git a/src/freenet/support/LRUMap.java b/src/freenet/support/LRUMap.java index 34c994f281f..2c8d3e5ff0f 100644 --- a/src/freenet/support/LRUMap.java +++ b/src/freenet/support/LRUMap.java @@ -88,7 +88,7 @@ public final synchronized V push(K key, V value) { * @return Least recently pushed key. */ public final synchronized K popKey() { - if ( list.size() > 0 ) { + if (!list.isEmpty()) { return hash.remove(list.pop().obj).obj; } else { return null; @@ -99,7 +99,7 @@ public final synchronized K popKey() { * @return Least recently pushed value. */ public final synchronized V popValue() { - if ( list.size() > 0 ) { + if (!list.isEmpty()) { return hash.remove(list.pop().obj).value; } else { return null; @@ -107,7 +107,7 @@ public final synchronized V popValue() { } public final synchronized V peekValue() { - if ( list.size() > 0 ) { + if (!list.isEmpty()) { return hash.get(list.tail().obj).value; } else { return null; @@ -115,7 +115,7 @@ public final synchronized V peekValue() { } public final synchronized K peekKey() { - if ( list.size() > 0 ) { + if (!list.isEmpty()) { return hash.get(list.tail().obj).obj; } else { return null; diff --git a/src/freenet/support/LRUQueue.java b/src/freenet/support/LRUQueue.java index b663e655441..57b0220886f 100644 --- a/src/freenet/support/LRUQueue.java +++ b/src/freenet/support/LRUQueue.java @@ -67,7 +67,7 @@ public synchronized void pushLeast(T obj) { * @return Least recently pushed Object. */ public final synchronized T pop() { - if ( list.size() > 0 ) { + if (!list.isEmpty()) { return hash.remove(list.pop().obj).obj; } else { return null; diff --git a/src/freenet/support/LoggerHook.java b/src/freenet/support/LoggerHook.java index e58fb9a801e..cd2ea3000c3 100644 --- a/src/freenet/support/LoggerHook.java +++ b/src/freenet/support/LoggerHook.java @@ -139,7 +139,7 @@ public void setDetailedThresholds(String details) throws InvalidThresholdExcepti ArrayList stuff = new ArrayList(); while (st.hasMoreTokens()) { String token = st.nextToken(); - if (token.length() == 0) + if (token.isEmpty()) continue; int x = token.indexOf(':'); if (x < 0) diff --git a/src/freenet/support/LoggerHookChain.java b/src/freenet/support/LoggerHookChain.java index 2053f8c9884..406afef39ab 100644 --- a/src/freenet/support/LoggerHookChain.java +++ b/src/freenet/support/LoggerHookChain.java @@ -65,11 +65,11 @@ public synchronized void removeHook(LoggerHook lh) { if(hooksLength == 0) return; LoggerHook[] newHooks = new LoggerHook[hooksLength-1]; int x=0; - for(int i=0;i 0) return true; + for (ArrayDeque job : jobs) if (!job.isEmpty()) return true; } return false; } diff --git a/src/freenet/support/SimpleFieldSet.java b/src/freenet/support/SimpleFieldSet.java index 998d1ad6ac6..324f4e33d79 100644 --- a/src/freenet/support/SimpleFieldSet.java +++ b/src/freenet/support/SimpleFieldSet.java @@ -201,7 +201,7 @@ private void read(LineReader br, int maxLength, int bufferSize, boolean utfOrIso Logger.error(this, "No end marker"); break; } - if ((line.length() == 0)) continue; // ignore + if (line.isEmpty()) continue; // ignore firstLine = false; char first = line.charAt(0); @@ -212,7 +212,7 @@ private void read(LineReader br, int maxLength, int bufferSize, boolean utfOrIso } else { if (headerSection) { - if (headers.size() > 0) { this.header = headers.toArray(new String[headers.size()]); } + if (!headers.isEmpty()) { this.header = headers.toArray(new String[headers.size()]); } headerSection = false; } @@ -221,7 +221,7 @@ private void read(LineReader br, int maxLength, int bufferSize, boolean utfOrIso // Mapping String before = line.substring(0, index).trim(); String after = line.substring(index+1); - if((!after.isEmpty()) && after.charAt(0) == '=' && allowBase64) { + if(!after.isEmpty() && after.charAt(0) == '=' && allowBase64) { try { after = after.substring(1); after = after.replaceAll("\\s", ""); diff --git a/src/freenet/support/TimeUtil.java b/src/freenet/support/TimeUtil.java index 92695950369..80da0aeb8a7 100644 --- a/src/freenet/support/TimeUtil.java +++ b/src/freenet/support/TimeUtil.java @@ -145,7 +145,7 @@ public static long toMillis(String timeInterval) { long millis = 0; for (String term : terms) { - if (term.length() == 0) continue; + if (term.isEmpty()) continue; char measure = term.charAt(term.length() - 1); switch(measure){ diff --git a/src/freenet/support/URLDecoder.java b/src/freenet/support/URLDecoder.java index b283647a73f..4cb473cffca 100644 --- a/src/freenet/support/URLDecoder.java +++ b/src/freenet/support/URLDecoder.java @@ -38,7 +38,7 @@ public static void main(String[] args) throws URLEncodedFormatException { * **/ public static String decode(String s, boolean tolerant) throws URLEncodedFormatException { - if (s.length() == 0) + if (s.isEmpty()) return ""; int len = s.length(); ByteArrayOutputStream decodedBytes = new ByteArrayOutputStream(); diff --git a/src/freenet/support/compress/Compressor.java b/src/freenet/support/compress/Compressor.java index 174b414d1c6..6259c3d5c8e 100644 --- a/src/freenet/support/compress/Compressor.java +++ b/src/freenet/support/compress/Compressor.java @@ -115,7 +115,7 @@ public static COMPRESSOR_TYPE[] getCompressorsArray(String compressordescriptor) public static COMPRESSOR_TYPE[] getCompressorsArrayNoDefault(String compressordescriptor) throws InvalidCompressionCodecException { if (compressordescriptor == null) return null; - if (compressordescriptor.trim().length() == 0) + if (compressordescriptor.trim().isEmpty()) return null; String[] codecs = compressordescriptor.split(","); ArrayList result = new ArrayList(codecs.length); diff --git a/src/freenet/support/io/BucketTools.java b/src/freenet/support/io/BucketTools.java index 8277deacb2f..6882b06551e 100644 --- a/src/freenet/support/io/BucketTools.java +++ b/src/freenet/support/io/BucketTools.java @@ -199,9 +199,9 @@ public static int[] nonNullIndices(Bucket[] array) { public static Bucket[] nonNullBuckets(Bucket[] array) { List list = new ArrayList(array.length); - for (int i = 0; i < array.length; i++) { - if (array[i] != null) { - list.add(array[i]); + for (Bucket bucket : array) { + if (bucket != null) { + list.add(bucket); } } diff --git a/src/freenet/support/io/TempBucketFactory.java b/src/freenet/support/io/TempBucketFactory.java index db68dfc5fa6..6e2767548bc 100644 --- a/src/freenet/support/io/TempBucketFactory.java +++ b/src/freenet/support/io/TempBucketFactory.java @@ -756,7 +756,7 @@ private boolean cleanBucketQueue(long now, boolean force) throws InsufficientDis } while(shouldContinue); if(toMigrate == null) return false; - if(toMigrate.size() > 0) { + if(!toMigrate.isEmpty()) { if(logMINOR) Logger.minor(this, "We are going to migrate " + toMigrate.size() + " RAMBuckets"); for(Migratable tmpBucket : toMigrate) { diff --git a/src/freenet/support/plugins/helpers1/AbstractFCPHandler.java b/src/freenet/support/plugins/helpers1/AbstractFCPHandler.java index 7ce54cb914e..4b3aedb38c3 100644 --- a/src/freenet/support/plugins/helpers1/AbstractFCPHandler.java +++ b/src/freenet/support/plugins/helpers1/AbstractFCPHandler.java @@ -62,12 +62,12 @@ public final void handle(PluginReplySender replysender, SimpleFieldSet params, B return; } - if (identifier == null || identifier.trim().length() == 0) { + if (identifier == null || identifier.trim().isEmpty()) { sendError(replysender, FCPException.MISSING_IDENTIFIER, "", "Empty identifier!"); return; } - if (command == null || command.trim().length() == 0) { + if (command == null || command.trim().isEmpty()) { sendError(replysender, FCPException.MISSING_COMMAND, identifier, "Empty Command name"); return; } diff --git a/src/freenet/support/plugins/helpers1/WebInterfaceToadlet.java b/src/freenet/support/plugins/helpers1/WebInterfaceToadlet.java index 4b3ca0410ac..63189b4a50d 100644 --- a/src/freenet/support/plugins/helpers1/WebInterfaceToadlet.java +++ b/src/freenet/support/plugins/helpers1/WebInterfaceToadlet.java @@ -46,7 +46,7 @@ public boolean isEnabled(ToadletContext ctx) { */ protected String normalizePath(String path) { String result = path.substring(_path.length()); - if (result.length() == 0) { + if (result.isEmpty()) { return "/"; } if (result.endsWith("/")) { diff --git a/src/freenet/support/transport/ip/IPAddressDetector.java b/src/freenet/support/transport/ip/IPAddressDetector.java index 395fa59b02e..f6e6f27794f 100644 --- a/src/freenet/support/transport/ip/IPAddressDetector.java +++ b/src/freenet/support/transport/ip/IPAddressDetector.java @@ -244,7 +244,7 @@ protected void onGetAddresses(List addrs) { Logger.debug( this, "onGetAddresses found " + addrs.size() + " potential addresses)"); - if (addrs.size() == 0) { + if (addrs.isEmpty()) { Logger.error(this, "No addresses found!"); lastAddressList = null; return; diff --git a/test/freenet/client/filter/WebPFilterTest.java b/test/freenet/client/filter/WebPFilterTest.java new file mode 100644 index 00000000000..f0ca5bb2c49 --- /dev/null +++ b/test/freenet/client/filter/WebPFilterTest.java @@ -0,0 +1,170 @@ +package freenet.client.filter; + +import static org.junit.Assert.*; +import static freenet.client.filter.ResourceFileUtil.resourceToBucket; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.HashMap; + +import org.junit.Test; +import freenet.support.api.Bucket; +import freenet.support.io.ArrayBucket; +import freenet.support.io.ArrayBucketFactory; +import freenet.support.io.BucketTools; + +/** + * Unit test for (parts of) {@link WebPFilter}. + */ +public class WebPFilterTest { + + /** + * Tests file without media chunk + */ + @Test + public void testNoChunkFile() throws IOException { + ByteBuffer buf = ByteBuffer.allocate(12) + .order(ByteOrder.LITTLE_ENDIAN) + .put(new byte[]{'R', 'I', 'F', 'F'}) + .putInt(4 /* file size */) + .put(new byte[]{'W', 'E', 'B', 'P'}); + + Bucket input = new ArrayBucket(buf.array()); + filterImage(input, DataFilterException.class); + } + + /** + * Tests file with too short VP8 chunk + */ + @Test + public void testFileEOF() throws IOException { + ByteBuffer buf = ByteBuffer.allocate(33) + .order(ByteOrder.LITTLE_ENDIAN) + .put(new byte[]{'R', 'I', 'F', 'F'}) + .putInt(0x1308 /* file size */) + .put(new byte[]{'W', 'E', 'B', 'P'}) + .put(new byte[]{'V', 'P', '8', ' '}) + .putInt(0x12FC /* chunk size */) + .putLong(((long)0x2a019d << 24 /* frame tag */) | (1 << 4 /* show_frame=1 */)); + + Bucket input = new ArrayBucket(buf.array()); + filterImage(input, DataFilterException.class); + } + + /** + * Tests file with just only a JUNK chunk + */ + @Test + public void testFileJustJUNK() throws IOException { + ByteBuffer buf = ByteBuffer.allocate(28) + .order(ByteOrder.LITTLE_ENDIAN) + .put(new byte[]{'R', 'I', 'F', 'F'}) + .putInt(20 /* file size */) + .put(new byte[]{'W', 'E', 'B', 'P'}) + .put(new byte[]{'J', 'U', 'N', 'K'}) + .putInt(7 /* chunk size */) + .putLong(0); + + Bucket input = new ArrayBucket(buf.array()); + filterImage(input, DataFilterException.class); + } + + /** + * Tests file with chunk size of 0x7fffff00 + */ + @Test + public void testTooBig() throws IOException { + ByteBuffer buf = ByteBuffer.allocate(32) + .order(ByteOrder.LITTLE_ENDIAN) + .put(new byte[]{'R', 'I', 'F', 'F'}) + .putInt(0x7fffff0c /* file size */) // 2 GiB + .put(new byte[]{'W', 'E', 'B', 'P'}) + .put(new byte[]{'V', 'P', '8', ' '}) + .putInt(0x7fffff00 /* chunk size */) // 2 GiB + .putLong(((long)0x2a019d << 24 /* frame tag */) | (1 << 4 /* show_frame=1 */)); + + Bucket input = new ArrayBucket(buf.array()); + filterImage(input, DataFilterException.class); + } + + /** + * Tests file with file size of 0 + */ + @Test + public void fileSizeTooSmall() throws IOException { + ByteBuffer buf = ByteBuffer.allocate(32) + .order(ByteOrder.LITTLE_ENDIAN) + .put(new byte[]{'R', 'I', 'F', 'F'}) + .putInt(0 /* file size */) // Empty RIFF file, promise! + .put(new byte[]{'W', 'E', 'B', 'P'}) + .put(new byte[]{'V', 'P', '8', ' '}) + .putInt(12 /* chunk size */) + .putLong(((long)0x2a019d << 24 /* frame tag */) | (1 << 4 /* show_frame=1 */)); + + Bucket input = new ArrayBucket(buf.array()); + filterImage(input, DataFilterException.class); + } + + /** + * Tests valid image (lossy image from libwebp 1.4) + */ + @Test + public void testValidImageLossy() throws IOException { + Bucket input = resourceToBucket("./webp/test.webp"); + Bucket output = filterImage(input, null); + + //Filter should return the original + assertEquals("Input and output should be the same length", input.size(), output.size()); + assertArrayEquals("Input and output are not identical", BucketTools.toByteArray(input), BucketTools.toByteArray(output)); + } + + /** + * Tests valid image (lossy image with alpha channel from https://developers.google.com/speed/webp/gallery2 “Yellow Rose”) + */ + @Test + public void testValidImageLossyAlpha() throws IOException { + Bucket input = resourceToBucket("./webp/1_webp_a.webp"); + Bucket output = filterImage(input, null); + + //Filter should return the original + assertEquals("Input and output should be the same length", input.size(), output.size()); + assertArrayEquals("Input and output are not identical", BucketTools.toByteArray(input), BucketTools.toByteArray(output)); + } + + /** + * Tests data after valid image + */ + @Test + public void testDataAfterEOF() throws IOException { + ArrayBucketFactory bf = new ArrayBucketFactory(); + Bucket inputValid = resourceToBucket("./webp/test.webp"); + Bucket input = BucketTools.pad(inputValid, (int)inputValid.size() + 1, bf, (int) inputValid.size()); + assertEquals("Input size is wrong", inputValid.size() + 1l, input.size()); + filterImage(input, DataFilterException.class); + } + + private Bucket filterImage(Bucket input, Class expected) throws IOException { + WebPFilter objWebPFilter = new WebPFilter(); + Bucket output = new ArrayBucket(); + try ( + InputStream inStream = input.getInputStream(); + OutputStream outStream = output.getOutputStream() + ) { + if (expected != null) { + assertThrows(expected, () -> readFilter(objWebPFilter, inStream, outStream)); + } else { + readFilter(objWebPFilter, inStream, outStream); + } + } + return output; + } + + private static void readFilter(WebPFilter objWebPFilter, InputStream inStream, OutputStream outStream) throws IOException { + objWebPFilter.readFilter(inStream, outStream, "", null, null, null); + } +} diff --git a/test/freenet/client/filter/webp/1_webp_a.webp b/test/freenet/client/filter/webp/1_webp_a.webp new file mode 100644 index 00000000000..fd78f9335a2 Binary files /dev/null and b/test/freenet/client/filter/webp/1_webp_a.webp differ diff --git a/test/freenet/client/filter/webp/test.webp b/test/freenet/client/filter/webp/test.webp new file mode 100644 index 00000000000..3e4bca1d850 Binary files /dev/null and b/test/freenet/client/filter/webp/test.webp differ diff --git a/test/freenet/crypt/HMACTest.java b/test/freenet/crypt/HMACTest.java index d7f820029fe..763cd595fef 100644 --- a/test/freenet/crypt/HMACTest.java +++ b/test/freenet/crypt/HMACTest.java @@ -95,18 +95,18 @@ public void testBenchmark() { long t1 = System.currentTimeMillis(); for (int i = 0; i < ITERATIONS; i++) { byte[] r1 = HMAC_legacy.macWithSHA256(knownKey, plaintext, 32); - for (int j = 0; j < r1.length; j++) { - count += r1[j]; - } + for (byte b : r1) { + count += b; + } } long legacyLength = System.currentTimeMillis() - t1; t1 = System.currentTimeMillis(); for (int i = 0; i < ITERATIONS; i++) { byte[] r1 = HMAC.macWithSHA256(knownKey, plaintext); - for (int j = 0; j < r1.length; j++) { - count += r1[j]; - } + for (byte b : r1) { + count += b; + } } long currentLength = System.currentTimeMillis() - t1; @@ -118,9 +118,9 @@ public void testBenchmark() { hmac.init(kp); hmac.update(plaintext, 0, plaintext.length); hmac.doFinal(r1, 0); - for (int j = 0; j < r1.length; j++) { - count += r1[j]; - } + for (byte b : r1) { + count += b; + } } long BCLength = System.currentTimeMillis() - t1; System.out.println("Legacy HMAC took " + TimeUtil.formatTime(legacyLength, 6, true)); diff --git a/test/freenet/crypt/HashTest.java b/test/freenet/crypt/HashTest.java index 6e79c4644d1..6e7be4e37f4 100644 --- a/test/freenet/crypt/HashTest.java +++ b/test/freenet/crypt/HashTest.java @@ -57,11 +57,11 @@ public void testGetHashByteArrayArray() { @Test // This also tests addBytes(byte[]...) and getHash() public void testGetHashByteArrayArrayReset() { - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); byte[] abcResult = hash.genHash(helloWorld); byte[] abcResult2 = hash.genHash(helloWorld); - assertArrayEquals("HashType: "+types[i].name(), abcResult, abcResult2); + assertArrayEquals("HashType: " + type.name(), abcResult, abcResult2); } } @@ -69,44 +69,44 @@ public void testGetHashByteArrayArrayReset() { @Test // This also tests addBytes(byte[]...) and getHash() public void testGetHashByteArrayArraySameAsMessageDigest() { - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); - MessageDigest md = types[i].get(); + for (HashType type : types) { + Hash hash = new Hash(type); + MessageDigest md = type.get(); byte[] mdResult = md.digest(helloWorld); byte[] hashResult = hash.genHash(helloWorld); - assertArrayEquals("HashType: "+types[i].name(), mdResult, hashResult); + assertArrayEquals("HashType: " + type.name(), mdResult, hashResult); } } @Test // This also tests addBytes(byte[]...) and getHash() public void testGetHashByteArrayArrayNullInput() { - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); - + for (HashType type : types) { + Hash hash = new Hash(type); + boolean throwNull = false; - try{ + try { hash.genHash(nullArray); - }catch(NullPointerException e){ + } catch (NullPointerException e) { throwNull = true; } - assertTrue("HashType: "+types[i].name(), throwNull); + assertTrue("HashType: " + type.name(), throwNull); } } @Test // This also tests addBytes(byte[]...) public void testGetHashByteArrayArrayNullMatrixElementInput() { - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwNulls = false; byte[][] nullMatrix = {helloWorld, null}; - try{ + try { hash.genHash(nullMatrix); - }catch(NullPointerException e){ + } catch (NullPointerException e) { throwNulls = true; } - assertTrue("HashType: "+types[i].name(), throwNulls); + assertTrue("HashType: " + type.name(), throwNulls); } } @@ -136,8 +136,8 @@ public void testAddByteByte(){ for(int i = 0; i < types.length; i++){ Hash hash = new Hash(types[i]); - for (int j = 0; j < helloWorld.length; j++){ - hash.addByte(helloWorld[j]); + for (byte b : helloWorld) { + hash.addByte(b); } assertArrayEquals("HashType: "+types[i].name(), Hex.decode(trueHashes[i]), hash.genHash()); @@ -147,16 +147,16 @@ public void testAddByteByte(){ @Test @SuppressWarnings("null") public void testAddByteByteNullInput(){ - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwNull = false; Byte nullByte = null; - try{ + try { hash.addByte(nullByte); - }catch(NullPointerException e){ + } catch (NullPointerException e) { throwNull = true; } - assertTrue("HashType: "+types[i].name(), throwNull); + assertTrue("HashType: " + type.name(), throwNull); } } @@ -173,16 +173,16 @@ public void testAddBytesByteBuffer(){ @Test public void testAddBytesByteBufferNullInput(){ - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwNull = false; ByteBuffer nullBuffer = null; - try{ + try { hash.addBytes(nullBuffer); - }catch(NullPointerException e){ + } catch (NullPointerException e) { throwNull = true; } - assertTrue("HashType: "+types[i].name(), throwNull); + assertTrue("HashType: " + type.name(), throwNull); } } @@ -199,44 +199,44 @@ public void testAddByteByteArrayIntInt(){ @Test public void testAddByteByteArrayIntIntNullInput(){ - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwNull = false; byte[] nullArray = null; - try{ + try { hash.addBytes(nullArray, 0, helloWorld.length); - }catch(IllegalArgumentException e){ + } catch (IllegalArgumentException e) { throwNull = true; } - assertTrue("HashType: "+types[i].name(), throwNull); + assertTrue("HashType: " + type.name(), throwNull); } } @Test public void testAddByteByteArrayIntIntOffsetOutOfBounds(){ - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwOutOfBounds = false; - try{ - hash.addBytes(helloWorld, -3, helloWorld.length-3); - }catch(ArrayIndexOutOfBoundsException e){ + try { + hash.addBytes(helloWorld, -3, helloWorld.length - 3); + } catch (ArrayIndexOutOfBoundsException e) { throwOutOfBounds = true; } - assertTrue("HashType: "+types[i].name(), throwOutOfBounds); + assertTrue("HashType: " + type.name(), throwOutOfBounds); } } @Test public void testAddByteByteArrayIntIntLengthOutOfBounds(){ - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwOutOfBounds = false; - try{ - hash.addBytes(helloWorld, 0, helloWorld.length+3); - }catch(IllegalArgumentException e){ + try { + hash.addBytes(helloWorld, 0, helloWorld.length + 3); + } catch (IllegalArgumentException e) { throwOutOfBounds = true; } - assertTrue("HashType: "+types[i].name(), throwOutOfBounds); + assertTrue("HashType: " + type.name(), throwOutOfBounds); } } @@ -260,39 +260,39 @@ public void testVerifyByteArrayByteArrayFalse() { @Test public void testVerifyByteArrayByteArrayWrongSizeMac() { - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); - - assertFalse("HashType: "+types[i].name(), hash.verify(helloWorld, helloWorld)); + for (HashType type : types) { + Hash hash = new Hash(type); + + assertFalse("HashType: " + type.name(), hash.verify(helloWorld, helloWorld)); } } @Test public void testVerifyByteArrayByteArrayNullInputPos1() { - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwResult = false; - boolean valid = true; - try{ + boolean valid = true; + try { valid = hash.verify(nullArray, helloWorld); - }catch(NullPointerException e){ + } catch (NullPointerException e) { throwResult = true; } - assertTrue("HashType: "+types[i].name(), throwResult || !valid); + assertTrue("HashType: " + type.name(), throwResult || !valid); } } @Test public void testVerifyByteArrayByteArrayNullInputPos2() { - for(int i = 0; i < types.length; i++){ - Hash hash = new Hash(types[i]); + for (HashType type : types) { + Hash hash = new Hash(type); boolean throwResult = false; - try{ + try { hash.verify(helloWorld, nullArray); - }catch(NullPointerException e){ + } catch (NullPointerException e) { throwResult = true; } - assertTrue("HashType: "+types[i].name(), throwResult); + assertTrue("HashType: " + type.name(), throwResult); } } @@ -318,11 +318,11 @@ public void testVerifyHashResultByteArrayFalse() { @Test public void testVerifyHashResultByteArrayWrongSizeMac() { - for(int i = 0; i < types.length; i++){ + for (HashType type : types) { byte[] hash1 = helloWorld; - HashResult hashResult = new HashResult(types[i], hash1, true); + HashResult hashResult = new HashResult(type, hash1, true); - assertFalse("HashType: "+types[i].name(), Hash.verify(hashResult, hash1)); + assertFalse("HashType: " + type.name(), Hash.verify(hashResult, hash1)); } } diff --git a/test/freenet/crypt/ciphers/RijndaelTest.java b/test/freenet/crypt/ciphers/RijndaelTest.java index 5a9f3965203..767522a51f3 100644 --- a/test/freenet/crypt/ciphers/RijndaelTest.java +++ b/test/freenet/crypt/ciphers/RijndaelTest.java @@ -1078,14 +1078,14 @@ public void testStandardTestVK() throws UnsupportedCipherException { public void testStandardTestVKJCA() throws UnsupportedCipherException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException { if(!CTRBlockCipherTest.TEST_JCA) return; // KEYSIZE=128 - for (int i = 0; i < TEST_VK128.length; i++) { - SecretKeySpec k = - new SecretKeySpec(TEST_VK128[i][0], "AES"); + for (byte[][] bytes : TEST_VK128) { + SecretKeySpec k = + new SecretKeySpec(bytes[0], "AES"); Cipher c = Cipher.getInstance("AES/ECB/NOPADDING"); c.init(Cipher.ENCRYPT_MODE, k); - + byte[] output = c.doFinal(TEST_VK_PT); - assertTrue(Arrays.equals(output, TEST_VK128[i][1])); + assertTrue(Arrays.equals(output, bytes[1])); } // KEYSIZE=192 @@ -1104,8 +1104,7 @@ public void testStandardTestVKJCA() throws UnsupportedCipherException, InvalidKe public void testRandom() throws UnsupportedCipherException { final int[] SIZE = new int[] { 128, /*192,*/ 256 }; - for (int k = 0; k < SIZE.length; k++) { - int size = SIZE[k]; + for (int size : SIZE) { Rijndael aes = new Rijndael(size, size); byte[] key = new byte[size / 8]; @@ -1123,10 +1122,10 @@ public void testRandom() throws UnsupportedCipherException { aes.decipher(cipher, plain2); assertTrue("(" + size + "," + size + // - ") KEY=" + HexUtil.bytesToHex(key) + // - ", PLAIN=" + HexUtil.bytesToHex(plain) + // - ", CIPHER=" + HexUtil.bytesToHex(cipher) + // - ", PLAIN2=" + HexUtil.bytesToHex(plain2),// + ") KEY=" + HexUtil.bytesToHex(key) + // + ", PLAIN=" + HexUtil.bytesToHex(plain) + // + ", CIPHER=" + HexUtil.bytesToHex(cipher) + // + ", PLAIN2=" + HexUtil.bytesToHex(plain2),// Arrays.equals(plain, plain2)); } } diff --git a/test/freenet/io/AddressIdentifierTest.java b/test/freenet/io/AddressIdentifierTest.java index ef974db6ff1..b3393113f5b 100644 --- a/test/freenet/io/AddressIdentifierTest.java +++ b/test/freenet/io/AddressIdentifierTest.java @@ -46,12 +46,65 @@ public void test() { assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("127.0.0.0.1")); /* test real unabridged IPv6 addresses */ - assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("0:0:0:0:0:0:0:1")); - assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("fe80:0:0:0:203:dff:fe22:420f")); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("0:0:0:0:0:0:0:1", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("fe80:0:0:0:203:dff:fe22:420f", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("FE80:0:0:0:203:DFF:FE22:420F", false)); + + /* test real abridged IPv6 addresses */ + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::1:2:3:4:5:6:7", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::1:2:3:4:5:6", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::1:2:3:4:5", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::1:2:3:4", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::1:2:3", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::1:2", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::1", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1::2:3:4:5:6:7", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1::2:3:4:5:6", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1::2:3:4:5", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1::2:3:4", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1::2:3", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1::2", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2::3:4:5:6:7", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2::3:4:5:6", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2::3:4:5", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2::3:4", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2::3", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3::4:5:6:7", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3::4:5:6", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3::4:5", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3::4", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4::5:6:7", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4::5:6", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4::5", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4:5::6:7", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4:5::6", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4:5::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4:5:6::7", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4:5:6::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("1:2:3:4:5:6:7::", false)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("fe80::203:dff:fe22:420f%10", true)); + assertEquals(AddressType.IPv6, AddressIdentifier.getAddressType("FE80::203:DFF:FE22:420F%10", true)); /* test fake IPv6 addresses */ - assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1:2:3:4:5:6:7:8:9")); - assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("12345:6:7:8:9")); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1:2:3:4:5:6:7:8:9", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("12345:6:7:8:9", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1:2:3:4:5:6:7:8%10", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType(":1:2:3:4:5:6:7:8", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType(":1:2:3:4:5:6:7", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1:2:3:4:5:6:7:", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType(":1:2::3:4", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1:2::3:4:", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1::2:3:4:5:6:7:8:9", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("::1::2:3", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1::2:3::", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("1::2:3::4", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("12:34:56:78:9a:bc:de:fg", false)); + assertEquals(AddressType.OTHER, AddressIdentifier.getAddressType("fe80::203:dff:fe22:420f%a", true)); } @Test @@ -59,6 +112,31 @@ public void testIsAnISATAPIPv6Address() { assertFalse(AddressIdentifier.isAnISATAPIPv6Address("fe80:0:0:0:203:dff:fe22:420f")); assertFalse(AddressIdentifier.isAnISATAPIPv6Address("fe80:0:5efe:0:203:dff:fe22:420f")); assertTrue(AddressIdentifier.isAnISATAPIPv6Address("2001:1:2:3:0:5efe:c801:20a")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("2001:1:2:3:0:5efe:c801:20a%10")); + // Some abridged addresses + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("::1:2:3:0:5efe:6:7")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("::1:2:0:5efE:5:6")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("::1:0:5eFe:4:5")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("::0:5eFE:3:4")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("::5Efe:2:3")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1::2:3:0:5EfE:6:7")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1::2:0:5EFe:5:6")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1::0:5EFE:4:5")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1::5efe:3:4")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2::3:0:5efe:6:7")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2::0:5efe:5:6")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2::5efe:4:5")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2:3::0:5efe:6:7")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2:3::5efe:5:6")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2:3:4::5efe:6:7")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2:3:4:0:5efe::7")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2:3:4:0:5efe::")); + assertTrue(AddressIdentifier.isAnISATAPIPv6Address("1:2:3:4:0:5efe:7::")); + // Some invalid addresses + assertFalse(AddressIdentifier.isAnISATAPIPv6Address("2001:1:2:3:5efe:c801:20a")); + assertFalse(AddressIdentifier.isAnISATAPIPv6Address("2001:1:2:3:4:5:5efe:c801:20a")); + assertFalse(AddressIdentifier.isAnISATAPIPv6Address("2001::1::5efe:c801:20a")); + assertFalse(AddressIdentifier.isAnISATAPIPv6Address("1:2:3:0:5efe::")); } } diff --git a/test/freenet/io/Inet6AddressMatcherTest.java b/test/freenet/io/Inet6AddressMatcherTest.java index 34034b09748..4873cab0011 100644 --- a/test/freenet/io/Inet6AddressMatcherTest.java +++ b/test/freenet/io/Inet6AddressMatcherTest.java @@ -37,31 +37,59 @@ public class Inet6AddressMatcherTest { @Test public void test() throws Exception { Inet6AddressMatcher matcher = new Inet6AddressMatcher("0:0:0:0:0:0:0:0/0"); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); matcher = new Inet6AddressMatcher("fe80:0:0:0:203:dff:fe22:420f/64"); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:0203:0dff:fe22:420f"))); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:0204:0dff:fe22:420f"))); - assertEquals(false, matcher.matches(InetAddress.getByName("fe81:0:0:0:0203:0dff:fe22:420f"))); - assertEquals(false, matcher.matches(InetAddress.getByName("0:0:0:0:0:0:0:1"))); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:0:0:0:1"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:0203:0dff:fe22:420f"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:0204:0dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("fe81:0:0:0:0203:0dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("0:0:0:0:0:0:0:1"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:0:0:0:1"))); matcher = new Inet6AddressMatcher("fe80:0:0:0:203:dff:fe22:420f/ffff:ffff:ffff:ffff:0:0:0:0"); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:0203:0dff:fe22:420f"))); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:0204:0dff:fe22:420f"))); - assertEquals(false, matcher.matches(InetAddress.getByName("fe81:0:0:0:0203:0dff:fe22:420f"))); - assertEquals(false, matcher.matches(InetAddress.getByName("0:0:0:0:0:0:0:1"))); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:0:0:0:1"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:0203:0dff:fe22:420f"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:0204:0dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("fe81:0:0:0:0203:0dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("0:0:0:0:0:0:0:1"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:0:0:0:1"))); matcher = new Inet6AddressMatcher("fe80:0:0:0:203:dff:fe22:420f/128"); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); - assertEquals(true, matcher.matches(InetAddress.getByName("fe80:0:0:0:0203:0dff:fe22:420f"))); - assertEquals(false, matcher.matches(InetAddress.getByName("fe80:0:0:0:0204:0dff:fe22:420f"))); - assertEquals(false, matcher.matches(InetAddress.getByName("fe81:0:0:0:0203:0dff:fe22:420f"))); - assertEquals(false, matcher.matches(InetAddress.getByName("0:0:0:0:0:0:0:1"))); - assertEquals(false, matcher.matches(InetAddress.getByName("fe80:0:0:0:0:0:0:1"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:203:dff:fe22:420f"))); + assertTrue(matcher.matches(InetAddress.getByName("fe80:0:0:0:0203:0dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("fe80:0:0:0:0204:0dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("fe81:0:0:0:0203:0dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("0:0:0:0:0:0:0:1"))); + assertFalse(matcher.matches(InetAddress.getByName("fe80:0:0:0:0:0:0:1"))); + + matcher = new Inet6AddressMatcher("::/0"); + assertTrue(matcher.matches(InetAddress.getByName("fe80::203:dff:fe22:420f"))); + + matcher = new Inet6AddressMatcher("fe80::/64"); + assertTrue(matcher.matches(InetAddress.getByName("fe80::203:dff:fe22:420f"))); + assertFalse(matcher.matches(InetAddress.getByName("fe80:203::dff:fe22:420f"))); + + matcher = new Inet6AddressMatcher("1::fe80/64"); + assertFalse(matcher.matches(InetAddress.getByName("::"))); + assertFalse(matcher.matches(InetAddress.getByName("1::2:3:4:5:6:7"))); + assertFalse(matcher.matches(InetAddress.getByName("1::2:3:4:5:6"))); + assertTrue(matcher.matches(InetAddress.getByName("1::2:3:4:5"))); + assertTrue(matcher.matches(InetAddress.getByName("1::2:3:4"))); + assertTrue(matcher.matches(InetAddress.getByName("1::2:3"))); + assertTrue(matcher.matches(InetAddress.getByName("1::2"))); + assertTrue(matcher.matches(InetAddress.getByName("1::"))); + assertFalse(matcher.matches(InetAddress.getByName("1:2::3:4:5:6:7"))); + + assertThrows(IllegalArgumentException.class, () -> new Inet6AddressMatcher("192.168.1.1")); + assertThrows(IllegalArgumentException.class, () -> new Inet6AddressMatcher("1::2::3")); + assertThrows(IllegalArgumentException.class, () -> new Inet6AddressMatcher("::1::2")); + assertThrows(IllegalArgumentException.class, () -> new Inet6AddressMatcher("::1:2:3:4:5:6:7:8")); + assertThrows(IllegalArgumentException.class, () -> new Inet6AddressMatcher(":1:2:3:4:5:6:7")); + assertThrows(IllegalArgumentException.class, () -> new Inet6AddressMatcher("1:2:3:4:5:6:7:")); + assertThrows(IllegalArgumentException.class, () -> new Inet6AddressMatcher("123456::789abcde")); + assertTrue(Inet6AddressMatcher.matches("::1", InetAddress.getByName("::1"))); + assertTrue(Inet6AddressMatcher.matches("fe80::", InetAddress.getByName("fe80::"))); } } diff --git a/test/freenet/node/NewPacketFormatTest.java b/test/freenet/node/NewPacketFormatTest.java index 764ee5a4884..0190bfcf86d 100644 --- a/test/freenet/node/NewPacketFormatTest.java +++ b/test/freenet/node/NewPacketFormatTest.java @@ -246,7 +246,7 @@ public void processDecryptedMessage(byte[] data, int offset, int length, int ove Thread.sleep(PacketSender.MAX_COALESCING_DELAY*2); NPFPacket packet1 = sender.createPacket(512, senderQueue, senderKey, false); - assert(packet1.getLossyMessages().size() == 0); + assert(packet1.getLossyMessages().isEmpty()); assert(packet1.getFragments().size() == 2); synchronized(gotMessage) { assert(!gotMessage.value); diff --git a/test/freenet/node/PeerLocationTest.java b/test/freenet/node/PeerLocationTest.java index 678fdf35193..2b0be61493d 100644 --- a/test/freenet/node/PeerLocationTest.java +++ b/test/freenet/node/PeerLocationTest.java @@ -88,12 +88,12 @@ private Set[] omit(double[] locs) { // Trivial reference implementation that finds the distance to the closest location private double trivialFindClosestDistance(double[] locs, double l) { double minDist = Double.POSITIVE_INFINITY; - for (int i = 0; i < locs.length; i++) { - final double d = Location.distance(locs[i], l); - if (d < minDist) { - minDist = d; - } - } + for (double loc : locs) { + final double d = Location.distance(loc, l); + if (d < minDist) { + minDist = d; + } + } return minDist; } @@ -101,15 +101,15 @@ private double trivialFindClosestDistance(double[] locs, double l) { // locations excluded from consideration private double trivialFindClosestDistance(double[] locs, double l, Set exclude) { double minDist = Double.POSITIVE_INFINITY; - for (int i = 0; i < locs.length; i++) { - if (exclude.contains(locs[i])) { - continue; - } - final double d = Location.distance(locs[i], l); - if (d < minDist) { - minDist = d; - } - } + for (double loc : locs) { + if (exclude.contains(loc)) { + continue; + } + final double d = Location.distance(loc, l); + if (d < minDist) { + minDist = d; + } + } return minDist; } } diff --git a/test/freenet/store/RAMSaltMigrationTest.java b/test/freenet/store/RAMSaltMigrationTest.java index e463c0e31f2..4d94d1e70af 100644 --- a/test/freenet/store/RAMSaltMigrationTest.java +++ b/test/freenet/store/RAMSaltMigrationTest.java @@ -129,7 +129,7 @@ private void probeStoreBlocks(CHKStore store, List dummyValueInsertedLis blockActuallyStoredList.add(blockInsertedList.get(i)); } } - assertTrue("Inserts failed, not a single key stored", dummyValueActuallyStoredList.size() > 0); + assertTrue("Inserts failed, not a single key stored", !dummyValueActuallyStoredList.isEmpty()); } /** diff --git a/test/freenet/support/HTMLEncoderDecoderTest.java b/test/freenet/support/HTMLEncoderDecoderTest.java index 669a97d6070..10d5706a3f6 100644 --- a/test/freenet/support/HTMLEncoderDecoderTest.java +++ b/test/freenet/support/HTMLEncoderDecoderTest.java @@ -103,10 +103,10 @@ public void testCompactRepeated(){ strBuffer[3].append(MAC_NEWLINE); strBuffer[4].append(CONTROL); strBuffer[5].append(ZEROWIDTHSPACE); - - for (int j = 0; j < strBuffer.length; j++) + + for (StringBuilder stringBuilder : strBuffer) assertEquals(" ", - HTMLDecoder.compact(strBuffer[j].toString())); + HTMLDecoder.compact(stringBuilder.toString())); } } diff --git a/test/freenet/support/HTMLNodeTest.java b/test/freenet/support/HTMLNodeTest.java index 3dc095965cd..86f686b07ae 100644 --- a/test/freenet/support/HTMLNodeTest.java +++ b/test/freenet/support/HTMLNodeTest.java @@ -533,12 +533,12 @@ private String readFirstLine(String aString) { public void testGenerate_fromHTMLNode_textareaDivA() { HTMLNode methodHTMLNode; String[] nodeNamesArray = {"textarea","div","a"}; - for(int i=0;i\n" + - // FIXME why is this using 2 tabs? I don't understand ... - "\t\t"+SAMPLE_NODE_CONTENT + - - //child - generateFullNodeOutput(SAMPLE_OKAY_NODE_NAME_NON_EMPTY, - SAMPLE_OKAY_ATTRIBUTE_NAME, SAMPLE_ATTRIBUTE_VALUE, - SAMPLE_NODE_CONTENT) + - "\n\t"+ - ("\n").toLowerCase() - +"\t", - - methodHTMLNode.generate()); + + assertEquals(("<" + s + " ").toLowerCase() + + SAMPLE_OKAY_ATTRIBUTE_NAME + "=" + + "\"" + SAMPLE_ATTRIBUTE_VALUE + "\">\n" + + // FIXME why is this using 2 tabs? I don't understand ... + "\t\t" + SAMPLE_NODE_CONTENT + + + //child + generateFullNodeOutput(SAMPLE_OKAY_NODE_NAME_NON_EMPTY, + SAMPLE_OKAY_ATTRIBUTE_NAME, SAMPLE_ATTRIBUTE_VALUE, + SAMPLE_NODE_CONTENT) + + "\n\t" + + ("\n").toLowerCase() + + "\t", + + methodHTMLNode.generate()); } } diff --git a/test/freenet/support/LRUMapTest.java b/test/freenet/support/LRUMapTest.java index f63a4d62a74..c0fad10d6d4 100644 --- a/test/freenet/support/LRUMapTest.java +++ b/test/freenet/support/LRUMapTest.java @@ -55,8 +55,7 @@ private Object[][] createSampleKeyVal(int size) { private LRUMap createSampleHashTable(int size) { LRUMap methodLRUht = new LRUMap(); Object[][] sampleObjects = createSampleKeyVal(size); - for (int i=0;i methodLRUht = new LRUMap(); Object[][] sampleObjects = createSampleKeyVal(sampleElemsNumber); //pushing objects - for (int i=0; i methodLRUht = new LRUMap(); Object[][] sampleObjects = createSampleKeyVal(sampleElemsNumber); //pushing objects - for (int i=0; i methodLRUht = new LRUMap(); Object[][] sampleObjects = createSampleKeyVal(sampleElemsNumber); //pushing objects - for (int i=0; i methodLRUht = new LRUMap(); Object[][] sampleObjects = createSampleKeyVal(sampleElemsNumber); - assertTrue(methodLRUht.size()==0); + assertTrue(methodLRUht.isEmpty()); //pushing objects for (int i=0; i methodLRUht = new LRUMap(); Object[][] sampleObjects = createSampleKeyVal(sampleElemsNumber); //pushing objects - for (int i=0; i=0; i--) { assertTrue(methodLRUht.removeKey(sampleObjects[i][0])); @@ -357,8 +351,7 @@ public void testKeys() { LRUMap methodLRUht = new LRUMap(); Object[][] sampleObjects = createSampleKeyVal(sampleElemsNumber); //pushing objects - for (int i=0; i methodEnumeration = methodLRUht.keys(); int j=0; while(methodEnumeration.hasMoreElements()) { diff --git a/test/freenet/support/LRUQueueTest.java b/test/freenet/support/LRUQueueTest.java index 8705b45986d..e1a4347ceee 100644 --- a/test/freenet/support/LRUQueueTest.java +++ b/test/freenet/support/LRUQueueTest.java @@ -50,8 +50,7 @@ private Object[] createSampleObjects(int size) { private LRUQueue createSampleQueue(int size) { LRUQueue methodLRUQueue = new LRUQueue(); Object[] sampleObjects = createSampleObjects(size); - for (int i=0;i createSampleQueue(int size) { * @return true if there is at least one reference to the object */ private boolean isPresent(Object[] anArray, Object aElementToSearch) { - for(int i=0; i methodLRUQueue = new LRUQueue(); Object[] sampleObjects = createSampleObjects(sampleElemsNumber); //pushing objects - for (int i=0; i methodLRUQueue = new LRUQueue(); Object[] sampleObjects = createSampleObjects(sampleElemsNumber); - for (int i=0;i=0;i--) { assertTrue(methodLRUQueue.remove(sampleObjects[i])); @@ -268,8 +264,7 @@ public void testElements() { Object[] sampleObjects = createSampleObjects(sampleElemsNumber); LRUQueue methodLRUQueue = new LRUQueue(); //pushing objects - for (int i=0; i methodEnumeration = methodLRUQueue.elements(); int j=0; while(methodEnumeration.hasMoreElements()) { @@ -288,14 +283,12 @@ public void testToArray() { Object[] sampleObjects = createSampleObjects(sampleElemsNumber); //pushing objects - for (int i=0; i)sampleObjects[i][1]).get(0)); + for (Object[] sampleObject : sampleObjects) + assertEquals(methodMVTable.get(sampleObject[0]), ((List) sampleObject[1]).get(0)); } /** @@ -156,8 +156,7 @@ public void testContainsKey() { Object[][] sampleObjects = createSampleKeyMultiVal(sampleKeyNumber,sampleMaxValueNumber,sampleIsRandom); methodMVTable = fillMultiValueTable(sampleObjects); - for(int i=0;i iter; - for(int i=0;i)(sampleObjects[i][1])).iterator(); - assertFalse(methodMVTable.containsElement(sampleObjects[i][0],new Object())); - while(iter.hasNext()) - assertTrue(methodMVTable.containsElement(sampleObjects[i][0],iter.next())); + for (Object[] sampleObject : sampleObjects) { + iter = ((List) (sampleObject[1])).iterator(); + assertFalse(methodMVTable.containsElement(sampleObject[0], new Object())); + while (iter.hasNext()) + assertTrue(methodMVTable.containsElement(sampleObject[0], iter.next())); } } @@ -199,11 +198,11 @@ public void testGetAll() { methodMVTable = fillMultiValueTable(sampleObjects); Iterator iter; Enumeration methodEnumeration; - for(int i=0;i)(sampleObjects[i][1])).iterator(); - methodEnumeration = methodMVTable.getAll(sampleObjects[i][0]); - while(iter.hasNext()) - assertEquals(methodEnumeration.nextElement(),iter.next()); + for (Object[] sampleObject : sampleObjects) { + iter = ((List) (sampleObject[1])).iterator(); + methodEnumeration = methodMVTable.getAll(sampleObject[0]); + while (iter.hasNext()) + assertEquals(methodEnumeration.nextElement(), iter.next()); } } @@ -218,8 +217,8 @@ public void testCountAll() { Object[][] sampleObjects = createSampleKeyMultiVal(sampleKeyNumber,sampleMaxValueNumber,sampleIsRandom); methodMVTable = fillMultiValueTable(sampleObjects); - for(int i=0;i)(sampleObjects[i][1])).size(),methodMVTable.countAll(sampleObjects[i][0])); + for (Object[] sampleObject : sampleObjects) + assertEquals(((List) (sampleObject[1])).size(), methodMVTable.countAll(sampleObject[0])); } /** @@ -234,8 +233,8 @@ public void testGetSync() { Object[][] sampleObjects = createSampleKeyMultiVal(sampleKeyNumber,sampleMaxValueNumber,sampleIsRandom); methodMVTable = fillMultiValueTable(sampleObjects); - for(int i=0;i)sampleObjects[i][1])); + for (Object[] sampleObject : sampleObjects) + assertEquals(methodMVTable.getSync(sampleObject[0]), ((List) sampleObject[1])); } /** @@ -250,8 +249,8 @@ public void testGetArray() { Object[][] sampleObjects = createSampleKeyMultiVal(sampleKeyNumber,sampleMaxValueNumber,sampleIsRandom); methodMVTable = fillMultiValueTable(sampleObjects); - for(int i=0;i)(sampleObjects[i][1])).toArray(),methodMVTable.getArray(sampleObjects[i][0]))); + for (Object[] sampleObject : sampleObjects) + assertTrue(Arrays.equals(((List) (sampleObject[1])).toArray(), methodMVTable.getArray(sampleObject[0]))); } /** @@ -268,8 +267,7 @@ public void testRemove() { Object[][] sampleObjects = createSampleKeyMultiVal(sampleKeyNumber,sampleMaxValueNumber,sampleIsRandom); methodMVTable = fillMultiValueTable(sampleObjects); - for(int i=0;i methodMVTable = fillMultiValueTable(sampleObjects); methodMVTable.clear(); - for(int i=0;i methodMVTable = fillMultiValueTable(sampleObjects); Object methodValue; Iterator iter; - for(int i=0;i)(sampleObjects[i][1])).iterator(); - assertFalse(methodMVTable.removeElement(sampleObjects[i][0],new Object())); - while(iter.hasNext()) { + for (Object[] sampleObject : sampleObjects) { + iter = ((List) (sampleObject[1])).iterator(); + assertFalse(methodMVTable.removeElement(sampleObject[0], new Object())); + while (iter.hasNext()) { methodValue = iter.next(); - assertTrue(methodMVTable.removeElement(sampleObjects[i][0],methodValue)); - assertFalse(methodMVTable.containsElement(sampleObjects[i][0],methodValue)); + assertTrue(methodMVTable.removeElement(sampleObject[0], methodValue)); + assertFalse(methodMVTable.containsElement(sampleObject[0], methodValue)); } } assertTrue(methodMVTable.isEmpty()); diff --git a/test/freenet/support/SimpleFieldSetTest.java b/test/freenet/support/SimpleFieldSetTest.java index b6200a9c699..d0c2ff88ceb 100644 --- a/test/freenet/support/SimpleFieldSetTest.java +++ b/test/freenet/support/SimpleFieldSetTest.java @@ -135,10 +135,9 @@ private boolean checkPutAndGetPairs(String[][] aPairsArray) { boolean retValue = true; SimpleFieldSet methodSFS = new SimpleFieldSet(true); //putting values - for (int i = 0; i < aPairsArray.length; i++) - methodSFS.putSingle(aPairsArray[i][0], aPairsArray[i][1]); - for (int i = 0; i < aPairsArray.length; i++) //getting values - retValue &= methodSFS.get(aPairsArray[i][0]).equals(aPairsArray[i][1]); + for (String[] value : aPairsArray) methodSFS.putSingle(value[0], value[1]); + //getting values + for (String[] strings : aPairsArray) retValue &= methodSFS.get(strings[0]).equals(strings[1]); retValue &= checkSimpleFieldSetSize(methodSFS, aPairsArray.length); return retValue; } @@ -161,17 +160,17 @@ public void testSimpleFieldSetSubset_String() { {"A","E","ae"}, {"A","F","af"} }; //putting values - for (int i = 0; i < methodPairsArray_MultiLevel.length; i++) - methodSFS.putSingle(methodPairsArray_MultiLevel[i][0] - + SimpleFieldSet.MULTI_LEVEL_CHAR - + methodPairsArray_MultiLevel[i][1], - methodPairsArray_MultiLevel[i][2]); + for (String[] value : methodPairsArray_MultiLevel) + methodSFS.putSingle(value[0] + + SimpleFieldSet.MULTI_LEVEL_CHAR + + value[1], + value[2]); //getting subsets and then values - for (int i = 0; i < methodPairsArray_MultiLevel.length; i++) + for (String[] strings : methodPairsArray_MultiLevel) assertEquals( methodSFS.subset( - methodPairsArray_MultiLevel[i][0]).get(methodPairsArray_MultiLevel[i][1]), - methodPairsArray_MultiLevel[i][2]); + strings[0]).get(strings[1]), + strings[2]); assertTrue(checkSimpleFieldSetSize(methodSFS,methodPairsArray_MultiLevel.length)); } @@ -187,14 +186,14 @@ public void testPutAllOverwrite() { SimpleFieldSet methodSFS = sfsFromSampleStringPairs(); SimpleFieldSet methodNewSFS = this.sfsFromStringPairs(methodAppendedString); methodSFS.putAllOverwrite(methodNewSFS); - for (int i=0; i < SAMPLE_STRING_PAIRS.length; i++) - assertEquals(methodSFS.get(SAMPLE_STRING_PAIRS[i][0]), - SAMPLE_STRING_PAIRS[i][1]+methodAppendedString); + for (String[] stringPair : SAMPLE_STRING_PAIRS) + assertEquals(methodSFS.get(stringPair[0]), + stringPair[1] + methodAppendedString); SimpleFieldSet nullSFS = new SimpleFieldSet(false); nullSFS.putAllOverwrite(methodNewSFS); - for (int i=0; i < SAMPLE_STRING_PAIRS.length; i++) - assertEquals(nullSFS.get(SAMPLE_STRING_PAIRS[i][0]), - SAMPLE_STRING_PAIRS[i][1]+methodAppendedString); + for (String[] sampleStringPair : SAMPLE_STRING_PAIRS) + assertEquals(nullSFS.get(sampleStringPair[0]), + sampleStringPair[1] + methodAppendedString); } /** @@ -205,10 +204,10 @@ public void testPut_StringSimpleFieldSet() { String methodKey = "prefix"; SimpleFieldSet methodSFS = new SimpleFieldSet(true); methodSFS.put(methodKey,sfsFromSampleStringPairs()); - for (int i=0; i < SAMPLE_STRING_PAIRS.length; i++) + for (String[] sampleStringPair : SAMPLE_STRING_PAIRS) assertEquals( - methodSFS.get(methodKey+SimpleFieldSet.MULTI_LEVEL_CHAR+SAMPLE_STRING_PAIRS[i][0]), - SAMPLE_STRING_PAIRS[i][1]); + methodSFS.get(methodKey + SimpleFieldSet.MULTI_LEVEL_CHAR + sampleStringPair[0]), + sampleStringPair[1]); } /** @@ -219,9 +218,9 @@ public void testTPut_StringSimpleFieldSet() { String methodKey = "prefix"; SimpleFieldSet methodSFS = new SimpleFieldSet(true); methodSFS.tput(methodKey,sfsFromSampleStringPairs()); - for (int i=0; i < SAMPLE_STRING_PAIRS.length; i++) - assertEquals(methodSFS.get(methodKey+SimpleFieldSet.MULTI_LEVEL_CHAR+SAMPLE_STRING_PAIRS[i][0]), - SAMPLE_STRING_PAIRS[i][1]); + for (String[] sampleStringPair : SAMPLE_STRING_PAIRS) + assertEquals(methodSFS.get(methodKey + SimpleFieldSet.MULTI_LEVEL_CHAR + sampleStringPair[0]), + sampleStringPair[1]); } /** @@ -253,9 +252,9 @@ public void testPutAndTPut_WithEmpty() { private SimpleFieldSet sfsFromStringPairs(String aSuffix) { SimpleFieldSet methodSFS = new SimpleFieldSet(true); //creating new - for (int i = 0; i < SAMPLE_STRING_PAIRS.length; i++) - methodSFS.putSingle(SAMPLE_STRING_PAIRS[i][0], - SAMPLE_STRING_PAIRS[i][1]+aSuffix); + for (String[] sampleStringPair : SAMPLE_STRING_PAIRS) + methodSFS.putSingle(sampleStringPair[0], + sampleStringPair[1] + aSuffix); return methodSFS; } @@ -309,19 +308,19 @@ public void testPut_StringInt() { SimpleFieldSet methodSFS = new SimpleFieldSet(true); int[][] methodPairsArray = { {1,1},{2,2},{3,3},{4,4} }; - for (int i = 0; i < methodPairsArray.length; i++) - methodSFS.put(Integer.toString(methodPairsArray[i][0]), methodPairsArray[i][1]); + for (int[] value : methodPairsArray) methodSFS.put(Integer.toString(value[0]), value[1]); assertTrue(checkSimpleFieldSetSize(methodSFS,methodPairsArray.length)); - - for (int i = 0; i < methodPairsArray.length; i++) { + + for (int[] ints : methodPairsArray) { try { - assertEquals(methodSFS.getInt(Integer.toString(methodPairsArray[i][0])), - methodPairsArray[i][1]); - assertEquals(methodSFS.getInt(Integer.toString(methodPairsArray[i][0]),5), - methodPairsArray[i][1]); + assertEquals(methodSFS.getInt(Integer.toString(ints[0])), + ints[1]); + assertEquals(methodSFS.getInt(Integer.toString(ints[0]), 5), + ints[1]); } catch (FSParseException aException) { - fail("Not expected exception thrown : " + aException.getMessage()); } + fail("Not expected exception thrown : " + aException.getMessage()); + } } } @@ -339,19 +338,19 @@ public void testPut_StringLong() { SimpleFieldSet methodSFS = new SimpleFieldSet(true); long[][] methodPairsArray = { {1,1},{2,2},{3,3},{4,4} }; - for (int i = 0; i < methodPairsArray.length; i++) - methodSFS.put(Long.toString(methodPairsArray[i][0]), methodPairsArray[i][1]); + for (long[] value : methodPairsArray) methodSFS.put(Long.toString(value[0]), value[1]); assertTrue(checkSimpleFieldSetSize(methodSFS,methodPairsArray.length)); - - for (int i = 0; i < methodPairsArray.length; i++) { + + for (long[] longs : methodPairsArray) { try { - assertEquals(methodSFS.getLong(Long.toString(methodPairsArray[i][0])), - methodPairsArray[i][1]); - assertEquals(methodSFS.getLong(Long.toString(methodPairsArray[i][0]),5), - methodPairsArray[i][1]); + assertEquals(methodSFS.getLong(Long.toString(longs[0])), + longs[1]); + assertEquals(methodSFS.getLong(Long.toString(longs[0]), 5), + longs[1]); } catch (FSParseException aException) { - fail("Not expected exception thrown : " + aException.getMessage()); } + fail("Not expected exception thrown : " + aException.getMessage()); + } } } @@ -369,19 +368,19 @@ public void testPut_StringChar() { SimpleFieldSet methodSFS = new SimpleFieldSet(true); char[][] methodPairsArray = { {'1','1'},{'2','2'},{'3','3'},{'4','4'} }; - for (int i = 0; i < methodPairsArray.length; i++) - methodSFS.put(String.valueOf(methodPairsArray[i][0]), methodPairsArray[i][1]); + for (char[] value : methodPairsArray) methodSFS.put(String.valueOf(value[0]), value[1]); assertTrue(checkSimpleFieldSetSize(methodSFS,methodPairsArray.length)); - - for (int i = 0; i < methodPairsArray.length; i++) { + + for (char[] chars : methodPairsArray) { try { - assertEquals(methodSFS.getChar(String.valueOf(methodPairsArray[i][0])), - methodPairsArray[i][1]); - assertEquals(methodSFS.getChar(String.valueOf(methodPairsArray[i][0]),'5'), - methodPairsArray[i][1]); + assertEquals(methodSFS.getChar(String.valueOf(chars[0])), + chars[1]); + assertEquals(methodSFS.getChar(String.valueOf(chars[0]), '5'), + chars[1]); } catch (FSParseException aException) { - fail("Not expected exception thrown : " + aException.getMessage()); } + fail("Not expected exception thrown : " + aException.getMessage()); + } } } @@ -399,19 +398,19 @@ public void testPut_StringShort() { SimpleFieldSet methodSFS = new SimpleFieldSet(true); short[][] methodPairsArray = { {1,1},{2,2},{3,3},{4,4} }; - for (int i = 0; i < methodPairsArray.length; i++) - methodSFS.put(Short.toString(methodPairsArray[i][0]), methodPairsArray[i][1]); + for (short[] value : methodPairsArray) methodSFS.put(Short.toString(value[0]), value[1]); assertTrue(checkSimpleFieldSetSize(methodSFS,methodPairsArray.length)); - - for (int i = 0; i < methodPairsArray.length; i++) { + + for (short[] shorts : methodPairsArray) { try { - assertEquals(methodSFS.getShort(Short.toString(methodPairsArray[i][0])), - methodPairsArray[i][1]); - assertEquals(methodSFS.getShort(Short.toString(methodPairsArray[i][0]),(short)5), - methodPairsArray[i][1]); + assertEquals(methodSFS.getShort(Short.toString(shorts[0])), + shorts[1]); + assertEquals(methodSFS.getShort(Short.toString(shorts[0]), (short) 5), + shorts[1]); } catch (FSParseException aException) { - fail("Not expected exception thrown : " + aException.getMessage()); } + fail("Not expected exception thrown : " + aException.getMessage()); + } } } @@ -429,22 +428,22 @@ public void testPut_StringDouble() { SimpleFieldSet methodSFS = new SimpleFieldSet(true); double[][] methodPairsArray = { {1,1},{2,2},{3,3},{4,4} }; - for (int i = 0; i < methodPairsArray.length; i++) - methodSFS.put(Double.toString(methodPairsArray[i][0]), methodPairsArray[i][1]); + for (double[] value : methodPairsArray) methodSFS.put(Double.toString(value[0]), value[1]); assertTrue(checkSimpleFieldSetSize(methodSFS,methodPairsArray.length)); - - for (int i = 0; i < methodPairsArray.length; i++) { + + for (double[] doubles : methodPairsArray) { try { //there is no assertEquals(Double,Double) so we are obliged to do this way -_- assertEquals( - Double.compare((methodSFS.getDouble(Double.toString(methodPairsArray[i][0]))), - methodPairsArray[i][1]),0); + Double.compare((methodSFS.getDouble(Double.toString(doubles[0]))), + doubles[1]), 0); assertEquals( - Double.compare(methodSFS.getDouble(Double.toString(methodPairsArray[i][0]),5), - methodPairsArray[i][1]),0); + Double.compare(methodSFS.getDouble(Double.toString(doubles[0]), 5), + doubles[1]), 0); } catch (FSParseException aException) { - fail("Not expected exception thrown : " + aException.getMessage()); } + fail("Not expected exception thrown : " + aException.getMessage()); + } } } @@ -458,8 +457,8 @@ public void testPut_StringDouble() { private String sfsReadyString(String[][] aStringPairsArray) { StringBuilder methodStringToReturn = new StringBuilder(); - for(int i = 0; i < aStringPairsArray.length; i++) - methodStringToReturn.append(aStringPairsArray[i][0]).append(KEY_VALUE_SEPARATOR).append(aStringPairsArray[i][1]).append('\n'); + for (String[] strings : aStringPairsArray) + methodStringToReturn.append(strings[0]).append(KEY_VALUE_SEPARATOR).append(strings[1]).append('\n'); methodStringToReturn.append(SAMPLE_END_MARKER); return methodStringToReturn.toString(); } @@ -474,9 +473,9 @@ public void testSimpleFieldSet_StringBooleanBoolean() { String methodStringToParse = sfsReadyString(methodStringPairs); try { SimpleFieldSet methodSFS = new SimpleFieldSet(methodStringToParse,false,false,false); - for (int i=0; i < methodStringPairs.length; i++) - assertEquals(methodSFS.get(methodStringPairs[i][0]), - methodStringPairs[i][1]); + for (String[] methodStringPair : methodStringPairs) + assertEquals(methodSFS.get(methodStringPair[0]), + methodStringPair[1]); } catch (IOException aException) { fail("Not expected exception thrown : " + aException.getMessage()); } } @@ -492,9 +491,9 @@ public void testSimpleFieldSet_BufferedReaderBooleanBoolean() { new BufferedReader(new StringReader(sfsReadyString(methodStringPairs))); try { SimpleFieldSet methodSFS = new SimpleFieldSet(methodBufferedReader,false,false); - for (int i=0; i < methodStringPairs.length; i++) - assertEquals(methodSFS.get(methodStringPairs[i][0]), - methodStringPairs[i][1]); + for (String[] methodStringPair : methodStringPairs) + assertEquals(methodSFS.get(methodStringPair[0]), + methodStringPair[1]); } catch (IOException aException) { fail("Not expected exception thrown : " + aException.getMessage()); } } @@ -506,9 +505,9 @@ public void testSimpleFieldSet_BufferedReaderBooleanBoolean() { */ private SimpleFieldSet sfsFromSampleStringPairs() { SimpleFieldSet methodSFS = new SimpleFieldSet(true); - for (int i = 0; i < SAMPLE_STRING_PAIRS.length; i++) - methodSFS.putSingle(SAMPLE_STRING_PAIRS[i][0], - SAMPLE_STRING_PAIRS[i][1]); + for (String[] sampleStringPair : SAMPLE_STRING_PAIRS) + methodSFS.putSingle(sampleStringPair[0], + sampleStringPair[1]); assertTrue(checkSimpleFieldSetSize(methodSFS, SAMPLE_STRING_PAIRS.length)); return methodSFS; @@ -522,9 +521,9 @@ private SimpleFieldSet sfsFromSampleStringPairs() { public void testSimpleFieldSet_SimpleFieldSet() { SimpleFieldSet methodSFS = new SimpleFieldSet(sfsFromSampleStringPairs()); String[][] methodStringPairs = SAMPLE_STRING_PAIRS; - for (int i=0; i < methodStringPairs.length; i++) - assertEquals(methodSFS.get(methodStringPairs[i][0]), - methodStringPairs[i][1]); + for (String[] methodStringPair : methodStringPairs) + assertEquals(methodSFS.get(methodStringPair[0]), + methodStringPair[1]); } /** @@ -594,8 +593,7 @@ public void testPutOverwrite_String() { String[] methodValues = {"boo","bar","zoo"}; String expectedResult = "zoo"; SimpleFieldSet methodSFS = new SimpleFieldSet(true); - for (int i = 0 ; i < methodValues.length; i++) - methodSFS.putOverwrite(methodKey,methodValues[i]); + for (String methodValue : methodValues) methodSFS.putOverwrite(methodKey, methodValue); assertEquals(methodSFS.get(methodKey),expectedResult); } @@ -622,8 +620,7 @@ public void testPutAppend() { +"bar"+SimpleFieldSet.MULTI_VALUE_CHAR +"zoo"; SimpleFieldSet methodSFS = new SimpleFieldSet(true); - for (int i = 0 ; i < methodValues.length; i++) - methodSFS.putAppend(methodKey,methodValues[i]); + for (String methodValue : methodValues) methodSFS.putAppend(methodKey, methodValue); assertEquals(methodSFS.get(methodKey),expectedResult); } @@ -635,8 +632,7 @@ public void testGetAll() { String methodKey = "foo.bar"; String[] methodValues = {"boo","bar","zoo"}; SimpleFieldSet methodSFS = new SimpleFieldSet(true); - for (int i = 0 ; i < methodValues.length; i++) - methodSFS.putAppend(methodKey,methodValues[i]); + for (String methodValue : methodValues) methodSFS.putAppend(methodKey, methodValue); assertTrue(Arrays.equals(methodSFS.getAll(methodKey),methodValues)); } @@ -708,8 +704,8 @@ public void testRemoveSubset() { * @return true if there is the key */ private boolean isAKey(String[][] aStringPairsArray, String aPrefix, String aKey) { - for (int i=0; i