)]}'
{
  "log": [
    {
      "commit": "ccad1bbc74111f08a74a81c182e4c6e6d5f0aec5",
      "tree": "7ca54e715944a458e0300e08e904a703a72d7290",
      "parents": [
        "a13f07850fccfb67c14737f1e09942e31023da66"
      ],
      "author": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Jul 11 15:41:09 2018 +0900"
      },
      "committer": {
        "name": "David Pursehouse",
        "email": "dpursehouse@collab.net",
        "time": "Wed Jul 11 15:41:09 2018 +0900"
      },
      "message": "FilestoreManager: Fix typo in log message\n\nChange-Id: I9a7f5d865ba21f0371d8800c7fef7a09cbb48640\n"
    },
    {
      "commit": "a13f07850fccfb67c14737f1e09942e31023da66",
      "tree": "7e12422b706a2c9f487fd89461e7cd56b057014f",
      "parents": [
        "c1d816da6e91037741a47fcd79458fe658a45b1d",
        "203748f479d06b284518b160e8196df61666235a"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Mon Jun 05 04:30:35 2017 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 05 04:30:35 2017 -0700"
      },
      "message": "Merge pull request #1243 from sebastianopilla/master\n\nFixes the 30 seconds timeout when cloning over HTTP"
    },
    {
      "commit": "203748f479d06b284518b160e8196df61666235a",
      "tree": "7e12422b706a2c9f487fd89461e7cd56b057014f",
      "parents": [
        "ac94c2c0c4dbcda4a6641ad16d9ece20258a10f4"
      ],
      "author": {
        "name": "Sebastiano Pilla",
        "email": "sebastiano@sebastianopilla.com",
        "time": "Sat Jun 03 14:25:01 2017 +0200"
      },
      "committer": {
        "name": "Sebastiano Pilla",
        "email": "sebastiano@sebastianopilla.com",
        "time": "Sat Jun 03 14:25:01 2017 +0200"
      },
      "message": "Rename the setting to httpIdleTimeout\n"
    },
    {
      "commit": "ac94c2c0c4dbcda4a6641ad16d9ece20258a10f4",
      "tree": "db5a04ae42e517c713a27122afe99da772a53b52",
      "parents": [
        "c1d816da6e91037741a47fcd79458fe658a45b1d"
      ],
      "author": {
        "name": "Sebastiano Pilla",
        "email": "sebastiano@sebastianopilla.com",
        "time": "Thu Jun 01 00:07:45 2017 +0200"
      },
      "committer": {
        "name": "Sebastiano Pilla",
        "email": "sebastiano@sebastianopilla.com",
        "time": "Thu Jun 01 00:07:45 2017 +0200"
      },
      "message": "Adds the\n\nserver.httpTimeout\n\nsetting to allow cloning big repositories over HTTP. This change fixes the java.util.concurrent.TimeoutException issue described in https://groups.google.com/d/topic/gitblit/UvDC48NpmF4/discussion .\n"
    },
    {
      "commit": "c1d816da6e91037741a47fcd79458fe658a45b1d",
      "tree": "683607a1e3dab5d29e18b77d0c4705632b74e117",
      "parents": [
        "e706776879285dd81ace1fe1472593a7cdb45b9c",
        "31a4c54b86db8e2ac0a5694a8e7afc9af3108ec9"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Mon May 22 07:47:54 2017 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 22 07:47:54 2017 -0400"
      },
      "message": "Merge pull request #1239 from pingunaut/1226_sshkey_form_feedback\n\n1226 sshkey form feedback"
    },
    {
      "commit": "e706776879285dd81ace1fe1472593a7cdb45b9c",
      "tree": "1c4d4a2e8183a9337569b3c2d789076c7f094d0c",
      "parents": [
        "2f74123ca0deaa138609a2126e0fc897167dac48",
        "279a5b606dc18ce9bb21a93e2e108090028369ca"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Mon May 22 07:46:30 2017 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 22 07:46:30 2017 -0400"
      },
      "message": "Merge pull request #1238 from pingunaut/master\n\nAdd nullcheck  during favorite protocol determination"
    },
    {
      "commit": "31a4c54b86db8e2ac0a5694a8e7afc9af3108ec9",
      "tree": "f0449c64710f1c31dc90d67624678aa5c5d89397",
      "parents": [
        "fc854d6819c9d28fae94435aa3d46cea4e169af0"
      ],
      "author": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:42:47 2017 +0200"
      },
      "committer": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:42:47 2017 +0200"
      },
      "message": "Remove unused code"
    },
    {
      "commit": "fc854d6819c9d28fae94435aa3d46cea4e169af0",
      "tree": "47a55542d089101e5f9b895517b81bd7d5e4120c",
      "parents": [
        "c3e317a28899915036517c3a05a2b883796f633d"
      ],
      "author": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:39:49 2017 +0200"
      },
      "committer": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:39:49 2017 +0200"
      },
      "message": "Revert \"Fix nullpointer exception with unsupported URL protocol #1237\"\n\nThis reverts commit 51b9b7f9016899bbf8a39f6bc33a916a3d2b3838.\n"
    },
    {
      "commit": "279a5b606dc18ce9bb21a93e2e108090028369ca",
      "tree": "1c4d4a2e8183a9337569b3c2d789076c7f094d0c",
      "parents": [
        "c3e317a28899915036517c3a05a2b883796f633d"
      ],
      "author": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:32:23 2017 +0200"
      },
      "committer": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:32:23 2017 +0200"
      },
      "message": "Revert \"Add feedback to SSH Key Form. #1226\"\n\nThis reverts commit c3e317a28899915036517c3a05a2b883796f633d.\nWas added by mistake here. Should go into own branch to be able to merge with upstream using separate PR\n"
    },
    {
      "commit": "c3e317a28899915036517c3a05a2b883796f633d",
      "tree": "71e1dd02009387318804a3b50f8d0460e1fd0b1d",
      "parents": [
        "51b9b7f9016899bbf8a39f6bc33a916a3d2b3838"
      ],
      "author": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:29:08 2017 +0200"
      },
      "committer": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon May 22 00:29:08 2017 +0200"
      },
      "message": "Add feedback to SSH Key Form. #1226\n\nif key is empty of can not be parsed, form did provide any feedback to\nuser before"
    },
    {
      "commit": "51b9b7f9016899bbf8a39f6bc33a916a3d2b3838",
      "tree": "1c4d4a2e8183a9337569b3c2d789076c7f094d0c",
      "parents": [
        "337443cc11d09b54de167a5e677816152d6969fb"
      ],
      "author": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Sun May 21 22:50:48 2017 +0200"
      },
      "committer": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Sun May 21 22:50:48 2017 +0200"
      },
      "message": "Fix nullpointer exception with unsupported URL protocol #1237"
    },
    {
      "commit": "337443cc11d09b54de167a5e677816152d6969fb",
      "tree": "683607a1e3dab5d29e18b77d0c4705632b74e117",
      "parents": [
        "2df318b0b06e8e1fbeb9c23965e12dd4bc2d06f3",
        "2f74123ca0deaa138609a2126e0fc897167dac48"
      ],
      "author": {
        "name": "Martin",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Mon Apr 24 21:30:06 2017 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 24 21:30:06 2017 +0200"
      },
      "message": "Merge pull request #4 from gitblit/master\n\nmerge upstream master"
    },
    {
      "commit": "2f74123ca0deaa138609a2126e0fc897167dac48",
      "tree": "683607a1e3dab5d29e18b77d0c4705632b74e117",
      "parents": [
        "71211a8cdfae8d528130cedf3e67d21e130ee8a0",
        "63dbdfda13daa78a26f1c2e77b0a4bfd5a35df8d"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "fzs@users.noreply.github.com",
        "time": "Sat Mar 18 13:37:25 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 18 13:37:25 2017 +0100"
      },
      "message": "Merge pull request #1168 from lucamilanesio/bump-to-lucene-5.5.2\n\nBump to Lucene 5.5.2\r\n\r\nThe new code will create Lucene indices in a new directory named after codec and index version.\r\nThis provides for easy and safe up- and downgrades. But it also means that the old indices will\r\nstick around on disk. What this version is missing is a kind of \"garbage collection\" deleting old, unused\r\nindices when they are no longer needed. That task needs to be done manually currently. We should\r\nat leas at some point provide a script for it."
    },
    {
      "commit": "63dbdfda13daa78a26f1c2e77b0a4bfd5a35df8d",
      "tree": "683607a1e3dab5d29e18b77d0c4705632b74e117",
      "parents": [
        "197ddd27c8a6d304c9ba20e8ef9af9daef5f3083"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:12:48 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:27:40 2017 +0100"
      },
      "message": "Reindex tickets on server start if no index exists\n\nCheck if tickets need to be reindexed when the server starts. This is the\ncase if no ticket index exists. In that case the ticket index is built.\n\nThis is done during the start of the `ITicketService`.\n\nFor this the interface of `ITicketService` needed to change. The `start`\nmethod was defined abstract and the specific ticket services had to\nimplement it. None does any real starting stuff in it.\nThe `start` method is now final. It calls a new abstract method `onStart`\nwhich the specific ticket services need to implement. In the existing\nimplementations I just changed `start` to `onStart`.\n"
    },
    {
      "commit": "197ddd27c8a6d304c9ba20e8ef9af9daef5f3083",
      "tree": "b14016cd71cea1687b8e582aec86c978e7b69d2c",
      "parents": [
        "f44f45a15e10a87bcb62a6a3a1bb0f7cbc282478"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 09 14:43:46 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:27:39 2017 +0100"
      },
      "message": "Revert \"Add library `lucene-backward-codecs` to migrate indices.\"\n\nThis reverts commit 662fb9012fb6897c9b05c939232919797e665f38.\n"
    },
    {
      "commit": "f44f45a15e10a87bcb62a6a3a1bb0f7cbc282478",
      "tree": "9ce74c96ef2985a6f2d7d4e1472c2466e26e2f72",
      "parents": [
        "71a27ddc781e0c2a684f747c794f8948c65cbf5c"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 17:11:50 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:27:37 2017 +0100"
      },
      "message": "Use versioned index directories for repository indices.\n\nChange from the index version of a repository index being stored in a config\nfile to also using index directories with the version in the name. For that,\n`LuceneRepoIndexStore` is added, which adds the fixed `lucene` part to the path.\nIt also gives out the location of the `lucene.conf` file, which is now stored in\nthe index directory. This way it is automatically deleted when the directory is\ndeleted.\n\nI believe that it should also provide means to store branch aliases and tips,\ni.e. hide the config file completely. But this isn\u0027t implemented with this\ncommit, the `LuceneService` is still aware that a config file is used.\n"
    },
    {
      "commit": "71a27ddc781e0c2a684f747c794f8948c65cbf5c",
      "tree": "e5f45ec86b5256708a3ce459cf93856a3e246a22",
      "parents": [
        "bf1b35aac29b6c0d5e918f00d99a0632e4925b51"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 16:45:44 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:27:31 2017 +0100"
      },
      "message": "Introduce an index version for the ticket index\n\nIn order to be able to update the index definition, the ticket index\nis assigned a version number, 2. This way the definiton can be updated\nand compatability with existing index files can be checked.\nThe actual index is stored in a directory of name `indexVersion_codecVersion`.\nThis wayit is veriy easy to check if an index of a certain version exists on the\nfilesystem. It allows to have multiple indexes of different versions present,\nso that a downgrade of the software is possible without having to reindex\nagain. Of coure, this is only possible if no new tickets were created since these\nwould be missing in the old index.\n\nA new class `LuceneIndexStore` is introduced, which abstracts away the versioned\nindex directory. The idea is, that this provides one place to keep the Lucene\ncodec version and to allow to code compatibility rules into this class, so that\nolder indices can still be used if they are compatible.\n"
    },
    {
      "commit": "bf1b35aac29b6c0d5e918f00d99a0632e4925b51",
      "tree": "09815483391193f44dec0f9d53e87217c8ee0e21",
      "parents": [
        "71e24e22cca3f85996b8a0d1951311b4592f2213"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Feb 26 18:44:02 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:27:22 2017 +0100"
      },
      "message": "Add DocValues to support sorting of ticket index fields.\n\nIn order to support sorting, Lucene 5 needs DocValue fields in an index.\nSo in order to make the ticket index work, i.e. show any tickets on the\ntickets page, the ticket index needs to be changed, adding a DocValues\nfield.\n\nThe DocValuesFields are implemented for the current index, which does not\nuse multiple values for a field. Should at any time in the future an\nexisting numeric field get multiple values stored in a document, then\nthe index needs to know that and use SortedNumeric DocValues and SortFields\ninstead.\n"
    },
    {
      "commit": "71e24e22cca3f85996b8a0d1951311b4592f2213",
      "tree": "8ff10cd33eb7454bbed37419a6457e467519a7ca",
      "parents": [
        "8130906c48dcd4886bb8b28a6c1055489b499140"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Jan 21 19:09:18 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:27:21 2017 +0100"
      },
      "message": "Replace deprecated BooleanQuery constructor with builder.\n\nAlso replace deprecated `search` method with the one without a filter\nargument, since the filter isn\u0027t used anyhow.\n"
    },
    {
      "commit": "8130906c48dcd4886bb8b28a6c1055489b499140",
      "tree": "68c7e6a18da3b8f7a712cf7687874b750051a833",
      "parents": [
        "9c2ddffa83353d608a24b5fdd0164a4a18d75916"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Jan 21 18:05:53 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:26:15 2017 +0100"
      },
      "message": "Update link target to Lucene 5.5 query syntax, moving the link to the page.\n\nUpdate the link target to the query parser syntax page of the 5.5 version.\n\nRefactor the `LuceneSearchPage` to use an `ExternalLink` for the link\nto the lucene page, so that the link target is kept and updated in the\nJava code. Move the link out of the language files. This was way too\ncumbersome to update the link target (which is probably why no one ever\ndid).\n\nThe query help text is changed to contain a variable:\n`gb.queryHelp \u003d here be some ${querySyntax} help`, which is replaced by\nWicket with a link.\nThe link text is a new lange file property: `gb.querySyntax`.\n"
    },
    {
      "commit": "9c2ddffa83353d608a24b5fdd0164a4a18d75916",
      "tree": "83d83e8f270a64557d883a7ad9c3eaef70566321",
      "parents": [
        "065583353751a976d578d08e2d4525fdc1ee042a"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Jan 15 00:11:16 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:21:00 2017 +0100"
      },
      "message": "Remove obsolete Lucene version constants.\n"
    },
    {
      "commit": "065583353751a976d578d08e2d4525fdc1ee042a",
      "tree": "018e99263910f81a1eea5ac908f8c54ab8ccf10e",
      "parents": [
        "9795ce49e134db7026a856671c8cc7e9dc82e5f8"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 09 14:43:46 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:20:59 2017 +0100"
      },
      "message": "Add library `lucene-backward-codecs` to migrate indices.\n\nTo be able to read and migrate Lucene indices from old (4.x)\nformats to new (5.x) ones, add the `lucene-backward-codecs`\nlibrary to the project.\nIt is added to the `ext` directory and therefore to the classpath.\nAccording to the Lucene documentation, having it in the classpath\ncan affect performance. But right now the `ext` directory is the\nonly one available and even for a separate tool for offline\nmigration the library would be needed.\n"
    },
    {
      "commit": "9795ce49e134db7026a856671c8cc7e9dc82e5f8",
      "tree": "6aaea6f837fb49ec617750e8d0a421e90da6dc45",
      "parents": [
        "2e03db322ea93cac67275bdd584a67b559ed185a"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 02 16:59:44 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:20:58 2017 +0100"
      },
      "message": "Exclude Lucene transitive dependencies.\n\nExclude Lucene dependencies `lucene-spatial` and `lucene-join`.\nThey were added during the update but are not needed. This patch\nexcludes them explicitly so that they do not show up in the\ngenerated IDE files and `ext` directory.\n"
    },
    {
      "commit": "2e03db322ea93cac67275bdd584a67b559ed185a",
      "tree": "e9ec908d649f975a00f676dc850baa7248cd9023",
      "parents": [
        "71211a8cdfae8d528130cedf3e67d21e130ee8a0"
      ],
      "author": {
        "name": "Luca Milanesio",
        "email": "luca.milanesio@gmail.com",
        "time": "Thu Dec 22 00:42:56 2016 +0000"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Mar 05 20:20:57 2017 +0100"
      },
      "message": "Bump to Lucene 5.5.2\n"
    },
    {
      "commit": "71211a8cdfae8d528130cedf3e67d21e130ee8a0",
      "tree": "5a76831f676056cf850b9763c017ed89cc8882a6",
      "parents": [
        "2df318b0b06e8e1fbeb9c23965e12dd4bc2d06f3",
        "e68dd4211a3dd378f5ba6133a75470c794af9110"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Fri Mar 03 10:53:03 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 03 10:53:03 2017 -0500"
      },
      "message": "Merge pull request #1207 from j123b567/fix/cs_locale\n\nBetter Czech localization"
    },
    {
      "commit": "e68dd4211a3dd378f5ba6133a75470c794af9110",
      "tree": "5a76831f676056cf850b9763c017ed89cc8882a6",
      "parents": [
        "2df318b0b06e8e1fbeb9c23965e12dd4bc2d06f3"
      ],
      "author": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Fri Mar 03 15:37:37 2017 +0100"
      },
      "committer": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Fri Mar 03 15:37:37 2017 +0100"
      },
      "message": "Better Czech localization\n"
    },
    {
      "commit": "2df318b0b06e8e1fbeb9c23965e12dd4bc2d06f3",
      "tree": "1fcb86452514d777ace79d5b47e1639cb84238e6",
      "parents": [
        "d54dc044acc6f359994230d506d7e1fe19413be4",
        "e49d70def0db06a4df65d4d0631d79b2b433bdc1"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Tue Feb 21 09:30:18 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 21 09:30:18 2017 -0500"
      },
      "message": "Merge pull request #1202 from j123b567/feature/treeViewTable\n\nPrevent last column on Tree page from wraping"
    },
    {
      "commit": "e49d70def0db06a4df65d4d0631d79b2b433bdc1",
      "tree": "1fcb86452514d777ace79d5b47e1639cb84238e6",
      "parents": [
        "d54dc044acc6f359994230d506d7e1fe19413be4"
      ],
      "author": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Mon Feb 20 17:35:49 2017 +0100"
      },
      "committer": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Mon Feb 20 17:35:49 2017 +0100"
      },
      "message": "Prevent last column on Tree page from wraping\n\nWith localizations, there can be longer text then 13em so there is a line break.\nThis fix prevent this line breaking and thus every line has normal height again.\n"
    },
    {
      "commit": "d54dc044acc6f359994230d506d7e1fe19413be4",
      "tree": "10d260fb1be9a05a886630ee4bcaa662dc9dfc45",
      "parents": [
        "b03fc536a398a294f52d91441cbddbad392b1ae6",
        "49bec41a98520c7e11027c681b885ab1154a99a5"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Thu Feb 16 08:17:20 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 16 08:17:20 2017 -0500"
      },
      "message": "Merge pull request #1201 from j123b567/bug/1114\n\nFix #1114 HttpUtils getGitblitURL does not support nonstandard ports"
    },
    {
      "commit": "49bec41a98520c7e11027c681b885ab1154a99a5",
      "tree": "10d260fb1be9a05a886630ee4bcaa662dc9dfc45",
      "parents": [
        "b03fc536a398a294f52d91441cbddbad392b1ae6"
      ],
      "author": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Wed Feb 15 18:58:55 2017 +0100"
      },
      "committer": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Wed Feb 15 18:58:55 2017 +0100"
      },
      "message": "Fix #1114 HttpUtils getGitblitURL does not support nonstandard ports\n\nX-Forwarded-Host can contain port number and it is added twice in that situation\nThis fix just prevent adding port number if it is already there\n"
    },
    {
      "commit": "b03fc536a398a294f52d91441cbddbad392b1ae6",
      "tree": "4956f40a50ce0d55a562a4e46d1dd14462a784ff",
      "parents": [
        "3d569f8ce066a6cadf021cbebcc8152b315db2d7",
        "3d20d25d5de1d2f2060378f35bade208e81e6d39"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Wed Feb 15 08:35:06 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 15 08:35:06 2017 -0500"
      },
      "message": "Merge pull request #1200 from j123b567/locale/cs\n\nAdd Czech locale"
    },
    {
      "commit": "3d20d25d5de1d2f2060378f35bade208e81e6d39",
      "tree": "4956f40a50ce0d55a562a4e46d1dd14462a784ff",
      "parents": [
        "3d569f8ce066a6cadf021cbebcc8152b315db2d7"
      ],
      "author": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Mon Feb 13 23:08:15 2017 +0100"
      },
      "committer": {
        "name": "Jan Breuer",
        "email": "jan.breuer@mobatime.cz",
        "time": "Wed Feb 15 12:19:58 2017 +0100"
      },
      "message": "Add Czech locale\n"
    },
    {
      "commit": "3d569f8ce066a6cadf021cbebcc8152b315db2d7",
      "tree": "9ff859c069c8a165656bdd3f8c5cf667bca9472c",
      "parents": [
        "cf2032c6820ab5cb88d82a4c229128a3674d7903",
        "61df9b9f633cd5ce176077ad0e1ce8436f019f0c"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Wed Feb 08 09:34:07 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 08 09:34:07 2017 -0500"
      },
      "message": "Merge pull request #1192 from mystygage/listBranchForRepository\n\nList branches from only one repository if a repository name is given"
    },
    {
      "commit": "cf2032c6820ab5cb88d82a4c229128a3674d7903",
      "tree": "e11dabfad514d5d90afc0e5b445741cbe7f411a3",
      "parents": [
        "526b3858711c033e857a30537b126359f7dff7a1",
        "2e68cb6eb7f943379aa4f8a40854bc9dfd8d9bc4"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Wed Feb 08 09:26:42 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 08 09:26:42 2017 -0500"
      },
      "message": "Merge pull request #1198 from WilliamFromTW/master\n\nNew Setting \"Default Language\" when creating user"
    },
    {
      "commit": "2e68cb6eb7f943379aa4f8a40854bc9dfd8d9bc4",
      "tree": "e11dabfad514d5d90afc0e5b445741cbe7f411a3",
      "parents": [
        "06f23c3c476d02c5e7899ed5ada798bcafa7b4ff"
      ],
      "author": {
        "name": "william",
        "email": "william.fromtw@gmail.com",
        "time": "Wed Feb 08 08:35:01 2017 +0800"
      },
      "committer": {
        "name": "william",
        "email": "william.fromtw@gmail.com",
        "time": "Wed Feb 08 08:35:01 2017 +0800"
      },
      "message": "New Setting \"Default Language\" when creating user.\n"
    },
    {
      "commit": "61df9b9f633cd5ce176077ad0e1ce8436f019f0c",
      "tree": "24b086d28af4b50978ec3a24f5be266ed75c6041",
      "parents": [
        "651b9980f5b8664939b91674252d0dfdc754fed2"
      ],
      "author": {
        "name": "Markus Fömpe",
        "email": "markus.foempe@gmail.com",
        "time": "Thu Jan 26 13:50:54 2017 +0100"
      },
      "committer": {
        "name": "Markus Fömpe",
        "email": "markus.foempe@gmail.com",
        "time": "Thu Jan 26 15:01:05 2017 +0100"
      },
      "message": "List branches from only one repository if a repository name is given\n\ne.g.: https://localhost:8443/rpc/?req\u003dLIST_REPOSITORY_BRANCHES\u0026name\u003drepo.git\n\nFix #1184\n"
    },
    {
      "commit": "526b3858711c033e857a30537b126359f7dff7a1",
      "tree": "e3a8590c535f439f5bb32548c916ad00eee64562",
      "parents": [
        "bfa7b43deee2127c938d3b2039467867e6b8b2ef",
        "6a7496f40c0eca659d0ee1c4f4d9cee204d244d7"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Wed Jan 25 09:17:53 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 25 09:17:53 2017 -0500"
      },
      "message": "Merge pull request #1187 from gitblit/revert-1186-listBranchForRepository\n\nRevert \"New rpc endpoint for listing all branches from a given repository\""
    },
    {
      "commit": "6a7496f40c0eca659d0ee1c4f4d9cee204d244d7",
      "tree": "e3a8590c535f439f5bb32548c916ad00eee64562",
      "parents": [
        "bfa7b43deee2127c938d3b2039467867e6b8b2ef"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Wed Jan 25 09:17:41 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 25 09:17:41 2017 -0500"
      },
      "message": "Revert \"New rpc endpoint for listing all branches from a given repository\"\n"
    },
    {
      "commit": "bfa7b43deee2127c938d3b2039467867e6b8b2ef",
      "tree": "9f51c5c4d44824456e9b90a6446e0aea52167572",
      "parents": [
        "651b9980f5b8664939b91674252d0dfdc754fed2",
        "182f194b7a7ff5b0991b8ad9f3deb23650089913"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Wed Jan 25 09:17:12 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 25 09:17:12 2017 -0500"
      },
      "message": "Merge pull request #1186 from mystygage/listBranchForRepository\n\nNew rpc endpoint for listing all branches from a given repository"
    },
    {
      "commit": "182f194b7a7ff5b0991b8ad9f3deb23650089913",
      "tree": "9f51c5c4d44824456e9b90a6446e0aea52167572",
      "parents": [
        "651b9980f5b8664939b91674252d0dfdc754fed2"
      ],
      "author": {
        "name": "Markus Fömpe",
        "email": "markus.foempe@gmail",
        "time": "Tue Jan 24 11:54:01 2017 +0100"
      },
      "committer": {
        "name": "Markus Fömpe",
        "email": "markus.foempe@gmail.com",
        "time": "Wed Jan 25 14:58:08 2017 +0100"
      },
      "message": "New rpc endpoint for listing all branches from a given repository\n"
    },
    {
      "commit": "06f23c3c476d02c5e7899ed5ada798bcafa7b4ff",
      "tree": "c713ed937d132109fd2caefcd7ffb8666f3f4157",
      "parents": [
        "370487036c1d4037b9c54258eb0e8dbd4ab4036b"
      ],
      "author": {
        "name": "william",
        "email": "william.fromtw@gmail.com",
        "time": "Wed Jan 25 17:29:05 2017 +0800"
      },
      "committer": {
        "name": "william",
        "email": "william.fromtw@gmail.com",
        "time": "Wed Jan 25 17:29:05 2017 +0800"
      },
      "message": "fix bug \"get user default language null exception\"\n"
    },
    {
      "commit": "370487036c1d4037b9c54258eb0e8dbd4ab4036b",
      "tree": "54de5236a42d13c590549ae05c1209a4ae626cf7",
      "parents": [
        "651b9980f5b8664939b91674252d0dfdc754fed2"
      ],
      "author": {
        "name": "william",
        "email": "william.fromtw@gmail.com",
        "time": "Tue Jan 24 17:30:01 2017 +0800"
      },
      "committer": {
        "name": "william",
        "email": "william.fromtw@gmail.com",
        "time": "Tue Jan 24 17:30:01 2017 +0800"
      },
      "message": "Sending email (certificate zip file) based on locale that user selected\n"
    },
    {
      "commit": "651b9980f5b8664939b91674252d0dfdc754fed2",
      "tree": "e3a8590c535f439f5bb32548c916ad00eee64562",
      "parents": [
        "52869d49e6901dd74f740ccc24fb5d81a7deae20",
        "8ae899ac193a5864d6bfb17bc999a9099de3bd7b"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Mon Jan 23 13:56:24 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 23 13:56:24 2017 -0500"
      },
      "message": "Merge pull request #1183 from RainerW/fixApacheProxySample\n\nDocumentation  update : \"behind apache\" also edit \"Ajax-Location\" header"
    },
    {
      "commit": "8ae899ac193a5864d6bfb17bc999a9099de3bd7b",
      "tree": "e3a8590c535f439f5bb32548c916ad00eee64562",
      "parents": [
        "52869d49e6901dd74f740ccc24fb5d81a7deae20"
      ],
      "author": {
        "name": "RainerW",
        "email": "github@inforw.de",
        "time": "Mon Jan 23 19:35:25 2017 +0100"
      },
      "committer": {
        "name": "RainerW",
        "email": "github@inforw.de",
        "time": "Mon Jan 23 19:35:25 2017 +0100"
      },
      "message": "when apache terminates https, the Ajax-Location header needs to be rewritten as well\n"
    },
    {
      "commit": "52869d49e6901dd74f740ccc24fb5d81a7deae20",
      "tree": "2510706e5703142bee44a712d4d62e3ceae091d2",
      "parents": [
        "d0d62788e3865db025b2636883988c6067fb59f8",
        "51e70f4233400ccf90c4e05638df53f2d5784d3c"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "fzs@users.noreply.github.com",
        "time": "Sat Jan 21 16:31:52 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 21 16:31:52 2017 +0100"
      },
      "message": "Merge pull request #6 from fzs/sshAuthMethods\n\nSet list of offered SSH authentication methods."
    },
    {
      "commit": "d0d62788e3865db025b2636883988c6067fb59f8",
      "tree": "15f6ad6ae83e1f61f320a6bf4e73c84f4ae727b2",
      "parents": [
        "5541f37ea97b5f78680344e74c5150831c45a8ab",
        "7bd114df717a8a626da8bd051d59c1d49dd92c75"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "fzs@users.noreply.github.com",
        "time": "Mon Jan 16 20:51:30 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 16 20:51:30 2017 +0100"
      },
      "message": "Merge pull request #1178 from srbala/patch-1\n\nUpdate declaration to Servlet 3.0 in web.xml and weblogic.xml.\r\nFixes #1132"
    },
    {
      "commit": "7bd114df717a8a626da8bd051d59c1d49dd92c75",
      "tree": "15f6ad6ae83e1f61f320a6bf4e73c84f4ae727b2",
      "parents": [
        "e6e1dbfb3b1018f8136a9ddc9e54a5097f8d0cf8"
      ],
      "author": {
        "name": "Bala Raman",
        "email": "srbala@gmail.com",
        "time": "Mon Jan 16 14:29:45 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 16 14:29:45 2017 -0500"
      },
      "message": "Update weblogic.xml\n\nUpdate to web app 3.0 xsd"
    },
    {
      "commit": "e6e1dbfb3b1018f8136a9ddc9e54a5097f8d0cf8",
      "tree": "a4f1c6af8a66a3b31374f652762e98cb1180a3ad",
      "parents": [
        "5541f37ea97b5f78680344e74c5150831c45a8ab"
      ],
      "author": {
        "name": "Bala Raman",
        "email": "srbala@gmail.com",
        "time": "Sun Jan 15 19:05:48 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 15 19:05:48 2017 -0500"
      },
      "message": "Update to web.xml, fix to #1132\n\nUpdate to web.xml, fix to #1132\r\n\r\nFixes to namespace to fix xml parse error, where strict validation required"
    },
    {
      "commit": "5541f37ea97b5f78680344e74c5150831c45a8ab",
      "tree": "0cd254d6ae907fab951fdb6553d7f516a95b6f93",
      "parents": [
        "c8c70d74e93283fffe591c07b73b5f44e01b7d4b",
        "d79f5630c82a0d89ec5b2d3a1f0365bf72668a78"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Fri Jan 06 09:41:44 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 06 09:41:44 2017 -0500"
      },
      "message": "Merge pull request #1171 from pingunaut/usermanager-file-instantiation\n\nUpdate UserManager to support construction of IUserServices with IRuntimeManager as a constructor parameter"
    },
    {
      "commit": "d79f5630c82a0d89ec5b2d3a1f0365bf72668a78",
      "tree": "9001acce02ffcd38fb5110aca6f801ba7992917a",
      "parents": [
        "a6ae27a472af1260ab078edb7199f60086b56a4b"
      ],
      "author": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Fri Jan 06 01:09:37 2017 +0100"
      },
      "committer": {
        "name": "Martin Spielmann",
        "email": "martin.spielmann@pingunaut.com",
        "time": "Fri Jan 06 01:09:37 2017 +0100"
      },
      "message": "extracted method"
    },
    {
      "commit": "c8c70d74e93283fffe591c07b73b5f44e01b7d4b",
      "tree": "e0831fdd8e855736a4b5854353812f6cb93a0d29",
      "parents": [
        "80f29044535d7a862303fa6bb9d130ac4b106c07",
        "84c827a3d34ac4d37622c73e8e8140eab3e0e910"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Thu Jan 05 09:52:12 2017 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 05 09:52:12 2017 -0500"
      },
      "message": "Merge pull request #1176 from ds5apn/master\n\nUpdate korean translation for gitblit new version."
    },
    {
      "commit": "84c827a3d34ac4d37622c73e8e8140eab3e0e910",
      "tree": "e0831fdd8e855736a4b5854353812f6cb93a0d29",
      "parents": [
        "80f29044535d7a862303fa6bb9d130ac4b106c07"
      ],
      "author": {
        "name": "DONGSU, KIM",
        "email": "ds5apn@gmail.com",
        "time": "Thu Jan 05 15:48:45 2017 +0900"
      },
      "committer": {
        "name": "DONGSU, KIM",
        "email": "ds5apn@gmail.com",
        "time": "Thu Jan 05 15:48:45 2017 +0900"
      },
      "message": "Update korean translation for gitblit new version.\n"
    },
    {
      "commit": "80f29044535d7a862303fa6bb9d130ac4b106c07",
      "tree": "106c47f131f17167ed608b45dd086d15fc7ce44f",
      "parents": [
        "7fd5776cbb470530d6ae506265285e268bc844e5"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 02 15:47:32 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 02 15:47:32 2017 +0100"
      },
      "message": "Increase minor version number to 9\n\nBump version to 1.9.0-SNAPSHOT, increasing the minor as the next\nrelease includes interface changes.\n"
    },
    {
      "commit": "7fd5776cbb470530d6ae506265285e268bc844e5",
      "tree": "da0a309855103abf2500740c1e6349133fdd8b91",
      "parents": [
        "23072ffb51710d0c850adaa2bac241f3d91c390b",
        "43f642bad9e3983f566c1166316f88cd69ce6318"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 02 13:06:48 2017 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 02 13:06:48 2017 +0100"
      },
      "message": "Merge branch \u0027ci\u0027, enabling CI services.\n"
    },
    {
      "commit": "43f642bad9e3983f566c1166316f88cd69ce6318",
      "tree": "ad0b98d04113b601e23abc1977a993d6e4611ba0",
      "parents": [
        "ac1e8f8e5aa2ec074668ec45d5c64633907743ea"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Thu Dec 15 22:10:37 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 02 12:56:10 2017 +0100"
      },
      "message": "Add build definition file for Circle CI\n\nConfigure the build for Circle CI in the new file circle.yml.\nSpecify a compile step to have the build fail on compilation error.\nThe test step is then configured as `ant test`, which will compile\nagain due to the limits of Ant/Moxie.\n\nContrary to the documentation, the default Java version on Circle CI\nis Java 8.\nThe project is set as a Java 7 project. We define to use OpenJDK 7,\nbecause the Gitblit build has some trouble with Java 8, I consider\nJava 7 the default, and Circle CI does not provide an Oracle JDK 7\ninstallation to use. I could only get it to work with OpenJDK 7.\n\nThe Java version is reported in the Circle CI build script to ease\nanalysis.\n\nTest and coverage reports get stored as artifacts for a build, which\nallows to browse them in the Circle CI web interface.\n"
    },
    {
      "commit": "ac1e8f8e5aa2ec074668ec45d5c64633907743ea",
      "tree": "df3e7d82f5d6c0c759f55d6b9b8b81b115da6c0b",
      "parents": [
        "d10fe0d8fd614f6ae6606179b0326bdc6a5f6af8"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Dec 12 13:34:17 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Jan 02 12:52:43 2017 +0100"
      },
      "message": "Add definition file for Travis CI\n\nAdd the most basic build definition file for Travis CI. It only\ndefines the project language as Java. For the rest the defaults\nare kept as Travis seems to work fine with them.\nWe add `.travis.yml` as a dotfile in order not to clutter the\ntop directory with too much non-project files.\n"
    },
    {
      "commit": "a6ae27a472af1260ab078edb7199f60086b56a4b",
      "tree": "55e431daeafd70e9cd18cbf544dfb62137fd0bd8",
      "parents": [
        "da6a2611ed8cb73856ad41a39a322596fdd9ea05"
      ],
      "author": {
        "name": "de4c9d",
        "email": "martin.spielmann@kiongroup.com",
        "time": "Fri Dec 30 18:19:58 2016 +0100"
      },
      "committer": {
        "name": "de4c9d",
        "email": "martin.spielmann@kiongroup.com",
        "time": "Fri Dec 30 18:19:58 2016 +0100"
      },
      "message": "updated comment"
    },
    {
      "commit": "da6a2611ed8cb73856ad41a39a322596fdd9ea05",
      "tree": "7475c5a1a605a6fc37aee13f192f4cf914fccc11",
      "parents": [
        "99b4a1898f0c3533062263cda18b456f099ee2cf"
      ],
      "author": {
        "name": "de4c9d",
        "email": "martin.spielmann@kiongroup.com",
        "time": "Fri Dec 30 17:09:16 2016 +0100"
      },
      "committer": {
        "name": "de4c9d",
        "email": "martin.spielmann@kiongroup.com",
        "time": "Fri Dec 30 18:12:27 2016 +0100"
      },
      "message": "update user manager to support instantiation if IUserService with IRuntimeManager as a parameter\n"
    },
    {
      "commit": "23072ffb51710d0c850adaa2bac241f3d91c390b",
      "tree": "9f3c63a9a3c03dfd1fb065b6e3e21783573bcf6a",
      "parents": [
        "99b4a1898f0c3533062263cda18b456f099ee2cf"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Dec 21 22:02:46 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Dec 21 22:02:46 2016 +0100"
      },
      "message": "Update to explicit versions of JUnit 4.12 and JaCoCo 0.7.8\n\nUse explicit coordinates, and therefor version numbers fro JUnit\nin the build.moxie file. It should not be some version that just\nhappens to be used.\n\nUpdate JUnit to latest 4.12.\nUpdate JaCoCo to lates 0.7.8, which makes it work under Java 8.\nThe last used version would fail when tests are run under Java 8.\n"
    },
    {
      "commit": "99b4a1898f0c3533062263cda18b456f099ee2cf",
      "tree": "932d803c462d7ba789fceaaa1d97b1415fa1e16f",
      "parents": [
        "472b74324eb40fda5892fa4dfe3a35cd87e75a2a"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Dec 19 10:08:42 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Dec 19 10:08:42 2016 +0100"
      },
      "message": "Add test resources path `src/test/resources` to project configuration\n"
    },
    {
      "commit": "472b74324eb40fda5892fa4dfe3a35cd87e75a2a",
      "tree": "5dad14b5ab72b3f84a33d32b2fc17eb422ed1b67",
      "parents": [
        "d6ddafdb24ea55e59ac718b92f4b74e3b825ca63"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Dec 16 13:36:43 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Dec 18 17:13:31 2016 +0100"
      },
      "message": "Fix typo in defaults.properties.\n"
    },
    {
      "commit": "d6ddafdb24ea55e59ac718b92f4b74e3b825ca63",
      "tree": "e029423f37eb109a123f8d9fc267d6638fa1be59",
      "parents": [
        "34b98a07b8f01015ddbafd4bdaad0458c25765ae",
        "1afeccc09bfaa885b5c01d3db29d42695b8290a1"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "fzs@users.noreply.github.com",
        "time": "Sun Dec 18 17:01:15 2016 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Dec 18 17:01:15 2016 +0100"
      },
      "message": "Merge pull request #1160 from fzs/sshLdapAuthenticator\n\nLDAP SSH key manager"
    },
    {
      "commit": "34b98a07b8f01015ddbafd4bdaad0458c25765ae",
      "tree": "463342694305e123838767bb3e76d9ee39b5bdd3",
      "parents": [
        "4ece397d714946697bf911221b6168356a6c44c7"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Thu Dec 15 20:28:37 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Thu Dec 15 20:28:37 2016 +0100"
      },
      "message": "Remove duplicate import of class SecureRandom\n\nFixes the build that was broken by cherry-picking commit 2be2c2,\nwhich resulted in an import collision on the `SecureRandom` class.\n"
    },
    {
      "commit": "4ece397d714946697bf911221b6168356a6c44c7",
      "tree": "11fd1ef945527fd713dfa4b9705dd8a51ca5fc64",
      "parents": [
        "bf179e6e1a1cf422076af2d5ef471f85a7ecf6e2",
        "60099a42faf7c34edb4651253cdb1a7723fbf029"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Wed Dec 14 17:01:10 2016 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 14 17:01:10 2016 -0500"
      },
      "message": "Merge pull request #1167 from fzs/secureCookies\n\nSecure cookies"
    },
    {
      "commit": "bf179e6e1a1cf422076af2d5ef471f85a7ecf6e2",
      "tree": "be18999b9ff48d4201e795c6459d3c2eb5c39601",
      "parents": [
        "9a51d2bf8ed3663715fc735afb0444e179c334f7",
        "2be2c2c95c9a3747fd200e3ea3623607053d5299"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 13 16:56:59 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 13 16:57:39 2016 +0100"
      },
      "message": "Merge branch \u0027rcaa-master\u0027 into master.\n"
    },
    {
      "commit": "9a51d2bf8ed3663715fc735afb0444e179c334f7",
      "tree": "a266d07fe861e255d9dd8dd431b7edb37cb3e3e8",
      "parents": [
        "6b0ac4155c4643de10a14166318f73e23616d36f",
        "7985115bd1301db867935b52a689ccfc32f13794"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Dec 12 22:59:12 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Dec 12 22:59:12 2016 +0100"
      },
      "message": "Merge branch \u0027fixMentionsInTickets-985\u0027\n"
    },
    {
      "commit": "2be2c2c95c9a3747fd200e3ea3623607053d5299",
      "tree": "b3e2e6ee26565a351933c91bb8f31a752a3980fc",
      "parents": [
        "a1fc7e7228d7b8de05bc2cf074f112af757401d0"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 01:00:27 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Dec 12 14:25:41 2016 +0100"
      },
      "message": "Introduce SecureRandom wrapper for properly seeded static instances\n\nIntroduce our own wrapper `SecureRandom` around `java.security.SecureRandom`.\nThis a) makes sure that the PRNG is seeded on creation and not when\nrandom bytes are retrieved, and\nb) uses a static instance in the `UserModel` so that lags do not occur\nduring operation due to potentially seeding getting blocked on Unix\nwhen reading from the system\u0027s entropy pool. To keep the random data\nstill secure, the static instance will reseed all 24 hours, also a\nfunctionality of the wrapper class.\n\nThis fixes #1063 and extends and closes PR #1116\n"
    },
    {
      "commit": "a1fc7e7228d7b8de05bc2cf074f112af757401d0",
      "tree": "9aead9b24509f2b15ceb254262fff6858b49c6f2",
      "parents": [
        "4365c8f0b0410f540118868bbfc30f6974db3008"
      ],
      "author": {
        "name": "rcaa",
        "email": "rodrigo_cardoso@hotmail.it",
        "time": "Sun Dec 11 19:12:27 2016 -0300"
      },
      "committer": {
        "name": "rcaa",
        "email": "rodrigo_cardoso@hotmail.it",
        "time": "Sun Dec 11 19:12:27 2016 -0300"
      },
      "message": "changing Math.random to SecureRandom\n"
    },
    {
      "commit": "7985115bd1301db867935b52a689ccfc32f13794",
      "tree": "021ec7ae22b4817ec2008b0cd2b2a9ed48d73e22",
      "parents": [
        "0e4eebcfd98d079c93c33510284cdfe976e27725"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 16:02:21 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 16:17:21 2016 +0100"
      },
      "message": "Fix user mention regular expression and group replacement.\n\nThe regular expression used for user mentions used to work\nonly inside sentences. Also, since it tested for whitespace, the\nwhitespace would get replaced, too, which would join lines together.\n\nInstead the new regex uses boundary matchers to match against\nword boundaires. As these are not capturing only the actual user\nmention can be captured and is then replaced. Also, this way the\nregex can ignore punctuation like in \"@jim, look at this.\"\n\nSince Gibtlit now requires Java 7 we can use named capture groups.\nThis makes the use of a centrally defined regular expression much\nsafer. The (admittedly only) group to capture the user name is named\n\"user\" and can be referenced by this name. By using the name instead\nof a group number, the regex could be changed without the code using\nit breaking because the group number changed.\n\nA simple test is added for user mentions, which unfortunately\nhas to deal with the full markdown replacement, too.\n\nFixes #985\n"
    },
    {
      "commit": "0e4eebcfd98d079c93c33510284cdfe976e27725",
      "tree": "af20823165faed2c40576c7126f6aa7ba2c261d3",
      "parents": [
        "a1d8cfcf60bf23136512afad95edc3faede7108c"
      ],
      "author": {
        "name": "Glenn Matthys",
        "email": "glenn@webmind.be",
        "time": "Fri Jan 08 12:48:47 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 12:43:36 2016 +0100"
      },
      "message": "Use REGEX_TICKET_MENTION instead of hardcoded regular expression\n"
    },
    {
      "commit": "a1d8cfcf60bf23136512afad95edc3faede7108c",
      "tree": "bc228b4a9c952666eef3fcc3b9e37fc57084226f",
      "parents": [
        "d10fe0d8fd614f6ae6606179b0326bdc6a5f6af8"
      ],
      "author": {
        "name": "Glenn Matthys",
        "email": "glenn@webmind.be",
        "time": "Fri Jan 08 12:48:21 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 12:29:59 2016 +0100"
      },
      "message": "Introduce new constant REGEX_TICKET_MENTION\n"
    },
    {
      "commit": "60099a42faf7c34edb4651253cdb1a7723fbf029",
      "tree": "69d5267a8084c1941591918cd8108df97671ad2c",
      "parents": [
        "90a8d1af6c202c8efcca5a0fdaf341494cb0b8eb"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 11:30:28 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 11:30:28 2016 +0100"
      },
      "message": "Set secure session cookies when redirecting from HTTP to HTTPS.\n\nSo far for session cookies the secure property was only set when no\nHTTP port was opened. This changes to also set it when HTTP is redirected\nto the HTTPS port.\n"
    },
    {
      "commit": "90a8d1af6c202c8efcca5a0fdaf341494cb0b8eb",
      "tree": "bd9f0f4bc67cdb5a2dbffe7500e9432331698df3",
      "parents": [
        "d10fe0d8fd614f6ae6606179b0326bdc6a5f6af8"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 10:57:45 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Dec 10 10:57:45 2016 +0100"
      },
      "message": "Set secure user cookies and only for HTTP.\n\nMark the user authentication cookie to be only used for HTTP, making\nit inaccessible for JavaScript engines.\n\n\nIf only HTTPS is used and no HTTP (i.e. also if HTTP is redirected to\nHTTPS) then mark the user cookie to be sent only over secure connections.\n"
    },
    {
      "commit": "1afeccc09bfaa885b5c01d3db29d42695b8290a1",
      "tree": "33a650272b9cfdbc92c3bdfc31763f39d6463061",
      "parents": [
        "40040b656299bfafcaa92b12b916f93e8c5aed1d"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Dec 05 15:58:06 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 06 15:36:53 2016 +0100"
      },
      "message": "Extend documentation in default.properties and LdapKeyManager.java.\n"
    },
    {
      "commit": "40040b656299bfafcaa92b12b916f93e8c5aed1d",
      "tree": "8f1cb2271a2593fba058e7a1548a80110d394dac",
      "parents": [
        "a3f9b4f64e52ba1833c3bcb18cf7f05b4d35714e"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Nov 29 22:08:50 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 06 15:35:23 2016 +0100"
      },
      "message": "The public key manager can disable writing keys, which hides commands\n\nSome public key mangers may be read-only, i.e. not allow to add or\ndelete keys, or to change the key comment or assigned permissions.\nIn such a case the respective commands should not be available on the\nSSH shell and the SSH Keys panel should also not offer the possibility.\n\nThe `IPublicKeyManager` gets three new methods, modelled after the\n`AuthenticationManager`:\n`supportsWritingKeys`, `supportsCommentChanges` and\n`supportsPermissionChanges`. They return true if a key manager allows for\nkeys to be written or updated.\nFor example the existing `FileKeyManager` will return true for all three\nsince it allows to store and update keys in a file.\nThe new `LdapKeyManager` returns false since it only accesses LDAP and\ncan not add or update any keys in the directory.\nA future key manager might get keys from an LDAP directory but still\nkeep comments and permissions for it in a local copy.\n\nIf writing of keys is not supported:\n* the welcome shell does not suggest adding a key,\n* the `SshKeysDispatcher` does not offer the \"add\", \"remove\", \"comment\" and\n  \"permission\" commands, and\n* the SSH keys panel hides the \"delete\" button in the key list, and the\n  \"Add Key\" form.\n\nThe hiding of the \"Add key\" form is not perfect since the surrounding\ndiv is still shown, but I don\u0027t know how to hide it and it didn\u0027t look\ntoo bad, either.\n"
    },
    {
      "commit": "a3f9b4f64e52ba1833c3bcb18cf7f05b4d35714e",
      "tree": "e757b17bb9bfb253596ca671f85769d61a25f75b",
      "parents": [
        "cb89090d936ff8383d26f69eaeae6717d3a701e1"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Nov 29 21:46:54 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 06 15:35:13 2016 +0100"
      },
      "message": "Fix SshKeysDispatcher test failing on Windows\n\nThe `SshKeysDispatcher` tests that use the keys list command are failing\non Windows because they assume a Unix line ending after each key. But\nthe command will use a system line ending. So this fix uses system line\nendings in the reference string for the assert, too.\n\nIn addition, two `assertTrue(false)´ are replaced with a proper `fail`.\n"
    },
    {
      "commit": "cb89090d936ff8383d26f69eaeae6717d3a701e1",
      "tree": "50104f19c11970f577dc8731ddcb2b050e5a6c84",
      "parents": [
        "f639d966cb5e7026cb30e6b25be55fb681feb896"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sat Nov 26 17:35:21 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 06 15:34:56 2016 +0100"
      },
      "message": "Use dynamic port selection for LDAP listeners in LDAP tests.\n\nInstead of using fixed ports for the listeners of the in-memory\nLDAP server, let the listeners select ports and then save them in\nthe authentication mode instance. This way we prevent port collisions,\nwhich especially showed up under Windows.\n"
    },
    {
      "commit": "51e70f4233400ccf90c4e05638df53f2d5784d3c",
      "tree": "8f14a90771baa1233869dc380c5f0e44ba37926c",
      "parents": [
        "d10fe0d8fd614f6ae6606179b0326bdc6a5f6af8"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 06 14:44:18 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Dec 06 14:44:18 2016 +0100"
      },
      "message": "Set list of offered SSH authentication methods.\n\nMake the SSH authentication methods used by the server configurable,\nso that for example password authentication can be turned off.\n\nFor this, a `git.sshAuthenticationMethods` setting is added which is a space\nseparated list of authentication method names. Only the methods listed will\nbe enabled in the server.\nThis is modeled after the option of the same name from sshd_config, but it\ndoes not offer listing multiple required methods. It leaves the door open,\nthough, for a later extension to support such a multi-factor authentication.\n\nSince this also includes Kerberos authentication with GSS API, this obsoletes\nthe `git.sshWithKrb5` property. The latter is removed. Instead, to enable\nKerberos5 authentication, add the method name `gssapi-with-mic` to the\nauthentication methods list.\n"
    },
    {
      "commit": "f639d966cb5e7026cb30e6b25be55fb681feb896",
      "tree": "5fd7523733eefbcf976132c458f195ef7acf9e5d",
      "parents": [
        "967c2422591b70a82bd8fc991e87088e880f5024"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Nov 25 18:21:27 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Tue Nov 29 12:01:42 2016 +0100"
      },
      "message": "Retrieve public SSH keys from LDAP.\n\nAdd new class `LdapPublicKeyManager` which retrieves public SSH keys\nfrom LDAP.\n\nThe attribute can be configured with the new configuration option\n`realm.ldap.sshPublicKey`. The setting can be a simple attribute name,\nlike `sshPublicKey`, or an attribute name and a prefix for the value,\nlike `altSecurityIdentities:SshKey`, in which case attributes are selected\nthat have the name `altSecurityIdentities` and whose values start with\n`SshKey:`.\n"
    },
    {
      "commit": "967c2422591b70a82bd8fc991e87088e880f5024",
      "tree": "9a86e2fee4e9d97359b18e9cde7d8e73b92ba22c",
      "parents": [
        "8d27912b0f7f0a67a929671a9c6ff3c8052e3497"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Nov 23 02:59:39 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Nov 23 02:59:39 2016 +0100"
      },
      "message": "Extract LdapConnection into new class from LdapAuthProvider\n\nExtract the inner class `LdapConnection` from the `LdapAuthProvider`\ninto a separate class, so that it can be used from multiple classes\nthat have to connect to an LDAP directory.\nThe new class is placed into the new package `com.gitblit.ldap`, since\nit isn\u0027t specific to authentication.\n"
    },
    {
      "commit": "8d27912b0f7f0a67a929671a9c6ff3c8052e3497",
      "tree": "0e7ccc90fd65bfaf3af00c9443e999d7c491dc4d",
      "parents": [
        "3b02737103c9d47f065f5026efad26c818cbe40a"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Nov 23 02:48:38 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Nov 23 02:48:38 2016 +0100"
      },
      "message": "Create base unit test class for LDAP tests.\n\nExtract the creation of the in-memory servers and the interceptor\ncode to a base class that LDAP related unit tests can extend to\nhave the servers available.\n"
    },
    {
      "commit": "6b0ac4155c4643de10a14166318f73e23616d36f",
      "tree": "46fa2123ca0f56ab29f272d0ccd3dcbd2b24cb08",
      "parents": [
        "dfa3c3d3f944a91e0af7300df4012df6a5f5ea11",
        "3b02737103c9d47f065f5026efad26c818cbe40a"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Fri Nov 18 18:51:20 2016 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 18 18:51:20 2016 -0500"
      },
      "message": "Merge pull request #1152 from fzs/fixAdminRoleLDAP\n\nSet \"can admin\" permission on LDAP users and teams correctly"
    },
    {
      "commit": "3b02737103c9d47f065f5026efad26c818cbe40a",
      "tree": "37120e30eaa8010f6611accf8fe708cedc208478",
      "parents": [
        "f004a7f1d6bd9eaa6e7a8c8cd9ddae4187bd9994"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Nov 18 20:26:06 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Nov 18 20:47:05 2016 +0100"
      },
      "message": "Set \"can admin\" permission on LDAP users and teams correctly\n\nThe canAdmin permission is set on a LDAP user, when the user is listed\nin `realm.ldap.admins` or is a member of a team listed in `realm.ldap.admins`.\nThis leads to inconsistent and surprising behaviour on the EditUser page\nwhen clicking the \"can admin\" checkbox. Also, the \"can admin\" checkbox\nis disabled, but not checked, for teams that are listed as admin teams.\n\nThe new behaviour implemented in this patch makes users and teams from\nLDAP match local ones. That means:\n* LDAP teams that are listed in `realm.ldap.admins` get the canAdmin\n  property set if teams are maintained in LDAP.\n* LDAP users that are listed in `realm.ldap.admins` get the canAdmin\n  property set if teams are maintained in LDAP.\n* LDAP users do not get the canAdmin property set, if they are only a\n  member of a team listed in `realm.ldap.admins`.\n* The `supportsRoleChanges` method for users and teams of the\n  `LdapAuthProvider` unconditially returns false if teams are\n  maintained in LDAP, not only for users and teams listed in\n  `realm.ldap.admins`.\n* Therefore, for all LDAP users and teams the \"can admin\" checkbox\n  is always disabled if teams are maintained in LDAP.\n"
    },
    {
      "commit": "dfa3c3d3f944a91e0af7300df4012df6a5f5ea11",
      "tree": "a93f6b5d7addb18735ad6f2dfb5444d00e739bd0",
      "parents": [
        "6832f1937942c5f499327c0c3fcb6307a6b7cf85",
        "d4a1aae48f097d48e9fded67445ba20720c1d966"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Mon Nov 14 17:44:21 2016 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 14 17:44:21 2016 -0500"
      },
      "message": "Merge pull request #1147 from tomaswolf/disabled_pager_links\n\nFix disabled links in PagerPanel"
    },
    {
      "commit": "6832f1937942c5f499327c0c3fcb6307a6b7cf85",
      "tree": "c9e12b13de28ffa7ab9a6913d071c875cdaa793e",
      "parents": [
        "35f149120cc1ab874f7fa8c1a299006a90759da9",
        "f004a7f1d6bd9eaa6e7a8c8cd9ddae4187bd9994"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Mon Nov 14 17:42:10 2016 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 14 17:42:10 2016 -0500"
      },
      "message": "Merge pull request #1149 from fzs/fixLDAPbinding\n\nFix LDAP binding strategies"
    },
    {
      "commit": "f004a7f1d6bd9eaa6e7a8c8cd9ddae4187bd9994",
      "tree": "71cd038263229f647a47178a4f864045ef97aefb",
      "parents": [
        "a4ad77f9ec3292a7a6c2fb21689d672cf5db1f20"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Nov 14 20:18:07 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Mon Nov 14 20:18:07 2016 +0100"
      },
      "message": "Update documentation for LDAP binding in default.properties.\n\nExtend the comments for some realm.ldap.* properties to better explain\nuse cases and requirements.\n"
    },
    {
      "commit": "a4ad77f9ec3292a7a6c2fb21689d672cf5db1f20",
      "tree": "d93f2dd859ede8da35efcd4fb41f29ace4337fc2",
      "parents": [
        "ffadc2e1878ce448127055e98299218574b103cf"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Nov 11 19:22:17 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Nov 11 19:22:17 2016 +0100"
      },
      "message": "Clean up `LdapAuthProvider` to properly cover different LDAP search scenarios.\n\nGitblit allows in its configuration to set a \"manager\" user (and password) which can be used\nto search for the entry of a user wanting to log in. If they are both not set, an anonymous search\nis attempted. In the description below, when I say \"...as manager\", it is either as manager or\nanonymous.\nSo far the behaviour of Gitblit, with respect to binding to and searching in LDAP,\nhas been the following when a user logs in:\n\n**bind as manager**\n**search for the user**\n_bind as the user_\n_search for the teams_\n\nI\u0027ll call this code flow A.\n\nLater an additional configuration option had been added: `realm.ldap.bindpattern`.\n(PR gitblit/gitblit#162) It was meant to allow for not using a manager nor anonymous binds,\nby searching the directory as the user logging in.\nThis is done in code flow B:\n\n**bind as manager**\n_bind as user_\n_search for user_\n_search for teams_\n\nBoth A and B are flawed, I think. In A, it looks like a mistake to me that the binding stays with the\nuser after authentication. The problem that this causes is, that in LDAP server configurations\nwhere normal users are not allowed to read groups, the team information cannot be retrieved.\nI tried but failed to understand how B is supposed to work. There will always be a bind request\nas either anonymous or the manager DN when the LDAP connection is created. If neither is\npossible, the authentication process will fail and the user cannot log in.\n\nWhen synchronizing users and teams from LDAP, the following code flow is exercised:\n\nF:\n**bind as manager**\n**search for users**\n**search for teams**\n\nThis patch fixes both code flows by introducing a new flow.\n\nC:\n**bind as manager**\n**search for user**\n_bind as user to authenticate_\n**bind as manager**\n**search for teams**\n\nAnd it changes code flow B to the following code flow D:\n\n_bind as user_\n_search for user_\n_search for teams_\n\nWith code flows A, C, D and F the following usage (and authentication) scenarios are covered.\nThey are described from the view of a Gitblit administrator\u0027s intent and his LDAP setup.\n\n* Users and team should be snychronized with LDAP\n\tThis means anonymous or a fixed account must be able to read users and groups.\n\t\u003d\u003e covered by C and F\n\nAs the above allows for authentication and is required for synchronisation, all the others below\ndo not cover synchronization.\n\n* No anonymous binding allowed and no special manager binding required\n\tThis means that users must be able to read user an group entries.\n\t\u003d\u003e covered by D\n\n* The user DN needs to be searched, e.g. because they are not all under the same parent DN.\n\tThis means that anonymous or a fixed account must be able to read users.\n\t\t-- anonymous or the \"manager\" account can also read groups\n\t\t\t\u003d\u003e covered by C\n\t\t-- anonymous or the \"manager\" account cannot read groups but a user can\n\t\t\t\u003d\u003e covered by A\n\nI therefore believe that the new code will cover all common use cases. The implementation\neither directly binds as the user, when `bindpattern` is not empty, or it binds anonymous or\nagainst the manger DN to search for the user DN entry.\n\nIf it directly bound against the user DN, the user is already authenticated. It will then only check\nthat the user DN it found in the search is identical to the one it is currently bound against. If it\nwas bound against a manager DN (or anonymously) it will bind against the found user DN to\nauthenticate the user logging in, and will then rebind against the manager DN.\n\nWhen searching for groups in LDAP, if the search fails with a result code other than SUCCESS,\nthe implementation will bind against the user DN, if it isn\u0027t already bound against it. It will then\nrepeat the search for groups under the user authorization. This is to keep backwards\ncompatible with the original behaviour A, in order to not break cases where the LDAP setup\nwould deny a manager account to search for groups but allow it for normal users.\n\nTo achieve this the implementation introduces an internal `LdapConnection` class that wraps\nthe connection and keeps bind state, so that a rebind as a user is possible.\nThis also fixes a resource leak where the connection was not closed in case that the initial bind\nas the manager account did not succeed.\n\nThis commit would fix gitblit/gitblit#920\n"
    },
    {
      "commit": "ffadc2e1878ce448127055e98299218574b103cf",
      "tree": "464b3d1293e2b902f46d3349e0c664527a27a710",
      "parents": [
        "0d1222739683b9392a1a6c96a95552333f7c2246"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Nov 09 22:04:00 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Wed Nov 09 22:04:00 2016 +0100"
      },
      "message": "Extend LDAP tests to use LDAP servers with access restrictions.\n\nAdd access restrictions to the LDAP test server instances.\nNew modes used a test parameters are ANONYMOUS, DS_MANAGER and USR_MANAGER.\nANONYMOUS can bind anonymously and access users and groups.\nIn DS_MANAGER the server requires authentication and will only allow\nthe DIRECTORY_MANAGER user to search for users and groups.\nIn USR_MANAGER only the user can search groups, the USER_MANAGER, which\nis used to bind in this mode, can not.\n\nA third server instance is created because I did fear side effects should\nthe tests be run in parallel, had I tried to configure the access\nrestriction in Before.\n"
    },
    {
      "commit": "0d1222739683b9392a1a6c96a95552333f7c2246",
      "tree": "97d10a5397a07bf337b91c2bf626dc939ae6a129",
      "parents": [
        "d10fe0d8fd614f6ae6606179b0326bdc6a5f6af8"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Nov 06 18:09:32 2016 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Sun Nov 06 18:09:32 2016 +0100"
      },
      "message": "Extend LDAP authentication tests to use different modes.\n\nInstantiate two LDAP servers, one that allows anonymous access, and\none that requires authentication for all operations.\nThe JUnit test is parameterized to run all tests with both instances.\nIt uses different settings for each mode.\n"
    },
    {
      "commit": "d4a1aae48f097d48e9fded67445ba20720c1d966",
      "tree": "a685d1c2d0847a9675f41be79c26f75c032f55a6",
      "parents": [
        "35f149120cc1ab874f7fa8c1a299006a90759da9"
      ],
      "author": {
        "name": "Tom",
        "email": "tw201207@gmail.com",
        "time": "Mon Oct 31 07:50:26 2016 +0100"
      },
      "committer": {
        "name": "Tom",
        "email": "tw201207@gmail.com",
        "time": "Mon Oct 31 07:50:26 2016 +0100"
      },
      "message": "Fix disabled links in PagerPanel\n\nDisabled links in the PagerPanel (used on the LuceneSearchPage to page\nthrough search results) were only rendered as \"disabled\". The links\nthemselves remained active, which gives strange effects when clicked.\nFor instance it was possible to move to result pages -1, -2, and so on.\n\nReally disable the links. Add missing CSS rules to have correct styling\nas Wicket renders disabled links as spans, not anchors. Include the new\nCSS file in BasePage.html. And add the left/right arrows only if not on\nthe first/last page."
    },
    {
      "commit": "35f149120cc1ab874f7fa8c1a299006a90759da9",
      "tree": "fe8da635a26082a18590bb3c14906bcbc557eb94",
      "parents": [
        "d64dd5de6cf6385d77dcd6014f1ce48369cf9ade",
        "4218f97ed40240c28d57ae8cb4f9e521d8a65ad3"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Fri Oct 28 16:05:46 2016 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 28 16:05:46 2016 -0400"
      },
      "message": "Merge pull request #1144 from fzs/logSendFailedException\n\nImprove logging when sending email fails."
    },
    {
      "commit": "d64dd5de6cf6385d77dcd6014f1ce48369cf9ade",
      "tree": "d104751eb03d4cacce2560d4f6684836dd692379",
      "parents": [
        "bac124176649617171a0d4be4b0a4edcfa073776",
        "355cbb8f10527032e9c9cedbef5b68f118418d68"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Fri Oct 28 16:04:40 2016 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 28 16:04:40 2016 -0400"
      },
      "message": "Merge pull request #1142 from fzs/merge-strategy\n\nMerge strategy"
    },
    {
      "commit": "355cbb8f10527032e9c9cedbef5b68f118418d68",
      "tree": "e0f6dea7a7ceb7a4f5c9d2ef69082430e6ca7932",
      "parents": [
        "5c44219084e825feea72c60a83bc6889e3cf1bc9"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@cycos.com",
        "time": "Mon Jun 23 04:12:19 2014 +0200"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Oct 28 11:02:25 2016 +0200"
      },
      "message": "Add merge type setting to repository page.\n\nThe merge type is a per repository setting. Add it to the edit page.\n"
    },
    {
      "commit": "5c44219084e825feea72c60a83bc6889e3cf1bc9",
      "tree": "1c2262cc18f54fa0d08579abbdd109dc3a9b54aa",
      "parents": [
        "d10fe0d8fd614f6ae6606179b0326bdc6a5f6af8"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@cycos.com",
        "time": "Sat Jun 21 02:53:21 2014 +0200"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@devolo.de",
        "time": "Fri Oct 28 11:02:25 2016 +0200"
      },
      "message": "Add integration strategy to merge tickes fast-forward or with commit.\n\nAdd the option to merge a ticket branch to the integration branch\nonly when it can be fast-forwarded, or\nalways with a merge commit, or\nby fast-foward if possible, otherwise with a merge commit.\n\nAdds a new property ticket.mergeType with the valid values\nFAST_FOWARD_ONLY, MERGE_ALWAYS and MERGE_IF_NECESSARY.\n\nMerging and canMerge were refactored to make use of a new\nIntegrationStrategy class for each type of strategy.\n"
    },
    {
      "commit": "4218f97ed40240c28d57ae8cb4f9e521d8a65ad3",
      "tree": "e6ead2936b1aefe3b3d789dabd8a3619e864fbf9",
      "parents": [
        "d10fe0d8fd614f6ae6606179b0326bdc6a5f6af8"
      ],
      "author": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@cycos.com",
        "time": "Tue Nov 18 23:53:33 2014 +0100"
      },
      "committer": {
        "name": "Florian Zschocke",
        "email": "florian.zschocke@cycos.com",
        "time": "Thu Oct 27 23:52:13 2016 +0200"
      },
      "message": "Improve logging when sending email fails.\n"
    },
    {
      "commit": "bac124176649617171a0d4be4b0a4edcfa073776",
      "tree": "c3263399e3ebd8023fdcf088379d608cefe86706",
      "parents": [
        "a3665a6a8218cb19eef6bbddcbbc317258f616f1",
        "de3f435db5256bd5a106462dcfc0a2ccdce95450"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Thu Oct 27 10:52:33 2016 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 27 10:52:33 2016 -0400"
      },
      "message": "Merge pull request #1140 from tomaswolf/issue_1076\n\nIssue #1076: load commit cache in a background thread"
    },
    {
      "commit": "de3f435db5256bd5a106462dcfc0a2ccdce95450",
      "tree": "c3263399e3ebd8023fdcf088379d608cefe86706",
      "parents": [
        "a3665a6a8218cb19eef6bbddcbbc317258f616f1"
      ],
      "author": {
        "name": "Tom",
        "email": "tw201207@gmail.com",
        "time": "Wed Oct 26 21:37:19 2016 +0200"
      },
      "committer": {
        "name": "Tom",
        "email": "tw201207@gmail.com",
        "time": "Thu Oct 27 16:07:26 2016 +0200"
      },
      "message": "Issue #1076: load commit cache in a background thread\n\n* Make the CommitCache fully thread-safe. It was using a\n  ConcurrentHashMap containing lists, but then handed out these lists.\n  It also did multiple operations on that map that as a whole should\n  be atomic.\n  \n* Use isEmpty() instead of size() \u003d\u003d 0.\n\n* Run the loading of the commit cache in a background daemon thread"
    },
    {
      "commit": "a3665a6a8218cb19eef6bbddcbbc317258f616f1",
      "tree": "305728714d69a7d9f6bc335045a6cdd800bceebe",
      "parents": [
        "9b8049057430592206cfb242ec24bde4ab7cb438",
        "2b9ad25b1a1f17cf06f31b08040a7ae098935b9d"
      ],
      "author": {
        "name": "James Moger",
        "email": "james.moger@gmail.com",
        "time": "Fri Sep 16 14:24:20 2016 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 16 14:24:20 2016 -0400"
      },
      "message": "Merge pull request #1130 from larsmaes/patch-2\n\nSpelling mistake fix"
    },
    {
      "commit": "2b9ad25b1a1f17cf06f31b08040a7ae098935b9d",
      "tree": "305728714d69a7d9f6bc335045a6cdd800bceebe",
      "parents": [
        "9b8049057430592206cfb242ec24bde4ab7cb438"
      ],
      "author": {
        "name": "larsmaes",
        "email": "lars.maes@gmail.com",
        "time": "Fri Sep 16 15:25:08 2016 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 16 15:25:08 2016 +0200"
      },
      "message": "Spelling mistake fix\n\npushedNewBranch was wrongly spelled"
    },
    {
      "commit": "4365c8f0b0410f540118868bbfc30f6974db3008",
      "tree": "5d7c5dc30fdb1b362529899e12effd1947c9be48",
      "parents": [
        "b453703aa83f9e3b1605190aed3356fec9d46155"
      ],
      "author": {
        "name": "Rodrigo Andrade",
        "email": "rodrigo_cardoso@hotmail.it",
        "time": "Mon Aug 15 18:24:24 2016 -0300"
      },
      "committer": {
        "name": "Rodrigo Andrade",
        "email": "rodrigo_cardoso@hotmail.it",
        "time": "Mon Aug 15 18:24:24 2016 -0300"
      },
      "message": "removing unecessary user cookie code\n"
    }
  ],
  "next": "b453703aa83f9e3b1605190aed3356fec9d46155"
}
