From 45d05819451d0fe45da268c8b128bbeb4fa9b5de Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 13:52:04 +0100 Subject: [PATCH 001/252] release: Bump version 4.16.0 to 4.17.0 --- .bumpversion.cfg | 2 +- rhodecode/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 90e20d7b..f3be16ef 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 4.16.0 +current_version = 4.17.0 message = release: Bump version {current_version} to {new_version} [bumpversion:file:rhodecode/VERSION] diff --git a/rhodecode/VERSION b/rhodecode/VERSION index 2c9aebff..8643e722 100644 --- a/rhodecode/VERSION +++ b/rhodecode/VERSION @@ -1 +1 @@ -4.16.0 \ No newline at end of file +4.17.0 \ No newline at end of file From 828893a1914ae11ffb2234bbc10a0a96bcf87728 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 16:28:20 +0100 Subject: [PATCH 002/252] dependencies: dropped pyflakes as it's not used anymore. --- pkgs/python-packages.nix | 12 ------------ requirements.txt | 1 - rhodecode/config/licenses.json | 11 ----------- 3 files changed, 24 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index eb36b1c7..36c70f2e 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1274,17 +1274,6 @@ self: super: { license = [ pkgs.lib.licenses.mit { fullName = "LGPL/MIT"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ]; }; }; - "pyflakes" = super.buildPythonPackage { - name = "pyflakes-0.8.1"; - doCheck = false; - src = fetchurl { - url = "https://files.pythonhosted.org/packages/75/22/a90ec0252f4f87f3ffb6336504de71fe16a49d69c4538dae2f12b9360a38/pyflakes-0.8.1.tar.gz"; - sha256 = "0sbpq6pqm1i9wqi41mlfrsc5rk92jv4mskvlyxmnhlbdnc80ma1z"; - }; - meta = { - license = [ pkgs.lib.licenses.mit ]; - }; - }; "pygments" = super.buildPythonPackage { name = "pygments-2.3.1"; doCheck = false; @@ -1756,7 +1745,6 @@ self: super: { self."py-bcrypt" self."pycrypto" self."pycurl" - self."pyflakes" self."pygments" self."pyparsing" self."pyramid-beaker" diff --git a/requirements.txt b/requirements.txt index 346e0681..75d4f13b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -49,7 +49,6 @@ psutil==5.4.8 py-bcrypt==0.4 pycrypto==2.6.1 pycurl==7.43.0.2 -pyflakes==0.8.1 pygments==2.3.1 pyparsing==2.3.0 pyramid-beaker==0.8 diff --git a/rhodecode/config/licenses.json b/rhodecode/config/licenses.json index 382e1b58..610cb187 100644 --- a/rhodecode/config/licenses.json +++ b/rhodecode/config/licenses.json @@ -1481,17 +1481,6 @@ ], "name": "python2.7-pygments-markdown-lexer-0.1.0.dev39" }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-pyflakes-0.8.1" - }, { "license": { "fullName": "MIT License", From 4bcaa29b2e121c153bb93b80339aa23a8a432fa7 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 16:39:43 +0100 Subject: [PATCH 003/252] dependencies: updated some of the loosely pinned deps. - pluggyto 0.9.0 - hupper to 1.5 - configparser to 3.7.3 - python-dateutil to 2.8.0 --- pkgs/python-packages.nix | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 36c70f2e..fdd49229 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -260,11 +260,11 @@ self: super: { }; }; "configparser" = super.buildPythonPackage { - name = "configparser-3.7.1"; + name = "configparser-3.7.3"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/b6/a6/eceea7c5a5dbcf56815bed411c38cabd8a879386be10717b160e7362b5a2/configparser-3.7.1.tar.gz"; - sha256 = "0cnz213il9lhgda6x70fw7mfqr8da43s3wm343lwzhqx94mgmmav"; + url = "https://files.pythonhosted.org/packages/4a/4d/5d4c07cd28476ecad84ea5ad43961e50b6fd74cd24b9b81113650b4de6ee/configparser-3.7.3.tar.gz"; + sha256 = "0bfg1fn061djhs3aqqprk9sd5sxacj8wc6h6fhck57r7zks4qn97"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -623,11 +623,11 @@ self: super: { }; }; "hupper" = super.buildPythonPackage { - name = "hupper-1.4.2"; + name = "hupper-1.5"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/f1/75/1915dc7650b4867fa3049256e24ca8eddb5989998fcec788cf52b9812dfc/hupper-1.4.2.tar.gz"; - sha256 = "16vb9fkiaakdpcp6pn56h3w0dwvm67bxq2k2dv4i382qhqwphdzb"; + url = "https://files.pythonhosted.org/packages/89/f1/aace4ea69c1d79e243e48a81dcf1608c87e8c5a190e6ef80fae245d494ac/hupper-1.5.tar.gz"; + sha256 = "02n6y2rvpacm2w3x089whj64j1x0qlkimkzw35r1g0mymmxicfk9"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1132,11 +1132,11 @@ self: super: { }; }; "pluggy" = super.buildPythonPackage { - name = "pluggy-0.8.1"; + name = "pluggy-0.9.0"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/38/e1/83b10c17688af7b2998fa5342fec58ecbd2a5a7499f31e606ae6640b71ac/pluggy-0.8.1.tar.gz"; - sha256 = "05l6g42p9ilmabw0hlbiyxy6gyzjri41m5l11a8dzgvi77q35p4d"; + url = "https://files.pythonhosted.org/packages/a7/8c/55c629849c64e665258d8976322dfdad171fa2f57117590662d8a67618a4/pluggy-0.9.0.tar.gz"; + sha256 = "13yg2q0wgcb4l8lgdvcnzqa8db5lrw3nwn50lxjy1z5jkp7gkv0r"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1527,14 +1527,14 @@ self: super: { }; }; "python-dateutil" = super.buildPythonPackage { - name = "python-dateutil-2.7.5"; + name = "python-dateutil-2.8.0"; doCheck = false; propagatedBuildInputs = [ self."six" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/0e/01/68747933e8d12263d41ce08119620d9a7e5eb72c876a3442257f74490da0/python-dateutil-2.7.5.tar.gz"; - sha256 = "00ngwcdw36w5b37b51mdwn3qxid9zdf3kpffv2q6n9kl05y2iyc8"; + url = "https://files.pythonhosted.org/packages/ad/99/5b2e99737edeb28c71bcbec5b5dda19d0d9ef3ca3e92e3e925e7c0bb364c/python-dateutil-2.8.0.tar.gz"; + sha256 = "17nsfhy4xdz1khrfxa61vd7pmvd5z0wa3zb6v4gb4kfnykv0b668"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.asl20 { fullName = "Dual License"; } ]; @@ -1679,7 +1679,7 @@ self: super: { }; }; "rhodecode-enterprise-ce" = super.buildPythonPackage { - name = "rhodecode-enterprise-ce-4.16.0"; + name = "rhodecode-enterprise-ce-4.17.0"; buildInputs = [ self."pytest" self."py" From 428a35d29b203a74298fcb2b6e71a659b6020ecf Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 16:40:40 +0100 Subject: [PATCH 004/252] packaging: moved some not required dependencies to pinned requirements file --- pip2nix.ini | 2 +- pkgs/python-packages.nix | 7 ------- requirements.txt | 8 +------- requirements_pinned.txt | 11 +++++++++++ 4 files changed, 13 insertions(+), 15 deletions(-) create mode 100644 requirements_pinned.txt diff --git a/pip2nix.ini b/pip2nix.ini index b4904638..ad76bcf0 100644 --- a/pip2nix.ini +++ b/pip2nix.ini @@ -1,3 +1,3 @@ [pip2nix] -requirements = ., -r ./requirements.txt +requirements = ., -r ./requirements.txt, -r ./requirements_pinned.txt output = ./pkgs/python-packages.nix diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index fdd49229..e9b91536 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1701,8 +1701,6 @@ self: super: { self."setuptools-scm" self."amqp" self."authomatic" - self."atomicwrites" - self."attrs" self."babel" self."beaker" self."bleach" @@ -1722,12 +1720,9 @@ self: super: { self."formencode" self."future" self."futures" - self."gnureadline" self."infrae.cache" self."iso8601" self."itsdangerous" - self."jinja2" - self."billiard" self."kombu" self."lxml" self."mako" @@ -1739,7 +1734,6 @@ self: super: { self."paste" self."pastedeploy" self."pastescript" - self."pathlib2" self."peppercorn" self."psutil" self."py-bcrypt" @@ -1801,7 +1795,6 @@ self: super: { self."greenlet" self."gunicorn" self."waitress" - self."setproctitle" self."ipdb" self."ipython" self."rhodecode-tools" diff --git a/requirements.txt b/requirements.txt index 75d4f13b..0a83bc36 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,8 +4,7 @@ setuptools-scm==2.1.0 amqp==2.3.1 # not released authomatic that has updated some oauth providers https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1 -atomicwrites==1.2.1 -attrs==18.2.0 + babel==1.3 beaker==1.9.1 bleach==3.0.2 @@ -26,12 +25,9 @@ ecdsa==0.13 formencode==1.2.4 future==0.14.3 futures==3.0.2 -gnureadline==6.3.8 infrae.cache==1.0.1 iso8601==0.1.12 itsdangerous==0.24 -jinja2==2.9.6 -billiard==3.5.0.3 kombu==4.2.1 lxml==4.2.5 mako==1.0.7 @@ -43,7 +39,6 @@ packaging==15.2 paste==3.0.5 pastedeploy==2.0.1 pastescript==3.0.0 -pathlib2==2.3.3 peppercorn==0.6 psutil==5.4.8 py-bcrypt==0.4 @@ -115,7 +110,6 @@ gevent==1.4.0 greenlet==0.4.15 gunicorn==19.9.0 waitress==1.1.0 -setproctitle==1.1.10 ## debug ipdb==0.11.0 diff --git a/requirements_pinned.txt b/requirements_pinned.txt new file mode 100644 index 00000000..cee5e38f --- /dev/null +++ b/requirements_pinned.txt @@ -0,0 +1,11 @@ +# contains not directly required libraries we want to pin the version. + +atomicwrites==1.2.1 +attrs==18.2.0 +billiard==3.5.0.3 +gnureadline==6.3.8 +jinja2==2.9.6 +jsonschema==2.6.0 +pathlib2==2.3.3 +setproctitle==1.1.10 + From bf6c34fe0828efe2f4987c8c5f2ae56f9c67cb26 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:44:25 +0100 Subject: [PATCH 005/252] dependencies: updated bleach to 3.1.0 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index e9b91536..5546084b 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -146,15 +146,15 @@ self: super: { }; }; "bleach" = super.buildPythonPackage { - name = "bleach-3.0.2"; + name = "bleach-3.1.0"; doCheck = false; propagatedBuildInputs = [ self."six" self."webencodings" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/ae/31/680afc7d44040004296a2d8f0584983c2f2386448cd9d0964197e6c1160e/bleach-3.0.2.tar.gz"; - sha256 = "06474zg7f73hv8h1xw2wcsmvn2ygj73zxgxxqg8zcx8ap1srdls8"; + url = "https://files.pythonhosted.org/packages/78/5a/0df03e8735cd9c75167528299c738702437589b9c71a849489d00ffa82e8/bleach-3.1.0.tar.gz"; + sha256 = "1yhrgrhkln8bd6gn3imj69g1h4xqah9gaz9q26crqr6gmmvpzprz"; }; meta = { license = [ pkgs.lib.licenses.asl20 ]; diff --git a/requirements.txt b/requirements.txt index 0a83bc36..eae0dc42 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c371 babel==1.3 beaker==1.9.1 -bleach==3.0.2 +bleach==3.1.0 celery==4.1.1 chameleon==2.24 channelstream==0.5.2 From cde3f75e782842e10833ba62009eece23024de3e Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:45:00 +0100 Subject: [PATCH 006/252] dependencies [security]: updated colander to 1.7.0 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 5546084b..cc9e0b39 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -230,7 +230,7 @@ self: super: { }; }; "colander" = super.buildPythonPackage { - name = "colander-1.5.1"; + name = "colander-1.7.0"; doCheck = false; propagatedBuildInputs = [ self."translationstring" @@ -238,8 +238,8 @@ self: super: { self."enum34" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/ec/d1/fcca811a0a692c69d27e36b4d11a73acb98b4bab48323442642b6fd4386d/colander-1.5.1.tar.gz"; - sha256 = "18ah4cwwxnpm6qxi6x9ipy51dal4spd343h44s5wd01cnhgrwsyq"; + url = "https://files.pythonhosted.org/packages/db/e4/74ab06f54211917b41865cafc987ce511e35503de48da9bfe9358a1bdc3e/colander-1.7.0.tar.gz"; + sha256 = "1wl1bqab307lbbcjx81i28s3yl6dlm4rf15fxawkjb6j48x1cn6p"; }; meta = { license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; diff --git a/requirements.txt b/requirements.txt index eae0dc42..ec845601 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ celery==4.1.1 chameleon==2.24 channelstream==0.5.2 click==7.0 -colander==1.5.1 +colander==1.7.0 # our custom configobj https://code.rhodecode.com/upstream/configobj/archive/a11ff0a0bd4fbda9e3a91267e720f88329efb4a6.tar.gz?md5=9916c524ea11a6c418217af6b28d4b3c#egg=configobj==5.0.6 cssselect==1.0.3 From 19421f2c7aa60b66341433e8875bce1d6178a56f Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:45:31 +0100 Subject: [PATCH 007/252] dependencies: updated psutil to 5.5.1 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index cc9e0b39..f8bdf3ca 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1158,11 +1158,11 @@ self: super: { }; }; "psutil" = super.buildPythonPackage { - name = "psutil-5.4.8"; + name = "psutil-5.5.1"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/e3/58/0eae6e4466e5abf779d7e2b71fac7fba5f59e00ea36ddb3ed690419ccb0f/psutil-5.4.8.tar.gz"; - sha256 = "1hyna338sml2cl1mfb2gs89np18z27mvyhmq4ifh22x07n7mq9kf"; + url = "https://files.pythonhosted.org/packages/c7/01/7c30b247cdc5ba29623faa5c8cf1f1bbf7e041783c340414b0ed7e067c64/psutil-5.5.1.tar.gz"; + sha256 = "045qaqvn6k90bj5bcy259yrwcd2afgznaav3sfhphy9b8ambzkkj"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; diff --git a/requirements.txt b/requirements.txt index ec845601..5e17db7a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,7 +40,7 @@ paste==3.0.5 pastedeploy==2.0.1 pastescript==3.0.0 peppercorn==0.6 -psutil==5.4.8 +psutil==5.5.1 py-bcrypt==0.4 pycrypto==2.6.1 pycurl==7.43.0.2 From 97d50a5ea31a3f7a0ce608f98026af9380ecd080 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:45:58 +0100 Subject: [PATCH 008/252] dependencies: updated psycopg2 to 2.7.7 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index f8bdf3ca..da8dd5d0 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1169,11 +1169,11 @@ self: super: { }; }; "psycopg2" = super.buildPythonPackage { - name = "psycopg2-2.7.5"; + name = "psycopg2-2.7.7"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz"; - sha256 = "17klx964gw8z0znl0raz3by8vdc7cq5gxj4pdcrfcina84nrdkzc"; + url = "https://files.pythonhosted.org/packages/63/54/c039eb0f46f9a9406b59a638415c2012ad7be9b4b97bfddb1f48c280df3a/psycopg2-2.7.7.tar.gz"; + sha256 = "0zjbabb4qjx9dm07imhf8y5a9rpa06d5zah80myiimgdi83nslpl"; }; meta = { license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ]; diff --git a/requirements.txt b/requirements.txt index 5e17db7a..e73296f4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -91,7 +91,7 @@ zope.interface==4.5.0 mysql-python==1.2.5 pymysql==0.8.1 pysqlite==2.8.3 -psycopg2==2.7.5 +psycopg2==2.7.7 # IPYTHON RENDERING # entrypoints backport, pypi version doesn't support egg installs From 76929c5ce05a450589eb40dbc4dc8dd9cc16b8ae Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:46:33 +0100 Subject: [PATCH 009/252] dependencies: updated zope.deprecation to 4.4.0 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index da8dd5d0..26079b7a 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -2274,14 +2274,14 @@ self: super: { }; }; "zope.deprecation" = super.buildPythonPackage { - name = "zope.deprecation-4.3.0"; + name = "zope.deprecation-4.4.0"; doCheck = false; propagatedBuildInputs = [ self."setuptools" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/a1/18/2dc5e6bfe64fdc3b79411b67464c55bb0b43b127051a20f7f492ab767758/zope.deprecation-4.3.0.tar.gz"; - sha256 = "095jas41wbxgmw95kwdxqhbc3bgihw2hzj9b3qpdg85apcsf2lkx"; + url = "https://files.pythonhosted.org/packages/34/da/46e92d32d545dd067b9436279d84c339e8b16de2ca393d7b892bc1e1e9fd/zope.deprecation-4.4.0.tar.gz"; + sha256 = "1pz2cv7gv9y1r3m0bdv7ks1alagmrn5msm5spwdzkb2by0w36i8d"; }; meta = { license = [ pkgs.lib.licenses.zpl21 ]; diff --git a/requirements.txt b/requirements.txt index e73296f4..14ae6e07 100644 --- a/requirements.txt +++ b/requirements.txt @@ -83,9 +83,9 @@ webob==1.8.4 whoosh==2.7.4 wsgiref==0.1.2 zope.cachedescriptors==4.3.1 -zope.deprecation==4.3.0 zope.event==4.3.0 zope.interface==4.5.0 +zope.deprecation==4.4.0 # DB drivers mysql-python==1.2.5 From 85a5ef3b27f5f04fc2a38239cc283db7d25f7e3e Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:47:06 +0100 Subject: [PATCH 010/252] dependencies: updated zope.event to 4.4 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 26079b7a..9e8fa054 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -2288,14 +2288,14 @@ self: super: { }; }; "zope.event" = super.buildPythonPackage { - name = "zope.event-4.3.0"; + name = "zope.event-4.4"; doCheck = false; propagatedBuildInputs = [ self."setuptools" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/9e/d0/54ba59f19a0635f6591b74be259cf6fbf67e73f4edda27b5cd0cf4d26efa/zope.event-4.3.0.tar.gz"; - sha256 = "1rrkyx42bcq8dkpj23c2v99kczlrg8d39c06q5qpr0vs4hjfmv70"; + url = "https://files.pythonhosted.org/packages/4c/b2/51c0369adcf5be2334280eed230192ab3b03f81f8efda9ddea6f65cc7b32/zope.event-4.4.tar.gz"; + sha256 = "1ksbc726av9xacml6jhcfyn828hlhb9xlddpx6fcvnlvmpmpvhk9"; }; meta = { license = [ pkgs.lib.licenses.zpl21 ]; diff --git a/requirements.txt b/requirements.txt index 14ae6e07..22a3b828 100644 --- a/requirements.txt +++ b/requirements.txt @@ -83,9 +83,9 @@ webob==1.8.4 whoosh==2.7.4 wsgiref==0.1.2 zope.cachedescriptors==4.3.1 -zope.event==4.3.0 zope.interface==4.5.0 zope.deprecation==4.4.0 +zope.event==4.4.0 # DB drivers mysql-python==1.2.5 From 63751338c3b6ef6a87853349b9fb2660c9b11bef Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:47:47 +0100 Subject: [PATCH 011/252] dependencies: updated zope.interface to 4.6.0 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 9e8fa054..1745caae 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -2302,14 +2302,14 @@ self: super: { }; }; "zope.interface" = super.buildPythonPackage { - name = "zope.interface-4.5.0"; + name = "zope.interface-4.6.0"; doCheck = false; propagatedBuildInputs = [ self."setuptools" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/ac/8a/657532df378c2cd2a1fe6b12be3b4097521570769d4852ec02c24bd3594e/zope.interface-4.5.0.tar.gz"; - sha256 = "0k67m60ij06wkg82n15qgyn96waf4pmrkhv0njpkfzpmv5q89hsp"; + url = "https://files.pythonhosted.org/packages/4e/d0/c9d16bd5b38de44a20c6dc5d5ed80a49626fafcb3db9f9efdc2a19026db6/zope.interface-4.6.0.tar.gz"; + sha256 = "1rgh2x3rcl9r0v0499kf78xy86rnmanajf4ywmqb943wpk50sg8v"; }; meta = { license = [ pkgs.lib.licenses.zpl21 ]; diff --git a/requirements.txt b/requirements.txt index 22a3b828..8fa70b38 100644 --- a/requirements.txt +++ b/requirements.txt @@ -83,9 +83,9 @@ webob==1.8.4 whoosh==2.7.4 wsgiref==0.1.2 zope.cachedescriptors==4.3.1 -zope.interface==4.5.0 zope.deprecation==4.4.0 zope.event==4.4.0 +zope.interface==4.6.0 # DB drivers mysql-python==1.2.5 From 3bfba2c72e984958a52f998d2cedb103e3067745 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 21:57:02 +0100 Subject: [PATCH 012/252] dependencies [security]: updated sshpubkeys to 3.1.0 - dropped pycrypto (had CVEs) --- pkgs/python-packages-overrides.nix | 12 ++++++ pkgs/python-packages.nix | 62 +++++++++++++++++++++++++----- requirements.txt | 3 +- rhodecode/config/licenses.json | 9 ----- 4 files changed, 65 insertions(+), 21 deletions(-) diff --git a/pkgs/python-packages-overrides.nix b/pkgs/python-packages-overrides.nix index 3881d18e..cd157c3b 100644 --- a/pkgs/python-packages-overrides.nix +++ b/pkgs/python-packages-overrides.nix @@ -35,6 +35,18 @@ self: super: { ]; }); + "cffi" = super."cffi".override (attrs: { + buildInputs = [ + pkgs.libffi + ]; + }); + + "cryptography" = super."cryptography".override (attrs: { + buildInputs = [ + pkgs.openssl + ]; + }); + "gevent" = super."gevent".override (attrs: { propagatedBuildInputs = attrs.propagatedBuildInputs ++ [ # NOTE: (marcink) odd requirements from gevent aren't set properly, diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 1745caae..356ecc25 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -51,6 +51,17 @@ self: super: { license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; + "asn1crypto" = super.buildPythonPackage { + name = "asn1crypto-0.24.0"; + doCheck = false; + src = fetchurl { + url = "https://files.pythonhosted.org/packages/fc/f1/8db7daa71f414ddabfa056c4ef792e1461ff655c2ae2928a2b675bfed6b4/asn1crypto-0.24.0.tar.gz"; + sha256 = "0jaf8rf9dx1lf23xfv2cdd5h52f1qr3w8k63985bc35g3d220p4x"; + }; + meta = { + license = [ pkgs.lib.licenses.mit ]; + }; + }; "atomicwrites" = super.buildPythonPackage { name = "atomicwrites-1.2.1"; doCheck = false; @@ -187,6 +198,20 @@ self: super: { license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; + "cffi" = super.buildPythonPackage { + name = "cffi-1.12.1"; + doCheck = false; + propagatedBuildInputs = [ + self."pycparser" + ]; + src = fetchurl { + url = "https://files.pythonhosted.org/packages/bc/81/47bd0404f2cb5363edb371e3b15da6387b5e9b80122e5b81be8b8f411e9b/cffi-1.12.1.tar.gz"; + sha256 = "0cw0dzynw34zi75h674y3bgas6axfjyw1h6hj6ic2llcwyj7nvwv"; + }; + meta = { + license = [ pkgs.lib.licenses.mit ]; + }; + }; "chameleon" = super.buildPythonPackage { name = "chameleon-2.24"; doCheck = false; @@ -295,6 +320,24 @@ self: super: { license = [ pkgs.lib.licenses.asl20 ]; }; }; + "cryptography" = super.buildPythonPackage { + name = "cryptography-2.5"; + doCheck = false; + propagatedBuildInputs = [ + self."asn1crypto" + self."six" + self."cffi" + self."enum34" + self."ipaddress" + ]; + src = fetchurl { + url = "https://files.pythonhosted.org/packages/69/ed/5e97b7f54237a9e4e6291b6e52173372b7fa45ca730d36ea90b790c0059a/cryptography-2.5.tar.gz"; + sha256 = "00c4d7gvsymlaw0r13zrm32dcnarmpayjyrh65yymlmr6mrbcij9"; + }; + meta = { + license = [ pkgs.lib.licenses.bsdOriginal { fullName = "BSD or Apache License, Version 2.0"; } pkgs.lib.licenses.asl20 ]; + }; + }; "cssselect" = super.buildPythonPackage { name = "cssselect-1.0.3"; doCheck = false; @@ -1252,15 +1295,15 @@ self: super: { license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; - "pycrypto" = super.buildPythonPackage { - name = "pycrypto-2.6.1"; + "pycparser" = super.buildPythonPackage { + name = "pycparser-2.19"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz"; - sha256 = "0g0ayql5b9mkjam8hym6zyg6bv77lbh66rv1fyvgqb17kfc1xkpj"; + url = "https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz"; + sha256 = "1cr5dcj9628lkz1qlwq3fv97c25363qppkmcayqvd05dpy573259"; }; meta = { - license = [ pkgs.lib.licenses.publicDomain ]; + license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; "pycurl" = super.buildPythonPackage { @@ -1737,7 +1780,6 @@ self: super: { self."peppercorn" self."psutil" self."py-bcrypt" - self."pycrypto" self."pycurl" self."pygments" self."pyparsing" @@ -1947,15 +1989,15 @@ self: super: { }; }; "sshpubkeys" = super.buildPythonPackage { - name = "sshpubkeys-2.2.0"; + name = "sshpubkeys-3.1.0"; doCheck = false; propagatedBuildInputs = [ - self."pycrypto" + self."cryptography" self."ecdsa" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/27/da/337fabeb3dca6b62039a93ceaa636f25065e0ae92b575b1235342076cf0a/sshpubkeys-2.2.0.tar.gz"; - sha256 = "0r4kpwzmg96a2x56pllik7dmc3fnqk189v3sfgsi07q2ryrhr6xm"; + url = "https://files.pythonhosted.org/packages/00/23/f7508a12007c96861c3da811992f14283d79c819d71a217b3e12d5196649/sshpubkeys-3.1.0.tar.gz"; + sha256 = "105g2li04nm1hb15a2y6hm9m9k7fbrkd5l3gy12w3kgcmsf3k25k"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; diff --git a/requirements.txt b/requirements.txt index 8fa70b38..0330b790 100644 --- a/requirements.txt +++ b/requirements.txt @@ -42,7 +42,6 @@ pastescript==3.0.0 peppercorn==0.6 psutil==5.5.1 py-bcrypt==0.4 -pycrypto==2.6.1 pycurl==7.43.0.2 pygments==2.3.1 pyparsing==2.3.0 @@ -68,7 +67,7 @@ routes==2.4.1 simplejson==3.16.0 six==1.11.0 sqlalchemy==1.1.18 -sshpubkeys==2.2.0 +sshpubkeys==3.1.0 subprocess32==3.5.3 supervisor==3.3.5 tempita==0.5.2 diff --git a/rhodecode/config/licenses.json b/rhodecode/config/licenses.json index 610cb187..9e83522a 100644 --- a/rhodecode/config/licenses.json +++ b/rhodecode/config/licenses.json @@ -1138,15 +1138,6 @@ ], "name": "python2.7-ecdsa-0.13" }, - { - "license": [ - { - "fullName": "Public Domain", - "shortName": "publicDomain" - } - ], - "name": "python2.7-pycrypto-2.6.1" - }, { "license": [ { From 6cea271467b526f2229d572ebbccb556d0b760b8 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 22:46:46 +0100 Subject: [PATCH 013/252] cleanup: removed pycrypto code from db schema, it's unused anyway --- rhodecode/lib/dbmigrate/schema/db_3_0_0_1.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/rhodecode/lib/dbmigrate/schema/db_3_0_0_1.py b/rhodecode/lib/dbmigrate/schema/db_3_0_0_1.py index de74c5ad..188beb63 100644 --- a/rhodecode/lib/dbmigrate/schema/db_3_0_0_1.py +++ b/rhodecode/lib/dbmigrate/schema/db_3_0_0_1.py @@ -38,8 +38,6 @@ from sqlalchemy.orm import relationship, joinedload, class_mapper, validates from sqlalchemy.exc import OperationalError from beaker.cache import cache_region, region_invalidate from webob.exc import HTTPNotFound -from Crypto.Cipher import AES -from Crypto import Random from zope.cachedescriptors.property import Lazy as LazyProperty from rhodecode.translation import _ From 2b3ffd037273bc9539bef9e603aec360e71be599 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 25 Feb 2019 22:49:45 +0100 Subject: [PATCH 014/252] ssh: replaced pycrypto with cryptography to generate SSH keys. - pycrypto has been removed now - pycrypto has CVEs and it's deprecated --- rhodecode/model/ssh_key.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/rhodecode/model/ssh_key.py b/rhodecode/model/ssh_key.py index fe855841..e4ca1f96 100644 --- a/rhodecode/model/ssh_key.py +++ b/rhodecode/model/ssh_key.py @@ -24,10 +24,15 @@ import traceback import sshpubkeys import sshpubkeys.exceptions +from cryptography.hazmat.primitives.asymmetric import rsa +from cryptography.hazmat.primitives import serialization as crypto_serialization +from cryptography.hazmat.backends import default_backend as crypto_default_backend + from rhodecode.model import BaseModel from rhodecode.model.db import UserSshKeys from rhodecode.model.meta import Session + log = logging.getLogger(__name__) @@ -62,16 +67,24 @@ class SshKeyModel(BaseModel): raise def generate_keypair(self, comment=None): - from Crypto.PublicKey import RSA - key = RSA.generate(2048) - private = key.exportKey('PEM') + key = rsa.generate_private_key( + backend=crypto_default_backend(), + public_exponent=65537, + key_size=2048 + ) + private_key = key.private_bytes( + crypto_serialization.Encoding.PEM, + crypto_serialization.PrivateFormat.PKCS8, + crypto_serialization.NoEncryption()) + public_key = key.public_key().public_bytes( + crypto_serialization.Encoding.OpenSSH, + crypto_serialization.PublicFormat.OpenSSH + ) - pubkey = key.publickey() - public = pubkey.exportKey('OpenSSH') if comment: - public = public + " " + comment - return private, public + public_key = public_key + " " + comment + return private_key, public_key def create(self, user, fingerprint, key_data, description): """ From 57f02c191ad4ca97b95d5f471ed1f72d02ffb620 Mon Sep 17 00:00:00 2001 From: Daniel Dourvaris Date: Tue, 26 Feb 2019 11:00:52 +0100 Subject: [PATCH 015/252] dependencies: bring back pycrypto as we cannot migrate our encrypted data and need to keep it for backward compat --- pkgs/python-packages.nix | 12 ++++++++++++ requirements.txt | 1 + 2 files changed, 13 insertions(+) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 356ecc25..8e7f9cf9 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1306,6 +1306,17 @@ self: super: { license = [ pkgs.lib.licenses.bsdOriginal ]; }; }; + "pycrypto" = super.buildPythonPackage { + name = "pycrypto-2.6.1"; + doCheck = false; + src = fetchurl { + url = "https://files.pythonhosted.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz"; + sha256 = "0g0ayql5b9mkjam8hym6zyg6bv77lbh66rv1fyvgqb17kfc1xkpj"; + }; + meta = { + license = [ pkgs.lib.licenses.publicDomain ]; + }; + }; "pycurl" = super.buildPythonPackage { name = "pycurl-7.43.0.2"; doCheck = false; @@ -1781,6 +1792,7 @@ self: super: { self."psutil" self."py-bcrypt" self."pycurl" + self."pycrypto" self."pygments" self."pyparsing" self."pyramid-beaker" diff --git a/requirements.txt b/requirements.txt index 0330b790..a336b442 100644 --- a/requirements.txt +++ b/requirements.txt @@ -43,6 +43,7 @@ peppercorn==0.6 psutil==5.5.1 py-bcrypt==0.4 pycurl==7.43.0.2 +pycrypto==2.6.1 pygments==2.3.1 pyparsing==2.3.0 pyramid-beaker==0.8 From 823c59c0110c9a21374a8f16072213d88d6abf5f Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Tue, 26 Feb 2019 13:18:24 +0100 Subject: [PATCH 016/252] encryption: added new backend using cryptography + Fernet encryption. - This would soon replace the old deprecated one based on pycrypto - We need a migration for the encryption data --- configs/development.ini | 5 +++ configs/production.ini | 5 +++ rhodecode/lib/encrypt.py | 26 ++++++++++- rhodecode/lib/encrypt2.py | 69 +++++++++++++++++++++++++++++ rhodecode/model/db.py | 64 +++++++++++++------------- rhodecode/tests/lib/test_encrypt.py | 57 ++++++++++++++++++++++++ 6 files changed, 194 insertions(+), 32 deletions(-) create mode 100644 rhodecode/lib/encrypt2.py diff --git a/configs/development.ini b/configs/development.ini index 1d2eb17b..1d9a0b49 100644 --- a/configs/development.ini +++ b/configs/development.ini @@ -133,6 +133,11 @@ rhodecode.api.url = /_admin/api ## `SignatureVerificationError` in case of wrong key, or damaged encryption data. #rhodecode.encrypted_values.strict = false +## Pick algorithm for encryption. Either fernet (more secure) or aes (default) +## fernet is safer, and we strongly recommend switching to it. +## Due to backward compatibility aes is used as default. +#rhodecode.encrypted_values.algorithm = fernet + ## return gzipped responses from RhodeCode (static files/application) gzip_responses = false diff --git a/configs/production.ini b/configs/production.ini index 5322f179..67cdd189 100644 --- a/configs/production.ini +++ b/configs/production.ini @@ -108,6 +108,11 @@ use = egg:rhodecode-enterprise-ce ## `SignatureVerificationError` in case of wrong key, or damaged encryption data. #rhodecode.encrypted_values.strict = false +## Pick algorithm for encryption. Either fernet (more secure) or aes (default) +## fernet is safer, and we strongly recommend switching to it. +## Due to backward compatibility aes is used as default. +#rhodecode.encrypted_values.algorithm = fernet + ## return gzipped responses from RhodeCode (static files/application) gzip_responses = false diff --git a/rhodecode/lib/encrypt.py b/rhodecode/lib/encrypt.py index cb90497f..c528494b 100644 --- a/rhodecode/lib/encrypt.py +++ b/rhodecode/lib/encrypt.py @@ -111,4 +111,28 @@ class AESCipher(object): @staticmethod def _unpad(s): - return s[:-ord(s[len(s)-1:])] \ No newline at end of file + return s[:-ord(s[len(s)-1:])] + + +def validate_and_get_enc_data(enc_data, enc_key, enc_strict_mode): + parts = enc_data.split('$', 3) + if not len(parts) == 3: + # probably not encrypted values + return enc_data + else: + if parts[0] != 'enc': + # parts ok but without our header ? + return enc_data + + # at that stage we know it's our encryption + if parts[1] == 'aes': + decrypted_data = AESCipher(enc_key).decrypt(parts[2]) + elif parts[1] == 'aes_hmac': + decrypted_data = AESCipher( + enc_key, hmac=True, + strict_verification=enc_strict_mode).decrypt(parts[2]) + else: + raise ValueError( + 'Encryption type part is wrong, must be `aes` ' + 'or `aes_hmac`, got `%s` instead' % (parts[1])) + return decrypted_data diff --git a/rhodecode/lib/encrypt2.py b/rhodecode/lib/encrypt2.py new file mode 100644 index 00000000..053d1eb6 --- /dev/null +++ b/rhodecode/lib/encrypt2.py @@ -0,0 +1,69 @@ +import os +import base64 +from cryptography.fernet import Fernet, InvalidToken +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC + + +class Encryptor(object): + key_format = 'enc2$salt:{}$data:{}' + pref_len = 5 # salt:, data: + + def __init__(self, enc_key): + self.enc_key = enc_key + + def b64_encode(self, data): + return base64.urlsafe_b64encode(data) + + def b64_decode(self, data): + return base64.urlsafe_b64decode(data) + + def get_encryptor(self, salt): + """ + Uses Fernet as encryptor with HMAC signature + :param salt: random salt used for encrypting the data + """ + kdf = PBKDF2HMAC( + algorithm=hashes.SHA512(), + length=32, + salt=salt, + iterations=100000, + backend=default_backend() + ) + key = self.b64_encode(kdf.derive(self.enc_key)) + return Fernet(key) + + def _get_parts(self, enc_data): + parts = enc_data.split('$', 3) + if len(parts) != 3: + raise ValueError('Encrypted Data has invalid format, expected {}'.format(self.key_format)) + prefix, salt, enc_data = parts + + try: + salt = self.b64_decode(salt[self.pref_len:]) + except TypeError: + # bad base64 + raise ValueError('Encrypted Data salt invalid format, expected base64 format') + + enc_data = enc_data[self.pref_len:] + return prefix, salt, enc_data + + def encrypt(self, data): + salt = os.urandom(64) + encryptor = self.get_encryptor(salt) + enc_data = encryptor.encrypt(data) + return self.key_format.format(self.b64_encode(salt), enc_data) + + def decrypt(self, data, safe=True): + parts = self._get_parts(data) + salt = parts[1] + enc_data = parts[2] + encryptor = self.get_encryptor(salt) + try: + return encryptor.decrypt(enc_data) + except (InvalidToken,): + if safe: + return '' + else: + raise diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py index 87f7bcac..83c869ca 100644 --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -62,8 +62,8 @@ from rhodecode.lib.jsonalchemy import MutationObj, MutationList, JsonType, \ JsonRaw from rhodecode.lib.ext_json import json from rhodecode.lib.caching_query import FromCache -from rhodecode.lib.encrypt import AESCipher - +from rhodecode.lib.encrypt import AESCipher, validate_and_get_enc_data +from rhodecode.lib.encrypt2 import Encryptor from rhodecode.model.meta import Base, Session URL_SEP = '/' @@ -159,44 +159,46 @@ class EncryptedTextValue(TypeDecorator): impl = Text def process_bind_param(self, value, dialect): + """ + Setter for storing value + """ + import rhodecode if not value: return value - if value.startswith('enc$aes$') or value.startswith('enc$aes_hmac$'): - # protect against double encrypting if someone manually starts - # doing - raise ValueError('value needs to be in unencrypted format, ie. ' - 'not starting with enc$aes') - return 'enc$aes_hmac$%s' % AESCipher( - ENCRYPTION_KEY, hmac=True).encrypt(value) + + # protect against double encrypting if values is already encrypted + if value.startswith('enc$aes$') \ + or value.startswith('enc$aes_hmac$') \ + or value.startswith('enc2$'): + raise ValueError('value needs to be in unencrypted format, ' + 'ie. not starting with enc$ or enc2$') + + algo = rhodecode.CONFIG.get('rhodecode.encrypted_values.algorithm') or 'aes' + if algo == 'aes': + return 'enc$aes_hmac$%s' % AESCipher(ENCRYPTION_KEY, hmac=True).encrypt(value) + elif algo == 'fernet': + return Encryptor(ENCRYPTION_KEY).encrypt(value) + else: + ValueError('Bad encryption algorithm, should be fernet or aes, got: {}'.format(algo)) def process_result_value(self, value, dialect): - import rhodecode + """ + Getter for retrieving value + """ + import rhodecode if not value: return value - parts = value.split('$', 3) - if not len(parts) == 3: - # probably not encrypted values - return value + algo = rhodecode.CONFIG.get('rhodecode.encrypted_values.algorithm') or 'aes' + enc_strict_mode = str2bool(rhodecode.CONFIG.get('rhodecode.encrypted_values.strict') or True) + if algo == 'aes': + decrypted_data = validate_and_get_enc_data(value, ENCRYPTION_KEY, enc_strict_mode) + elif algo == 'fernet': + return Encryptor(ENCRYPTION_KEY).decrypt(value) else: - if parts[0] != 'enc': - # parts ok but without our header ? - return value - enc_strict_mode = str2bool(rhodecode.CONFIG.get( - 'rhodecode.encrypted_values.strict') or True) - # at that stage we know it's our encryption - if parts[1] == 'aes': - decrypted_data = AESCipher(ENCRYPTION_KEY).decrypt(parts[2]) - elif parts[1] == 'aes_hmac': - decrypted_data = AESCipher( - ENCRYPTION_KEY, hmac=True, - strict_verification=enc_strict_mode).decrypt(parts[2]) - else: - raise ValueError( - 'Encryption type part is wrong, must be `aes` ' - 'or `aes_hmac`, got `%s` instead' % (parts[1])) - return decrypted_data + ValueError('Bad encryption algorithm, should be fernet or aes, got: {}'.format(algo)) + return decrypted_data class BaseModel(object): diff --git a/rhodecode/tests/lib/test_encrypt.py b/rhodecode/tests/lib/test_encrypt.py index 210535db..a823b307 100644 --- a/rhodecode/tests/lib/test_encrypt.py +++ b/rhodecode/tests/lib/test_encrypt.py @@ -22,6 +22,7 @@ import pytest from rhodecode.lib.encrypt import ( AESCipher, SignatureVerificationError, InvalidDecryptedValue) +from rhodecode.lib.encrypt2 import (Encryptor, InvalidToken) class TestEncryptModule(object): @@ -74,3 +75,59 @@ class TestEncryptModule(object): assert isinstance(AESCipher( 'differentsecret', hmac=True, strict_verification=False ).decrypt(enc), InvalidDecryptedValue) + + +class TestEncryptModule2(object): + + @pytest.mark.parametrize( + "key, text", + [ + ('a', 'short'), + ('a'*64, 'too long(trimmed to 32)'), + ('a'*32, 'just enough'), + ('ąćęćę', 'non asci'), + ('$asa$asa', 'special $ used'), + ] + ) + def test_encryption(self, key, text): + enc = Encryptor(key).encrypt(text) + assert Encryptor(key).decrypt(enc) == text + + def test_encryption_with_bad_key(self): + key = 'secretstring' + text = 'ihatemysql' + enc = Encryptor(key).encrypt(text) + + assert Encryptor('differentsecret').decrypt(enc) == '' + + def test_encryption_with_bad_key_raises(self): + key = 'secretstring' + text = 'ihatemysql' + enc = Encryptor(key).encrypt(text) + + with pytest.raises(InvalidToken) as e: + Encryptor('differentsecret').decrypt(enc, safe=False) + + assert 'InvalidToken' in str(e) + + def test_encryption_with_bad_format_data(self): + key = 'secret' + text = 'ihatemysql' + enc = Encryptor(key).encrypt(text) + enc = '$xyz' + enc[3:] + + with pytest.raises(ValueError) as e: + Encryptor(key).decrypt(enc, safe=False) + + assert 'Encrypted Data has invalid format' in str(e) + + def test_encryption_with_bad_data(self): + key = 'secret' + text = 'ihatemysql' + enc = Encryptor(key).encrypt(text) + enc = enc[:-5] + + with pytest.raises(InvalidToken) as e: + Encryptor(key).decrypt(enc, safe=False) + + assert 'InvalidToken' in str(e) From 5e68ab12e26c31debd19e40d1db7560ae947b24a Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Tue, 26 Feb 2019 17:24:12 +0100 Subject: [PATCH 017/252] docs: updated saml bulk instructions --- docs/auth/auth-saml-bulk-enroll-users.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/auth/auth-saml-bulk-enroll-users.rst b/docs/auth/auth-saml-bulk-enroll-users.rst index b0b05f28..cc3bd511 100644 --- a/docs/auth/auth-saml-bulk-enroll-users.rst +++ b/docs/auth/auth-saml-bulk-enroll-users.rst @@ -32,9 +32,9 @@ The most important this id needs to be unique for each user. In [1]: saml2user = { ...: # OneLogin, uses externalID available to read from in the UI - ...: 123: {'id: '48253211'}, + ...: 123: {'id': '48253211'}, ...: # for Google/DuoSecurity email is also an option for unique ID - ...: 124: {'id: 'email@domain.com'}, + ...: 124: {'id': 'email@domain.com'}, ...: } @@ -70,7 +70,7 @@ Enter in the ishell prompt ...: new_external_identity.external_id = external_id ...: new_external_identity.external_username = '{}-saml-{}'.format(user.username, user.user_id) ...: new_external_identity.provider_name = provider - ...: new_external_identity.local_user_id = user_id + ...: new_external_identity.local_user_id = user.user_id ...: new_external_identity.access_token = '' ...: new_external_identity.token_secret = '' ...: new_external_identity.alt_token = '' From 4cfd4ac542081910eb601db30aebd276e9e0e57a Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 27 Feb 2019 17:03:05 +0100 Subject: [PATCH 018/252] tests: fixed SSH Key tests --- rhodecode/apps/admin/tests/test_admin_users_ssh_keys.py | 2 +- rhodecode/apps/my_account/tests/test_my_account_ssh_keys.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rhodecode/apps/admin/tests/test_admin_users_ssh_keys.py b/rhodecode/apps/admin/tests/test_admin_users_ssh_keys.py index bcda9554..e8b07e2b 100644 --- a/rhodecode/apps/admin/tests/test_admin_users_ssh_keys.py +++ b/rhodecode/apps/admin/tests/test_admin_users_ssh_keys.py @@ -173,4 +173,4 @@ class TestAdminUsersSshKeysView(TestController): response.mustcontain('Private key') response.mustcontain('Public key') - response.mustcontain('-----BEGIN RSA PRIVATE KEY-----') + response.mustcontain('-----BEGIN PRIVATE KEY-----') diff --git a/rhodecode/apps/my_account/tests/test_my_account_ssh_keys.py b/rhodecode/apps/my_account/tests/test_my_account_ssh_keys.py index 913641d1..756953bc 100644 --- a/rhodecode/apps/my_account/tests/test_my_account_ssh_keys.py +++ b/rhodecode/apps/my_account/tests/test_my_account_ssh_keys.py @@ -160,4 +160,4 @@ class TestMyAccountSshKeysView(TestController): response.mustcontain('Private key') response.mustcontain('Public key') - response.mustcontain('-----BEGIN RSA PRIVATE KEY-----') + response.mustcontain('-----BEGIN PRIVATE KEY-----') From 50b4956860de799315bc9a509ef2dbbafc08de34 Mon Sep 17 00:00:00 2001 From: Daniel Dourvaris Date: Thu, 28 Feb 2019 12:45:48 +0100 Subject: [PATCH 019/252] tests: protocol ops, added --pull and --pull --stream clone tests --- .../tests/vcs_operations/test_vcs_operations.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/rhodecode/tests/vcs_operations/test_vcs_operations.py b/rhodecode/tests/vcs_operations/test_vcs_operations.py index 52c82929..ef85952a 100644 --- a/rhodecode/tests/vcs_operations/test_vcs_operations.py +++ b/rhodecode/tests/vcs_operations/test_vcs_operations.py @@ -54,6 +54,20 @@ class TestVCSOperations(object): 'hg clone', clone_url, tmpdir.strpath) _check_proper_clone(stdout, stderr, 'hg') + def test_clone_hg_repo_by_admin_pull_protocol(self, rc_web_server, tmpdir): + clone_url = rc_web_server.repo_clone_url(HG_REPO) + stdout, stderr = Command('/tmp').execute( + 'hg clone --pull', clone_url, tmpdir.strpath) + _check_proper_clone(stdout, stderr, 'hg') + + def test_clone_hg_repo_by_admin_pull_stream_protocol(self, rc_web_server, tmpdir): + clone_url = rc_web_server.repo_clone_url(HG_REPO) + stdout, stderr = Command('/tmp').execute( + 'hg clone --pull --stream', clone_url, tmpdir.strpath) + assert '225 files to transfer, 1.04 MB of data' in stdout + assert 'transferred 1.04 MB' in stdout + assert '114 files updated,' in stdout + def test_clone_git_repo_by_admin(self, rc_web_server, tmpdir): clone_url = rc_web_server.repo_clone_url(GIT_REPO) cmd = Command('/tmp') From 2bede91515ece9efeb26b4a255b898f9a91176a3 Mon Sep 17 00:00:00 2001 From: Daniel Dourvaris Date: Thu, 28 Feb 2019 13:34:19 +0100 Subject: [PATCH 020/252] user-bookmarks: add ${server_url} template to be used in the links. --- rhodecode/apps/my_account/views/my_account.py | 9 ++++++--- .../templates/admin/my_account/my_account_bookmarks.mako | 5 ++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/rhodecode/apps/my_account/views/my_account.py b/rhodecode/apps/my_account/views/my_account.py index f35e41bb..4fad51da 100644 --- a/rhodecode/apps/my_account/views/my_account.py +++ b/rhodecode/apps/my_account/views/my_account.py @@ -496,6 +496,7 @@ class MyAccountView(BaseAppView, DataGridAppView): if not user_bookmark: raise HTTPFound(redirect_url) + # repository set if user_bookmark.repository: repo_name = user_bookmark.repository.repo_name base_redirect_url = h.route_path( @@ -506,7 +507,7 @@ class MyAccountView(BaseAppView, DataGridAppView): .safe_substitute({'repo_url': base_redirect_url}) else: redirect_url = base_redirect_url - + # repository group set elif user_bookmark.repository_group: repo_group_name = user_bookmark.repository_group.group_name base_redirect_url = h.route_path( @@ -517,9 +518,11 @@ class MyAccountView(BaseAppView, DataGridAppView): .safe_substitute({'repo_group_url': base_redirect_url}) else: redirect_url = base_redirect_url - + # custom URL set elif user_bookmark.redirect_url: - redirect_url = user_bookmark.redirect_url + server_url = h.route_url('home').rstrip('/') + redirect_url = string.Template(user_bookmark.redirect_url) \ + .safe_substitute({'server_url': server_url}) log.debug('Redirecting bookmark %s to %s', user_bookmark, redirect_url) raise HTTPFound(redirect_url) diff --git a/rhodecode/templates/admin/my_account/my_account_bookmarks.mako b/rhodecode/templates/admin/my_account/my_account_bookmarks.mako index 5ba847f6..7af94d0c 100644 --- a/rhodecode/templates/admin/my_account/my_account_bookmarks.mako +++ b/rhodecode/templates/admin/my_account/my_account_bookmarks.mako @@ -23,8 +23,11 @@ ${h.checkbox('remove', value=True)} - + +

+ ${_('Server URL is available as ${server_url} variable. E.g. Redirect url: ${server_url}/_admin/exception_tracker')} +

From 7156dbfb6dab513343a731bce0e651c5efe3de2c Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Thu, 28 Feb 2019 14:49:48 +0100 Subject: [PATCH 021/252] config: updated header limits on gunicorn --- configs/gunicorn_config.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/configs/gunicorn_config.py b/configs/gunicorn_config.py index db796506..89c54976 100644 --- a/configs/gunicorn_config.py +++ b/configs/gunicorn_config.py @@ -30,10 +30,12 @@ loglevel = 'debug' # SECURITY # The maximum size of HTTP request line in bytes. -limit_request_line = 4094 +# 0 for unlimited +limit_request_line = 0 # Limit the number of HTTP headers fields in a request. -limit_request_fields = 1024 +# By default this value is 100 and can’t be larger than 32768. +limit_request_fields = 10240 # Limit the allowed size of an HTTP request header field. # Value is a positive number or 0. From 14efa7652a46e623d3b6c09c4fb65cbd81686bff Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 4 Mar 2019 16:44:25 +0100 Subject: [PATCH 022/252] docs: updated Apache config with chunked proxy option --- docs/admin/apache-conf-example.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/admin/apache-conf-example.rst b/docs/admin/apache-conf-example.rst index fa97c851..8f46c25e 100644 --- a/docs/admin/apache-conf-example.rst +++ b/docs/admin/apache-conf-example.rst @@ -66,14 +66,18 @@ Below config if for an Apache Reverse Proxy configuration. # Directive to properly generate url (clone url) for RhodeCode ProxyPreserveHost On + # It allows request bodies to be sent to the backend using chunked transfer encoding. + SetEnv proxy-sendchunked 1 + + # Increase headers size for large Mercurial headers sent with many branches + LimitRequestLine 16380 + # Url to running RhodeCode instance. This is shown as `- URL:` when # running rccontrol status. + ProxyPass / http://127.0.0.1:10002/ timeout=7200 Keepalive=On ProxyPassReverse / http://127.0.0.1:10002/ - # Increase headers for large Mercurial headers - LimitRequestLine 16380 - # strict http prevents from https -> http downgrade Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" From 37457f6c50370315128415ab39816d434fd3a531 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Thu, 28 Feb 2019 17:44:52 +0100 Subject: [PATCH 023/252] makefile: added some handly functions for package generation --- Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Makefile b/Makefile index c784f146..38adafd1 100644 --- a/Makefile +++ b/Makefile @@ -53,3 +53,12 @@ web-build: generate-pkgs: nix-shell pkgs/shell-generate.nix --command "pip2nix generate --licenses" + +generate-js-pkgs: + rm -rf node_modules && \ + nix-shell pkgs/shell-generate.nix --command "node2nix --input package.json -o pkgs/node-packages.nix -e pkgs/node-env.nix -c pkgs/node-default.nix -d --flatten --nodejs-8" && \ + sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix + +generate-license-meta: + nix-build pkgs/license-generate.nix -o result-license && \ + cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json \ No newline at end of file From 6c42cd732c1c1e7a5104c64fe9a6694e973f200a Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Thu, 28 Feb 2019 17:46:28 +0100 Subject: [PATCH 024/252] packages: updated JS package data. --- pkgs/node-packages.nix | 499 +++++++++++++++++++---------------------- 1 file changed, 228 insertions(+), 271 deletions(-) diff --git a/pkgs/node-packages.nix b/pkgs/node-packages.nix index 5a567668..daf307e8 100644 --- a/pkgs/node-packages.nix +++ b/pkgs/node-packages.nix @@ -166,13 +166,13 @@ let sha512 = "dgOe12GyCF1VZBLUQqnzGWlf3xb255FajNCVB1VFj/AtskYtoamnafa7m3a+1vs+C8qbg4Benn5KwgxVDSW4cg=="; }; }; - "@polymer/paper-spinner-3.0.1" = { + "@polymer/paper-spinner-3.0.2" = { name = "_at_polymer_slash_paper-spinner"; packageName = "@polymer/paper-spinner"; - version = "3.0.1"; + version = "3.0.2"; src = fetchurl { - url = "https://registry.npmjs.org/@polymer/paper-spinner/-/paper-spinner-3.0.1.tgz"; - sha512 = "MYIU6qWZnhZ5yNFOBzROPgBteGfxKEnDZ6bCgjrvUtJkBuQEz0MQZzSE/zmZc0oaJ9u5QK5xAFuYdudsGv7+sQ=="; + url = "https://registry.npmjs.org/@polymer/paper-spinner/-/paper-spinner-3.0.2.tgz"; + sha512 = "XUzu8/4NH+pnNZUTI2MxtOKFAr0EOsW7eGhTg3VBhTh7DDW/q3ewzwYRWnqNJokX9BEnxKMiXXaIeTEBq4k2dw=="; }; }; "@polymer/paper-styles-3.0.1" = { @@ -229,13 +229,13 @@ let sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614"; }; }; - "@types/node-6.14.2" = { + "@types/node-6.14.3" = { name = "_at_types_slash_node"; packageName = "@types/node"; - version = "6.14.2"; + version = "6.14.3"; src = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-6.14.2.tgz"; - sha512 = "JWB3xaVfsfnFY8Ofc9rTB/op0fqqTSqy4vBcVk1LuRJvta7KTX+D//fCkiTMeLGhdr2EbFZzQjC97gvmPilk9Q=="; + url = "https://registry.npmjs.org/@types/node/-/node-6.14.3.tgz"; + sha512 = "V2VrQBCKo4U0rni6tW4AASRDqIO5ZTLDN/Xzrm4mNBr9SGQYZ+7zZJn+hMs89Q8ZCIHzp4aWQPyCpK+rux1YGA=="; }; }; "@types/parse5-2.2.34" = { @@ -409,22 +409,22 @@ let sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA=="; }; }; - "@webcomponents/shadycss-1.7.1" = { + "@webcomponents/shadycss-1.9.0" = { name = "_at_webcomponents_slash_shadycss"; packageName = "@webcomponents/shadycss"; - version = "1.7.1"; + version = "1.9.0"; src = fetchurl { - url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.7.1.tgz"; - sha512 = "6SZqLajRPWL0rrKDZOGF8PCBq5B9JqgFmE5rX5psk6i8WrqiMkSCuO8+rnirzViTsU5CqnjQPFC3OvG4YJdMrQ=="; + url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.0.tgz"; + sha512 = "g8Xa+6RSEME4g/wLJW4YII0eq15rvXp76RxPAuv7hx+Bdoi7GzZJ/EoZOUfyIbqAsQbII1TcWD4/+Xhs5NcM1w=="; }; }; - "@webcomponents/webcomponentsjs-2.2.1" = { + "@webcomponents/webcomponentsjs-2.2.7" = { name = "_at_webcomponents_slash_webcomponentsjs"; packageName = "@webcomponents/webcomponentsjs"; - version = "2.2.1"; + version = "2.2.7"; src = fetchurl { - url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.2.1.tgz"; - sha512 = "lZZ+Lkke6JhsJcQQqSVk1Pny6/8y4qhJ98LO7a/MwBSRO8WqHqK1X2vscfeL8vOnYGFnmBUyVG95lwYv/AXyLQ=="; + url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.2.7.tgz"; + sha512 = "kPPjzV+5kpoWpTniyvBSPcXS33f3j/C6HvNOJ3YecF3pvz3XwVeU4ammbxtVy/osF3z7hr1DYNptIf4oPEvXZA=="; }; }; "@xtuc/ieee754-1.2.0" = { @@ -499,22 +499,22 @@ let sha1 = "82ffb02b29e662ae53bdc20af15947706739c536"; }; }; - "ajv-6.6.2" = { + "ajv-6.9.2" = { name = "ajv"; packageName = "ajv"; - version = "6.6.2"; + version = "6.9.2"; src = fetchurl { - url = "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz"; - sha512 = "FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g=="; + url = "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz"; + sha512 = "4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg=="; }; }; - "ajv-keywords-3.2.0" = { + "ajv-keywords-3.4.0" = { name = "ajv-keywords"; packageName = "ajv-keywords"; - version = "3.2.0"; + version = "3.4.0"; src = fetchurl { - url = "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz"; - sha1 = "e86b819c602cf8821ad637413698f1dec021847a"; + url = "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz"; + sha512 = "aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw=="; }; }; "align-text-0.1.4" = { @@ -716,15 +716,6 @@ let sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"; }; }; - "arrify-1.0.1" = { - name = "arrify"; - packageName = "arrify"; - version = "1.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"; - sha1 = "898508da2226f380df904728456849c1501a4b0d"; - }; - }; "asap-2.0.6" = { name = "asap"; packageName = "asap"; @@ -815,13 +806,13 @@ let sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1"; }; }; - "async-2.6.1" = { + "async-2.6.2" = { name = "async"; packageName = "async"; - version = "2.6.1"; + version = "2.6.2"; src = fetchurl { - url = "https://registry.npmjs.org/async/-/async-2.6.1.tgz"; - sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ=="; + url = "https://registry.npmjs.org/async/-/async-2.6.2.tgz"; + sha512 = "H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg=="; }; }; "async-each-1.0.1" = { @@ -1445,13 +1436,13 @@ let sha512 = "vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="; }; }; - "binary-extensions-1.12.0" = { + "binary-extensions-1.13.0" = { name = "binary-extensions"; packageName = "binary-extensions"; - version = "1.12.0"; + version = "1.13.0"; src = fetchurl { - url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz"; - sha512 = "DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg=="; + url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz"; + sha512 = "EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw=="; }; }; "bluebird-3.5.3" = { @@ -1679,22 +1670,22 @@ let sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"; }; }; - "caniuse-db-1.0.30000927" = { + "caniuse-db-1.0.30000939" = { name = "caniuse-db"; packageName = "caniuse-db"; - version = "1.0.30000927"; + version = "1.0.30000939"; src = fetchurl { - url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000927.tgz"; - sha512 = "CX/QvLA8oh7kQ9cHCCzFm0UZW4KwSyQSRJ5A1XtH42HaMJQ0yh+9fEVWagMqv9I1vSCtaqA5Mb8k0uKfv7jhDw=="; + url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000939.tgz"; + sha512 = "nB5tLf3hOs+biXl1lhKjHRgNC0J1I7H52h/t1FP7qxARKKwpB0z+P/JewJLYAlxCBP/q7rxJzQzHHrQMl0viKg=="; }; }; - "caniuse-lite-1.0.30000927" = { + "caniuse-lite-1.0.30000939" = { name = "caniuse-lite"; packageName = "caniuse-lite"; - version = "1.0.30000927"; + version = "1.0.30000939"; src = fetchurl { - url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000927.tgz"; - sha512 = "ogq4NbUWf1uG/j66k0AmiO3GjqJAlQyF8n4w8a954cbCyFKmYGvRtgz6qkq2fWuduTXHibX7GyYL5Pg58Aks2g=="; + url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz"; + sha512 = "oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg=="; }; }; "caseless-0.12.0" = { @@ -1742,13 +1733,13 @@ let sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="; }; }; - "chokidar-2.0.4" = { + "chokidar-2.1.2" = { name = "chokidar"; packageName = "chokidar"; - version = "2.0.4"; + version = "2.1.2"; src = fetchurl { - url = "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz"; - sha512 = "z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ=="; + url = "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz"; + sha512 = "IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg=="; }; }; "chownr-1.1.1" = { @@ -2093,13 +2084,13 @@ let sha512 = "Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA=="; }; }; - "core-js-2.6.1" = { + "core-js-2.6.5" = { name = "core-js"; packageName = "core-js"; - version = "2.6.1"; + version = "2.6.5"; src = fetchurl { - url = "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz"; - sha512 = "L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg=="; + url = "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz"; + sha512 = "klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A=="; }; }; "core-util-is-1.0.2" = { @@ -2201,13 +2192,13 @@ let sha512 = "xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA=="; }; }; - "css-what-2.1.2" = { + "css-what-2.1.3" = { name = "css-what"; packageName = "css-what"; - version = "2.1.2"; + version = "2.1.3"; src = fetchurl { - url = "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz"; - sha512 = "wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ=="; + url = "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz"; + sha512 = "a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="; }; }; "cssesc-0.1.0" = { @@ -2417,13 +2408,13 @@ let sha512 = "kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="; }; }; - "dir-glob-2.0.0" = { + "dir-glob-2.2.2" = { name = "dir-glob"; packageName = "dir-glob"; - version = "2.0.0"; + version = "2.2.2"; src = fetchurl { - url = "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz"; - sha512 = "37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag=="; + url = "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz"; + sha512 = "f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw=="; }; }; "dom-converter-0.2.0" = { @@ -2435,13 +2426,13 @@ let sha512 = "gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="; }; }; - "dom-serializer-0.1.0" = { + "dom-serializer-0.1.1" = { name = "dom-serializer"; packageName = "dom-serializer"; - version = "0.1.0"; + version = "0.1.1"; src = fetchurl { - url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz"; - sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82"; + url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz"; + sha512 = "l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA=="; }; }; "dom5-2.3.0" = { @@ -2462,15 +2453,6 @@ let sha512 = "jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="; }; }; - "domelementtype-1.1.3" = { - name = "domelementtype"; - packageName = "domelementtype"; - version = "1.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz"; - sha1 = "bd28773e2642881aec51544924299c5cd822185b"; - }; - }; "domelementtype-1.3.1" = { name = "domelementtype"; packageName = "domelementtype"; @@ -2480,15 +2462,6 @@ let sha512 = "BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="; }; }; - "domhandler-2.1.0" = { - name = "domhandler"; - packageName = "domhandler"; - version = "2.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz"; - sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"; - }; - }; "domhandler-2.3.0" = { name = "domhandler"; packageName = "domhandler"; @@ -2498,15 +2471,6 @@ let sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738"; }; }; - "domutils-1.1.6" = { - name = "domutils"; - packageName = "domutils"; - version = "1.1.6"; - src = fetchurl { - url = "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz"; - sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485"; - }; - }; "domutils-1.5.1" = { name = "domutils"; packageName = "domutils"; @@ -2516,13 +2480,13 @@ let sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf"; }; }; - "duplexify-3.6.1" = { + "duplexify-3.7.1" = { name = "duplexify"; packageName = "duplexify"; - version = "3.6.1"; + version = "3.7.1"; src = fetchurl { - url = "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz"; - sha512 = "vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA=="; + url = "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz"; + sha512 = "07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="; }; }; "ecc-jsbn-0.1.2" = { @@ -2534,13 +2498,13 @@ let sha1 = "3a83a904e54353287874c564b7549386849a98c9"; }; }; - "electron-to-chromium-1.3.98" = { + "electron-to-chromium-1.3.113" = { name = "electron-to-chromium"; packageName = "electron-to-chromium"; - version = "1.3.98"; + version = "1.3.113"; src = fetchurl { - url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.98.tgz"; - sha512 = "WIZdNuvE3dFr6kkPgv4d/cfswNZD6XbeLBM8baOIQTsnbf4xWrVEaLvp7oNnbnMWWXDqq7Tbv+H5JfciLTJm4Q=="; + url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz"; + sha512 = "De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g=="; }; }; "elliptic-6.4.1" = { @@ -2732,13 +2696,13 @@ let sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab"; }; }; - "events-1.1.1" = { + "events-3.0.0" = { name = "events"; packageName = "events"; - version = "1.1.1"; + version = "3.0.0"; src = fetchurl { - url = "https://registry.npmjs.org/events/-/events-1.1.1.tgz"; - sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"; + url = "https://registry.npmjs.org/events/-/events-3.0.0.tgz"; + sha512 = "Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA=="; }; }; "evp_bytestokey-1.0.3" = { @@ -2975,13 +2939,13 @@ let sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782"; }; }; - "flush-write-stream-1.0.3" = { + "flush-write-stream-1.1.1" = { name = "flush-write-stream"; packageName = "flush-write-stream"; - version = "1.0.3"; + version = "1.1.1"; src = fetchurl { - url = "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz"; - sha512 = "calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw=="; + url = "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz"; + sha512 = "3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w=="; }; }; "for-in-1.0.2" = { @@ -3056,13 +3020,13 @@ let sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f"; }; }; - "fsevents-1.2.4" = { + "fsevents-1.2.7" = { name = "fsevents"; packageName = "fsevents"; - version = "1.2.4"; + version = "1.2.7"; src = fetchurl { - url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz"; - sha512 = "z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg=="; + url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz"; + sha512 = "Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw=="; }; }; "function-bind-1.1.1" = { @@ -3524,13 +3488,13 @@ let sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8"; }; }; - "homedir-polyfill-1.0.1" = { + "homedir-polyfill-1.0.3" = { name = "homedir-polyfill"; packageName = "homedir-polyfill"; - version = "1.0.1"; + version = "1.0.3"; src = fetchurl { - url = "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz"; - sha1 = "4c2bbc8a758998feebf5ed68580f76d46768b4bc"; + url = "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz"; + sha512 = "eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="; }; }; "hooker-0.2.3" = { @@ -3587,15 +3551,6 @@ let sha1 = "b01abbd723acaaa7b37b6af4492ebda03d9dd37b"; }; }; - "htmlparser2-3.3.0" = { - name = "htmlparser2"; - packageName = "htmlparser2"; - version = "3.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz"; - sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe"; - }; - }; "htmlparser2-3.8.3" = { name = "htmlparser2"; packageName = "htmlparser2"; @@ -4145,13 +4100,13 @@ let sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583"; }; }; - "js-base64-2.5.0" = { + "js-base64-2.5.1" = { name = "js-base64"; packageName = "js-base64"; - version = "2.5.0"; + version = "2.5.1"; src = fetchurl { - url = "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz"; - sha512 = "wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g=="; + url = "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz"; + sha512 = "M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw=="; }; }; "js-tokens-3.0.2" = { @@ -4208,6 +4163,15 @@ let sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b"; }; }; + "jshint-2.10.1" = { + name = "jshint"; + packageName = "jshint"; + version = "2.10.1"; + src = fetchurl { + url = "https://registry.npmjs.org/jshint/-/jshint-2.10.1.tgz"; + sha512 = "9GpPfKeffYBl7oBDX2lHPG16j0AM7D2bn3aLy9DaWTr6CWa0i/7UGhX8WLZ7V14QQnnr4hXbjauTLYg06F+HYw=="; + }; + }; "jshint-2.9.7" = { name = "jshint"; packageName = "jshint"; @@ -4370,13 +4334,13 @@ let sha1 = "2009291bb31cea861bbf10a7c15a28caf75c31ec"; }; }; - "loader-runner-2.3.1" = { + "loader-runner-2.4.0" = { name = "loader-runner"; packageName = "loader-runner"; - version = "2.3.1"; + version = "2.4.0"; src = fetchurl { - url = "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz"; - sha512 = "By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw=="; + url = "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz"; + sha512 = "Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="; }; }; "loader-utils-0.2.17" = { @@ -4460,15 +4424,6 @@ let sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6"; }; }; - "lodash.debounce-4.0.8" = { - name = "lodash.debounce"; - packageName = "lodash.debounce"; - version = "4.0.8"; - src = fetchurl { - url = "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"; - sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af"; - }; - }; "lodash.isplainobject-4.0.6" = { name = "lodash.isplainobject"; packageName = "lodash.isplainobject"; @@ -4613,13 +4568,13 @@ let sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="; }; }; - "mem-4.0.0" = { + "mem-4.1.0" = { name = "mem"; packageName = "mem"; - version = "4.0.0"; + version = "4.1.0"; src = fetchurl { - url = "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz"; - sha512 = "WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA=="; + url = "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz"; + sha512 = "I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg=="; }; }; "memory-fs-0.4.1" = { @@ -4658,22 +4613,22 @@ let sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="; }; }; - "mime-db-1.37.0" = { + "mime-db-1.38.0" = { name = "mime-db"; packageName = "mime-db"; - version = "1.37.0"; + version = "1.38.0"; src = fetchurl { - url = "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz"; - sha512 = "R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="; + url = "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz"; + sha512 = "bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg=="; }; }; - "mime-types-2.1.21" = { + "mime-types-2.1.22" = { name = "mime-types"; packageName = "mime-types"; - version = "2.1.21"; + version = "2.1.22"; src = fetchurl { - url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz"; - sha512 = "3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg=="; + url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz"; + sha512 = "aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog=="; }; }; "mimic-fn-1.2.0" = { @@ -4775,13 +4730,13 @@ let sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903"; }; }; - "moment-2.23.0" = { + "moment-2.24.0" = { name = "moment"; packageName = "moment"; - version = "2.23.0"; + version = "2.24.0"; src = fetchurl { - url = "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz"; - sha512 = "3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA=="; + url = "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz"; + sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="; }; }; "mousetrap-1.6.2" = { @@ -4856,13 +4811,13 @@ let sha512 = "rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ=="; }; }; - "node-libs-browser-2.1.0" = { + "node-libs-browser-2.2.0" = { name = "node-libs-browser"; packageName = "node-libs-browser"; - version = "2.1.0"; + version = "2.2.0"; src = fetchurl { - url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz"; - sha512 = "5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg=="; + url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz"; + sha512 = "5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA=="; }; }; "nopt-1.0.10" = { @@ -4910,6 +4865,15 @@ let sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"; }; }; + "normalize-path-3.0.0" = { + name = "normalize-path"; + packageName = "normalize-path"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"; + sha512 = "6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="; + }; + }; "normalize-range-0.1.2" = { name = "normalize-range"; packageName = "normalize-range"; @@ -4991,13 +4955,13 @@ let sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c"; }; }; - "object-keys-1.0.12" = { + "object-keys-1.1.0" = { name = "object-keys"; packageName = "object-keys"; - version = "1.0.12"; + version = "1.1.0"; src = fetchurl { - url = "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz"; - sha512 = "FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="; + url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz"; + sha512 = "6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg=="; }; }; "object-visit-1.0.1" = { @@ -5117,13 +5081,13 @@ let sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae"; }; }; - "p-is-promise-1.1.0" = { + "p-is-promise-2.0.0" = { name = "p-is-promise"; packageName = "p-is-promise"; - version = "1.1.0"; + version = "2.0.0"; src = fetchurl { - url = "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz"; - sha1 = "9c9456989e9f6588017b0434d56097675c3da05e"; + url = "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz"; + sha512 = "pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg=="; }; }; "p-limit-1.3.0" = { @@ -5180,13 +5144,13 @@ let sha512 = "hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="; }; }; - "pako-1.0.7" = { + "pako-1.0.8" = { name = "pako"; packageName = "pako"; - version = "1.0.7"; + version = "1.0.8"; src = fetchurl { - url = "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz"; - sha512 = "3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ=="; + url = "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz"; + sha512 = "6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA=="; }; }; "parallel-transform-1.1.0" = { @@ -5207,13 +5171,13 @@ let sha1 = "df94fd8cf6531ecf75e6bef9a0858fbc72be2247"; }; }; - "parse-asn1-5.1.1" = { + "parse-asn1-5.1.4" = { name = "parse-asn1"; packageName = "parse-asn1"; - version = "5.1.1"; + version = "5.1.4"; src = fetchurl { - url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz"; - sha512 = "KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw=="; + url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz"; + sha512 = "Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw=="; }; }; "parse-filepath-1.0.2" = { @@ -5927,13 +5891,13 @@ let sha1 = "9ec61f79049875707d69414596fd907a4d711e73"; }; }; - "randombytes-2.0.6" = { + "randombytes-2.1.0" = { name = "randombytes"; packageName = "randombytes"; - version = "2.0.6"; + version = "2.1.0"; src = fetchurl { - url = "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz"; - sha512 = "CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A=="; + url = "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"; + sha512 = "vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="; }; }; "randomfill-1.0.4" = { @@ -5954,15 +5918,6 @@ let sha512 = "guh4ZNAf96f+CDwfnPbFeFiO5YcfPllUmZrgcoOmx6iqZPq+DcKbnyjPuBxEAtQ3tqqd++qChsQfQB+VBzFT0Q=="; }; }; - "readable-stream-1.0.34" = { - name = "readable-stream"; - packageName = "readable-stream"; - version = "1.0.34"; - src = fetchurl { - url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz"; - sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c"; - }; - }; "readable-stream-1.1.14" = { name = "readable-stream"; packageName = "readable-stream"; @@ -6116,13 +6071,13 @@ let sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef"; }; }; - "renderkid-2.0.2" = { + "renderkid-2.0.3" = { name = "renderkid"; packageName = "renderkid"; - version = "2.0.2"; + version = "2.0.3"; src = fetchurl { - url = "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz"; - sha512 = "FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg=="; + url = "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz"; + sha512 = "z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA=="; }; }; "repeat-element-1.1.3" = { @@ -6179,13 +6134,13 @@ let sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1"; }; }; - "resolve-1.9.0" = { + "resolve-1.10.0" = { name = "resolve"; packageName = "resolve"; - version = "1.9.0"; + version = "1.10.0"; src = fetchurl { - url = "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz"; - sha512 = "TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ=="; + url = "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz"; + sha512 = "3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg=="; }; }; "resolve-cwd-2.0.0" = { @@ -6593,13 +6548,13 @@ let sha1 = "04e6926f662895354f3dd015203633b857297e2c"; }; }; - "sshpk-1.16.0" = { + "sshpk-1.16.1" = { name = "sshpk"; packageName = "sshpk"; - version = "1.16.0"; + version = "1.16.1"; src = fetchurl { - url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz"; - sha512 = "Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ=="; + url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz"; + sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg=="; }; }; "ssri-5.3.0" = { @@ -6629,13 +6584,13 @@ let sha1 = "142bf6b64c2b416e4b707ebf8f09b8b5a5043877"; }; }; - "stream-browserify-2.0.1" = { + "stream-browserify-2.0.2" = { name = "stream-browserify"; packageName = "stream-browserify"; - version = "2.0.1"; + version = "2.0.2"; src = fetchurl { - url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz"; - sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"; + url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz"; + sha512 = "nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg=="; }; }; "stream-each-1.2.3" = { @@ -6872,13 +6827,13 @@ let sha512 = "YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg=="; }; }; - "tiny-emitter-2.0.2" = { + "tiny-emitter-2.1.0" = { name = "tiny-emitter"; packageName = "tiny-emitter"; - version = "2.0.2"; + version = "2.1.0"; src = fetchurl { - url = "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz"; - sha512 = "2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow=="; + url = "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz"; + sha512 = "NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="; }; }; "tiny-lr-fork-0.0.5" = { @@ -7223,13 +7178,13 @@ let sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9"; }; }; - "util-0.10.4" = { + "util-0.11.1" = { name = "util"; packageName = "util"; - version = "0.10.4"; + version = "0.11.1"; src = fetchurl { - url = "https://registry.npmjs.org/util/-/util-0.10.4.tgz"; - sha512 = "0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="; + url = "https://registry.npmjs.org/util/-/util-0.11.1.tgz"; + sha512 = "HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ=="; }; }; "util-deprecate-1.0.2" = { @@ -7536,14 +7491,14 @@ let sources."@polymer/paper-behaviors-3.0.1" sources."@polymer/paper-button-3.0.1" sources."@polymer/paper-ripple-3.0.1" - sources."@polymer/paper-spinner-3.0.1" + sources."@polymer/paper-spinner-3.0.2" sources."@polymer/paper-styles-3.0.1" sources."@polymer/paper-toast-3.0.1" sources."@polymer/paper-toggle-button-3.0.1" sources."@polymer/paper-tooltip-3.0.1" sources."@polymer/polymer-3.1.0" sources."@types/clone-0.1.30" - sources."@types/node-6.14.2" + sources."@types/node-6.14.3" sources."@types/parse5-2.2.34" sources."@webassemblyjs/ast-1.7.10" sources."@webassemblyjs/floating-point-hex-parser-1.7.10" @@ -7563,8 +7518,8 @@ let sources."@webassemblyjs/wasm-parser-1.7.10" sources."@webassemblyjs/wast-parser-1.7.10" sources."@webassemblyjs/wast-printer-1.7.10" - sources."@webcomponents/shadycss-1.7.1" - sources."@webcomponents/webcomponentsjs-2.2.1" + sources."@webcomponents/shadycss-1.9.0" + sources."@webcomponents/webcomponentsjs-2.2.7" sources."@xtuc/ieee754-1.2.0" sources."@xtuc/long-4.2.1" sources."abbrev-1.1.1" @@ -7576,7 +7531,7 @@ let ]; }) sources."ajv-4.11.8" - sources."ajv-keywords-3.2.0" + sources."ajv-keywords-3.4.0" (sources."align-text-0.1.4" // { dependencies = [ sources."kind-of-3.2.2" @@ -7586,7 +7541,11 @@ let sources."amdefine-1.0.1" sources."ansi-regex-0.2.1" sources."ansi-styles-1.1.0" - sources."anymatch-2.0.0" + (sources."anymatch-2.0.0" // { + dependencies = [ + sources."normalize-path-2.1.1" + ]; + }) sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" sources."aproba-1.2.0" (sources."argparse-0.1.16" // { @@ -7602,7 +7561,6 @@ let sources."array-union-1.0.2" sources."array-uniq-1.0.3" sources."array-unique-0.3.2" - sources."arrify-1.0.1" sources."asap-2.0.6" sources."asn1-0.2.4" sources."asn1.js-4.10.1" @@ -7738,7 +7696,7 @@ let sources."base64-js-1.3.0" sources."bcrypt-pbkdf-1.0.2" sources."big.js-5.2.2" - sources."binary-extensions-1.12.0" + sources."binary-extensions-1.13.0" sources."bluebird-3.5.3" sources."bn.js-4.11.8" sources."boolbase-1.0.0" @@ -7778,12 +7736,12 @@ let sources."browserslist-1.7.7" ]; }) - sources."caniuse-db-1.0.30000927" - sources."caniuse-lite-1.0.30000927" + sources."caniuse-db-1.0.30000939" + sources."caniuse-lite-1.0.30000939" sources."caseless-0.12.0" sources."center-align-0.1.3" sources."chalk-0.5.1" - (sources."chokidar-2.0.4" // { + (sources."chokidar-2.1.2" // { dependencies = [ sources."is-glob-4.0.0" ]; @@ -7876,7 +7834,7 @@ let sources."minimatch-3.0.4" ]; }) - sources."core-js-2.6.1" + sources."core-js-2.6.5" sources."core-util-is-1.0.2" sources."create-ecdh-4.0.3" sources."create-hash-1.2.0" @@ -7896,7 +7854,7 @@ let sources."regexpu-core-1.0.0" ]; }) - sources."css-what-2.1.2" + sources."css-what-2.1.3" sources."cssesc-0.1.0" sources."cssnano-3.10.0" sources."csso-2.3.2" @@ -7921,11 +7879,10 @@ let sources."detect-file-1.0.0" sources."detect-indent-4.0.0" sources."diffie-hellman-5.0.3" - sources."dir-glob-2.0.0" + sources."dir-glob-2.2.2" sources."dom-converter-0.2.0" - (sources."dom-serializer-0.1.0" // { + (sources."dom-serializer-0.1.1" // { dependencies = [ - sources."domelementtype-1.1.3" sources."entities-1.1.2" ]; }) @@ -7939,14 +7896,14 @@ let sources."domelementtype-1.3.1" sources."domhandler-2.3.0" sources."domutils-1.5.1" - (sources."duplexify-3.6.1" // { + (sources."duplexify-3.7.1" // { dependencies = [ sources."readable-stream-2.3.6" sources."string_decoder-1.1.1" ]; }) sources."ecc-jsbn-0.1.2" - sources."electron-to-chromium-1.3.98" + sources."electron-to-chromium-1.3.113" sources."elliptic-6.4.1" sources."emojis-list-2.1.0" sources."end-of-stream-1.4.1" @@ -7968,7 +7925,7 @@ let sources."estraverse-4.2.0" sources."esutils-2.0.2" sources."eventemitter2-0.4.14" - sources."events-1.1.1" + sources."events-3.0.0" sources."evp_bytestokey-1.0.3" sources."execa-1.0.0" sources."exit-0.1.2" @@ -8028,7 +7985,7 @@ let sources."fined-1.1.1" sources."flagged-respawn-1.0.1" sources."flatten-1.0.2" - (sources."flush-write-stream-1.0.3" // { + (sources."flush-write-stream-1.1.1" // { dependencies = [ sources."readable-stream-2.3.6" sources."string_decoder-1.1.1" @@ -8051,7 +8008,7 @@ let ]; }) sources."fs.realpath-1.0.0" - sources."fsevents-1.2.4" + sources."fsevents-1.2.7" sources."function-bind-1.1.1" sources."gaze-0.5.2" sources."get-caller-file-1.0.3" @@ -8115,12 +8072,18 @@ let sources."supports-color-2.0.0" ]; }) - sources."grunt-contrib-jshint-0.12.0" + (sources."grunt-contrib-jshint-0.12.0" // { + dependencies = [ + sources."jshint-2.9.7" + sources."lodash-4.17.11" + sources."minimatch-3.0.4" + ]; + }) (sources."grunt-contrib-less-1.4.1" // { dependencies = [ sources."ansi-regex-2.1.1" sources."ansi-styles-2.2.1" - sources."async-2.6.1" + sources."async-2.6.2" sources."chalk-1.1.3" sources."has-ansi-2.0.0" sources."lodash-4.17.11" @@ -8172,7 +8135,7 @@ let sources."hmac-drbg-1.0.1" sources."hoek-2.16.3" sources."home-or-tmp-2.0.0" - sources."homedir-polyfill-1.0.1" + sources."homedir-polyfill-1.0.3" sources."hooker-0.2.3" sources."html-comment-regex-1.1.2" sources."html-loader-0.4.5" @@ -8261,12 +8224,12 @@ let sources."isobject-3.0.1" sources."isstream-0.1.2" sources."jquery-1.11.3" - sources."js-base64-2.5.0" + sources."js-base64-2.5.1" sources."js-tokens-3.0.2" sources."js-yaml-2.0.5" sources."jsbn-0.1.1" sources."jsesc-1.3.0" - (sources."jshint-2.9.7" // { + (sources."jshint-2.10.1" // { dependencies = [ sources."lodash-4.17.11" sources."minimatch-3.0.4" @@ -8297,12 +8260,11 @@ let sources."findup-sync-2.0.0" ]; }) - sources."loader-runner-2.3.1" + sources."loader-runner-2.4.0" sources."loader-utils-1.2.3" sources."locate-path-2.0.0" sources."lodash-0.9.2" sources."lodash.camelcase-4.3.0" - sources."lodash.debounce-4.0.8" sources."lodash.isplainobject-4.0.6" sources."lodash.memoize-4.1.2" sources."lodash.uniq-4.5.0" @@ -8318,7 +8280,7 @@ let sources."mark.js-8.11.1" sources."math-expression-evaluator-1.2.17" sources."md5.js-1.3.5" - sources."mem-4.0.0" + sources."mem-4.1.0" (sources."memory-fs-0.4.1" // { dependencies = [ sources."readable-stream-2.3.6" @@ -8328,8 +8290,8 @@ let sources."micromatch-3.1.10" sources."miller-rabin-4.0.1" sources."mime-1.6.0" - sources."mime-db-1.37.0" - sources."mime-types-2.1.21" + sources."mime-db-1.38.0" + sources."mime-types-2.1.22" sources."mimic-fn-1.2.0" sources."minimalistic-assert-1.0.1" sources."minimalistic-crypto-utils-1.0.1" @@ -8346,7 +8308,7 @@ let sources."minimist-0.0.8" ]; }) - sources."moment-2.23.0" + sources."moment-2.24.0" sources."mousetrap-1.6.2" (sources."move-concurrently-1.0.1" // { dependencies = [ @@ -8361,7 +8323,7 @@ let sources."neo-async-2.6.0" sources."nice-try-1.0.5" sources."no-case-2.3.2" - (sources."node-libs-browser-2.1.0" // { + (sources."node-libs-browser-2.2.0" // { dependencies = [ (sources."readable-stream-2.3.6" // { dependencies = [ @@ -8377,7 +8339,7 @@ let sources."nopt-2.0.0" ]; }) - sources."normalize-path-2.1.1" + sources."normalize-path-3.0.0" sources."normalize-range-0.1.2" sources."normalize-url-1.9.1" sources."npm-run-path-2.0.2" @@ -8399,7 +8361,7 @@ let sources."kind-of-3.2.2" ]; }) - sources."object-keys-1.0.12" + sources."object-keys-1.1.0" sources."object-visit-1.0.1" sources."object.defaults-1.1.0" sources."object.getownpropertydescriptors-2.0.3" @@ -8413,11 +8375,11 @@ let sources."osenv-0.1.5" sources."p-defer-1.0.0" sources."p-finally-1.0.0" - sources."p-is-promise-1.1.0" + sources."p-is-promise-2.0.0" sources."p-limit-1.3.0" sources."p-locate-2.0.0" sources."p-try-1.0.0" - sources."pako-1.0.7" + sources."pako-1.0.8" (sources."parallel-transform-1.1.0" // { dependencies = [ sources."readable-stream-2.3.6" @@ -8425,7 +8387,7 @@ let ]; }) sources."param-case-2.1.1" - sources."parse-asn1-5.1.1" + sources."parse-asn1-5.1.4" sources."parse-filepath-1.0.2" sources."parse-passwd-1.0.0" sources."parse5-3.0.3" @@ -8564,7 +8526,7 @@ let sources."query-string-4.3.4" sources."querystring-0.2.0" sources."querystring-es3-0.2.1" - sources."randombytes-2.0.6" + sources."randombytes-2.1.0" sources."randomfill-1.0.4" sources."raw-loader-1.0.0-beta.0" (sources."readable-stream-1.1.14" // { @@ -8608,14 +8570,9 @@ let }) sources."relateurl-0.2.7" sources."remove-trailing-separator-1.1.0" - (sources."renderkid-2.0.2" // { + (sources."renderkid-2.0.3" // { dependencies = [ sources."ansi-regex-2.1.1" - sources."domhandler-2.1.0" - sources."domutils-1.1.6" - sources."htmlparser2-3.3.0" - sources."isarray-0.0.1" - sources."readable-stream-1.0.34" sources."strip-ansi-3.0.1" ]; }) @@ -8625,7 +8582,7 @@ let sources."request-2.81.0" sources."require-directory-2.1.1" sources."require-main-filename-1.0.1" - sources."resolve-1.9.0" + sources."resolve-1.10.0" sources."resolve-cwd-2.0.0" sources."resolve-dir-1.0.1" sources."resolve-from-3.0.0" @@ -8641,7 +8598,7 @@ let sources."sax-1.2.4" (sources."schema-utils-0.4.7" // { dependencies = [ - sources."ajv-6.6.2" + sources."ajv-6.9.2" ]; }) sources."select-1.1.2" @@ -8698,7 +8655,7 @@ let sources."source-map-url-0.4.0" sources."split-string-3.1.0" sources."sprintf-js-1.0.3" - (sources."sshpk-1.16.0" // { + (sources."sshpk-1.16.1" // { dependencies = [ sources."assert-plus-1.0.0" ]; @@ -8722,7 +8679,7 @@ let ]; }) sources."sticky-sidebar-3.3.1" - (sources."stream-browserify-2.0.1" // { + (sources."stream-browserify-2.0.2" // { dependencies = [ sources."readable-stream-2.3.6" sources."string_decoder-1.1.1" @@ -8768,7 +8725,7 @@ let ]; }) sources."timers-browserify-2.0.10" - sources."tiny-emitter-2.0.2" + sources."tiny-emitter-2.1.0" (sources."tiny-lr-fork-0.0.5" // { dependencies = [ sources."debug-0.7.4" @@ -8857,7 +8814,7 @@ let ]; }) sources."use-3.1.1" - sources."util-0.10.4" + sources."util-0.11.1" sources."util-deprecate-1.0.2" sources."util.promisify-1.0.0" sources."utila-0.4.0" @@ -8879,7 +8836,7 @@ let sources."waypoints-4.0.1" (sources."webpack-4.23.1" // { dependencies = [ - sources."ajv-6.6.2" + sources."ajv-6.9.2" ]; }) (sources."webpack-cli-3.1.2" // { From 83f92470520faac84c32e45048f6fe1efe731ce7 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Thu, 28 Feb 2019 20:02:53 +0100 Subject: [PATCH 025/252] license: updated license metadata --- rhodecode/config/licenses.json | 877 +++++++++++++++++---------------- 1 file changed, 465 insertions(+), 412 deletions(-) diff --git a/rhodecode/config/licenses.json b/rhodecode/config/licenses.json index 9e83522a..7e3ea426 100644 --- a/rhodecode/config/licenses.json +++ b/rhodecode/config/licenses.json @@ -25,17 +25,6 @@ }, "name": "python-2.7.15" }, - { - "license": [ - { - "fullName": "BSD 4-clause \"Original\" or \"Old\" License", - "shortName": "bsdOriginal", - "spdxId": "BSD-4-Clause", - "url": "http://spdx.org/licenses/BSD-4-Clause.html" - } - ], - "name": "python2.7-coverage-3.7.1" - }, { "license": [ { @@ -45,6 +34,10 @@ "url": "http://spdx.org/licenses/MIT.html" } ], + "name": "python2.7-beautifulsoup4-4.6.3" + }, + { + "license": "UNKNOWN", "name": "python2.7-bootstrapped-pip-9.0.1" }, { @@ -56,29 +49,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-cov-core-1.15.0" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-webtest-2.0.29" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-beautifulsoup4-4.6.3" + "name": "python2.7-webtest-2.0.32" }, { "license": [ @@ -100,7 +71,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-webob-1.7.4" + "name": "python2.7-webob-1.8.4" }, { "license": [ @@ -113,6 +84,28 @@ ], "name": "python2.7-six-1.11.0" }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-coverage-4.5.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-cov-core-1.15.0" + }, { "license": [ { @@ -124,6 +117,17 @@ ], "name": "python2.7-mock-1.0.1" }, + { + "license": [ + { + "fullName": "GNU Lesser General Public License v3 or later (LGPLv3+)" + }, + { + "fullName": "LGPL" + } + ], + "name": "python2.7-gprof2dot-2017.9.19" + }, { "license": [ { @@ -136,7 +140,7 @@ "fullName": "DFSG approved" } ], - "name": "python2.7-pytest-timeout-1.2.1" + "name": "python2.7-pytest-timeout-1.3.2" }, { "license": [ @@ -147,7 +151,32 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-pytest-3.6.0" + "name": "python2.7-pytest-3.8.2" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pathlib2-2.3.3" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "New BSD License" + } + ], + "name": "python2.7-scandir-1.9.0" }, { "license": [ @@ -172,7 +201,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-pluggy-0.6.0" + "name": "python2.7-pluggy-0.9.0" }, { "license": [ @@ -183,7 +212,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-atomicwrites-1.1.5" + "name": "python2.7-atomicwrites-1.2.1" }, { "license": [ @@ -194,7 +223,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-more-itertools-4.3.0" + "name": "python2.7-more-itertools-5.0.0" }, { "license": [ @@ -205,7 +234,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-attrs-18.1.0" + "name": "python2.7-attrs-18.2.0" }, { "license": [ @@ -216,18 +245,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-py-1.5.3" - }, - { - "license": [ - { - "fullName": "GNU Lesser General Public License v3 or later (LGPLv3+)" - }, - { - "fullName": "LGPL" - } - ], - "name": "python2.7-gprof2dot-2017.9.19" + "name": "python2.7-py-1.6.0" }, { "license": [ @@ -299,7 +317,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-pytest-cov-2.5.1" + "name": "python2.7-pytest-cov-2.6.0" }, { "license": [ @@ -310,7 +328,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-appenlight-client-0.6.25" + "name": "python2.7-appenlight-client-0.6.26" }, { "license": [ @@ -326,10 +344,107 @@ { "license": [ { - "fullName": "AGPLv3 and Proprietary" + "fullName": "Apache 2.0 and Proprietary" } ], - "name": "python2.7-rhodecode-tools-0.16.0" + "name": "python2.7-rhodecode-tools-1.2.1" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-elasticsearch1-dsl-0.0.12" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-elasticsearch1-1.10.0" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-urllib3-1.24.1" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + }, + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + }, + { + "fullName": "Dual License" + } + ], + "name": "python2.7-python-dateutil-2.8.0" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-elasticsearch2-2.5.0" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-elasticsearch-dsl-6.3.1" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-ipaddress-1.0.22" + }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-elasticsearch-6.3.1" }, { "license": [ @@ -348,59 +463,6 @@ ], "name": "python2.7-whoosh-2.7.4" }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-urllib3-1.21" - }, - { - "license": [ - { - "fullName": "Apache License 2.0", - "shortName": "asl20", - "spdxId": "Apache-2.0", - "url": "http://spdx.org/licenses/Apache-2.0.html" - } - ], - "name": "python2.7-elasticsearch-dsl-2.2.0" - }, - { - "license": [ - { - "fullName": "Apache License 2.0", - "shortName": "asl20", - "spdxId": "Apache-2.0", - "url": "http://spdx.org/licenses/Apache-2.0.html" - } - ], - "name": "python2.7-elasticsearch-2.3.0" - }, - { - "license": [ - { - "fullName": "BSD 4-clause \"Original\" or \"Old\" License", - "shortName": "bsdOriginal", - "spdxId": "BSD-4-Clause", - "url": "http://spdx.org/licenses/BSD-4-Clause.html" - }, - { - "fullName": "Apache License 2.0", - "shortName": "asl20", - "spdxId": "Apache-2.0", - "url": "http://spdx.org/licenses/Apache-2.0.html" - }, - { - "fullName": "Dual License" - } - ], - "name": "python2.7-python-dateutil-2.7.3" - }, { "license": [ { @@ -410,7 +472,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-markupsafe-1.0" + "name": "python2.7-markupsafe-1.1.0" }, { "license": [ @@ -443,29 +505,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-click-6.6" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-bottle-0.12.13" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-cprofilev-1.0.7" + "name": "python2.7-click-7.0" }, { "license": [ @@ -510,31 +550,6 @@ "license": [], "name": "python2.7-ptyprocess-0.6.0" }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-pathlib2-2.3.0" - }, - { - "license": [ - { - "fullName": "BSD 4-clause \"Original\" or \"Old\" License", - "shortName": "bsdOriginal", - "spdxId": "BSD-4-Clause", - "url": "http://spdx.org/licenses/BSD-4-Clause.html" - }, - { - "fullName": "New BSD License" - } - ], - "name": "python2.7-scandir-1.9.0" - }, { "license": [ { @@ -555,7 +570,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-pygments-2.2.0" + "name": "python2.7-pygments-2.3.1" }, { "license": [ @@ -646,7 +661,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-pickleshare-0.7.4" + "name": "python2.7-pickleshare-0.7.5" }, { "license": [ @@ -690,7 +705,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-greenlet-0.4.13" + "name": "python2.7-greenlet-0.4.15" }, { "license": [ @@ -701,7 +716,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-gevent-1.3.5" + "name": "python2.7-gevent-1.4.0" }, { "license": [ @@ -712,7 +727,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-psutil-5.4.6" + "name": "python2.7-psutil-5.5.1" }, { "license": [ @@ -745,7 +760,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-alembic-0.9.9" + "name": "python2.7-alembic-1.0.5" }, { "license": { @@ -754,7 +769,7 @@ "spdxId": "Apache-2.0", "url": "http://spdx.org/licenses/Apache-2.0.html" }, - "name": "python2.7-python-editor-1.0.3" + "name": "python2.7-python-editor-1.0.4" }, { "license": [ @@ -839,39 +854,6 @@ ], "name": "python2.7-functools32-3.2.3.post2" }, - { - "license": [ - { - "fullName": "Apache License 2.0", - "shortName": "asl20", - "spdxId": "Apache-2.0", - "url": "http://spdx.org/licenses/Apache-2.0.html" - } - ], - "name": "python2.7-bleach-2.1.4" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-html5lib-1.0.1" - }, - { - "license": [ - { - "fullName": "BSD 4-clause \"Original\" or \"Old\" License", - "shortName": "bsdOriginal", - "spdxId": "BSD-4-Clause", - "url": "http://spdx.org/licenses/BSD-4-Clause.html" - } - ], - "name": "python2.7-webencodings-0.5.1" - }, { "license": [ { @@ -892,7 +874,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-testpath-0.3.1" + "name": "python2.7-testpath-0.4.2" }, { "license": [ @@ -905,6 +887,28 @@ ], "name": "python2.7-pandocfilters-1.4.2" }, + { + "license": [ + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-bleach-3.1.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-webencodings-0.5.1" + }, { "license": [ { @@ -925,7 +929,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-configparser-3.5.0" + "name": "python2.7-configparser-3.7.3" }, { "license": [ @@ -947,7 +951,73 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-mistune-0.8.3" + "name": "python2.7-mistune-0.8.4" + }, + { + "license": { + "fullName": "GNU Lesser General Public License v3.0 or later", + "shortName": "lgpl3Plus", + "spdxId": "LGPL-3.0+", + "url": "http://spdx.org/licenses/LGPL-3.0+.html" + }, + "name": "python2.7-psycopg2-2.7.7" + }, + { + "license": { + "fullName": "PostgreSQL License", + "shortName": "postgresql", + "spdxId": "PostgreSQL", + "url": "http://spdx.org/licenses/PostgreSQL.html" + }, + "name": "postgresql-9.6.10" + }, + { + "license": [ + { + "fullName": "zlib License", + "shortName": "zlib", + "spdxId": "Zlib", + "url": "http://spdx.org/licenses/Zlib.html" + }, + { + "fullName": "libpng License", + "shortName": "libpng", + "spdxId": "Libpng", + "url": "http://spdx.org/licenses/Libpng.html" + } + ], + "name": "python2.7-pysqlite-2.8.3" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-pymysql-0.8.1" + }, + { + "license": [ + { + "fullName": "GNU General Public License v1.0 only", + "shortName": "gpl1", + "spdxId": "GPL-1.0", + "url": "http://spdx.org/licenses/GPL-1.0.html" + } + ], + "name": "python2.7-mysql-python-1.2.5" + }, + { + "license": { + "fullName": "GNU Library General Public License v2.1 only", + "shortName": "lgpl21", + "spdxId": "LGPL-2.1", + "url": "http://spdx.org/licenses/LGPL-2.1.html" + }, + "name": "mariadb-connector-c-2.3.4" }, { "license": [ @@ -958,7 +1028,7 @@ "url": "http://spdx.org/licenses/ZPL-2.1.html" } ], - "name": "python2.7-zope.interface-4.5.0" + "name": "python2.7-zope.interface-4.6.0" }, { "license": [ @@ -969,7 +1039,7 @@ "url": "http://spdx.org/licenses/ZPL-2.1.html" } ], - "name": "python2.7-zope.event-4.3.0" + "name": "python2.7-zope.event-4.4" }, { "license": [ @@ -980,7 +1050,7 @@ "url": "http://spdx.org/licenses/ZPL-2.1.html" } ], - "name": "python2.7-zope.deprecation-4.3.0" + "name": "python2.7-zope.deprecation-4.4.0" }, { "license": [ @@ -1043,7 +1113,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-paste-2.0.3" + "name": "python2.7-paste-3.0.5" }, { "license": [ @@ -1061,7 +1131,7 @@ "fullName": "Repoze License", "url": "http://www.repoze.org/LICENSE.txt" }, - "name": "python2.7-venusian-1.1.0" + "name": "python2.7-venusian-1.2.0" }, { "license": { @@ -1071,17 +1141,6 @@ }, "name": "python2.7-urlobject-2.4.3" }, - { - "license": [ - { - "fullName": "Apache License 2.0", - "shortName": "asl20", - "spdxId": "Apache-2.0", - "url": "http://spdx.org/licenses/Apache-2.0.html" - } - ], - "name": "python2.7-trollius-1.0.4" - }, { "license": { "fullName": "Repoze License", @@ -1095,7 +1154,7 @@ "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" } ], - "name": "python2.7-supervisor-3.3.4" + "name": "python2.7-supervisor-3.3.5" }, { "license": [ @@ -1114,7 +1173,7 @@ "url": "http://spdx.org/licenses/Python-2.0.html" } ], - "name": "python2.7-subprocess32-3.5.1" + "name": "python2.7-subprocess32-3.5.3" }, { "license": [ @@ -1125,7 +1184,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-sshpubkeys-2.2.0" + "name": "python2.7-sshpubkeys-3.1.0" }, { "license": [ @@ -1141,8 +1200,25 @@ { "license": [ { - "fullName": "Academic Free License (AFL)" + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" }, + { + "fullName": "BSD or Apache License, Version 2.0" + }, + { + "fullName": "Apache License 2.0", + "shortName": "asl20", + "spdxId": "Apache-2.0", + "url": "http://spdx.org/licenses/Apache-2.0.html" + } + ], + "name": "python2.7-cryptography-2.5" + }, + { + "license": [ { "fullName": "MIT License", "shortName": "mit", @@ -1150,7 +1226,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-simplejson-3.11.1" + "name": "python2.7-cffi-1.12.1" }, { "license": [ @@ -1161,7 +1237,32 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-setproctitle-1.1.10" + "name": "python2.7-pycparser-2.19" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-asn1crypto-0.24.0" + }, + { + "license": [ + { + "fullName": "Academic Free License (AFL)" + }, + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-simplejson-3.16.0" }, { "license": [ @@ -1201,7 +1302,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-py-gfm-0.1.3" + "name": "python2.7-py-gfm-0.1.4" }, { "license": [ @@ -1236,6 +1337,72 @@ ], "name": "python2.7-pytz-2018.4" }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-python-saml-2.4.2" + }, + { + "license": [ + { + "fullName": "Python Software Foundation License version 2", + "shortName": "psfl", + "spdxId": "Python-2.0", + "url": "http://spdx.org/licenses/Python-2.0.html" + } + ], + "name": "python2.7-defusedxml-0.5.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-isodate-0.6.0" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-dm.xmlsec.binding-1.3.7" + }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-lxml-4.2.5" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-wheel-0.30.0" + }, { "license": [ { @@ -1251,14 +1418,7 @@ "name": "python2.7-python-pam-1.8.4" }, { - "license": [ - { - "fullName": "GNU General Public License v1.0 only", - "shortName": "gpl1", - "spdxId": "GPL-1.0", - "url": "http://spdx.org/licenses/GPL-1.0.html" - } - ], + "license": "UNKNOWN", "name": "linux-pam-1.3.0" }, { @@ -1293,9 +1453,7 @@ "name": "libkrb5-1.15.2" }, { - "license":{ - "fullName": "BSD-derived (https://www.openldap.org/software/release/license.html)" - }, + "license": "UNKNOWN", "name": "openldap-2.4.45" }, { @@ -1307,7 +1465,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-pyasn1-modules-0.2.2" + "name": "python2.7-pyasn1-modules-0.2.4" }, { "license": [ @@ -1318,42 +1476,47 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-pyasn1-0.4.4" + "name": "python2.7-pyasn1-0.4.5" }, { "license": [ { - "fullName": "zlib License", - "shortName": "zlib", - "spdxId": "Zlib", - "url": "http://spdx.org/licenses/Zlib.html" - }, - { - "fullName": "libpng License", - "shortName": "libpng", - "spdxId": "Libpng", - "url": "http://spdx.org/licenses/Libpng.html" + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-pysqlite-2.8.3" + "name": "python2.7-pyramid-mailer-0.15.1" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-transaction-2.4.0" + }, + { + "license": [ + { + "fullName": "Zope Public License 2.1", + "shortName": "zpl21", + "spdxId": "ZPL-2.1", + "url": "http://spdx.org/licenses/ZPL-2.1.html" + } + ], + "name": "python2.7-repoze.sendmail-4.4.1" }, { "license": { "fullName": "Repoze License", "url": "http://www.repoze.org/LICENSE.txt" }, - "name": "python2.7-pyramid-1.9.2" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-hupper-1.3" + "name": "python2.7-pyramid-1.10.1" }, { "license": [ @@ -1386,7 +1549,18 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-pastedeploy-1.5.2" + "name": "python2.7-pastedeploy-2.0.1" + }, + { + "license": [ + { + "fullName": "MIT License", + "shortName": "mit", + "spdxId": "MIT", + "url": "http://spdx.org/licenses/MIT.html" + } + ], + "name": "python2.7-hupper-1.5" }, { "license": { @@ -1419,18 +1593,7 @@ "url": "http://www.repoze.org/LICENSE.txt" } ], - "name": "python2.7-pyramid-debugtoolbar-4.4" - }, - { - "license": [ - { - "fullName": "Python Software Foundation License version 2", - "shortName": "psfl", - "spdxId": "Python-2.0", - "url": "http://spdx.org/licenses/Python-2.0.html" - } - ], - "name": "python2.7-ipaddress-1.0.22" + "name": "python2.7-pyramid-debugtoolbar-4.5" }, { "license": { @@ -1459,18 +1622,16 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-pyparsing-1.5.7" + "name": "python2.7-pyparsing-2.3.0" }, { "license": [ { - "fullName": "Apache License 2.0", - "shortName": "asl20", - "spdxId": "Apache-2.0", - "url": "http://spdx.org/licenses/Apache-2.0.html" + "fullName": "Public Domain", + "shortName": "publicDomain" } ], - "name": "python2.7-pygments-markdown-lexer-0.1.0.dev39" + "name": "python2.7-pycrypto-2.6.1" }, { "license": { @@ -1492,31 +1653,13 @@ ], "name": "python2.7-py-bcrypt-0.4" }, - { - "license": { - "fullName": "GNU Lesser General Public License v3.0 or later", - "shortName": "lgpl3Plus", - "spdxId": "LGPL-3.0+", - "url": "http://spdx.org/licenses/LGPL-3.0+.html" - }, - "name": "python2.7-psycopg2-2.7.4" - }, - { - "license": { - "fullName": "PostgreSQL License", - "shortName": "postgresql", - "spdxId": "PostgreSQL", - "url": "http://spdx.org/licenses/PostgreSQL.html" - }, - "name": "postgresql-9.6.10" - }, { "license": [ { "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" } ], - "name": "python2.7-peppercorn-0.5" + "name": "python2.7-peppercorn-0.6" }, { "license": [ @@ -1527,7 +1670,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-pastescript-2.0.2" + "name": "python2.7-pastescript-3.0.0" }, { "license": [ @@ -1549,60 +1692,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-objgraph-3.1.1" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-graphviz-0.9" - }, - { - "license": [ - { - "fullName": "BSD 4-clause \"Original\" or \"Old\" License", - "shortName": "bsdOriginal", - "spdxId": "BSD-4-Clause", - "url": "http://spdx.org/licenses/BSD-4-Clause.html" - } - ], - "name": "python2.7-pyotp-2.2.6" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-pymysql-0.8.1" - }, - { - "license": [ - { - "fullName": "GNU General Public License v1.0 only", - "shortName": "gpl1", - "spdxId": "GPL-1.0", - "url": "http://spdx.org/licenses/GPL-1.0.html" - } - ], - "name": "python2.7-mysql-python-1.2.5" - }, - { - "license": { - "fullName": "GNU Library General Public License v2.1 only", - "shortName": "lgpl21", - "spdxId": "LGPL-2.1", - "url": "http://spdx.org/licenses/LGPL-2.1.html" - }, - "name": "mariadb-connector-c-2.3.4" + "name": "python2.7-pyotp-2.2.7" }, { "license": [ @@ -1624,29 +1714,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-lxml-3.7.3" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-wheel-0.30.0" - }, - { - "license": [ - { - "fullName": "BSD 4-clause \"Original\" or \"Old\" License", - "shortName": "bsdOriginal", - "spdxId": "BSD-4-Clause", - "url": "http://spdx.org/licenses/BSD-4-Clause.html" - } - ], - "name": "python2.7-kombu-4.2.0" + "name": "python2.7-kombu-4.2.1" }, { "license": [ @@ -1668,18 +1736,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-vine-1.1.4" - }, - { - "license": [ - { - "fullName": "BSD 4-clause \"Original\" or \"Old\" License", - "shortName": "bsdOriginal", - "spdxId": "BSD-4-Clause", - "url": "http://spdx.org/licenses/BSD-4-Clause.html" - } - ], - "name": "python2.7-billiard-3.5.0.3" + "name": "python2.7-vine-1.2.0" }, { "license": [ @@ -1701,7 +1758,7 @@ "url": "http://spdx.org/licenses/MIT.html" } ], - "name": "python2.7-iso8601-0.1.11" + "name": "python2.7-iso8601-0.1.12" }, { "license": [ @@ -1745,7 +1802,7 @@ "url": "http://spdx.org/licenses/BSD-4-Clause.html" } ], - "name": "python2.7-dogpile.cache-0.6.6" + "name": "python2.7-dogpile.cache-0.7.1" }, { "license": { @@ -1758,18 +1815,21 @@ }, { "license": [ + { + "fullName": "Repoze Public License" + }, { "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)" } ], - "name": "python2.7-deform-2.0.5" + "name": "python2.7-deform-2.0.7" }, { "license": { "fullName": "Repoze License", "url": "http://www.repoze.org/LICENSE.txt" }, - "name": "python2.7-colander-1.4" + "name": "python2.7-colander-1.7.0" }, { "license": [ @@ -1834,6 +1894,17 @@ ], "name": "python2.7-celery-4.1.1" }, + { + "license": [ + { + "fullName": "BSD 4-clause \"Original\" or \"Old\" License", + "shortName": "bsdOriginal", + "spdxId": "BSD-4-Clause", + "url": "http://spdx.org/licenses/BSD-4-Clause.html" + } + ], + "name": "python2.7-billiard-3.5.0.3" + }, { "license": [ { @@ -1857,25 +1928,7 @@ "name": "python2.7-authomatic-0.1.0.post1" }, { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "node-grunt-cli-1.2.0" - }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], + "license": "UNKNOWN", "name": "python2.7-rhodecode-testdata-0.10.0" } ] From 7ae6f87669e12405e3f6fec3c8290917e1db78db Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 4 Mar 2019 12:00:00 +0100 Subject: [PATCH 026/252] Mercurial: changes for hg 4.9 support - we dropped custom diff call and replace it with generic solution - before ctx_diff was called which is no longer supported by vcsserver backend --- rhodecode/lib/vcs/backends/hg/commit.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/rhodecode/lib/vcs/backends/hg/commit.py b/rhodecode/lib/vcs/backends/hg/commit.py index bccfa25f..e821ac36 100644 --- a/rhodecode/lib/vcs/backends/hg/commit.py +++ b/rhodecode/lib/vcs/backends/hg/commit.py @@ -193,13 +193,6 @@ class MercurialCommit(base.BaseCommit): children = self._remote.ctx_children(self.idx) return self._make_commits(children) - def diff(self, ignore_whitespace=True, context=3): - result = self._remote.ctx_diff( - self.idx, - git=True, ignore_whitespace=ignore_whitespace, context=context) - diff = ''.join(result) - return MercurialDiff(diff) - def _fix_path(self, path): """ Mercurial keeps filenodes as str so we need to encode from unicode From 7b4415eaf11711b1eab44fcefa81805794633683 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Tue, 5 Mar 2019 19:22:45 +0100 Subject: [PATCH 027/252] tests: fixed stream tests --- rhodecode/tests/vcs_operations/test_vcs_operations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rhodecode/tests/vcs_operations/test_vcs_operations.py b/rhodecode/tests/vcs_operations/test_vcs_operations.py index ef85952a..452cf4ff 100644 --- a/rhodecode/tests/vcs_operations/test_vcs_operations.py +++ b/rhodecode/tests/vcs_operations/test_vcs_operations.py @@ -64,8 +64,8 @@ class TestVCSOperations(object): clone_url = rc_web_server.repo_clone_url(HG_REPO) stdout, stderr = Command('/tmp').execute( 'hg clone --pull --stream', clone_url, tmpdir.strpath) - assert '225 files to transfer, 1.04 MB of data' in stdout - assert 'transferred 1.04 MB' in stdout + assert 'files to transfer,' in stdout + assert 'transferred 1.' in stdout assert '114 files updated,' in stdout def test_clone_git_repo_by_admin(self, rc_web_server, tmpdir): From ba0940ba9455ca47167f43d85027784f0cb31d37 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Tue, 5 Mar 2019 11:19:22 +0100 Subject: [PATCH 028/252] gists: define and use explicit Mercurial backend to speed up creation and fetching of backend repo --- rhodecode/apps/gist/views.py | 1 - rhodecode/model/db.py | 9 ++++++++- rhodecode/model/gist.py | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/rhodecode/apps/gist/views.py b/rhodecode/apps/gist/views.py index ce767434..b2d6dfe9 100644 --- a/rhodecode/apps/gist/views.py +++ b/rhodecode/apps/gist/views.py @@ -67,7 +67,6 @@ class GistView(BaseAppView): (Gist.ACL_LEVEL_PUBLIC, _("Can be accessed by anonymous users")) ] - return c @LoginRequired() diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py index 83c869ca..87854537 100644 --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -4260,9 +4260,16 @@ class Gist(Base, BaseModel): # SCM functions def scm_instance(self, **kwargs): + """ + Get explicit Mercurial repository used + :param kwargs: + :return: + """ + from rhodecode.model.gist import GistModel full_repo_path = os.path.join(self.base_path(), self.gist_access_id) return get_vcs_instance( - repo_path=safe_str(full_repo_path), create=False) + repo_path=safe_str(full_repo_path), create=False, + _vcs_alias=GistModel.vcs_backend) class ExternalIdentity(Base, BaseModel): diff --git a/rhodecode/model/gist.py b/rhodecode/model/gist.py index 37f43ffc..741b5c30 100644 --- a/rhodecode/model/gist.py +++ b/rhodecode/model/gist.py @@ -47,6 +47,7 @@ GIST_METADATA_FILE = '.rc_gist_metadata' class GistModel(BaseModel): cls = Gist + vcs_backend = 'hg' def _get_gist(self, gist): """ @@ -145,7 +146,7 @@ class GistModel(BaseModel): gist_repo_path = os.path.join(GIST_STORE_LOC, gist_id) log.debug('Creating new %s GIST repo in %s', gist_type, gist_repo_path) repo = RepoModel()._create_filesystem_repo( - repo_name=gist_id, repo_type='hg', repo_group=GIST_STORE_LOC, + repo_name=gist_id, repo_type=self.vcs_backend, repo_group=GIST_STORE_LOC, use_global_config=True) # now create single multifile commit From a1b36af5a6919ae68641d224f2fd64d7cce8612e Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Tue, 5 Mar 2019 22:24:05 +0100 Subject: [PATCH 029/252] tweens: check url sanity before vcs detection tween. --- rhodecode/tweens.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rhodecode/tweens.py b/rhodecode/tweens.py index eb8466a2..6ee0024e 100644 --- a/rhodecode/tweens.py +++ b/rhodecode/tweens.py @@ -92,6 +92,7 @@ def junk_form_data_detector(request): def sanity_check_factory(handler, registry): def sanity_check(request): + log.debug('Checking URL sanity') try: junk_encoding_detector(request) bad_url_data_detector(request) @@ -113,5 +114,5 @@ def includeme(config): 'pyramid.events.NewRequest') config.add_subscriber('rhodecode.subscribers.add_request_user_context', 'pyramid.events.ContextFound') - config.add_tween('rhodecode.tweens.sanity_check_factory') config.add_tween('rhodecode.tweens.vcs_detection_tween_factory') + config.add_tween('rhodecode.tweens.sanity_check_factory') From ce1e0aa0e1d58b1d3c3e89a233b48c33cb318c47 Mon Sep 17 00:00:00 2001 From: Daniel Dourvaris Date: Tue, 5 Mar 2019 23:48:22 +0100 Subject: [PATCH 030/252] gists: handle 500 error on sending unsupported format --- rhodecode/apps/gist/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rhodecode/apps/gist/views.py b/rhodecode/apps/gist/views.py index b2d6dfe9..b57df13d 100644 --- a/rhodecode/apps/gist/views.py +++ b/rhodecode/apps/gist/views.py @@ -25,7 +25,7 @@ import formencode import formencode.htmlfill import peppercorn -from pyramid.httpexceptions import HTTPNotFound, HTTPFound +from pyramid.httpexceptions import HTTPNotFound, HTTPFound, HTTPBadRequest from pyramid.view import view_config from pyramid.renderers import render from pyramid.response import Response @@ -295,6 +295,8 @@ class GistView(BaseAppView): response = Response(content) response.content_type = 'text/plain' return response + elif return_format: + raise HTTPBadRequest() return self._get_template_context(c) From fad88932523af1c83b1e9049d885a1568ee50205 Mon Sep 17 00:00:00 2001 From: Marcin Lulek Date: Wed, 6 Mar 2019 12:22:09 +0100 Subject: [PATCH 031/252] user-sessions: added option to cleanup redis based sessions in user session interface. --- configs/development.ini | 4 ++++ configs/production.ini | 4 ++++ rhodecode/lib/user_sessions.py | 40 +++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/configs/development.ini b/configs/development.ini index 1d9a0b49..3bd3c90f 100644 --- a/configs/development.ini +++ b/configs/development.ini @@ -379,6 +379,10 @@ rc_cache.cache_repo_longterm.max_size = 10000 beaker.session.type = file beaker.session.data_dir = %(here)s/data/sessions +## redis sessions +#beaker.session.type = ext:redis +#beaker.session.url = redis://127.0.0.1:6379/2 + ## db based session, fast, and allows easy management over logged in users #beaker.session.type = ext:database #beaker.session.table_name = db_session diff --git a/configs/production.ini b/configs/production.ini index 67cdd189..2f24f63f 100644 --- a/configs/production.ini +++ b/configs/production.ini @@ -354,6 +354,10 @@ rc_cache.cache_repo_longterm.max_size = 10000 beaker.session.type = file beaker.session.data_dir = %(here)s/data/sessions +## redis sessions +#beaker.session.type = ext:redis +#beaker.session.url = redis://127.0.0.1:6379/2 + ## db based session, fast, and allows easy management over logged in users #beaker.session.type = ext:database #beaker.session.table_name = db_session diff --git a/rhodecode/lib/user_sessions.py b/rhodecode/lib/user_sessions.py index a276b616..37c2ef31 100644 --- a/rhodecode/lib/user_sessions.py +++ b/rhodecode/lib/user_sessions.py @@ -23,6 +23,7 @@ import re import time import datetime import dateutil +import pickle from rhodecode.model.db import DbSession, Session @@ -142,7 +143,6 @@ class FileAuthSessions(BaseAuthSessions): return stats['callbacks'] - class MemcachedAuthSessions(BaseAuthSessions): SESSION_TYPE = 'ext:memcached' _key_regex = re.compile(r'ITEM (.*_session) \[(.*); (.*)\]') @@ -195,6 +195,43 @@ class MemcachedAuthSessions(BaseAuthSessions): raise CleanupCommand('Cleanup for this session type not yet available') +class RedisAuthSessions(BaseAuthSessions): + SESSION_TYPE = 'ext:redis' + + def _get_client(self): + import redis + args = { + 'socket_timeout': 60, + 'url': self.config.get('beaker.session.url') + } + + client = redis.StrictRedis.from_url(**args) + return client + + def get_count(self): + client = self._get_client() + return len(client.keys('beaker_cache:*')) + + def get_expired_count(self, older_than_seconds=None): + expiry_date = self._seconds_to_date(older_than_seconds) + return self.NOT_AVAILABLE + + def clean_sessions(self, older_than_seconds=None): + client = self._get_client() + expiry_time = time.time() - older_than_seconds + deleted_keys = 0 + for key in client.keys('beaker_cache:*'): + data = client.get(key) + if data: + json_data = pickle.loads(data) + accessed_time = json_data['_accessed_time'] + if accessed_time < expiry_time: + client.delete(key) + deleted_keys += 1 + + return deleted_keys + + class MemoryAuthSessions(BaseAuthSessions): SESSION_TYPE = 'memory' @@ -212,6 +249,7 @@ def get_session_handler(session_type): types = { 'file': FileAuthSessions, 'ext:memcached': MemcachedAuthSessions, + 'ext:redis': RedisAuthSessions, 'ext:database': DbAuthSessions, 'memory': MemoryAuthSessions } From a697b290c8e66e4da8ea38e16c8d0c9af6697bff Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 6 Mar 2019 13:24:29 +0100 Subject: [PATCH 032/252] ui/menu: re-order the navigation for future changes. --- rhodecode/templates/base/base.mako | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/rhodecode/templates/base/base.mako b/rhodecode/templates/base/base.mako index da01ad96..f030f3a6 100644 --- a/rhodecode/templates/base/base.mako +++ b/rhodecode/templates/base/base.mako @@ -507,6 +507,12 @@ ## ROOT MENU +
  • + + + +
  • + %if c.rhodecode_user.username != h.DEFAULT_USER:
  • @@ -520,16 +526,13 @@
  • %endif +
  • -
  • - - - -
  • + % if h.HasPermissionAll('hg.admin')('access admin main page'):
  • From 34f922314fe3ef9af333e2d39a7b8e298786195b Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 6 Mar 2019 13:29:05 +0100 Subject: [PATCH 033/252] ui: reduce logo size --- .../images/rhodecode-logo-white-216x60.png | Bin 10866 -> 0 bytes .../images/rhodecode-logo-white-266x74.png | Bin 9933 -> 0 bytes .../images/rhodecode-logo-white-60x60.png | Bin 0 -> 4766 bytes rhodecode/templates/base/base.mako | 2 +- rhodecode/templates/login.mako | 2 +- rhodecode/templates/password_reset.mako | 2 +- rhodecode/templates/register.mako | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 rhodecode/public/images/rhodecode-logo-white-216x60.png delete mode 100644 rhodecode/public/images/rhodecode-logo-white-266x74.png create mode 100644 rhodecode/public/images/rhodecode-logo-white-60x60.png diff --git a/rhodecode/public/images/rhodecode-logo-white-216x60.png b/rhodecode/public/images/rhodecode-logo-white-216x60.png deleted file mode 100644 index 7b3d3dd162ca2dc1869fc24b559a5a94da312664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10866 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 IM6N<$f|5Yx4FCWD diff --git a/rhodecode/public/images/rhodecode-logo-white-266x74.png b/rhodecode/public/images/rhodecode-logo-white-266x74.png deleted file mode 100644 index 8428dcb71885ffd052f8ba7c634434560b81ee74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9933 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 LNkvXXu0mjf9l^R{ diff --git a/rhodecode/public/images/rhodecode-logo-white-60x60.png b/rhodecode/public/images/rhodecode-logo-white-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..62c835cf7c7e7dd73c5c8189a789d0956923df10 GIT binary patch literal 4766 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
  • @@ -693,6 +695,16 @@ icon += ''; } } + // file + else if (searchType === 'file') { + var repo_data = data['repo_data']; + var repoIcon = getRepoIcon(repo_data['repository_type']); + if (repoIcon) { + icon += repoIcon; + } else { + icon += ''; + } + } var tmpl = '
    {0}{1}
    '; return tmpl.format(icon, valueDisplay); From 2ff4542cd5cdbb1380b61beb4a4e201c8f0d9b74 Mon Sep 17 00:00:00 2001 From: Daniel Dourvaris Date: Wed, 6 Mar 2019 22:30:13 +0100 Subject: [PATCH 035/252] ui: fixed branding look&feel as per discussions. --- rhodecode/apps/admin/tests/test_admin_settings.py | 3 +-- rhodecode/public/css/main.less | 6 +++++- rhodecode/templates/base/base.mako | 8 +++++--- rhodecode/templates/login.mako | 8 +++++--- rhodecode/templates/password_reset.mako | 8 +++++--- rhodecode/templates/register.mako | 8 +++++--- 6 files changed, 26 insertions(+), 15 deletions(-) diff --git a/rhodecode/apps/admin/tests/test_admin_settings.py b/rhodecode/apps/admin/tests/test_admin_settings.py index db79a3c7..25efd6cd 100644 --- a/rhodecode/apps/admin/tests/test_admin_settings.py +++ b/rhodecode/apps/admin/tests/test_admin_settings.py @@ -214,8 +214,7 @@ class TestAdminSettingsGlobal(object): }) response = response.follow() - response.mustcontain( - """
    - %s
    """ % new_title) + response.mustcontain(new_title) def post_and_verify_settings(self, settings): old_title = 'RhodeCode' diff --git a/rhodecode/public/css/main.less b/rhodecode/public/css/main.less index 33255906..543aa507 100644 --- a/rhodecode/public/css/main.less +++ b/rhodecode/public/css/main.less @@ -1024,11 +1024,15 @@ label { float:left; } -.branding{ +.branding { float: left; padding: 9px 2px; line-height: 1em; font-size: @navigation-fontsize; + + a { + color: @grey5 + } } img { diff --git a/rhodecode/templates/base/base.mako b/rhodecode/templates/base/base.mako index 742c86f1..9c7a89a6 100644 --- a/rhodecode/templates/base/base.mako +++ b/rhodecode/templates/base/base.mako @@ -11,9 +11,11 @@
    RhodeCode
    - %if c.rhodecode_name: -
    - ${h.branding(c.rhodecode_name)}
    - %endif + % if c.rhodecode_name: + + % endif
    ${self.menu_bar_nav()} diff --git a/rhodecode/templates/login.mako b/rhodecode/templates/login.mako index 01ecb5a7..6f6ae123 100644 --- a/rhodecode/templates/login.mako +++ b/rhodecode/templates/login.mako @@ -16,9 +16,11 @@
    RhodeCode
    - %if c.rhodecode_name: -
    - ${h.branding(c.rhodecode_name)}
    - %endif + % if c.rhodecode_name: + + % endif diff --git a/rhodecode/templates/password_reset.mako b/rhodecode/templates/password_reset.mako index b61d92be..f2c07bd2 100644 --- a/rhodecode/templates/password_reset.mako +++ b/rhodecode/templates/password_reset.mako @@ -16,9 +16,11 @@
    RhodeCode
    - %if c.rhodecode_name: -
    - ${h.branding(c.rhodecode_name)}
    - %endif + % if c.rhodecode_name: + + % endif diff --git a/rhodecode/templates/register.mako b/rhodecode/templates/register.mako index 25915078..8183618f 100644 --- a/rhodecode/templates/register.mako +++ b/rhodecode/templates/register.mako @@ -16,9 +16,11 @@
    RhodeCode
    - %if c.rhodecode_name: -
    - ${h.branding(c.rhodecode_name)}
    - %endif + % if c.rhodecode_name: + + % endif From aae04c2b48672a322fb608c02139901d17b79872 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 6 Mar 2019 23:26:05 +0100 Subject: [PATCH 036/252] docs: added admin trick to unarchive an repository --- docs/admin/admin-tricks.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/admin/admin-tricks.rst b/docs/admin/admin-tricks.rst index d16c851b..192d1b7a 100644 --- a/docs/admin/admin-tricks.rst +++ b/docs/admin/admin-tricks.rst @@ -239,3 +239,26 @@ following URL: ``{instance-URL}/_admin/ping``. .. _Markdown: http://daringfireball.net/projects/markdown/ .. _reStructured Text: http://docutils.sourceforge.net/docs/index.html + + +Unarchiving a repository +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Archive operation for the repository is similar as delete. Archive keeps the data for future references +but makes the repository read-only. After archiving the repository it shouldn't be modified in any way. +This is why repository settings are disabled for an archived repository. + +If there's a need for unarchiving a repository for some reasons, the interactive +ishell interface should be used. + +.. code-block:: bash + + # Open iShell from the terminal + $ rccontrol ishell enterprise-1/community-1 + +.. code-block:: python + + # Set repository as un-archived + In [1]: repo = Repository.get_by_repo_name('SOME_REPO_NAME') + In [2]: repo.archived = False + In [3]: Session().add(repo);Session().commit() From d204635753d2e19d536323ab02cea77d9f819e96 Mon Sep 17 00:00:00 2001 From: Marcin Lulek Date: Thu, 7 Mar 2019 06:41:04 +0100 Subject: [PATCH 037/252] summary: fixed 500 errors on loading just summary commits and missing clone_url set. - some bots were triggering this, and we should handle that case properly --- .../apps/repository/views/repo_summary.py | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/rhodecode/apps/repository/views/repo_summary.py b/rhodecode/apps/repository/views/repo_summary.py index 0e0f6fb8..a1868318 100644 --- a/rhodecode/apps/repository/views/repo_summary.py +++ b/rhodecode/apps/repository/views/repo_summary.py @@ -152,6 +152,26 @@ class RepoSummaryView(RepoAppView): c.comments = self.db_repo.get_comments(page_ids) c.statuses = self.db_repo.statuses(page_ids) + def _prepare_and_set_clone_url(self, c): + username = '' + if self._rhodecode_user.username != User.DEFAULT_USER: + username = safe_str(self._rhodecode_user.username) + + _def_clone_uri = _def_clone_uri_id = c.clone_uri_tmpl + _def_clone_uri_ssh = c.clone_uri_ssh_tmpl + + if '{repo}' in _def_clone_uri: + _def_clone_uri_id = _def_clone_uri.replace('{repo}', '_{repoid}') + elif '{repoid}' in _def_clone_uri: + _def_clone_uri_id = _def_clone_uri.replace('_{repoid}', '{repo}') + + c.clone_repo_url = self.db_repo.clone_url( + user=username, uri_tmpl=_def_clone_uri) + c.clone_repo_url_id = self.db_repo.clone_url( + user=username, uri_tmpl=_def_clone_uri_id) + c.clone_repo_url_ssh = self.db_repo.clone_url( + uri_tmpl=_def_clone_uri_ssh, ssh=True) + @LoginRequired() @HasRepoPermissionAnyDecorator( 'repository.read', 'repository.write', 'repository.admin') @@ -160,6 +180,7 @@ class RepoSummaryView(RepoAppView): renderer='rhodecode:templates/summary/summary_commits.mako') def summary_commits(self): c = self.load_default_context() + self._prepare_and_set_clone_url(c) self._load_commits_context(c) return self._get_template_context(c) @@ -179,26 +200,7 @@ class RepoSummaryView(RepoAppView): c = self.load_default_context() # Prepare the clone URL - username = '' - if self._rhodecode_user.username != User.DEFAULT_USER: - username = safe_str(self._rhodecode_user.username) - - _def_clone_uri = _def_clone_uri_id = c.clone_uri_tmpl - _def_clone_uri_ssh = c.clone_uri_ssh_tmpl - - if '{repo}' in _def_clone_uri: - _def_clone_uri_id = _def_clone_uri.replace( - '{repo}', '_{repoid}') - elif '{repoid}' in _def_clone_uri: - _def_clone_uri_id = _def_clone_uri.replace( - '_{repoid}', '{repo}') - - c.clone_repo_url = self.db_repo.clone_url( - user=username, uri_tmpl=_def_clone_uri) - c.clone_repo_url_id = self.db_repo.clone_url( - user=username, uri_tmpl=_def_clone_uri_id) - c.clone_repo_url_ssh = self.db_repo.clone_url( - uri_tmpl=_def_clone_uri_ssh, ssh=True) + self._prepare_and_set_clone_url(c) # If enabled, get statistics data From e303ffca3f4e92aea01a21e7e33477eb34f139a5 Mon Sep 17 00:00:00 2001 From: Marcin Lulek Date: Mon, 11 Mar 2019 08:46:12 +0100 Subject: [PATCH 038/252] comments[security]: make an additional check to forbid solving comments from other repo scope. --- rhodecode/model/comment.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rhodecode/model/comment.py b/rhodecode/model/comment.py index 6be2938f..f682e224 100644 --- a/rhodecode/model/comment.py +++ b/rhodecode/model/comment.py @@ -259,8 +259,18 @@ class CommentsModel(BaseModel): # check if the comment actually belongs to this PR if resolved_comment and resolved_comment.pull_request and \ resolved_comment.pull_request != pull_request: + log.warning('Comment tried to resolved unrelated todo comment: %s', + resolved_comment) # comment not bound to this pull request, forbid resolved_comment = None + + elif resolved_comment and resolved_comment.repo and \ + resolved_comment.repo != repo: + log.warning('Comment tried to resolved unrelated todo comment: %s', + resolved_comment) + # comment not bound to this repo, forbid + resolved_comment = None + comment.resolved_comment = resolved_comment pull_request_id = pull_request From 60c1714915d49b1f253b9bd969501c137c1f2888 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 11 Mar 2019 13:02:39 +0100 Subject: [PATCH 039/252] dependencies: moved some to pinned requirements --- pkgs/python-packages.nix | 4 ---- requirements.txt | 4 ---- requirements_pinned.txt | 8 +++++++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 8e7f9cf9..fddcf6a0 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1759,7 +1759,6 @@ self: super: { self."beaker" self."bleach" self."celery" - self."chameleon" self."channelstream" self."click" self."colander" @@ -1770,7 +1769,6 @@ self: super: { self."docutils" self."dogpile.cache" self."dogpile.core" - self."ecdsa" self."formencode" self."future" self."futures" @@ -1797,7 +1795,6 @@ self: super: { self."pyparsing" self."pyramid-beaker" self."pyramid-debugtoolbar" - self."pyramid-jinja2" self."pyramid-mako" self."pyramid" self."pyramid-mailer" @@ -1820,7 +1817,6 @@ self: super: { self."sshpubkeys" self."subprocess32" self."supervisor" - self."tempita" self."translationstring" self."urllib3" self."urlobject" diff --git a/requirements.txt b/requirements.txt index a336b442..d5bfacf8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,6 @@ babel==1.3 beaker==1.9.1 bleach==3.1.0 celery==4.1.1 -chameleon==2.24 channelstream==0.5.2 click==7.0 colander==1.7.0 @@ -21,7 +20,6 @@ deform==2.0.7 docutils==0.14.0 dogpile.cache==0.7.1 dogpile.core==0.4.1 -ecdsa==0.13 formencode==1.2.4 future==0.14.3 futures==3.0.2 @@ -48,7 +46,6 @@ pygments==2.3.1 pyparsing==2.3.0 pyramid-beaker==0.8 pyramid-debugtoolbar==4.5.0 -pyramid-jinja2==2.7 pyramid-mako==1.0.2 pyramid==1.10.1 pyramid_mailer==0.15.1 @@ -71,7 +68,6 @@ sqlalchemy==1.1.18 sshpubkeys==3.1.0 subprocess32==3.5.3 supervisor==3.3.5 -tempita==0.5.2 translationstring==1.3 urllib3==1.24.1 urlobject==2.4.3 diff --git a/requirements_pinned.txt b/requirements_pinned.txt index cee5e38f..410f1eae 100644 --- a/requirements_pinned.txt +++ b/requirements_pinned.txt @@ -3,9 +3,15 @@ atomicwrites==1.2.1 attrs==18.2.0 billiard==3.5.0.3 +chameleon==2.24 +cffi==1.12.2 +ecdsa==0.13 +hupper==1.6 gnureadline==6.3.8 jinja2==2.9.6 jsonschema==2.6.0 pathlib2==2.3.3 +pyramid-jinja2==2.7 setproctitle==1.1.10 - +scandir==1.10.0 +tempita==0.5.2 From 19d24cd94687e11573d6fcc7a5248397a1a07c55 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 11 Mar 2019 13:05:07 +0100 Subject: [PATCH 040/252] dependencies: bumped few libraries and freeze their versions - hupper==1.6 - cffi==1.12.2 - cryptography==2.6.1 --- pkgs/python-packages.nix | 25 +++++++++++++------------ requirements.txt | 1 + 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index fddcf6a0..2343b032 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -199,14 +199,14 @@ self: super: { }; }; "cffi" = super.buildPythonPackage { - name = "cffi-1.12.1"; + name = "cffi-1.12.2"; doCheck = false; propagatedBuildInputs = [ self."pycparser" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/bc/81/47bd0404f2cb5363edb371e3b15da6387b5e9b80122e5b81be8b8f411e9b/cffi-1.12.1.tar.gz"; - sha256 = "0cw0dzynw34zi75h674y3bgas6axfjyw1h6hj6ic2llcwyj7nvwv"; + url = "https://files.pythonhosted.org/packages/64/7c/27367b38e6cc3e1f49f193deb761fe75cda9f95da37b67b422e62281fcac/cffi-1.12.2.tar.gz"; + sha256 = "19qfks2djya8vix95bmg3xzipjb8w9b8mbj4j5k2hqkc8j58f4z1"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -321,7 +321,7 @@ self: super: { }; }; "cryptography" = super.buildPythonPackage { - name = "cryptography-2.5"; + name = "cryptography-2.6.1"; doCheck = false; propagatedBuildInputs = [ self."asn1crypto" @@ -331,8 +331,8 @@ self: super: { self."ipaddress" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/69/ed/5e97b7f54237a9e4e6291b6e52173372b7fa45ca730d36ea90b790c0059a/cryptography-2.5.tar.gz"; - sha256 = "00c4d7gvsymlaw0r13zrm32dcnarmpayjyrh65yymlmr6mrbcij9"; + url = "https://files.pythonhosted.org/packages/07/ca/bc827c5e55918ad223d59d299fff92f3563476c3b00d0a9157d9c0217449/cryptography-2.6.1.tar.gz"; + sha256 = "19iwz5avym5zl6jrrrkym1rdaa9h61j20ph4cswsqgv8xg5j3j16"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal { fullName = "BSD or Apache License, Version 2.0"; } pkgs.lib.licenses.asl20 ]; @@ -666,11 +666,11 @@ self: super: { }; }; "hupper" = super.buildPythonPackage { - name = "hupper-1.5"; + name = "hupper-1.6"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/89/f1/aace4ea69c1d79e243e48a81dcf1608c87e8c5a190e6ef80fae245d494ac/hupper-1.5.tar.gz"; - sha256 = "02n6y2rvpacm2w3x089whj64j1x0qlkimkzw35r1g0mymmxicfk9"; + url = "https://files.pythonhosted.org/packages/a4/f7/595756fdfdf896d2c46ae6dc25b1bc97645d0fbf2d6ca547b5b55728eaf3/hupper-1.6.tar.gz"; + sha256 = "0p30l0pk63js0c0hl57c0dvffmawkwhh4yjmfaqyzgwdpdb0g3fc"; }; meta = { license = [ pkgs.lib.licenses.mit ]; @@ -1760,6 +1760,7 @@ self: super: { self."bleach" self."celery" self."channelstream" + self."cryptography" self."click" self."colander" self."configobj" @@ -1909,11 +1910,11 @@ self: super: { }; }; "scandir" = super.buildPythonPackage { - name = "scandir-1.9.0"; + name = "scandir-1.10.0"; doCheck = false; src = fetchurl { - url = "https://files.pythonhosted.org/packages/16/2a/557af1181e6b4e30254d5a6163b18f5053791ca66e251e77ab08887e8fe3/scandir-1.9.0.tar.gz"; - sha256 = "0r3hvf1a9jm1rkqgx40gxkmccknkaiqjavs8lccgq9s8khh5x5s4"; + url = "https://files.pythonhosted.org/packages/df/f5/9c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e/scandir-1.10.0.tar.gz"; + sha256 = "1bkqwmf056pkchf05ywbnf659wqlp6lljcdb0y88wr9f0vv32ijd"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal { fullName = "New BSD License"; } ]; diff --git a/requirements.txt b/requirements.txt index d5bfacf8..789929cc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,7 @@ colander==1.7.0 # our custom configobj https://code.rhodecode.com/upstream/configobj/archive/a11ff0a0bd4fbda9e3a91267e720f88329efb4a6.tar.gz?md5=9916c524ea11a6c418217af6b28d4b3c#egg=configobj==5.0.6 cssselect==1.0.3 +cryptography==2.6.1 decorator==4.1.2 deform==2.0.7 docutils==0.14.0 From 6039839d538c419a3971d742c92f6d14d9a4c9b1 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 13 Mar 2019 12:12:01 +0100 Subject: [PATCH 041/252] go-to search: updated logic of goto switcher - when in repo group searcher are ordered by the entries in the group - support prefixes with spaces, eg file: PATTERN - new contextual search for groups/repos with mark token - better suggestions --- rhodecode/apps/home/views.py | 319 +++++++++++------- rhodecode/lib/helpers.py | 2 +- rhodecode/model/db.py | 2 +- rhodecode/public/css/navigation.less | 37 +- .../js/src/plugins/jquery.autocomplete.js | 16 +- rhodecode/templates/base/base.mako | 136 ++++++-- rhodecode/templates/base/root.mako | 3 +- rhodecode/templates/search/search.mako | 4 +- 8 files changed, 366 insertions(+), 153 deletions(-) diff --git a/rhodecode/apps/home/views.py b/rhodecode/apps/home/views.py index 15acf587..d7b8657a 100644 --- a/rhodecode/apps/home/views.py +++ b/rhodecode/apps/home/views.py @@ -33,7 +33,7 @@ from rhodecode.lib.index import searcher_from_config from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int from rhodecode.lib.ext_json import json from rhodecode.model.db import ( - func, true, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup) + func, true, or_, case, in_filter_generator, Repository, RepoGroup, User, UserGroup) from rhodecode.model.repo import RepoModel from rhodecode.model.repo_group import RepoGroupModel from rhodecode.model.scm import RepoGroupList, RepoList @@ -105,21 +105,27 @@ class HomeView(BaseAppView): return {'suggestions': _user_groups} - def _get_repo_list(self, name_contains=None, repo_type=None, limit=20): + def _get_repo_list(self, name_contains=None, repo_type=None, repo_group_name='', limit=20): org_query = name_contains allowed_ids = self._rhodecode_user.repo_acl_ids( ['repository.read', 'repository.write', 'repository.admin'], cache=False, name_filter=name_contains) or [-1] query = Repository.query()\ - .order_by(func.length(Repository.repo_name))\ - .order_by(Repository.repo_name)\ .filter(Repository.archived.isnot(true()))\ .filter(or_( # generate multiple IN to fix limitation problems *in_filter_generator(Repository.repo_id, allowed_ids) )) + query = query.order_by(case( + [ + (Repository.repo_name.startswith(repo_group_name), repo_group_name+'/'), + ], + )) + query = query.order_by(func.length(Repository.repo_name)) + query = query.order_by(Repository.repo_name) + if repo_type: query = query.filter(Repository.repo_type == repo_type) @@ -145,20 +151,26 @@ class HomeView(BaseAppView): } for obj in acl_iter] - def _get_repo_group_list(self, name_contains=None, limit=20): + def _get_repo_group_list(self, name_contains=None, repo_group_name='', limit=20): org_query = name_contains allowed_ids = self._rhodecode_user.repo_group_acl_ids( ['group.read', 'group.write', 'group.admin'], cache=False, name_filter=name_contains) or [-1] query = RepoGroup.query()\ - .order_by(func.length(RepoGroup.group_name))\ - .order_by(RepoGroup.group_name) \ .filter(or_( # generate multiple IN to fix limitation problems *in_filter_generator(RepoGroup.group_id, allowed_ids) )) + query = query.order_by(case( + [ + (RepoGroup.group_name.startswith(repo_group_name), repo_group_name+'/'), + ], + )) + query = query.order_by(func.length(RepoGroup.group_name)) + query = query.order_by(RepoGroup.group_name) + if name_contains: ilike_expression = u'%{}%'.format(safe_unicode(name_contains)) query = query.filter( @@ -183,11 +195,17 @@ class HomeView(BaseAppView): def _get_user_list(self, name_contains=None, limit=20): org_query = name_contains if not name_contains: - return [] + return [], False - name_contains = re.compile('(?:user:)(.+)').findall(name_contains) + # TODO(marcink): should all logged in users be allowed to search others? + allowed_user_search = self._rhodecode_user.username != User.DEFAULT_USER + if not allowed_user_search: + return [], False + + name_contains = re.compile('(?:user:[ ]?)(.+)').findall(name_contains) if len(name_contains) != 1: - return [] + return [], False + name_contains = name_contains[0] query = User.query()\ @@ -207,22 +225,28 @@ class HomeView(BaseAppView): { 'id': obj.user_id, 'value': org_query, - 'value_display': obj.username, + 'value_display': 'user: `{}`'.format(obj.username), 'type': 'user', 'icon_link': h.gravatar_url(obj.email, 30), 'url': h.route_path( 'user_profile', username=obj.username) } - for obj in acl_iter] + for obj in acl_iter], True def _get_user_groups_list(self, name_contains=None, limit=20): org_query = name_contains if not name_contains: - return [] + return [], False - name_contains = re.compile('(?:user_group:)(.+)').findall(name_contains) + # TODO(marcink): should all logged in users be allowed to search others? + allowed_user_search = self._rhodecode_user.username != User.DEFAULT_USER + if not allowed_user_search: + return [], False + + name_contains = re.compile('(?:user_group:[ ]?)(.+)').findall(name_contains) if len(name_contains) != 1: - return [] + return [], False + name_contains = name_contains[0] query = UserGroup.query()\ @@ -241,27 +265,34 @@ class HomeView(BaseAppView): { 'id': obj.users_group_id, 'value': org_query, - 'value_display': obj.users_group_name, + 'value_display': 'user_group: `{}`'.format(obj.users_group_name), 'type': 'user_group', 'url': h.route_path( 'user_group_profile', user_group_name=obj.users_group_name) } - for obj in acl_iter] + for obj in acl_iter], True + + def _get_hash_commit_list(self, auth_user, searcher, query, repo=None, repo_group=None): + repo_name = repo_group_name = None + if repo: + repo_name = repo.repo_name + if repo_group: + repo_group_name = repo_group.group_name - def _get_hash_commit_list(self, auth_user, searcher, query): org_query = query if not query or len(query) < 3 or not searcher: - return [] + return [], False - commit_hashes = re.compile('(?:commit:)([0-9a-f]{2,40})').findall(query) + commit_hashes = re.compile('(?:commit:[ ]?)([0-9a-f]{2,40})').findall(query) if len(commit_hashes) != 1: - return [] + return [], False + commit_hash = commit_hashes[0] result = searcher.search( 'commit_id:{}*'.format(commit_hash), 'commit', auth_user, - raise_on_exc=False) + repo_name, repo_group_name, raise_on_exc=False) commits = [] for entry in result['results']: @@ -286,22 +317,29 @@ class HomeView(BaseAppView): } commits.append(commit_entry) - return commits + return commits, True + + def _get_path_list(self, auth_user, searcher, query, repo=None, repo_group=None): + repo_name = repo_group_name = None + if repo: + repo_name = repo.repo_name + if repo_group: + repo_group_name = repo_group.group_name - def _get_path_list(self, auth_user, searcher, query): org_query = query if not query or len(query) < 3 or not searcher: - return [] + return [], False - paths_re = re.compile('(?:file:)(.{1,})').findall(query) + paths_re = re.compile('(?:file:[ ]?)(.+)').findall(query) if len(paths_re) != 1: - return [] + return [], False + file_path = paths_re[0] search_path = searcher.escape_specials(file_path) result = searcher.search( 'file.raw:*{}*'.format(search_path), 'path', auth_user, - raise_on_exc=False) + repo_name, repo_group_name, raise_on_exc=False) files = [] for entry in result['results']: @@ -327,7 +365,7 @@ class HomeView(BaseAppView): } files.append(file_entry) - return files + return files, True @LoginRequired() @view_config( @@ -405,17 +443,15 @@ class HomeView(BaseAppView): qry = query return {'q': qry, 'type': 'content'} label = u'File search for `{}` in this repository.'.format(query) - queries.append( - { - 'id': -10, - 'value': query, - 'value_display': label, - 'type': 'search', - 'url': h.route_path('search_repo', - repo_name=repo_name, - _query=query_modifier()) + file_qry = { + 'id': -10, + 'value': query, + 'value_display': label, + 'type': 'search', + 'url': h.route_path('search_repo', + repo_name=repo_name, + _query=query_modifier()) } - ) # commits def query_modifier(): @@ -423,17 +459,22 @@ class HomeView(BaseAppView): return {'q': qry, 'type': 'commit'} label = u'Commit search for `{}` in this repository.'.format(query) - queries.append( - { - 'id': -20, - 'value': query, - 'value_display': label, - 'type': 'search', - 'url': h.route_path('search_repo', - repo_name=repo_name, - _query=query_modifier()) + commit_qry = { + 'id': -20, + 'value': query, + 'value_display': label, + 'type': 'search', + 'url': h.route_path('search_repo', + repo_name=repo_name, + _query=query_modifier()) } - ) + + if repo_context in ['commit', 'changelog']: + queries.extend([commit_qry, file_qry]) + elif repo_context in ['files', 'summary']: + queries.extend([file_qry, commit_qry]) + else: + queries.extend([commit_qry, file_qry]) elif is_es_6 and repo_group_name: # files @@ -442,17 +483,15 @@ class HomeView(BaseAppView): return {'q': qry, 'type': 'content'} label = u'File search for `{}` in this repository group'.format(query) - queries.append( - { - 'id': -30, - 'value': query, - 'value_display': label, - 'type': 'search', - 'url': h.route_path('search_repo_group', - repo_group_name=repo_group_name, - _query=query_modifier()) + file_qry = { + 'id': -30, + 'value': query, + 'value_display': label, + 'type': 'search', + 'url': h.route_path('search_repo_group', + repo_group_name=repo_group_name, + _query=query_modifier()) } - ) # commits def query_modifier(): @@ -460,18 +499,24 @@ class HomeView(BaseAppView): return {'q': qry, 'type': 'commit'} label = u'Commit search for `{}` in this repository group'.format(query) - queries.append( - { - 'id': -40, - 'value': query, - 'value_display': label, - 'type': 'search', - 'url': h.route_path('search_repo_group', - repo_group_name=repo_group_name, - _query=query_modifier()) + commit_qry = { + 'id': -40, + 'value': query, + 'value_display': label, + 'type': 'search', + 'url': h.route_path('search_repo_group', + repo_group_name=repo_group_name, + _query=query_modifier()) } - ) + if repo_context in ['commit', 'changelog']: + queries.extend([commit_qry, file_qry]) + elif repo_context in ['files', 'summary']: + queries.extend([file_qry, commit_qry]) + else: + queries.extend([commit_qry, file_qry]) + + # Global, not scoped if not queries: queries.append( { @@ -510,65 +555,107 @@ class HomeView(BaseAppView): if not query: return {'suggestions': res} + def no_match(name): + return { + 'id': -1, + 'value': "", + 'value_display': name, + 'type': 'text', + 'url': "" + } searcher = searcher_from_config(self.request.registry.settings) - for _q in self._get_default_search_queries(self.request.GET, searcher, query): - res.append(_q) + has_specialized_search = False + # set repo context + repo = None + repo_id = safe_int(self.request.GET.get('search_context[repo_id]')) + if repo_id: + repo = Repository.get(repo_id) + + # set group context + repo_group = None repo_group_id = safe_int(self.request.GET.get('search_context[repo_group_id]')) if repo_group_id: repo_group = RepoGroup.get(repo_group_id) - composed_hint = '{}/{}'.format(repo_group.group_name, query) - show_hint = not query.startswith(repo_group.group_name) - if repo_group and show_hint: - hint = u'Repository search inside: `{}`'.format(composed_hint) - res.append({ - 'id': -1, - 'value': composed_hint, - 'value_display': hint, - 'type': 'hint', - 'url': "" - }) + prefix_match = False - repo_groups = self._get_repo_group_list(query) - for serialized_repo_group in repo_groups: - res.append(serialized_repo_group) + # user: type search + if not prefix_match: + users, prefix_match = self._get_user_list(query) + if users: + has_specialized_search = True + for serialized_user in users: + res.append(serialized_user) + elif prefix_match: + has_specialized_search = True + res.append(no_match('No matching users found')) - repos = self._get_repo_list(query) - for serialized_repo in repos: - res.append(serialized_repo) + # user_group: type search + if not prefix_match: + user_groups, prefix_match = self._get_user_groups_list(query) + if user_groups: + has_specialized_search = True + for serialized_user_group in user_groups: + res.append(serialized_user_group) + elif prefix_match: + has_specialized_search = True + res.append(no_match('No matching user groups found')) - # TODO(marcink): should all logged in users be allowed to search others? - allowed_user_search = self._rhodecode_user.username != User.DEFAULT_USER - if allowed_user_search: - users = self._get_user_list(query) - for serialized_user in users: - res.append(serialized_user) - - user_groups = self._get_user_groups_list(query) - for serialized_user_group in user_groups: - res.append(serialized_user_group) - - commits = self._get_hash_commit_list(c.auth_user, searcher, query) - if commits: - unique_repos = collections.OrderedDict() - for commit in commits: - repo_name = commit['repo'] - unique_repos.setdefault(repo_name, []).append(commit) - - for repo, commits in unique_repos.items(): + # FTS commit: type search + if not prefix_match: + commits, prefix_match = self._get_hash_commit_list( + c.auth_user, searcher, query, repo, repo_group) + if commits: + has_specialized_search = True + unique_repos = collections.OrderedDict() for commit in commits: - res.append(commit) + repo_name = commit['repo'] + unique_repos.setdefault(repo_name, []).append(commit) - paths = self._get_path_list(c.auth_user, searcher, query) - if paths: - unique_repos = collections.OrderedDict() - for path in paths: - repo_name = path['repo'] - unique_repos.setdefault(repo_name, []).append(path) + for _repo, commits in unique_repos.items(): + for commit in commits: + res.append(commit) + elif prefix_match: + has_specialized_search = True + res.append(no_match('No matching commits found')) - for repo, paths in unique_repos.items(): + # FTS file: type search + if not prefix_match: + paths, prefix_match = self._get_path_list( + c.auth_user, searcher, query, repo, repo_group) + if paths: + has_specialized_search = True + unique_repos = collections.OrderedDict() for path in paths: - res.append(path) + repo_name = path['repo'] + unique_repos.setdefault(repo_name, []).append(path) + + for repo, paths in unique_repos.items(): + for path in paths: + res.append(path) + elif prefix_match: + has_specialized_search = True + res.append(no_match('No matching files found')) + + # main suggestions + if not has_specialized_search: + repo_group_name = '' + if repo_group: + repo_group_name = repo_group.group_name + + for _q in self._get_default_search_queries(self.request.GET, searcher, query): + res.append(_q) + + repo_groups = self._get_repo_group_list(query, repo_group_name=repo_group_name) + for serialized_repo_group in repo_groups: + res.append(serialized_repo_group) + + repos = self._get_repo_list(query, repo_group_name=repo_group_name) + for serialized_repo in repos: + res.append(serialized_repo) + + if not repos and not repo_groups: + res.append(no_match('No matches found')) return {'suggestions': res} diff --git a/rhodecode/lib/helpers.py b/rhodecode/lib/helpers.py index a7d874dd..aad2612d 100644 --- a/rhodecode/lib/helpers.py +++ b/rhodecode/lib/helpers.py @@ -2037,6 +2037,6 @@ def get_repo_view_type(request): 'repo_files': 'files', 'repo_summary': 'summary', 'repo_commit': 'commit' - } + return route_to_view_type.get(route_name) diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py index 87854537..0fc7bb33 100644 --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -39,7 +39,7 @@ from sqlalchemy import ( Index, Sequence, UniqueConstraint, ForeignKey, CheckConstraint, Column, Boolean, String, Unicode, UnicodeText, DateTime, Integer, LargeBinary, Text, Float, PickleType) -from sqlalchemy.sql.expression import true, false +from sqlalchemy.sql.expression import true, false, case from sqlalchemy.sql.functions import coalesce, count # pragma: no cover from sqlalchemy.orm import ( relationship, joinedload, class_mapper, validates, aliased) diff --git a/rhodecode/public/css/navigation.less b/rhodecode/public/css/navigation.less index 482cf506..fe35bedb 100644 --- a/rhodecode/public/css/navigation.less +++ b/rhodecode/public/css/navigation.less @@ -644,6 +644,40 @@ ul#context-pages { .main_filter_input_box { display: inline-block; + + .searchItems { + display:flex; + background: #666666; + padding: 0px; + + a { + border: none !important; + } + } + + .searchTag { + line-height: 28px; + padding: 0px 4px; + + .tag { + color: @nav-grey; + border-color: @nav-grey; + } + } + + .searchTagFilter { + background-color: @grey3 !important; + } + + .searchTagHelp { + background-color: @grey2 !important; + } + .searchTagHelp:hover { + background-color: @grey2 !important; + } + .searchTagInput { + background-color: @grey3 !important; + } } .main_filter_box { @@ -667,7 +701,8 @@ ul#context-pages { color: @nav-grey; background: @grey3; min-height: 18px; - + border:none; + border-radius: 0; &:active { color: @grey2 !important; diff --git a/rhodecode/public/js/src/plugins/jquery.autocomplete.js b/rhodecode/public/js/src/plugins/jquery.autocomplete.js index d7efab87..ea9517d3 100644 --- a/rhodecode/public/js/src/plugins/jquery.autocomplete.js +++ b/rhodecode/public/js/src/plugins/jquery.autocomplete.js @@ -528,7 +528,19 @@ if ($.isFunction(serviceUrl)) { serviceUrl = serviceUrl.call(that.element, query); } - cacheKey = serviceUrl + '?' + $.param(params || {}); + + var callParams = {}; + //make an evaluated copy of params + $.each(params, function(index, value) { + if($.isFunction(value)){ + callParams[index] = value(); + } + else { + callParams[index] = value; + } + }); + + cacheKey = serviceUrl + '?' + $.param(callParams); response = that.cachedResponse[cacheKey]; } @@ -536,7 +548,7 @@ that.suggestions = response.suggestions; that.suggest(); } else if (!that.isBadQuery(query)) { - if (options.onSearchStart.call(that.element, options.params) === false) { + if (options.onSearchStart.call(that.element, params) === false) { return; } if (that.currentRequest) { diff --git a/rhodecode/templates/base/base.mako b/rhodecode/templates/base/base.mako index 9c7a89a6..78ef9582 100644 --- a/rhodecode/templates/base/base.mako +++ b/rhodecode/templates/base/base.mako @@ -233,7 +233,6 @@
  • -
  • ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()" %if c.rhodecode_db_repo.repo_type in ['git','hg']: @@ -338,7 +337,6 @@
    @@ -622,6 +653,22 @@ }(result, escapeMarkup); }; + var escapeRegExChars = function (value) { + return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }; + + var getRepoIcon = function(repo_type) { + if (repo_type === 'hg') { + return ' '; + } + else if (repo_type === 'git') { + return ' '; + } + else if (repo_type === 'svn') { + return ' '; + } + return '' + }; var autocompleteMainFilterFormatResult = function (data, value, org_formatter) { @@ -632,27 +679,14 @@ var searchType = data['type']; var valueDisplay = data['value_display']; - var escapeRegExChars = function (value) { - return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - }; var pattern = '(' + escapeRegExChars(value) + ')'; - var getRepoIcon = function(repo_type) { - if (repo_type === 'hg') { - return ' '; - } - else if (repo_type === 'git') { - return ' '; - } - else if (repo_type === 'svn') { - return ' '; - } - return '' - }; + valueDisplay = Select2.util.escapeMarkup(valueDisplay); // highlight match - valueDisplay = Select2.util.escapeMarkup(valueDisplay); - valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '$1<\/strong>'); + if (searchType != 'text') { + valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '$1<\/strong>'); + } var icon = ''; @@ -684,6 +718,7 @@ else if (searchType === 'user_group') { icon += ' '; } + // user else if (searchType === 'user') { icon += ''.format(data['icon_link']); } @@ -707,6 +742,10 @@ icon += ''; } } + // generic text + else if (searchType === 'text') { + icon = ''; + } var tmpl = '
    {0}{1}
    '; return tmpl.format(icon, valueDisplay); @@ -716,25 +755,52 @@ if (suggestion.type === "hint") { // we skip action $('#main_filter').focus(); + } + else if (suggestion.type === "text") { + // we skip action + $('#main_filter').focus(); + } else { window.location = suggestion['url']; } }; + var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) { if (queryLowerCase.split(':').length === 2) { queryLowerCase = queryLowerCase.split(':')[1] } + if (suggestion.type === "text") { + // special case we don't want to "skip" display for + return true + } return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1; }; + var cleanContext = { + repo_view_type: null, + + repo_id: null, + repo_name: "", + + repo_group_id: null, + repo_group_name: null + }; + var removeGoToFilter = function () { + $('.searchTagHidable').hide(); + $('#main_filter').autocomplete( + 'setOptions', {params:{search_context: cleanContext}}); + }; + $('#main_filter').autocomplete({ serviceUrl: pyroutes.url('goto_switcher_data'), - params: {"search_context": templateContext.search_context}, + params: { + "search_context": templateContext.search_context + }, minChars:2, maxHeight:400, deferRequestBy: 300, //miliseconds tabDisabled: true, - autoSelectFirst: true, + autoSelectFirst: false, formatResult: autocompleteMainFilterFormatResult, lookupFilter: autocompleteMainFilterResult, onSelect: function (element, suggestion) { @@ -753,6 +819,18 @@ $('#main_filter_help').toggle(); }; + $('#main_filter').on('keydown.autocomplete', function (e) { + + var BACKSPACE = 8; + var el = $(e.currentTarget); + if(e.which === BACKSPACE){ + var inputVal = el.val(); + if (inputVal === ""){ + removeGoToFilter() + } + } + }); + diff --git a/rhodecode/templates/base/root.mako b/rhodecode/templates/base/root.mako index a29d42e2..f4bf5b5c 100644 --- a/rhodecode/templates/base/root.mako +++ b/rhodecode/templates/base/root.mako @@ -7,7 +7,7 @@ go_import_header = '' if hasattr(c, 'rhodecode_db_repo'): c.template_context['repo_type'] = c.rhodecode_db_repo.repo_type c.template_context['repo_landing_commit'] = c.rhodecode_db_repo.landing_rev[1] - ## check repo context + c.template_context['repo_id'] = c.rhodecode_db_repo.repo_id c.template_context['repo_view_type'] = h.get_repo_view_type(request) if getattr(c, 'repo_group', None): @@ -29,6 +29,7 @@ c.template_context['default_user'] = { c.template_context['search_context'] = { 'repo_group_id': c.template_context.get('repo_group_id'), 'repo_group_name': c.template_context.get('repo_group_name'), + 'repo_id': c.template_context.get('repo_id'), 'repo_name': c.template_context.get('repo_name'), 'repo_view_type': c.template_context.get('repo_view_type'), } diff --git a/rhodecode/templates/search/search.mako b/rhodecode/templates/search/search.mako index edaf570f..7159bc3f 100644 --- a/rhodecode/templates/search/search.mako +++ b/rhodecode/templates/search/search.mako @@ -37,9 +37,9 @@ <%def name="menu_bar_subnav()"> %if c.repo_name: - ${self.repo_menu(active='search')} + ${self.repo_menu(active='summary')} %elif c.repo_group_name: - ${self.repo_group_menu(active='search')} + ${self.repo_group_menu(active='home')} %endif From 0cac94b9466190877388a53f7770c8ba13b57bb4 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 13 Mar 2019 18:08:57 +0100 Subject: [PATCH 042/252] ui: normalize main grid sizes and columns --- rhodecode/model/repo_group.py | 4 ++++ rhodecode/public/css/tables.less | 5 +++++ rhodecode/templates/index_base.mako | 7 +++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/rhodecode/model/repo_group.py b/rhodecode/model/repo_group.py index 64f27cc0..4b6aed68 100644 --- a/rhodecode/model/repo_group.py +++ b/rhodecode/model/repo_group.py @@ -728,6 +728,10 @@ class RepoGroupModel(BaseModel): "name_raw": group.group_name, "last_change": last_change(group.last_db_change), "last_change_raw": datetime_to_time(group.last_db_change), + + "last_changeset": "", + "last_changeset_raw": "", + "desc": desc(group.description_safe, group.personal), "top_level_repos": 0, "owner": user_profile(group.user.username) diff --git a/rhodecode/public/css/tables.less b/rhodecode/public/css/tables.less index 3fcafc1b..c7bca511 100644 --- a/rhodecode/public/css/tables.less +++ b/rhodecode/public/css/tables.less @@ -141,6 +141,11 @@ table.dataTable { } } + &.td-grid-name { + white-space: nowrap; + min-width: 300px; + } + &.td-componentname { white-space: nowrap; } diff --git a/rhodecode/templates/index_base.mako b/rhodecode/templates/index_base.mako index 8ebb3342..3d29c48f 100644 --- a/rhodecode/templates/index_base.mako +++ b/rhodecode/templates/index_base.mako @@ -79,13 +79,16 @@ order: [[ 0, "asc" ]], columns: [ { data: {"_": "name", - "sort": "name_raw"}, title: "${_('Name')}", className: "td-componentname" }, + "sort": "name_raw"}, title: "${_('Name')}", className: "truncate-wrap td-grid-name" }, { data: 'menu', "bSortable": false, className: "quick_repo_menu" }, { data: {"_": "desc", "sort": "desc"}, title: "${_('Description')}", className: "td-description" }, { data: {"_": "last_change", "sort": "last_change_raw", "type": Number}, title: "${_('Last Change')}", className: "td-time" }, + { data: {"_": "last_changeset", + "sort": "last_changeset_raw", + "type": Number}, title: "", className: "td-hash" }, { data: {"_": "owner", "sort": "owner"}, title: "${_('Owner')}", className: "td-user" } ], @@ -109,7 +112,7 @@ pageLength: ${c.visual.dashboard_items}, columns: [ { data: {"_": "name", - "sort": "name_raw"}, title: "${_('Name')}", className: "truncate-wrap td-componentname" }, + "sort": "name_raw"}, title: "${_('Name')}", className: "truncate-wrap td-grid-name" }, { data: 'menu', "bSortable": false, className: "quick_repo_menu" }, { data: {"_": "desc", "sort": "desc"}, title: "${_('Description')}", className: "td-description" }, From 815078785bd07bb4c23039582ee40f20102510e2 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 29 Mar 2019 12:23:43 +0100 Subject: [PATCH 043/252] dependencies: removed setuptools-scm as it's no longer required --- pkgs/python-packages-overrides.nix | 6 ------ pkgs/python-packages.nix | 12 ------------ requirements.txt | 1 - rhodecode/config/licenses.json | 11 ----------- 4 files changed, 30 deletions(-) diff --git a/pkgs/python-packages-overrides.nix b/pkgs/python-packages-overrides.nix index cd157c3b..fbdac0f3 100644 --- a/pkgs/python-packages-overrides.nix +++ b/pkgs/python-packages-overrides.nix @@ -164,12 +164,6 @@ self: super: { }; }); - "pytest-runner" = super."pytest-runner".override (attrs: { - propagatedBuildInputs = [ - self."setuptools-scm" - ]; - }); - "python-ldap" = super."python-ldap".override (attrs: { propagatedBuildInputs = attrs.propagatedBuildInputs ++ [ pkgs.openldap diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index ac78740e..7470dfa7 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1752,7 +1752,6 @@ self: super: { ]; doCheck = true; propagatedBuildInputs = [ - self."setuptools-scm" self."amqp" self."authomatic" self."babel" @@ -1942,17 +1941,6 @@ self: super: { license = [ pkgs.lib.licenses.mit ]; }; }; - "setuptools-scm" = super.buildPythonPackage { - name = "setuptools-scm-2.1.0"; - doCheck = false; - src = fetchurl { - url = "https://files.pythonhosted.org/packages/e5/62/f9e1ac314464eb5945c97542acb6bf6f3381dfa5d7a658de7730c36f31a1/setuptools_scm-2.1.0.tar.gz"; - sha256 = "0yb364cgk15sfw3x8ln4ssh98z1dj6n8iiz4r2rw1cfsxhgi8rx7"; - }; - meta = { - license = [ pkgs.lib.licenses.mit ]; - }; - }; "simplegeneric" = super.buildPythonPackage { name = "simplegeneric-0.8.1"; doCheck = false; diff --git a/requirements.txt b/requirements.txt index c388c62e..b6626933 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ ## dependencies -setuptools-scm==2.1.0 amqp==2.3.1 # not released authomatic that has updated some oauth providers https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1 diff --git a/rhodecode/config/licenses.json b/rhodecode/config/licenses.json index 7e3ea426..aa2e0c1e 100644 --- a/rhodecode/config/licenses.json +++ b/rhodecode/config/licenses.json @@ -269,17 +269,6 @@ ], "name": "python2.7-pytest-runner-4.2" }, - { - "license": [ - { - "fullName": "MIT License", - "shortName": "mit", - "spdxId": "MIT", - "url": "http://spdx.org/licenses/MIT.html" - } - ], - "name": "python2.7-setuptools-scm-2.1.0" - }, { "license": [ { From 3682e12c8853f98b5d5ac59f7f7472241a6379fd Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 29 Mar 2019 12:24:03 +0100 Subject: [PATCH 044/252] dependencies: bumped paste to 3.0.8 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 7470dfa7..dad5bab7 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1051,14 +1051,14 @@ self: super: { }; }; "paste" = super.buildPythonPackage { - name = "paste-3.0.5"; + name = "paste-3.0.8"; doCheck = false; propagatedBuildInputs = [ self."six" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/d4/41/91bde422400786b1b06357c1e6e3a5379f54dc3002aeb337cb767233304e/Paste-3.0.5.tar.gz"; - sha256 = "1a6i8fh1fg8r4x800fvy9r82m15clwjim6yf2g9r4dff0y40dchv"; + url = "https://files.pythonhosted.org/packages/66/65/e3acf1663438483c1f6ced0b6c6f3b90da9f0faacb0a6e2aa0f3f9f4b235/Paste-3.0.8.tar.gz"; + sha256 = "05w1sh6ky4d7pmdb8nv82n13w22jcn3qsagg5ih3hjmbws9kkwf4"; }; meta = { license = [ pkgs.lib.licenses.mit ]; diff --git a/requirements.txt b/requirements.txt index b6626933..f3ad219c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,7 @@ markupsafe==1.1.0 msgpack-python==0.5.6 pyotp==2.2.7 packaging==15.2 -paste==3.0.5 +paste==3.0.8 pastedeploy==2.0.1 pastescript==3.0.0 peppercorn==0.6 From b844fdabb25263f6b93e3bf2af3b5a5eb97deffa Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 29 Mar 2019 12:24:25 +0100 Subject: [PATCH 045/252] dependencies: bumped pastescript to 3.1.0 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index dad5bab7..71b5743a 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1076,7 +1076,7 @@ self: super: { }; }; "pastescript" = super.buildPythonPackage { - name = "pastescript-3.0.0"; + name = "pastescript-3.1.0"; doCheck = false; propagatedBuildInputs = [ self."paste" @@ -1084,8 +1084,8 @@ self: super: { self."six" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/08/2a/3797377a884ab9a064ad4d564ed612e54d26d7997caa8229c9c9df4eac31/PasteScript-3.0.0.tar.gz"; - sha256 = "1hvmyz1sbn7ws1syw567ph7km9fi0wi75r3vlyzx6sk0z26xkm6r"; + url = "https://files.pythonhosted.org/packages/9e/1d/14db1c283eb21a5d36b6ba1114c13b709629711e64acab653d9994fe346f/PasteScript-3.1.0.tar.gz"; + sha256 = "02qcxjjr32ks7a6d4f533wl34ysc7yhwlrfcyqwqbzr52250v4fs"; }; meta = { license = [ pkgs.lib.licenses.mit ]; diff --git a/requirements.txt b/requirements.txt index f3ad219c..686bde24 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,7 +36,7 @@ pyotp==2.2.7 packaging==15.2 paste==3.0.8 pastedeploy==2.0.1 -pastescript==3.0.0 +pastescript==3.1.0 peppercorn==0.6 psutil==5.5.1 py-bcrypt==0.4 From a6caa077af566f977e08ee3a26096a05a6e906d4 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 29 Mar 2019 12:24:42 +0100 Subject: [PATCH 046/252] dependencies: bumped alembic to 1.0.8 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 71b5743a..b36db794 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -5,7 +5,7 @@ self: super: { "alembic" = super.buildPythonPackage { - name = "alembic-1.0.5"; + name = "alembic-1.0.8"; doCheck = false; propagatedBuildInputs = [ self."sqlalchemy" @@ -14,8 +14,8 @@ self: super: { self."python-dateutil" ]; src = fetchurl { - url = "https://files.pythonhosted.org/packages/1c/65/b8e4f5b2f345bb13b5e0a3fddd892b0b3f0e8ad4880e954fdc6a50d00d84/alembic-1.0.5.tar.gz"; - sha256 = "0rpjqp2iq6p49x1nli18ivak1izz547nnjxi110mzrgc1v7dxzz9"; + url = "https://files.pythonhosted.org/packages/d6/bb/ec1e21f2e303689ad2170eb47fc67df9ad4199ade6759a99474c4d3535c8/alembic-1.0.8.tar.gz"; + sha256 = "1s34i1j0dsxbflxligwhnkf37a5hvcshsv8ibkcfdjf03ph42pah"; }; meta = { license = [ pkgs.lib.licenses.mit ]; diff --git a/requirements.txt b/requirements.txt index 686bde24..ed28842d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -97,7 +97,7 @@ nbformat==4.4.0 jupyter_client==5.0.0 ## cli tools -alembic==1.0.5 +alembic==1.0.8 invoke==0.13.0 bumpversion==0.5.3 From 500599bd6167c369cb3bfbd7d1f65c37f10d0489 Mon Sep 17 00:00:00 2001 From: Peter Colledge Date: Thu, 21 Mar 2019 11:52:57 +0000 Subject: [PATCH 047/252] Issue #5548 - Add initial search API method --- rhodecode/api/views/search_api.py | 101 ++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 rhodecode/api/views/search_api.py diff --git a/rhodecode/api/views/search_api.py b/rhodecode/api/views/search_api.py new file mode 100644 index 00000000..6e9d4727 --- /dev/null +++ b/rhodecode/api/views/search_api.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2011-2018 RhodeCode GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3 +# (only), as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# This program is dual-licensed. If you wish to learn more about the +# RhodeCode Enterprise Edition, including its added features, Support services, +# and proprietary license terms, please see https://rhodecode.com/licenses/ + + +import logging + +from rhodecode.api import jsonrpc_method +from rhodecode.api.exc import JSONRPCValidationError +from rhodecode.api.utils import Optional +from rhodecode.lib.index import searcher_from_config +from rhodecode.model import validation_schema +from rhodecode.model.validation_schema.schemas import search_schema + +log = logging.getLogger(__name__) + + +@jsonrpc_method() +def search(request, apiuser, search_query, search_type, page_limit=Optional(10), page=Optional(1), search_sort=Optional('newfirst'), repo_name=Optional(None)): + """ + Search + + :param apiuser: This is filled automatically from the |authtoken|. + :type apiuser: AuthUser + :param search_query: Search query. + :type search_query: str + :param search_type: Search type. either commit or content. + :type search_type: str + :param page_limit: Page item limit. Default 10 items. + :type page_limit: Optional(int) + :param page: Page number. Default first page. + :type page: Optional(int) + :param search_sort: Search sort. Default newfirst. + :type search_sort: Optional(str) + :param repo_name: Filter by one repo. Default is all. + :type repo_name: Optional(str) + """ + + searcher = searcher_from_config(request.registry.settings) + data = {'execution_time': ''} + repo_name = Optional.extract(repo_name) + + schema = search_schema.SearchParamsSchema() + + search_params = {} + try: + search_params = schema.deserialize( + dict(search_query=search_query, + search_type=search_type, + search_sort=Optional.extract(search_sort), + page_limit=Optional.extract(page_limit), + requested_page=Optional.extract(page)) + ) + except validation_schema.Invalid as err: + raise JSONRPCValidationError(colander_exc=err) + + search_query = search_params.get('search_query') + search_type = search_params.get('search_type') + search_sort = search_params.get('search_sort') + + if search_params.get('search_query'): + page_limit = search_params['page_limit'] + requested_page = search_params['requested_page'] + + try: + search_result = searcher.search( + search_query, search_type, apiuser, repo_name, + requested_page, page_limit, search_sort) + + data.update(dict( + results=list(search_result['results']), page=requested_page, + item_count=search_result['count'], + items_per_page=page_limit)) + finally: + searcher.cleanup() + + if not search_result['error']: + data['execution_time'] = '%s results (%.3f seconds)' % ( + search_result['count'], + search_result['runtime']) + else: + node = schema['search_query'] + raise JSONRPCValidationError(colander_exc=validation_schema.Invalid(node, search_result['error'])) + + return data From 69ea375e9d51f56db5ff36e5d5ebe722c1dd1ff6 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 22 Mar 2019 16:39:11 +0100 Subject: [PATCH 048/252] pull-requests: expose force refresh of merge workspace and expose all metadata for merge message formatting. --- rhodecode/model/pull_request.py | 9 ++++++--- .../templates/pullrequests/pullrequest_merge_checks.mako | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/rhodecode/model/pull_request.py b/rhodecode/model/pull_request.py index 9fb2aa51..698a5058 100644 --- a/rhodecode/model/pull_request.py +++ b/rhodecode/model/pull_request.py @@ -1303,10 +1303,13 @@ class PullRequestModel(BaseModel): merge_state = self._refresh_merge_state( pull_request, target_vcs, target_ref) else: - possible = pull_request.\ - last_merge_status == MergeFailureReason.NONE + possible = pull_request.last_merge_status == MergeFailureReason.NONE + metadata = { + 'target_ref': pull_request.target_ref_parts, + 'source_ref': pull_request.source_ref_parts + } merge_state = MergeResponse( - possible, False, None, pull_request.last_merge_status) + possible, False, None, pull_request.last_merge_status, metadata=metadata) return merge_state diff --git a/rhodecode/templates/pullrequests/pullrequest_merge_checks.mako b/rhodecode/templates/pullrequests/pullrequest_merge_checks.mako index 3650586b..8bf018f4 100644 --- a/rhodecode/templates/pullrequests/pullrequest_merge_checks.mako +++ b/rhodecode/templates/pullrequests/pullrequest_merge_checks.mako @@ -28,6 +28,9 @@ % endfor +
  • + Try forced recheck of the merge workspace in case current status seems wrong. +
  • % endif From 8aa083fbe015460a90079ba14c5a8b32d89d62a4 Mon Sep 17 00:00:00 2001 From: Liviu Date: Fri, 22 Mar 2019 16:08:14 +0000 Subject: [PATCH 049/252] ui: start of new UI branch --- rhodecode/templates/base/base.mako | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rhodecode/templates/base/base.mako b/rhodecode/templates/base/base.mako index da01ad96..b709c525 100644 --- a/rhodecode/templates/base/base.mako +++ b/rhodecode/templates/base/base.mako @@ -226,6 +226,11 @@
    + +
    + ${self.repo_page_title(c.rhodecode_db_repo)} +
    +