diff --git a/.travis.yml b/.travis.yml index 88266e89f42..c214da055b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: java jdk: - - openjdk10 - - openjdk12 + - openjdk11 cache: directories: diff --git a/build.gradle b/build.gradle index b369a17826e..1556a6aa318 100644 --- a/build.gradle +++ b/build.gradle @@ -46,11 +46,11 @@ configure(subprojects) { httpcoreVersion = '4.4.13' ioVersion = '2.6' jacksonVersion = '2.12.1' - javafxVersion = '11.0.2' + javafxVersion = '15' javaxAnnotationVersion = '1.2' jcsvVersion = '1.4.0' jetbrainsAnnotationsVersion = '13.0' - jfoenixVersion = '9.0.6' + jfoenixVersion = '9.0.10' joptVersion = '5.0.4' jsonsimpleVersion = '1.1.1' jsonrpc4jVersion = '1.6.0.bisq.1' @@ -58,17 +58,16 @@ configure(subprojects) { jupiterVersion = '5.7.0' kotlinVersion = '1.3.41' knowmXchangeVersion = '4.4.2' - langVersion = '3.8' + langVersion = '3.11' logbackVersion = '1.1.11' loggingVersion = '1.2' - lombokVersion = '1.18.2' - mockitoVersion = '3.0.0' + lombokVersion = '1.18.12' + mockitoVersion = '3.5.15' netlayerVersion = '8db4a13' // Commit ID from https://github.com/bisq-network/netlayer/commits/externaltor protobufVersion = '3.10.0' protocVersion = protobufVersion pushyVersion = '0.13.2' qrgenVersion = '1.3' - sarxosVersion = '0.3.12' slf4jVersion = '1.7.30' sparkVersion = '2.5.2' springBootVersion = '1.5.10.RELEASE' @@ -382,8 +381,13 @@ configure(project(':desktop')) { apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'witness' apply from: '../gradle/witness/gradle-witness.gradle' + apply from: 'package/package.gradle' - version = '1.6.1-SNAPSHOT' + version = '1.6.2-SNAPSHOT' + + jar.manifest.attributes( + "Implementation-Title": project.name, + "Implementation-Version": version) mainClassName = 'bisq.desktop.app.BisqAppMain' @@ -402,7 +406,6 @@ configure(project(':desktop')) { compile "de.jensd:fontawesomefx-materialdesignfont:$fontawesomefxMaterialdesignfontVersion" compile "com.google.guava:guava:$guavaVersion" compile "com.googlecode.jcsv:jcsv:$jcsvVersion" - compile "com.github.sarxos:webcam-capture:$sarxosVersion" compile "org.openjfx:javafx-controls:$javafxVersion:$os" compile "org.openjfx:javafx-fxml:$javafxVersion:$os" compile "org.openjfx:javafx-swing:$javafxVersion:$os" diff --git a/common/src/main/java/bisq/common/app/Version.java b/common/src/main/java/bisq/common/app/Version.java index 1b8bf7e6c95..9d3bc83a94d 100644 --- a/common/src/main/java/bisq/common/app/Version.java +++ b/common/src/main/java/bisq/common/app/Version.java @@ -30,7 +30,7 @@ public class Version { // VERSION = 0.5.0 introduces proto buffer for the P2P network and local DB and is a not backward compatible update // Therefore all sub versions start again with 1 // We use semantic versioning with major, minor and patch - public static final String VERSION = "1.6.1"; + public static final String VERSION = "1.6.2"; /** * Holds a list of the tagged resource files for optimizing the getData requests. diff --git a/core/src/test/java/bisq/core/payment/ReceiptValidatorTest.java b/core/src/test/java/bisq/core/payment/ReceiptValidatorTest.java index 4be13530a6c..12dbe054b92 100644 --- a/core/src/test/java/bisq/core/payment/ReceiptValidatorTest.java +++ b/core/src/test/java/bisq/core/payment/ReceiptValidatorTest.java @@ -167,7 +167,6 @@ public void testIsValidWhenNationalBankAccount() { when(predicates.isEqualPaymentMethods(offer, account)).thenReturn(true); when(predicates.isMatchingCountryCodes(offer, account)).thenReturn(true); when(predicates.isMatchingSepaOffer(offer, account)).thenReturn(false); - when(predicates.isMatchingSepaOffer(offer, account)).thenReturn(false); when(predicates.isMatchingSepaInstant(offer, account)).thenReturn(false); when(predicates.isOfferRequireSameOrSpecificBank(offer, account)).thenReturn(false); diff --git a/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java b/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java index 32632190c6d..fc6a1f534db 100644 --- a/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java +++ b/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java @@ -68,17 +68,32 @@ public void testGetAddress() { } @Test - public void testGetAddress_noValidReceivers() { + public void testGetAddress_noValidReceivers_nullFilter() { when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default"); when(filterManager.getFilter()).thenReturn(null); assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager)); + } + + @Test + public void testGetAddress_noValidReceivers_filterWithNullList() { + when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default"); when(filterManager.getFilter()).thenReturn(filterWithReceivers(null)); assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager)); + } + + @Test + public void testGetAddress_noValidReceivers_filterWithEmptyList() { + when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default"); when(filterManager.getFilter()).thenReturn(filterWithReceivers(List.of())); assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager)); + } + + @Test + public void testGetAddress_noValidReceivers_filterWithIllFormedList() { + when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default"); when(filterManager.getFilter()).thenReturn(filterWithReceivers(List.of("ill-formed"))); assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager)); diff --git a/desktop/package/linux/Dockerfile b/desktop/package/linux/Dockerfile index f613ccf301e..14e02228fba 100644 --- a/desktop/package/linux/Dockerfile +++ b/desktop/package/linux/Dockerfile @@ -8,7 +8,7 @@ # pull base image FROM openjdk:8-jdk -ENV version 1.6.1-SNAPSHOT +ENV version 1.6.2-SNAPSHOT RUN apt-get update && apt-get install -y --no-install-recommends openjfx && rm -rf /var/lib/apt/lists/* && apt-get install -y vim fakeroot diff --git a/desktop/package/linux/LICENSE b/desktop/package/linux/LICENSE deleted file mode 100644 index dba13ed2ddf..00000000000 --- a/desktop/package/linux/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - 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 Affero 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 . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/desktop/package/linux/package.sh b/desktop/package/linux/package.sh deleted file mode 100755 index 63a0cbbfbc4..00000000000 --- a/desktop/package/linux/package.sh +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env bash -# Requirements: -# - OracleJDK 10 installed -# Note: OpenJDK 10 does not have the javapackager util, so must use OracleJDK -# Prior to running this script: -# - Update version below -# - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory - -version=1.6.1-SNAPSHOT -version_base=$(echo $version | awk -F'[_-]' '{print $1}') -if [ ! -f "$JAVA_HOME/bin/javapackager" ]; then - if [ -d "/usr/lib/jvm/jdk-10.0.2" ]; then - JAVA_HOME=/usr/lib/jvm/jdk-10.0.2 - else - echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK. - exit 1 - fi -fi - -base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../.. -src_dir=$base_dir/desktop/package - -cd $base_dir - -set -eu - -echo Installing required packages -if [[ -f "/etc/debian_version" ]]; then - sudo apt install -y fakeroot rpm -elif [[ -f "/etc/redhat-release" ]]; then - sudo yum install -y fakeroot rpm-build dpkg perl-Digest-SHA -fi - -if [ ! -f "$base_dir/desktop/package/desktop-$version-all.jar" ]; then - echo Building application - ./gradlew :desktop:clean :desktop:build -x test shadowJar - jar_file=$base_dir/desktop/build/libs/desktop-$version-all.jar - if [ ! -f "$jar_file" ]; then - echo No jar file available at $jar_file - exit 2 - fi - - tmp=$base_dir/desktop/build/libs/tmp - echo Extracting jar file to $tmp - if [ -d "$tmp" ]; then - rm -rf $tmp - fi - mkdir -p $tmp - unzip -o -q $jar_file -d $tmp - - echo Deleting problematic module config from extracted jar - # Strip out Java 9 module configuration used in the fontawesomefx library as it causes javapackager to stop - # because of this existing module information, since it is not used as a module. - # Sometimes module-info.class does not exist - TODO check why and if still needed - if [ -f "$tmp/module-info.class" ]; then - rm -f $tmp/module-info.class - fi - - jar_file=$base_dir/desktop/package/desktop-$version-all.jar - echo Zipping jar again without module config to $jar_file - cd $tmp; zip -r -q -X $jar_file * - cd $base_dir; rm -rf $tmp - - echo SHA256 before stripping jar file: - shasum -a256 $jar_file | awk '{print $1}' - - echo Making deterministic jar by stripping out parameters and comments that contain dates - # Jar file created from https://github.com/ManfredKarrer/tools - # TODO Is this step still necessary? Since we are using preserveFileTimestamps and reproducibleFileOrder in build.gradle - java -jar $base_dir/desktop/package/tools-1.0.jar $jar_file - - echo SHA256 after stripping jar file: - shasum -a256 $jar_file | awk '{print $1}' | tee $base_dir/desktop/package/desktop-$version-all.jar.txt -else - local_src_dir="/home/$USER/Desktop/build" - mkdir -p $local_src_dir - cp $base_dir/desktop/package/desktop-$version-all.jar $local_src_dir/desktop-$version-all.jar - src_dir=$local_src_dir -fi - -chmod o+rx "$src_dir/desktop-$version-all.jar" - -# Remove previously generated packages so we can later determine if they are actually generated successfully -if [ -f "$base_dir/desktop/package/linux/bisq-$version.deb" ]; then - rm "$base_dir/desktop/package/linux/bisq-$version.deb" -fi -if [ -f "$base_dir/desktop/package/linux/bisq-$version.rpm" ]; then - rm "$base_dir/desktop/package/linux/bisq-$version.rpm" -fi - -# TODO: add the license as soon as it is working with our build setup -#-BlicenseFile=LICENSE \ -#-srcfiles package/linux/LICENSE \ - -echo Generating deb package -$JAVA_HOME/bin/javapackager \ - -deploy \ - -BappVersion=$version \ - -Bcategory=Network \ - -Bemail=contact@bisq.network \ - -BlicenseType=GPLv3 \ - -Bicon=$base_dir/desktop/package/linux/icon.png \ - -native deb \ - -name Bisq \ - -title "A decentralized bitcoin exchange network." \ - -vendor Bisq \ - -outdir $base_dir/desktop/package/linux \ - -srcdir $src_dir \ - -srcfiles desktop-$version-all.jar \ - -appclass bisq.desktop.app.BisqAppMain \ - -BjvmOptions=-Xss1280k \ - -BjvmOptions=-XX:MaxRAM=4g \ - -BjvmOptions=-Djava.net.preferIPv4Stack=true \ - -outfile Bisq-$version \ - -v - -if [ ! -f "$base_dir/desktop/package/linux/bisq-$version.deb" ]; then - echo No deb file found at $base_dir/desktop/package/linux/bisq-$version.deb - exit 3 -fi - -echo Generating rpm package -$JAVA_HOME/bin/javapackager \ - -deploy \ - -BappVersion="$version_base" \ - -Bcategory=Network \ - -Bemail=contact@bisq.network \ - -BlicenseType=GPLv3 \ - -Bicon=$base_dir/desktop/package/linux/icon.png \ - -native rpm \ - -name Bisq \ - -title "A decentralized bitcoin exchange network." \ - -vendor Bisq \ - -outdir $base_dir/desktop/package/linux \ - -srcdir $src_dir \ - -srcfiles desktop-$version-all.jar \ - -appclass bisq.desktop.app.BisqAppMain \ - -BjvmOptions=-Xss1280k \ - -BjvmOptions=-XX:MaxRAM=4g \ - -BjvmOptions=-Djava.net.preferIPv4Stack=true \ - -outfile Bisq-$version \ - -v - -if [ ! -f "$base_dir/desktop/package/linux/bisq-$version_base-1.x86_64.rpm" ]; then - echo "No rpm file found at $base_dir/desktop/package/linux/bisq-$version_base-1.x86_64.rpm" - exit 3 -fi - -# FIXME: My Ubuntu somehow also deletes the lower case file -# if [ -f "$base_dir/desktop/package/linux/Bisq-$version.deb" ]; then -# rm "$base_dir/desktop/package/linux/Bisq-$version.deb" -# fi -mv $base_dir/desktop/package/linux/bisq-$version.deb $base_dir/desktop/package/linux/Bisq-$version.deb - -echo SHA256 of $base_dir/desktop/package/linux/Bisq-$version.deb: -shasum -a256 $base_dir/desktop/package/linux/Bisq-$version.deb | awk '{print $1}' | tee $base_dir/desktop/package/linux/Bisq-$version.deb.txt - -# FIXME: My Ubuntu somehow also deletes the lower case file -# if [ -f "$base_dir/desktop/package/linux/Bisq-$version_base-1.x86_64.rpm" ]; then -# rm "$base_dir/desktop/package/linux/Bisq-$version_base-1.x86_64.rpm" -# fi -mv "$base_dir/desktop/package/linux/bisq-$version_base-1.x86_64.rpm" "$base_dir/desktop/package/linux/Bisq-$version.rpm" - -echo SHA256 of $base_dir/desktop/package/linux/Bisq-$version.rpm: -shasum -a256 $base_dir/desktop/package/linux/Bisq-$version.rpm | awk '{print $1}' | tee $base_dir/desktop/package/linux/Bisq-$version.rpm.txt - -echo Done! diff --git a/desktop/package/linux/release.sh b/desktop/package/linux/release.sh deleted file mode 100755 index d732a75d59e..00000000000 --- a/desktop/package/linux/release.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash -# Requirements: -# - GPG signing key has been created -# Prior to running this script: -# - Update version below - -version=1.6.1-SNAPSHOT -base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../.. -package_dir=$base_dir/desktop/package -release_dir=$base_dir/desktop/release/$version - -dmg=Bisq-$version.dmg -deb=Bisq-$version.deb -rpm=Bisq-$version.rpm -exe=Bisq-$version.exe - -read -p "Enter email address used for gpg signing: " gpg_user - -echo Creating release directory -if [ -d "$release_dir" ]; then - rm -fr "$release_dir" -fi -mkdir -p "$release_dir" - -echo Copying files to release folder -# sig key mkarrer -cp "$package_dir/F379A1C6.asc" "$release_dir" -# sig key cbeams -cp "$package_dir/5BC5ED73.asc" "$release_dir" -# sig key Christoph Atteneder -cp "$package_dir/29CDFD3B.asc" "$release_dir" -# signing key -cp "$package_dir/signingkey.asc" "$release_dir" -if [ -f "$package_dir/macosx/$dmg" ]; then - cp "$package_dir/macosx/$dmg" "$release_dir" - cp "$package_dir/macosx/$dmg.txt" "$release_dir" -fi -if [ -f "$package_dir/linux/$deb" ]; then - cp "$package_dir/linux/$deb" "$release_dir" - cp "$package_dir/linux/$deb.txt" "$release_dir" -fi -if [ -f "$package_dir/linux/$rpm" ]; then - cp "$package_dir/linux/$rpm" "$release_dir" - cp "$package_dir/linux/$rpm.txt" "$release_dir" -fi -if [ -f "$package_dir/windows/$exe" ]; then - cp "$package_dir/windows/$exe" "$release_dir" - cp "$package_dir/windows/$exe.txt" "$release_dir" -fi - -echo Creating signatures -if [ -f "$release_dir/$dmg" ]; then - gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$dmg.asc" --detach-sig --armor "$release_dir/$dmg" -fi -if [ -f "$release_dir/$deb" ]; then - gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$deb.asc" --detach-sig --armor "$release_dir/$deb" -fi -if [ -f "$release_dir/$rpm" ]; then - gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$rpm.asc" --detach-sig --armor "$release_dir/$rpm" -fi -if [ -f "$release_dir/$exe" ]; then - gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$exe.asc" --detach-sig --armor "$release_dir/$exe" -fi - -echo Verifying signatures -if [ -f "$release_dir/$dmg" ]; then - gpg --digest-algo SHA256 --verify "$release_dir/$dmg.asc" -fi -if [ -f "$release_dir/$deb" ]; then - gpg --digest-algo SHA256 --verify "$release_dir/$deb.asc" -fi -if [ -f "$release_dir/$rpm" ]; then - gpg --digest-algo SHA256 --verify "$release_dir/$rpm.asc" -fi -if [ -f "$release_dir/$exe" ]; then - gpg --digest-algo SHA256 --verify "$release_dir/$exe.asc" -fi - -echo Done! diff --git a/desktop/package/macosx/Bisq-background.png b/desktop/package/macosx/Bisq-background.png deleted file mode 100644 index 8edd4b2e041..00000000000 Binary files a/desktop/package/macosx/Bisq-background.png and /dev/null differ diff --git a/desktop/package/macosx/Bisq-background.tiff b/desktop/package/macosx/Bisq-background.tiff new file mode 100644 index 00000000000..9fb7dde469d Binary files /dev/null and b/desktop/package/macosx/Bisq-background.tiff differ diff --git a/desktop/package/macosx/Bisq-dmg-setup.scpt b/desktop/package/macosx/Bisq-dmg-setup.scpt index a57653b27b8..d07ed4b0b79 100644 --- a/desktop/package/macosx/Bisq-dmg-setup.scpt +++ b/desktop/package/macosx/Bisq-dmg-setup.scpt @@ -4,14 +4,15 @@ tell application "Finder" set current view of container window to icon view set toolbar visible of container window to false set statusbar visible of container window to false + set pathbar visible of container window to false - -- size of window should match size of background + -- size of window should match size of background (1034x641) set the bounds of container window to {400, 100, 1434, 741} set theViewOptions to the icon view options of container window set arrangement of theViewOptions to not arranged set icon size of theViewOptions to 128 - set background picture of theViewOptions to file ".background:background.png" + set background picture of theViewOptions to file ".background:background.tiff" -- Create alias for install location make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} diff --git a/desktop/package/macosx/Bisq-volume.icns b/desktop/package/macosx/Bisq-volume.icns new file mode 100644 index 00000000000..d60546972a5 Binary files /dev/null and b/desktop/package/macosx/Bisq-volume.icns differ diff --git a/desktop/package/macosx/Info.plist b/desktop/package/macosx/Info.plist index ccee170b6e9..e7ac7c34c90 100644 --- a/desktop/package/macosx/Info.plist +++ b/desktop/package/macosx/Info.plist @@ -5,10 +5,10 @@ CFBundleVersion - 1.6.1 + 1.6.2 CFBundleShortVersionString - 1.6.1 + 1.6.2 CFBundleExecutable Bisq diff --git a/desktop/package/macosx/copy_dbs.sh b/desktop/package/macosx/copy_dbs.sh index e0476c1a20b..f1e49afb02e 100755 --- a/desktop/package/macosx/copy_dbs.sh +++ b/desktop/package/macosx/copy_dbs.sh @@ -2,7 +2,7 @@ cd $(dirname $0)/../../../ -version="1.6.1" +version="1.6.2" # Set BISQ_DIR as environment var to the path of your locally synced Bisq data directory e.g. BISQ_DIR=~/Library/Application\ Support/Bisq diff --git a/desktop/package/macosx/create_app.sh b/desktop/package/macosx/create_app.sh deleted file mode 100755 index 35b88ce2be5..00000000000 --- a/desktop/package/macosx/create_app.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -cd $(dirname $0)/../../ - -mkdir -p deploy - -set -e - -version="1.6.1-SNAPSHOT" - -cd .. -./gradlew :desktop:build -x test shadowJar -cd desktop - -EXE_JAR=build/libs/desktop-$version-all.jar -JAR_LIB=build/app/lib - -# we need to strip out Java 9 module configuration used in the fontawesomefx library as it causes the javapackager to stop, -# because of this existing module information, although it is not used as a module. -echo Unzipping jar to delete module config -tmp=build/libs/tmp -unzip -o -q $EXE_JAR -d $tmp - -# Sometimes $tmp/module-info.class is not available. TODO check why and if still needed -rm -f $tmp/module-info.class - -rm $EXE_JAR -echo Zipping jar again without module config -cd $tmp; zip -r -q -X "../desktop-$version-all.jar" * -cd ../../../; rm -rf $tmp - -echo SHA 256 before stripping jar file: -shasum -a256 $EXE_JAR | awk '{print $1}' - -# We make a deterministic jar by stripping out comments with date, etc. -# jar file created from https://github.com/ManfredKarrer/tools -java -jar ./package/tools-1.0.jar $EXE_JAR - -echo SHA 256 after stripping jar file to get a deterministic jar: -shasum -a256 $EXE_JAR | awk '{print $1}' | tee deploy/Bisq-$version.jar.txt - -# zip jar lib for Raspberry Pi -echo "Zipping jar lib for raspberry pi" -zip -r -X -q "deploy/jar-lib-for-raspberry-pi-$version.zip" $JAR_LIB - -# Set BISQ_VM_PATH as environment var to the directory where your shared folders for virtual box are residing - -vmPath=$BISQ_VM_PATH -linux64=$vmPath/vm_shared_ubuntu/desktop -linux64Package=$linux64/package/linux -win64=$vmPath/vm_shared_windows/desktop -win64Package=$win64/package/windows - -rm -rf $linux64Package $win64Package - -mkdir -p $linux64 $win64 $linux64Package $win64Package - -cp $EXE_JAR "deploy/Bisq-$version.jar" - -# copy app jar to VM shared folders -cp $EXE_JAR "$linux64Package/../desktop-$version-all.jar" -cp $EXE_JAR "$win64Package/../desktop-$version-all.jar" - -# Copy packager scripts to VM. No need to checkout the source as we only are interested in the build scripts. - -cp -r package/linux/. $linux64Package -cp -r package/windows/. $win64Package - -if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=$(/usr/libexec/java_home) -fi - -# Open jdk does not has the java packager. -# JAVA_HOME=/Library/Java/JavaVirtualMachines/oracle_jdk-10.0.2.jdk/Contents/Home - -echo "Using JAVA_HOME: $JAVA_HOME" - -$JAVA_HOME/bin/javapackager \ - -deploy \ - -BappVersion=$version \ - -Bmac.CFBundleIdentifier=io.bisq.CAT \ - -Bmac.CFBundleName=Bisq \ - -Bicon=package/macosx/Bisq.icns \ - -Bruntime="$JAVA_HOME/jre" \ - -native dmg \ - -name Bisq \ - -title "A decentralized bitcoin exchange network." \ - -vendor Bisq \ - -outdir deploy \ - -srcdir deploy \ - -srcfiles "Bisq-$version.jar" \ - -appclass bisq.desktop.app.BisqAppMain \ - -outfile Bisq \ - -v - -open deploy - -cd package/macosx diff --git a/desktop/package/macosx/create_desktop_for_testing.sh b/desktop/package/macosx/create_desktop_for_testing.sh deleted file mode 100755 index 83c0eaf9c27..00000000000 --- a/desktop/package/macosx/create_desktop_for_testing.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -cd $(dirname $0)/../../ - -mkdir -p deploy - -set -e - -version="1.1.5-SNAPSHOT" -commithash="ec633f0c3771893b47956b8d05b17c6f3f1919c1" - -cd .. -./gradlew :desktop:build -x test shadowJar -cd desktop - -EXE_JAR=build/libs/desktop-$version-all.jar -JAR_WITH_HASH_NAME=desktop-$version-$commithash-all.jar -EXE_JAR_WITH_HASH=build/libs/$JAR_WITH_HASH_NAME -DEPLOY_JAR=deploy/$JAR_WITH_HASH_NAME - -# we need to strip out Java 9 module configuration used in the fontawesomefx library as it causes the javapackager to stop, -# because of this existing module information, although it is not used as a module. -echo Unzipping jar to delete module config -tmp=build/libs/tmp -unzip -o -q $EXE_JAR -d $tmp - -# Sometimes $tmp/module-info.class is not available. TODO check why and if still needed -rm -f $tmp/module-info.class - -rm $EXE_JAR -echo Zipping jar again without module config -cd $tmp; zip -r -q -X "../$JAR_WITH_HASH_NAME" * -cd ../../../; rm -rf $tmp - -cp $EXE_JAR_WITH_HASH $DEPLOY_JAR - -echo Create signature -gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $DEPLOY_JAR.asc --detach-sig --armor $DEPLOY_JAR - -echo Verify signatures -gpg --digest-algo SHA256 --verify $DEPLOY_JAR{.asc*,} - -open deploy diff --git a/desktop/package/macosx/create_seednode_for_testing.sh b/desktop/package/macosx/create_seednode_for_testing.sh deleted file mode 100755 index aba6ddbd681..00000000000 --- a/desktop/package/macosx/create_seednode_for_testing.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -cd $(dirname $0)/../../ - -set -e - -version="1.1.5-SNAPSHOT" -commithash="ec633f0c3771893b47956b8d05b17c6f3f1919c1" - -cd .. -./gradlew :seednode:build -x test shadowJar -cd seednode - -mkdir -p deploy - -EXE_JAR=build/libs/seednode-all.jar -JAR_WITH_HASH_NAME=seednode-$version-$commithash-all.jar -EXE_JAR_WITH_HASH=build/libs/$JAR_WITH_HASH_NAME -DEPLOY_JAR=deploy/$JAR_WITH_HASH_NAME - -# we need to strip out Java 9 module configuration used in the fontawesomefx library as it causes the javapackager to stop, -# because of this existing module information, although it is not used as a module. -echo Unzipping jar to delete module config -tmp=build/libs/tmp -unzip -o -q $EXE_JAR -d $tmp - -# Sometimes $tmp/module-info.class is not available. TODO check why and if still needed -rm -f $tmp/module-info.class - -rm $EXE_JAR -echo Zipping jar again without module config -cd $tmp; zip -r -q -X "../$JAR_WITH_HASH_NAME" * -cd ../../../; rm -rf $tmp - -cp $EXE_JAR_WITH_HASH $DEPLOY_JAR - -echo Create signature -gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $DEPLOY_JAR.asc --detach-sig --armor $DEPLOY_JAR - -echo Verify signatures -gpg --digest-algo SHA256 --verify $DEPLOY_JAR{.asc*,} - -open deploy diff --git a/desktop/package/macosx/finalize.sh b/desktop/package/macosx/finalize.sh index 269638fbd3e..077117cf8dc 100755 --- a/desktop/package/macosx/finalize.sh +++ b/desktop/package/macosx/finalize.sh @@ -2,7 +2,7 @@ cd ../../ -version="1.6.1-SNAPSHOT" +version="1.6.2-SNAPSHOT" target_dir="releases/$version" @@ -10,8 +10,9 @@ target_dir="releases/$version" # Set BISQ_VM_PATH as environment var to the directory where your shared folders for virtual box are residing vmPath=$BISQ_VM_PATH -linux64=$vmPath/vm_shared_ubuntu/desktop/package/linux -win64=$vmPath/vm_shared_windows/desktop/package/windows +linux64=$vmPath/vm_shared_ubuntu +win64=$vmPath/vm_shared_windows +macos=$vmPath/vm_shared_macosx deployDir=deploy @@ -27,17 +28,15 @@ cp "$target_dir/../../package/5BC5ED73.asc" "$target_dir/" cp "$target_dir/../../package/29CDFD3B.asc" "$target_dir/" # signing key cp "$target_dir/../../package/signingkey.asc" "$target_dir/" -# hash of jar file -cp "deploy/Bisq-$version.jar.txt" "$target_dir/" dmg="Bisq-$version.dmg" -cp "$deployDir/$dmg" "$target_dir/" +cp "$macos/$dmg" "$target_dir/" -deb="Bisq-$version.deb" +deb="bisq_$version-1_amd64.deb" deb64="Bisq-64bit-$version.deb" cp "$linux64/$deb" "$target_dir/$deb64" -rpm="Bisq-$version.rpm" +rpm="bisq-$version-1.x86_64.rpm" rpm64="Bisq-64bit-$version.rpm" cp "$linux64/$rpm" "$target_dir/$rpm64" diff --git a/desktop/package/macosx/insert_snapshot_version.sh b/desktop/package/macosx/insert_snapshot_version.sh index b57a36465cf..1147e7c997e 100755 --- a/desktop/package/macosx/insert_snapshot_version.sh +++ b/desktop/package/macosx/insert_snapshot_version.sh @@ -2,7 +2,7 @@ cd $(dirname $0)/../../../ -version=1.6.1 +version=1.6.2 find . -type f \( -name "finalize.sh" \ -o -name "create_app.sh" \ diff --git a/desktop/package/macosx/macos.entitlements b/desktop/package/macosx/macos.entitlements new file mode 100644 index 00000000000..0e0df6c7627 --- /dev/null +++ b/desktop/package/macosx/macos.entitlements @@ -0,0 +1,16 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.cs.disable-library-validation + + com.apple.security.cs.allow-dyld-environment-variables + + + diff --git a/desktop/package/macosx/replace_version_number.sh b/desktop/package/macosx/replace_version_number.sh index 6c09cc91ca0..1ba86fa4509 100755 --- a/desktop/package/macosx/replace_version_number.sh +++ b/desktop/package/macosx/replace_version_number.sh @@ -2,8 +2,8 @@ cd $(dirname $0)/../../../. -oldVersion=1.6.0 -newVersion=1.6.1 +oldVersion=1.6.1 +newVersion=1.6.2 find . -type f \( -name "finalize.sh" \ -o -name "create_app.sh" \ diff --git a/desktop/package/package.gradle b/desktop/package/package.gradle new file mode 100644 index 00000000000..eeab2e6c6bb --- /dev/null +++ b/desktop/package/package.gradle @@ -0,0 +1,518 @@ +import java.time.LocalDateTime +import org.apache.tools.ant.taskdefs.condition.Os + +import static groovy.io.FileType.* + +task jpackageSanityChecks { + description 'Interactive sanity checks on the version of the code that will be packaged' + + doLast { + executeCmd("git --no-pager log -5 --oneline") + ant.input(message: "Above you see the current HEAD and its recent history.\n" + + "Is this the right commit for packaging? (y=continue, n=abort)", + addproperty: "sanity-check-1", + validargs: "y,n") + if (ant.properties['sanity-check-1'] == 'n') { + ant.fail('Aborting') + } + + executeCmd("git status --short --branch") + ant.input(message: "Above you see any local changes that are not in the remote branch.\n" + + "If you have any local changes, please abort, get them merged, get the latest branch and try again.\n" + + "Continue with packaging? (y=continue, n=abort)", + addproperty: "sanity-check-2", + validargs: "y,n") + if (ant.properties['sanity-check-2'] == 'n') { + ant.fail('Aborting') + } + + // TODO Evtl check programmatically in gradle (i.e. fail if below v11) + executeCmd("java --version") + ant.input(message: "Above you see the installed java version, which will be used to compile and build Bisq.\n" + + "Is this java version ok for that? (y=continue, n=abort)", + addproperty: "sanity-check-3", + validargs: "y,n") + if (ant.properties['sanity-check-3'] == 'n') { + ant.fail('Aborting') + } + } +} + +task getJavaBinariesDownloadURLs { + description 'Find out which JDK will be used for jpackage and prepare to download it' + dependsOn 'jpackageSanityChecks' + + doLast { + // The build directory will be deleted next time the clean task runs + // Therefore, we can use it to store any temp files (separate JDK for jpackage, etc) and resulting build artefacts + // We create a temp folder in the build directory which holds all jpackage-related artefacts (not just the final installers) + String tempRootDirName = 'temp-' + LocalDateTime.now().format('yyyy.MM.dd-HHmmssSSS') + File tempRootDir = new File(project.buildDir, tempRootDirName) + tempRootDir.mkdirs() + ext.tempRootDir = tempRootDir + println "Created temp root folder " + tempRootDir + + File binariesFolderPath = new File(tempRootDir, "binaries") + binariesFolderPath.mkdirs() + ext.binariesFolderPath = binariesFolderPath + + // TODO Extend script logic to alternatively allow a local (separate, v14+) JDK for jpackage + // TODO Another option is to use the local JDK for everything: build jars and use jpackage (but then it has to be v14+) + + // Define the download URLs (and associated binary hashes) for the JDK used to package the installers + // These JDKs are independent of what is installed on the building system + // + // If these specific versions are not hosted by AdoptOpenJDK anymore, or if different versions are desired, + // simply update the links and associated hashes below + // + // See https://adoptopenjdk.net/releases.html?variant=openjdk15&jvmVariant=hotspot for latest download URLs + // On the download page linked above, filter as follows to get the binary URL + associated SHA256: + // - architecture: x64 + // - operating system: + // -- linux ( -> use the tar.gz JDK link) + // -- macOS ( -> use the tar.gz JDK link) + // -- windows ( -> use the .zip JDK link) + Map jdk15Binaries = [ + 'linux' : 'https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_linux_hotspot_15.0.2_7.tar.gz', + 'linux-sha256' : '94f20ca8ea97773571492e622563883b8869438a015d02df6028180dd9acc24d', + 'mac' : 'https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_mac_hotspot_15.0.2_7.tar.gz', + 'mac-sha256' : 'd358a7ff03905282348c6c80562a4da2e04eb377b60ad2152be4c90f8d580b7f', + 'windows' : 'https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_windows_hotspot_15.0.2_7.zip', + 'windows-sha256': 'b80dde2b7f8374eff0f1726c1cbdb48fb095fdde21489046d92f7144baff5741' + + // TODO For some reason, using "--runtime-image jdk-11" does NOT work with a v15 jpackage, but works with v14 + ] + + String osKey + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + osKey = 'windows' + } else if (Os.isFamily(Os.FAMILY_MAC)) { + osKey = 'mac' + } else { + osKey = 'linux' + } + + ext.jdk15Binary_DownloadURL = jdk15Binaries[osKey] + ext.jdk15Binary_SHA256Hash = jdk15Binaries[osKey + '-sha256'] + } +} + +task retrieveAndExtractJavaBinaries { + description 'Retrieve necessary Java binaries and extract them' + dependsOn 'getJavaBinariesDownloadURLs' + + doLast { + File tempRootDir = getJavaBinariesDownloadURLs.property("tempRootDir") as File + + // Folder where the jpackage JDK archive will be downloaded and extracted + String jdkForJpackageDirName = "jdk-jpackage" + File jdkForJpackageDir = new File(tempRootDir, jdkForJpackageDirName) + jdkForJpackageDir.mkdirs() + + String jdkForJpackageArchiveURL = getJavaBinariesDownloadURLs.property('jdk15Binary_DownloadURL') + String jdkForJpackageArchiveHash = getJavaBinariesDownloadURLs.property('jdk15Binary_SHA256Hash') + String jdkForJpackageArchiveFileName = jdkForJpackageArchiveURL.tokenize('/').last() + File jdkForJpackageFile = new File(jdkForJpackageDir, jdkForJpackageArchiveFileName) + + // Download necessary JDK binaries + verify hash + ext.downloadAndVerifyArchive(jdkForJpackageArchiveURL, jdkForJpackageArchiveHash, jdkForJpackageFile) + + // Extract them + String jpackageBinaryFileName + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + ext.extractArchiveZip(jdkForJpackageFile, jdkForJpackageDir) + jpackageBinaryFileName = 'jpackage.exe' + } else { + ext.extractArchiveTarGz(jdkForJpackageFile, jdkForJpackageDir) + jpackageBinaryFileName = 'jpackage' + } + + // Find jpackage in the newly extracted JDK + // Don't rely on hardcoded paths to reach it, because the path depends on the version and platform + jdkForJpackageDir.traverse(type: FILES, nameFilter: jpackageBinaryFileName) { + println 'Using jpackage binary from ' + it + ext.jpackageFilePath = it.path + } + } + + ext.downloadAndVerifyArchive = { String archiveURL, String archiveSHA256, File destinationArchiveFile -> + println "Downloading ${archiveURL}" + ant.get(src: archiveURL, dest: destinationArchiveFile) + println 'Download saved to ' + destinationArchiveFile + + println 'Verifying checksum for downloaded binary ...' + ant.jdkHash = archiveSHA256 + ant.checksum(file: destinationArchiveFile, algorithm: 'SHA-256', property: '${jdkHash}', verifyProperty: 'hashMatches') + if (ant.properties['hashMatches'] != 'true') { + ant.fail('Checksum mismatch: Downloaded JDK binary has a different checksum than expected') + } + println 'Checksum verified' + } + + ext.extractArchiveTarGz = { File tarGzFile, File destinationDir -> + println "Extracting tar.gz ${tarGzFile}" + // Gradle's tar extraction preserves permissions (crucial for jpackage to function correctly) + copy { + from tarTree(resources.gzip(tarGzFile)) + into destinationDir + } + println "Extracted to ${destinationDir}" + } + + ext.extractArchiveZip = { File zipFile, File destinationDir -> + println "Extracting zip ${zipFile}..." + ant.unzip(src: zipFile, dest: destinationDir) + println "Extracted to ${destinationDir}" + } +} + +task packageInstallers { + description 'Call jpackage to prepare platform-specific binaries for this platform' + dependsOn 'retrieveAndExtractJavaBinaries' + // Clean all previous artefacts and create a fresh shadowJar for the installers + dependsOn rootProject.clean + dependsOn ':desktop:shadowJar' + + doLast { + String jPackageFilePath = retrieveAndExtractJavaBinaries.property('jpackageFilePath') + File binariesFolderPath = file(getJavaBinariesDownloadURLs.property('binariesFolderPath')) + + File tempRootDir = getJavaBinariesDownloadURLs.property("tempRootDir") as File + // The jpackageTempDir stores temp files used by jpackage for building the installers + // It can be inspected in order to troubleshoot the packaging process + File jpackageTempDir = new File(tempRootDir, "jpackage-temp") + jpackageTempDir.mkdirs() + + // ALL contents of this folder will be included in the resulting installers + // However, the fat jar is the only one we need + // Therefore, this location should point to a folder that ONLY contains the fat jar + // If later we will need to include other non-jar resources, we can do that by adding --resource-dir to the jpackage opts + String fatJarFolderPath = "${project(':desktop').buildDir}/libs/fatJar" + String mainJarName = shadowJar.getArchiveFileName().get() + + delete(fatJarFolderPath) + mkdir(fatJarFolderPath) + copy { + from "${project(':desktop').buildDir}/libs/${mainJarName}" + into fatJarFolderPath + } + + // We convert the fat jar into a deterministic one by stripping out comments with date, etc. + // jar file created from https://github.com/ManfredKarrer/tools + executeCmd("java -jar \"${project(':desktop').projectDir}/package/tools-1.0.jar\" ${fatJarFolderPath}/${mainJarName}") + + // Store deterministic jar SHA-256 + ant.checksum(file: "${fatJarFolderPath}/${mainJarName}", algorithm: 'SHA-256') + copy { + from "${fatJarFolderPath}/${mainJarName}.SHA-256" + into binariesFolderPath + } + + // TODO For non-modular applications: use jlink to create a custom runtime containing only the modules required + + // See jpackager argument documentation: + // https://docs.oracle.com/en/java/javase/15/docs/specs/man/jpackage.html + + // Remove the -SNAPSHOT suffix from the version string (originally defined in build.gradle) + // Having it in would have resulted in an invalid version property for several platforms (mac, linux/rpm) + String appVersion = version.replaceAll("-SNAPSHOT", "") + println "Packaging Bisq version ${appVersion}" + + // zip jar lib for Raspberry Pi only on macOS as there are path issues on Windows and it is only needed once + // for the release + if (Os.isFamily(Os.FAMILY_MAC)) { + println "Zipping jar lib for raspberry pi" + ant.zip(basedir: "${project(':desktop').buildDir}/app/lib", + destfile: "${binariesFolderPath}/jar-lib-for-raspberry-pi-${appVersion}.zip") + } + + String appDescription = 'A decentralized bitcoin exchange network.' + String appCopyright = '© 2021 Bisq' + String appNameAndVendor = 'Bisq' + + String commonOpts = new String( + // Generic options + " --dest \"${binariesFolderPath}\"" + + " --name ${appNameAndVendor}" + + " --description \"${appDescription}\"" + + " --app-version ${appVersion}" + + " --copyright \"${appCopyright}\"" + + " --vendor ${appNameAndVendor}" + + " --temp \"${jpackageTempDir}\"" + + + // Options for creating the application image + " --input ${fatJarFolderPath}" + + + // Options for creating the application launcher + " --main-jar ${mainJarName}" + + " --main-class bisq.desktop.app.BisqAppMain" + + " --java-options -Xss1280k" + + " --java-options -XX:MaxRAM=4g" + + " --java-options -Djava.net.preferIPv4Stack=true" + // Warning: this will cause guice reflection exceptions and lead to issues with the guice internal cache + // resulting in the UI not loading +// " --java-options -Djdk.module.illegalAccess=deny" + + ) + + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + // TODO Found no benefit in using --resource-dir "..package/windows", it has the same outcome as opts below + String windowsOpts = new String( + " --icon \"${project(':desktop').projectDir}/package/windows/Bisq.ico\"" + + " --resource-dir \"${project(':desktop').projectDir}/package/windows\"" + + " --win-dir-chooser" + + " --win-per-user-install" + + " --win-menu" + + " --win-shortcut" + ) + + executeCmd(jPackageFilePath + commonOpts + windowsOpts + " --type exe") + + // Set the necessary permissions before calling signtool + executeCmd("\"attrib -R \"${binariesFolderPath}/Bisq-${appVersion}.exe\"\"") + + // In addition to the groovy quotes around the string, the entire Windows command must also be surrounded + // by quotes, plus each path inside the command has to be quoted as well + // Reason for this is that the path to the called executable contains spaces + // See https://stackoverflow.com/questions/6376113/how-do-i-use-spaces-in-the-command-prompt/6378038#6378038 + executeCmd("\"\"C:\\Program Files (x86)\\Windows Kits\\10\\App Certification Kit\\signtool.exe\" sign /v /fd SHA256 /a \"${binariesFolderPath}/Bisq-${appVersion}.exe\"\"") + } else if (Os.isFamily(Os.FAMILY_MAC)) { + // See https://docs.oracle.com/en/java/javase/14/jpackage/override-jpackage-resources.html + // for details of "--resource-dir" + + String macOpts = new String( + " --resource-dir \"${project(':desktop').projectDir}/package/macosx\"" + ) + + // Env variable can be set by calling "export BISQ_PACKAGE_SIGNING_IDENTITY='Some value'" + // See "man codesign" for details about the expected signing identity + String envVariableSigningID = "$System.env.BISQ_PACKAGE_SIGNING_IDENTITY" + println "Environment variable BISQ_PACKAGE_SIGNING_IDENTITY is: ${envVariableSigningID}" + ant.input(message: "Sign the app using the above signing identity? (y=yes, n=no)", + addproperty: "macos-sign-check", + validargs: "y,n") + if (ant.properties['macos-sign-check'] == 'y') { + // Create a temp folder to extract the macos-specific dylibs that need to be signed + File tempDylibFolderPath = new File(tempRootDir, "dylibs-to-sign") + tempDylibFolderPath.mkdirs() + + // Dylibs relevant for signing (paths relative to the tempDylibFolderPath) + String dylibsToSign = new String( + " libjavafx_iio.dylib" + + " libglass.dylib" + + " libjavafx_font.dylib" + + " libprism_common.dylib" + + " libprism_es2.dylib" + + " libdecora_sse.dylib" + + " libprism_sw.dylib" + + " META-INF/native/libio_grpc_netty_shaded_netty_tcnative_osx_x86_64.jnilib" + ) + + // macOS step 1: Sign dylibs and replace them in the shadow jar + // Extract dylibss for signing + executeCmd("cd ${tempDylibFolderPath} &&" + + " jar xf ${fatJarFolderPath}/${mainJarName}" + + dylibsToSign) + // Sign them + executeCmd("cd ${tempDylibFolderPath} &&" + + " codesign -vvv --options runtime --deep --force --sign \"${envVariableSigningID}\"" + + dylibsToSign) + + // Verify signature + executeCmd("cd ${tempDylibFolderPath} &&" + + " codesign -vvv --deep --strict " + dylibsToSign) + + // Replace unsigned files in jar file + executeCmd("cd ${tempDylibFolderPath} &&" + + " jar uf ${fatJarFolderPath}/${mainJarName}" + + dylibsToSign) + + // macOS step 2: Build app-image using the shadow jar above (containing signed dylibs) + // NOTE: licensing file cannot be added at this point only when creating the dmg later + executeCmd(jPackageFilePath + + commonOpts + + macOpts + + " --type app-image") + + // macOS step 3: Sign app (hardended runtime) + File bisqAppImageFullPath = new File(binariesFolderPath, "Bisq.app") + executeCmd("codesign" + + " --sign \"${envVariableSigningID}\"" + + " --options runtime" + + " --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" + + " --force" + + " --verbose" + + " ${bisqAppImageFullPath}/Contents/runtime/Contents/MacOS/libjli.dylib") + executeCmd("codesign" + + " --sign \"${envVariableSigningID}\"" + + " --options runtime" + + " --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" + + " --force" + + " --verbose" + + " ${bisqAppImageFullPath}/Contents/MacOS/Bisq") + executeCmd("codesign" + + " --sign \"${envVariableSigningID}\"" + + " --options runtime" + + " --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" + + " --force" + + " --verbose" + + " ${bisqAppImageFullPath}") + + // macOS step 4: Package the app-image into a dmg bundle + executeCmd(jPackageFilePath + + " --dest \"${binariesFolderPath}\"" + + " --name ${appNameAndVendor}" + + " --description \"${appDescription}\"" + + " --app-version ${appVersion}" + + " --copyright \"${appCopyright}\"" + + " --vendor ${appNameAndVendor}" + + " --temp \"${jpackageTempDir}\"" + + " --app-image ${bisqAppImageFullPath}" + + " --mac-sign" + + macOpts + + " --type dmg") + + // macOS step 5: Delete unused app image + delete(bisqAppImageFullPath) + + // macOS step 6: Sign dmg bundle + executeCmd("codesign" + + " --sign \"${envVariableSigningID}\"" + + " --options runtime" + + " --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" + + " -vvvv" + + " --deep" + + " '${binariesFolderPath}/Bisq-${appVersion}.dmg'") + + // macOS step 7: Upload for notarization + // See https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow#3087734 + String envVariableAcUsername = "$System.env.BISQ_PACKAGE_NOTARIZATION_AC_USERNAME" + String envVariableAscProvider = "$System.env.BISQ_PACKAGE_NOTARIZATION_ASC_PROVIDER" + // e.g. network.bisq.CAT is used when binaries are built by @ripcurlx + String envVariablePrimaryBundleId = "$System.env.BISQ_PRIMARY_BUNDLE_ID" + def uploadForNotarizationOutput = executeCmd("xcrun altool --notarize-app" + + " --primary-bundle-id '${envVariablePrimaryBundleId}'" + + " --username '${envVariableAcUsername}'" + + " --password '@keychain:AC_PASSWORD'" + + " --asc-provider '${envVariableAscProvider}'" + + " --file '${binariesFolderPath}/Bisq-${appVersion}.dmg'") + // Response: + // No errors uploading '[PATH_TO_BISQ_REPO]/bisq/desktop/build/temp-620637000/binaries/Bisq-1.1.1.dmg'. + // RequestUUID = ea8bba77-97b7-4c15-a53f-8bbccf627190 + def requestUUID = uploadForNotarizationOutput.split('RequestUUID = ')[1].trim() + println "Extracted RequestUUID: " + requestUUID + + // Every 1 minute, check the status + def notarizationEndedInSuccess = false + def notarizationEndedInFailure = false + while (!(notarizationEndedInSuccess || notarizationEndedInFailure)) { + println "Current time is:" + executeCmd('date') + println "Waiting for 1 minute..." + sleep(1 * 60 * 1000) + + println "Checking notarization status" + + def checkNotarizationStatusOutput = executeCmd("xcrun altool --notarization-info" + + " '${requestUUID}'" + + " --username '${envVariableAcUsername}'" + + " --password '@keychain:AC_PASSWORD'") + + notarizationEndedInSuccess = checkNotarizationStatusOutput.contains('success') + notarizationEndedInFailure = checkNotarizationStatusOutput.contains('invalid') + } + + if (notarizationEndedInFailure) { + ant.fail('Notarization failed, aborting') + } + + if (notarizationEndedInSuccess) { + println "Notarization was successful" + + // macOS step 8: Staple ticket on dmg + executeCmd("xcrun stapler staple" + + " '${binariesFolderPath}/Bisq-${appVersion}.dmg'") + } + + } else { + // If user didn't confirm the optional signing step, then generate a plain non-signed dmg + executeCmd(jPackageFilePath + commonOpts + macOpts + " --type dmg") + } + } else { + String linuxOpts = new String( + " --icon ${project(':desktop').projectDir}/package/linux/icon.png" + + + // This defines the first part of the resulting packages (the application name) + // deb requires lowercase letters, therefore the application name is written in lowercase + " --linux-package-name bisq" + + + // This represents the linux package version (revision) + // By convention, this is part of the deb/rpm package names, in addition to the software version + " --linux-app-release 1" + + + " --linux-menu-group Network" + + " --linux-shortcut" + ) + + // Package deb + executeCmd(jPackageFilePath + commonOpts + linuxOpts + + " --linux-deb-maintainer noreply@bisq.network" + + " --type deb") + + // Clean jpackage temp folder, needs to be empty for the next packaging step (rpm) + jpackageTempDir.deleteDir() + jpackageTempDir.mkdirs() + + // Package rpm + executeCmd(jPackageFilePath + commonOpts + linuxOpts + + " --linux-rpm-license-type AGPLv3" + // https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses + " --type rpm") + } + + // Env variable can be set by calling "export BISQ_SHARED_FOLDER='Some value'" + // This is to copy the final binary/ies to a shared folder for further processing if a VM is used. + String envVariableSharedFolder = "$System.env.BISQ_SHARED_FOLDER" + println "Environment variable BISQ_SHARED_FOLDER is: ${envVariableSharedFolder}" + ant.input(message: "Copy the created binary to a shared folder? (y=yes, n=no)", + addproperty: "copy-to-shared-folder", + validargs: "y,n") + if (ant.properties['copy-to-shared-folder'] == 'y') { + copy { + from binariesFolderPath + into envVariableSharedFolder + } + executeCmd("open " + envVariableSharedFolder) + } + + println "The binaries are ready:" + binariesFolderPath.traverse { + println it.path + } + } +} + +def executeCmd(String cmd) { + String shell + String shellArg + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + shell = 'cmd' + shellArg = '/c' + } else { + shell = 'bash' + shellArg = '-c' + } + + println "Executing command:\n${cmd}\n" + // See "Executing External Processes" section of + // http://docs.groovy-lang.org/next/html/documentation/ + def commands = [shell, shellArg, cmd] + def process = commands.execute(null, project.rootDir) + def result + if (process.waitFor() == 0) { + result = process.text + println "Command output (stdout):\n${result}" + } else { + result = process.err.text + println "Command output (stderr):\n${result}" + } + return result +} diff --git a/desktop/package/windows/Bisq-setup-icon.bmp b/desktop/package/windows/Bisq-setup-icon.bmp deleted file mode 100644 index 98ee6b3e34f..00000000000 Binary files a/desktop/package/windows/Bisq-setup-icon.bmp and /dev/null differ diff --git a/desktop/package/windows/Bisq.iss b/desktop/package/windows/Bisq.iss deleted file mode 100644 index 796c3ec3707..00000000000 --- a/desktop/package/windows/Bisq.iss +++ /dev/null @@ -1,257 +0,0 @@ -;This file will be executed next to the application bundle image -;I.e. current directory will contain folder Bisq with application files -;Note: This file must use UTF-8 encoding with BOM for the unicode custom messages to be displayed properly - -#define SourceDir GetEnv('package_dir') + '\windows' -#define AppVersion GetEnv('version') -#define FileVersion GetEnv('file_version') -#define AppCopyrightYear GetDateTimeString('yyyy', '-', ':') - -[Setup] -AppId={{bisq}} -AppName=Bisq -AppVersion={#AppVersion} -AppVerName=Bisq v{#AppVersion} -AppPublisher=Bisq -AppComments={cm:AppComments} -AppCopyright=Copyright (C) {#AppCopyrightYear} -AppPublisherURL=https://bisq.network -AppSupportURL=https://bisq.community -;AppUpdatesURL=https://bisq.network/downloads -VersionInfoVersion={#FileVersion} -VersionInfoDescription=Bisq Setup -VersionInfoCopyright=Copyright (C) {#AppCopyrightYear} -DefaultDirName={code:GetDefaultDirName} -DefaultGroupName=Bisq -DisableStartupPrompt=Yes -DisableWelcomePage=No -DisableDirPage=No -DisableProgramGroupPage=Yes -DisableReadyPage=No -DisableFinishedPage=No -;Optional License -LicenseFile= -;Windows 7 with Service Pack 1 or above -MinVersion=0,6.1.7601 -OutputBaseFilename=Bisq-{#AppVersion} -Compression=lzma -SolidCompression=yes -PrivilegesRequired=lowest -SetupIconFile=Bisq\Bisq.ico -UninstallDisplayIcon={app}\Bisq.ico -UninstallDisplayName=Bisq -WizardImageFile={#SourceDir}\Bisq-setup-image.bmp -WizardImageStretch=No -WizardSmallImageFile=Bisq-setup-icon.bmp -ArchitecturesInstallIn64BitMode=x64 -ShowLanguageDialog=No - -[Languages] -Name: en; MessagesFile: "compiler:Default.isl" -Name: de; MessagesFile: "compiler:Languages\German.isl" -Name: fr; MessagesFile: "compiler:Languages\French.isl" -Name: sp; MessagesFile: "compiler:Languages\Spanish.isl" - -[CustomMessages] -en.AppComments=A decentralized bitcoin exchange network -en.AppIsRunning=Bisq is running, please close it and run setup again. -en.SpecialAppPath=Your default install path appears to have special characters: %1%n%nThis may prevent Bisq from starting. See https://github.com/bisq-network/bisq/issues/3605 for more information.%n%nYou can either cancel this installation and install as a user without special characters in the username, or proceed with this installation using a different install path that does not contain special characters (e.g. %2). -de.AppComments=Ein dezentrales bitcoin-Austauschnetz -de.AppIsRunning=Bisq läuft, bitte schließen Sie es und führen Sie das Setup erneut aus. -de.SpecialAppPath=Ihr Standardinstallationspfad scheint Sonderzeichen zu enthalten: %1%n%nDies kann den Start von Bisq verhindern. Weitere Informationen finden Sie unter https://github.com/bisq-network/bisq/issues/3605.%n%nSie können diese Installation abbrechen und als Benutzer ohne Sonderzeichen im Benutzernamen installieren oder mit dieser Installation fortfahren, indem Sie einen anderen Installationspfad verwenden, der keine Sonderzeichen enthält (z. B. %2). -fr.AppComments=Un réseau d’échange bitcoin décentralisé -fr.AppIsRunning=Bisq est en cours d'exécution, fermez-le et exécutez à nouveau le programme d'installation. -fr.SpecialAppPath=Votre chemin d'installation par défaut semble comporter des caractères spéciaux: %1%n%nCela peut empêcher le démarrage de Bisq. Voir https://github.com/bisq-network/bisq/issues/3605 pour plus d'informations.%n%nVous pouvez annuler cette installation et l'installer en tant qu'utilisateur sans caractères spéciaux dans le nom d'utilisateur ou procéder à cette installation en utilisant un chemin d'installation différent ne contenant pas de caractères spéciaux (par exemple, %2). -sp.AppComments=Una red descentralizada de intercambio de bitcoin -sp.AppIsRunning=Bisq se está ejecutando, ciérrelo y vuelva a ejecutar la configuración. -sp.SpecialAppPath=Su ruta de instalación predeterminada parece tener caracteres especiales: %1%n%nEsto puede evitar que Bisq se inicie. Consulte https://github.com/bisq-network/bisq/issues/3605 para obtener más información.%n%nPuede cancelar esta instalación e instalar como usuario sin caracteres especiales en el nombre de usuario, o continuar con esta instalación utilizando una ruta de instalación diferente que no contenga caracteres especiales (por ejemplo, %2). - -[Files] -Source: "Bisq\Bisq.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "Bisq\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs - -[Icons] -Name: "{group}\Bisq"; Filename: "{app}\Bisq.exe"; IconFilename: "{app}\Bisq.ico" -Name: "{userdesktop}\Bisq"; Filename: "{app}\Bisq.exe"; IconFilename: "{app}\Bisq.ico" - -[Run] -Filename: "{app}\Bisq.exe"; Description: "{cm:LaunchProgram,Bisq}"; Flags: nowait postinstall skipifsilent - -[Code] -procedure DirectoryCopy(SourcePath, DestPath: string); -var - FindRec: TFindRec; - SourceFilePath: string; - DestFilePath: string; -begin - if FindFirst(SourcePath + '\*', FindRec) then - begin - try - repeat - if (FindRec.Name <> '.') and (FindRec.Name <> '..') then - begin - SourceFilePath := SourcePath + '\' + FindRec.Name; - DestFilePath := DestPath + '\' + FindRec.Name; - if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then - begin - if FileCopy(SourceFilePath, DestFilePath, False) then - begin - Log(Format('Copied %s to %s', [SourceFilePath, DestFilePath])); - end - else - begin - Log(Format('Failed to copy %s to %s', [SourceFilePath, DestFilePath])); - end; - end - else - begin - if DirExists(DestFilePath) or CreateDir(DestFilePath) then - begin - Log(Format('Created %s', [DestFilePath])); - DirectoryCopy(SourceFilePath, DestFilePath); - end - else - begin - Log(Format('Failed to create %s', [DestFilePath])); - end; - end; - end; - until not FindNext(FindRec); - finally - FindClose(FindRec); - end; - end - else - begin - Log(Format('Failed to list %s', [SourcePath])); - end; -end; - -//Delete old app directory to prevent issues during update -procedure DeleteOldAppDataDirectory; -var - entry: String; -begin - entry := ExpandConstant('{localappdata}') + '\Bisq\'; - if DirExists(entry) then begin - DelTree(entry, true, true, true); - end; -end; - -procedure DeleteTorFiles; -var - mainnetDir: String; - torDir: String; - hiddenServiceDir: String; - hiddenServiceBackupDir : String; -begin - mainnetDir := ExpandConstant('{userappdata}') + '\Bisq\btc_mainnet'; - torDir := mainnetDir + '\tor\*'; - hiddenServiceDir := mainnetDir + '\tor\hiddenservice'; - hiddenServiceBackupDir := mainnetDir + '\hiddenservice_backup'; - if DirExists(hiddenServiceDir) then begin - if DirExists(hiddenServiceBackupDir) then begin - DelTree(hiddenServiceBackupDir, true, true, true); - end; - CreateDir(hiddenServiceBackupDir); - DirectoryCopy(hiddenServiceDir, hiddenServiceBackupDir); - DelTree(torDir, false, true, true); - CreateDir(hiddenServiceDir); - DirectoryCopy(hiddenServiceBackupDir, hiddenServiceDir); - end; -end; - -function PrepareToInstall(var NeedsRestart: Boolean): String; -begin - DeleteOldAppDataDirectory; - DeleteTorFiles; - Result := ''; -end; - -function IsAppRunning(): Boolean; -var - FSWbemLocator : Variant; - FWMIService : Variant; - FWbemObjectSet : Variant; - ExecutablePath : String; -begin - Result := False; - ExecutablePath := Format('%s\Bisq\Bisq.exe', [ExpandConstant('{localappdata}')]) - StringChangeEx(ExecutablePath, '\', '\\', True); - try - FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator'); - FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); - FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where ExecutablePath="%s"', [ExecutablePath])); - Result := (FWbemObjectSet.Count > 0); - FWbemObjectSet := Unassigned; - FWMIService := Unassigned; - FSWbemLocator := Unassigned; - except - end; -end; - -function isPathSpecial(Path : String): Boolean; -var - I : Integer; -begin - Result := not - ((Length(Path) >= 3) and - (Path[1] >= 'A') and (Path[1] <= 'Z') and - (Path[2] = ':') and - (Path[3] = '\')); - if not Result then - begin - for I := 4 to Length(Path) do - begin - case Path[I] of - '0'..'9', 'A'..'Z', 'a'..'z', '\', ' ', '.', '-', '_', '(', ')': - else - begin - Result := True; - Break; - end; - end; - end; - end; -end; - -function InitializeSetup(): Boolean; -begin - Result := True; - if IsAppRunning() then begin - MsgBox(ExpandConstant('{cm:AppIsRunning}'), mbCriticalError, MB_OK); - Result := False; - end; -end; - -function InitializeUninstall(): Boolean; -begin - Result := True; - if IsAppRunning() then - begin - MsgBox(ExpandConstant('{cm:AppIsRunning}'), mbCriticalError, MB_OK); - Result := False; - end; -end; - -procedure CurPageChanged(CurPageID: Integer); -var - DefaultAppPath : String; - AppPath : String; -begin - DefaultAppPath := ExpandConstant('{localappdata}'); - if (CurPageID = wpSelectDir) and isPathSpecial(DefaultAppPath) then - begin - AppPath := ExpandConstant('{code:GetDefaultDirName}'); - MsgBox(FmtMessage(CustomMessage('SpecialAppPath'), [DefaultAppPath, AppPath]), mbInformation, MB_OK); - end; -end; - -function GetDefaultDirName(Param: String): String; -begin - Result := Format('%s\Bisq', [ExpandConstant('{localappdata}')]); - if isPathSpecial(Result) then - begin - Result := Format('%s\Bisq', [ExpandConstant('{%ProgramW6432}')]); - end; -end; diff --git a/desktop/package/windows/Bisq-setup-image.bmp b/desktop/package/windows/images/WixUIBannerBmp.bmp similarity index 67% rename from desktop/package/windows/Bisq-setup-image.bmp rename to desktop/package/windows/images/WixUIBannerBmp.bmp index bfa68915528..8af4e9b770f 100644 Binary files a/desktop/package/windows/Bisq-setup-image.bmp and b/desktop/package/windows/images/WixUIBannerBmp.bmp differ diff --git a/desktop/package/windows/images/WixUIDialogBmp.bmp b/desktop/package/windows/images/WixUIDialogBmp.bmp new file mode 100644 index 00000000000..0f3e140bb2e Binary files /dev/null and b/desktop/package/windows/images/WixUIDialogBmp.bmp differ diff --git a/desktop/package/windows/main.wxs b/desktop/package/windows/main.wxs new file mode 100644 index 00000000000..9c04430f2af --- /dev/null +++ b/desktop/package/windows/main.wxs @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + !(loc.message.install.dir.exist) + + + + + + + + 1 + INSTALLDIR_VALID="0" + INSTALLDIR_VALID="1" + + + + 1 + 1 + + + + + + + + + + + WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed + + + + + + + + + + + + Not Installed + + JP_UPGRADABLE_FOUND + + + JP_DOWNGRADABLE_FOUND + + + + + + diff --git a/desktop/package/windows/overrides.wxi b/desktop/package/windows/overrides.wxi new file mode 100644 index 00000000000..7ff18a3af8b --- /dev/null +++ b/desktop/package/windows/overrides.wxi @@ -0,0 +1,33 @@ + + + + + + diff --git a/desktop/package/windows/package.bat b/desktop/package/windows/package.bat deleted file mode 100644 index 714f19d3c73..00000000000 --- a/desktop/package/windows/package.bat +++ /dev/null @@ -1,130 +0,0 @@ -:: Requirements: -:: - Inno Setup unicode installed (http://www.jrsoftware.org/isdl.php) -:: - OracleJDK 10 installed -:: Note: OpenJDK 10 does not have the javapackager util, so must use OracleJDK -:: - Sign Tool installed (https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool) -:: Note: Sign Tool is part of Windows 10 SDK (https://go.microsoft.com/fwlink/?LinkID=698771) -:: - Code signing certificate installed -:: Prior to running this script: -:: - Update version below -:: - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory - -@echo off - -set version=1.6.1-SNAPSHOT -if not exist "%JAVA_HOME%\bin\javapackager.exe" ( - if not exist "%ProgramFiles%\Java\jdk-10.0.2" ( - echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK. - exit /B 1 - ) - set JAVA_HOME=%ProgramFiles%\Java\jdk-10.0.2 -) -set package_dir=%~dp0.. -for /F "tokens=1,2,3 delims=.-" %%a in ("%version%") do ( - set file_version=%%a.%%b.%%c -) - -cd %~dp0..\..\.. - -if exist "%package_dir%\desktop-%version%-all.jar" ( - set jar_dir=%package_dir% - set jar_file=%package_dir%\desktop-%version%-all.jar - set jar_filename=desktop-%version%-all.jar - goto PackageJar -) - -echo Building application -call gradlew.bat :desktop:clean :desktop:build -x test shadowJar -if exist "%~dp0..\..\..\desktop\build\libs\desktop-%version%-all.jar" ( - set jar_dir=%~dp0..\..\..\desktop\build\libs - set jar_file=%~dp0..\..\..\desktop\build\libs\desktop-%version%-all.jar - set jar_filename=desktop-%version%-all.jar -) else ( - echo No jar file available in %~dp0..\..\..\desktop\build\libs - exit /B 2 -) - -if not exist "%TEMP%\7za920\7za.exe" ( - echo Downloading 7zip ^(command line version^) to %TEMP% in order to extract the jar - powershell -Command "Invoke-WebRequest https://www.7-zip.org/a/7za920.zip -OutFile $env:temp\7za920.zip" - powershell -Command "Expand-Archive $env:temp\7za920.zip -DestinationPath $env:temp\7za920 -Force" -) - -set tmp_dir=%~dp0..\..\..\desktop\build\libs\tmp -echo Extracting jar file to %tmp_dir% -if exist "%tmp_dir%" ( - rmdir /S /Q "%tmp_dir%" -) -md "%tmp_dir%" -"%TEMP%\7za920\7za.exe" x "%jar_file%" -o"%tmp_dir%" -r -y - -echo Deleting problematic module config from extracted jar -:: Strip out Java 9 module configuration used in the fontawesomefx library as it causes javapackager to stop -:: because of this existing module information, since it is not used as a module. -:: Sometimes module-info.class does not exist - TODO check why and if still needed -if exist "%tmp_dir%\module-info.class" ( - del /Q "%tmp_dir%\module-info.class" -) - -echo Zipping jar again without module config -set jar_file=%package_dir%\%jar_filename% -if exist "%jar_file%" ( - del /Q "%jar_file%" -) -"%TEMP%\7za920\7za.exe" a -tzip "%jar_file%" "%tmp_dir%\*" -r -rmdir /S /Q "%tmp_dir%" - -if exist "%TEMP%\7za920.zip" ( - echo Removing downloaded files - del /Q "%TEMP%\7za920.zip" -) - -echo SHA256 before stripping jar file: -for /F "delims=" %%h in ('certutil -hashfile "%jar_file%" SHA256 ^| findstr -i -v "SHA256" ^| findstr -i -v "certutil"') do (set hash=%%h) -echo %hash% - -echo Making deterministic jar by stripping out parameters and comments that contain dates -:: Jar file created from https://github.com/ManfredKarrer/tools -:: TODO Is this step still necessary? Since we are using preserveFileTimestamps and reproducibleFileOrder in build.gradle -java -jar "%CD%\desktop\package\tools-1.0.jar" "%jar_file%" - -echo SHA256 after stripping jar file: -for /F "delims=" %%h in ('certutil -hashfile "%jar_file%" SHA256 ^| findstr -i -v "SHA256" ^| findstr -i -v "certutil"') do (set hash=%%h) -echo %hash% -echo %hash% > "%package_dir%\%jar_filename%.txt" - -:PackageJar -if exist "%package_dir%\windows\Bisq-%version%.exe" ( - del /Q "%package_dir%\windows\Bisq-%version%.exe" -) - -cd desktop - -echo Generating packaged executable -call "%JAVA_HOME%\bin\javapackager.exe" -deploy ^ --native exe ^ --name Bisq ^ --title Bisq ^ --vendor Bisq ^ --outdir "%package_dir%\windows" ^ --appclass bisq.desktop.app.BisqAppMain ^ --srcdir "%package_dir%" ^ --srcfiles %jar_filename% ^ --outfile Bisq ^ --v - -if not exist "%package_dir%\windows\Bisq-%version%.exe" ( - echo No exe file found at %package_dir%\windows\Bisq-%version%.exe - exit /B 3 -) - -echo Signing executable with default Code Signing Certificate -call "C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe" sign /v /fd SHA256 /a "%package_dir%\windows\Bisq-%version%.exe" - -echo SHA256 of %package_dir%\windows\Bisq-%version%.exe: -for /F "delims=" %%h in ('certutil -hashfile "%package_dir%\windows\Bisq-%version%.exe" SHA256 ^| findstr -i -v "SHA256" ^| findstr -i -v "certutil"') do (set hash=%%h) -echo %hash% -echo %hash% > "%package_dir%\windows\Bisq-%version%.exe.txt" - -echo Done! -pause diff --git a/desktop/package/windows/release.bat b/desktop/package/windows/release.bat deleted file mode 100644 index be105545a15..00000000000 --- a/desktop/package/windows/release.bat +++ /dev/null @@ -1,70 +0,0 @@ -:: Requirements: -:: - GPG installed (https://gpg4win.org/get-gpg4win.html) -:: - GPG key has been created -:: Prior to running this script: -:: - Update version below - -@echo off - -set version=1.6.1-SNAPSHOT -set release_dir=%~dp0..\..\..\releases\%version% -set package_dir=%~dp0.. - -set dmg=Bisq-%version%.dmg -set deb=Bisq-%version%.deb -set exe=Bisq-%version%.exe - -set /P gpg_user="Enter email address used for gpg signing: " - -echo Creating release directory -if exist "%release_dir%" ( - rmdir /S /Q "%release_dir%" -) -md "%release_dir%" - -echo Copying files to release folder -:: sig key mkarrer -xcopy /Y "%~dp0..\F379A1C6.asc" "%release_dir%" -:: sig key cbeams -xcopy /Y "%~dp0..\5BC5ED73.asc" "%release_dir%" -:: sig key Christoph Atteneder -xcopy /Y "%~dp0..\29CDFD3B.asc" "%release_dir%" -:: signing key -xcopy /Y "%~dp0..\signingkey.asc" "%release_dir%" -if exist "%package_dir%\macosx\%dmg%" ( - xcopy /Y "%package_dir%\macosx\%dmg%" "%release_dir%" - xcopy /Y "%package_dir%\macosx\%dmg%.txt" "%release_dir%" -) -if exist "%package_dir%\linux\%deb%" ( - xcopy /Y "%package_dir%\linux\%deb%" "%release_dir%" - xcopy /Y "%package_dir%\linux\%deb%.txt" "%release_dir%" -) -if exist "%package_dir%\windows\%exe%" ( - xcopy /Y "%package_dir%\windows\%exe%" "%release_dir%" - xcopy /Y "%package_dir%\windows\%exe%.txt" "%release_dir%" -) - -echo Creating signatures -if exist "%release_dir%\%dmg%" ( - gpg --digest-algo SHA256 --local-user %gpg_user% --output "%release_dir%\%dmg%.asc" --detach-sig --armor "%release_dir%\%dmg%" -) -if exist "%release_dir%\%deb%" ( - gpg --digest-algo SHA256 --local-user %gpg_user% --output "%release_dir%\%deb%.asc" --detach-sig --armor "%release_dir%\%deb%" -) -if exist "%release_dir%\%exe%" ( - gpg --digest-algo SHA256 --local-user %gpg_user% --output "%release_dir%\%exe%.asc" --detach-sig --armor "%release_dir%\%exe%" -) - -echo Verifying signatures -if exist "%release_dir%\%dmg%" ( - gpg --digest-algo SHA256 --verify "%release_dir%\%dmg%.asc" -) -if exist "%release_dir%\%deb%" ( - gpg --digest-algo SHA256 --verify "%release_dir%\%deb%.asc" -) -if exist "%release_dir%\%exe%" ( - gpg --digest-algo SHA256 --verify "%release_dir%\%exe%.asc" -) - -echo Done! -pause diff --git a/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java b/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java index 7edc7046c5c..d2577194db9 100644 --- a/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java +++ b/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java @@ -133,5 +133,10 @@ protected void startApplication() { @Override protected void onApplicationStarted() { super.onApplicationStarted(); + + // Relevant to have this in the logs, for support cases + // This can only be called after JavaFX is initialized, otherwise the version logged will be null + // Therefore, calling this as part of onApplicationStarted() + log.info("Using JavaFX {}", System.getProperty("javafx.version")); } } diff --git a/desktop/src/main/java/bisq/desktop/components/JFXTextFieldSkinBisqStyle.java b/desktop/src/main/java/bisq/desktop/components/JFXTextFieldSkinBisqStyle.java index 475a5daf106..4aca7692e5c 100644 --- a/desktop/src/main/java/bisq/desktop/components/JFXTextFieldSkinBisqStyle.java +++ b/desktop/src/main/java/bisq/desktop/components/JFXTextFieldSkinBisqStyle.java @@ -120,7 +120,6 @@ private void createPromptNode() { promptText = new Text(); promptText.setManaged(false); promptText.getStyleClass().add("text"); - promptText.setTranslateX(-getSkinnable().getPadding().getLeft()); promptText.visibleProperty().bind(linesWrapper.usePromptText); promptText.fontProperty().bind(getSkinnable().fontProperty()); promptText.textProperty().bind(getSkinnable().promptTextProperty()); diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/notifications/MobileNotificationsView.java b/desktop/src/main/java/bisq/desktop/main/account/content/notifications/MobileNotificationsView.java index 3c2f60fe3f8..ca2bdec89db 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/notifications/MobileNotificationsView.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/notifications/MobileNotificationsView.java @@ -23,7 +23,6 @@ import bisq.desktop.components.InputTextField; import bisq.desktop.main.PriceUtil; import bisq.desktop.main.overlays.popups.Popup; -import bisq.desktop.main.overlays.windows.WebCamWindow; import bisq.desktop.util.FormBuilder; import bisq.desktop.util.GUIUtil; import bisq.desktop.util.Layout; @@ -90,15 +89,12 @@ public class MobileNotificationsView extends ActivatableView { private final MarketAlerts marketAlerts; private final MobileNotificationService mobileNotificationService; - private WebCamWindow webCamWindow; - private QrCodeReader qrCodeReader; - private TextField tokenInputTextField; private InputTextField priceAlertHighInputTextField, priceAlertLowInputTextField, marketAlertTriggerInputTextField; private ToggleButton useSoundToggleButton, tradeToggleButton, marketToggleButton, priceToggleButton; private ComboBox currencyComboBox; private ComboBox paymentAccountsComboBox; - private Button downloadButton, webCamButton, noWebCamButton, eraseButton, setPriceAlertButton, + private Button downloadButton, eraseButton, setPriceAlertButton, removePriceAlertButton, addMarketAlertButton, manageAlertsButton /*,testMsgButton*/; private ChangeListener useSoundCheckBoxListener, tradeCheckBoxListener, marketCheckBoxListener, @@ -149,8 +145,6 @@ protected void activate() { // setup tokenInputTextField.textProperty().addListener(tokenInputTextFieldListener); downloadButton.setOnAction(e -> onDownload()); - webCamButton.setOnAction(e -> onOpenWebCam()); - noWebCamButton.setOnAction(e -> onNoWebCam()); // testMsgButton.setOnAction(e -> onSendTestMsg()); eraseButton.setOnAction(e -> onErase()); @@ -203,8 +197,6 @@ protected void deactivate() { // setup tokenInputTextField.textProperty().removeListener(tokenInputTextFieldListener); downloadButton.setOnAction(null); - webCamButton.setOnAction(null); - noWebCamButton.setOnAction(null); //testMsgButton.setOnAction(null); eraseButton.setOnAction(null); @@ -243,45 +235,6 @@ private void onDownload() { GUIUtil.openWebPage("https://bisq.network/downloads"); } - private void onOpenWebCam() { - webCamButton.setDisable(true); - log.info("Start WebCamLauncher"); - new WebCamLauncher(webCam -> { - log.info("webCam available"); - webCamWindow = new WebCamWindow(webCam.getViewSize().width, webCam.getViewSize().height) - .onClose(() -> { - webCamButton.setDisable(false); - qrCodeReader.close(); - }); - webCamWindow.show(); - - qrCodeReader = new QrCodeReader(webCam, webCamWindow.getImageView(), qrCode -> { - log.info("Qr code available"); - webCamWindow.hide(); - webCamButton.setDisable(false); - reset(); - tokenInputTextField.setText(qrCode); - updateMarketAlertFields(); - updatePriceAlertFields(); - }); - }, throwable -> { - if (throwable instanceof NoWebCamFoundException) { - new Popup().warning(Res.get("account.notifications.noWebCamFound.warning")).show(); - webCamButton.setDisable(false); - onNoWebCam(); - } else { - log.error(throwable.toString()); - new Popup().error(throwable.toString()).show(); - } - }); - } - - private void onNoWebCam() { - setPairingTokenFieldsVisible(); - noWebCamButton.setManaged(false); - noWebCamButton.setVisible(false); - } - private void onErase() { try { mobileNotificationService.sendEraseMessage(); @@ -401,18 +354,10 @@ private void createSetupFields() { Res.get("account.notifications.download.label"), Layout.TWICE_FIRST_ROW_DISTANCE); - Tuple3 tuple = addTopLabel2Buttons(root, ++gridRow, - Res.get("account.notifications.webcam.label"), - Res.get("account.notifications.webcam.button"), Res.get("account.notifications.noWebcam.button"), 0); - webCamButton = tuple.second; - noWebCamButton = tuple.third; - tokenInputTextField = addInputTextField(root, ++gridRow, Res.get("account.notifications.email.label")); tokenInputTextField.setPromptText(Res.get("account.notifications.email.prompt")); tokenInputTextFieldListener = (observable, oldValue, newValue) -> applyKeyAndToken(newValue); - tokenInputTextField.setManaged(false); - tokenInputTextField.setVisible(false); /*testMsgButton = FormBuilder.addTopLabelButton(root, ++gridRow, Res.get("account.notifications.testMsg.label"), Res.get("account.notifications.testMsg.title")).second; diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/notifications/QrCodeReader.java b/desktop/src/main/java/bisq/desktop/main/account/content/notifications/QrCodeReader.java deleted file mode 100644 index 97057b935a3..00000000000 --- a/desktop/src/main/java/bisq/desktop/main/account/content/notifications/QrCodeReader.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq 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 Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.desktop.main.account.content.notifications; - -import bisq.common.UserThread; - -import javafx.scene.image.ImageView; -import javafx.scene.image.WritableImage; - -import javafx.geometry.Point3D; - -import java.awt.image.BufferedImage; - -import java.util.function.Consumer; - -import lombok.extern.slf4j.Slf4j; - - - -import com.github.sarxos.webcam.Webcam; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.LuminanceSource; -import com.google.zxing.MultiFormatReader; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.client.j2se.BufferedImageLuminanceSource; -import com.google.zxing.common.HybridBinarizer; -import javafx.embed.swing.SwingFXUtils; - -@Slf4j -// Must not be UI thread -class QrCodeReader extends Thread { - private final Webcam webCam; - private final ImageView imageView; - private final Consumer resultHandler; - private boolean isRunning; - - QrCodeReader(Webcam webCam, ImageView imageView, Consumer resultHandler) { - this.webCam = webCam; - this.imageView = imageView; - this.resultHandler = resultHandler; - - start(); - } - - @Override - public void run() { - try { - if (!webCam.isOpen()) - webCam.open(); - - isRunning = true; - Result result; - BufferedImage bufferedImage; - while (isRunning) { - bufferedImage = webCam.getImage(); - if (bufferedImage != null) { - WritableImage writableImage = SwingFXUtils.toFXImage(bufferedImage, null); - imageView.setImage(writableImage); - imageView.setRotationAxis(new Point3D(0.0, 1.0, 0.0)); - imageView.setRotate(180.0); - - LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage); - BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); - - try { - result = new MultiFormatReader().decode(bitmap); - isRunning = false; - String qrCode = result.getText(); - UserThread.execute(() -> resultHandler.accept(qrCode)); - } catch (NotFoundException ignore) { - // No qr code in image... - } - } - } - } catch (Throwable t) { - log.error(t.toString()); - } finally { - webCam.close(); - } - } - - public void close() { - isRunning = false; - } -} diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/notifications/WebCamLauncher.java b/desktop/src/main/java/bisq/desktop/main/account/content/notifications/WebCamLauncher.java deleted file mode 100644 index 569005508c8..00000000000 --- a/desktop/src/main/java/bisq/desktop/main/account/content/notifications/WebCamLauncher.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq 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 Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.desktop.main.account.content.notifications; - -import bisq.common.UserThread; -import bisq.common.handlers.ExceptionHandler; - -import java.awt.Dimension; - -import java.util.concurrent.TimeoutException; -import java.util.function.Consumer; - -import lombok.extern.slf4j.Slf4j; - - - -import com.github.sarxos.webcam.Webcam; - -@Slf4j -// Must not be UI thread -class WebCamLauncher extends Thread { - private final Consumer resultHandler; - private final ExceptionHandler exceptionHandler; - - WebCamLauncher(Consumer resultHandler, ExceptionHandler exceptionHandler) { - this.resultHandler = resultHandler; - this.exceptionHandler = exceptionHandler; - - start(); - } - - @Override - public void run() { - try { - Webcam webCam = Webcam.getDefault(1000); // one second timeout - the default is too long - if (webCam != null) { - Dimension[] sizes = webCam.getViewSizes(); - Dimension size = sizes[sizes.length - 1]; // the largest size - webCam.setViewSize(size); - UserThread.execute(() -> resultHandler.accept(webCam)); - } else { - UserThread.execute(() -> exceptionHandler.handleException(new NoWebCamFoundException("No webcam found."))); - } - } catch (TimeoutException e) { - log.error(e.toString()); - UserThread.execute(() -> exceptionHandler.handleException(e)); - } - } -} diff --git a/docs/release-process.md b/docs/release-process.md index cbaa855717a..3830350136e 100644 --- a/docs/release-process.md +++ b/docs/release-process.md @@ -38,8 +38,9 @@ Although performance of VMs might vary based on your hardware configuration foll Use VirtualBox > 6.1 with following configuration: - * System > Motherboard > Base Memory: 2048 MB - * System > Processor > Processor(s): 2 CPUs + +* System > Motherboard > Base Memory: 4096 MB +* System > Processor > Processor(s): 2 CPUs * System > Processor > Execution Cap: 90% * Display > Screen > Video Memory: 128 MB * Display > Screen > Scale Factor: 200% @@ -65,46 +66,67 @@ with following configuration: #### For Windows * Update AntiVirus Software and virus definitions -* Install unicode version of [Inno Tools](http://www.jrsoftware.org/isdl.php) +* Install [WiX toolset](https://wixtoolset.org/releases/) * Run full AV system scan ### Build release #### macOS -1. Make sure all version numbers are updated (update version variables and run [replace_version_number.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/replace_version_number.sh)). -2. Set environment variable e.g. export BISQ_GPG_USER=manfred@bitsquare.io to ~/.profile file or the like... (one time effort) -3. Update [vmPath variable](https://github.com/bisq-network/bisq/blob/b4b5d0bb12c36afbe1aa6611dd8451378df6db8c/desktop/package/macosx/create_app.sh#L42) if necessary -4. Run [create_app.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/create_app.sh) +To be able to generate a signed and notarized binary you have to have an Apple developer account and create the required +certificate and provisioning file before running the build. + +1. Make sure all version numbers are updated (update version variables and + run [replace_version_number.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/replace_version_number.sh)) + . +2. Set environment variables to ~/.profile file or the like... (one time effort) + - `BISQ_GPG_USER`: e.g. export BISQ_GPG_USER=manfred@bitsquare.io + - `BISQ_SHARED_FOLDER`: shared folder that is used between your VM host and client system + - `BISQ_PACKAGE_SIGNING_IDENTITY`: e.g. "Developer ID Application: Christoph Atteneder (WQT93T6D6C)" + - `BISQ_PRIMARY_BUNDLE_ID`: e.g. "network.bisq.CAT" + - `BISQ_PACKAGE_NOTARIZATION_AC_USERNAME`: your Apple developer email address + - `BISQ_PACKAGE_NOTARIZATION_ASC_PROVIDER`: Your developer ID (e.g. WQT93T6D6C) +3. Run `./gradlew --console=plain packageInstallers` -Build output expected in deploy directory (opened after successful build process): +Build output expected in shared folder: -1. `Bisq-${NEW_VERSION}.dmg` macOS signed installer -2. `Bisq-${NEW_VERSION}.jar` Deterministic fat jar -3. `Bisq-${NEW_VERSION}.jar.txt` sha256 sum of deterministic fat jar +1. `Bisq-${NEW_VERSION}.dmg` macOS notarized and signed installer +2. `desktop-${NEW_VERSION}-all.jar.SHA-256` sha256 sum of fat jar +3. `jar-lib-for-raspberry-pi-${NEW_VERSION}.zip` Jar libraries for Raspberry Pi -The build script also copies over the deterministic fat jar into the shared folders for the other VMs (Windows & Linux). -Before building the other binaries install the generated Bisq app on macOS and verify that everything works as expected. +* Before building the other binaries install the generated Bisq app on macOS and verify that everything works as + expected. #### Linux -* Run `desktop/package/linux/package.sh` from the shared VM folder +1. Checkout the release tag in your VM +2. Set environment variables to ~/.profile file or the like... (one time effort) + - `BISQ_SHARED_FOLDER`: shared folder that is used between your VM host and client system +3. Run `./gradlew --console=plain packageInstallers` Build output expected: -1. `Bisq-${NEW_VERSION}.deb` package for distributions that derive from Debian -2. `Bisq-${NEW_VERSION}.rpm` package for distributions that derive from Redhat based distros +1. `bisq_${NEW_VERSION}-1_amd64.deb` package for distributions that derive from Debian +2. `bisq-${NEW_VERSION}-1.x86_64.rpm` package for distributions that derive from Redhat based distros +3. `desktop-${NEW_VERSION}-all.jar.SHA-256` sha256 sum of fat jar * Install and run generated package #### Windows -* Run `desktop/package/windows/package.bat` from the shared VM folder +To be able to generate a signed binary you have to apply and install a developer certificate before running the build. + +1. Checkout the release tag in your VM +2. Set environment variables to ~/.profile file or the like... (one time effort) + - `BISQ_SHARED_FOLDER`: shared folder that is used between your VM host and client system +3. Run `./gradlew --console=plain packageInstallers` Build output expected: -1. `Bisq-${NEW_VERSION}.exe` Windows unsigned installer -2. `Bisq-${NEW_VERSION}.exe.txt` sha256 sum of installer +1. `Bisq-${NEW_VERSION}.exe` Windows signed installer +2. `desktop-${NEW_VERSION}-all.jar.SHA-256` sha256 sum of fat jar + +* Install and run generated package ### Sign release on macOS @@ -116,15 +138,14 @@ Build output expected: 2. `5BC5ED73.asc` Sig key of Chris Beams 3. `29CDFD3B.asc`Sig key of Christoph Atteneder 4. `signingkey.asc` Fingerprint of key that was used for these builds -5. `Bisq-${NEW_VERSION}.jar.txt` Sha256 sum of deterministic fat jar -6. `Bisq-${NEW_VERSION}.dmg` macOS installer -7. `Bisq-${NEW_VERSION}.dmg.asc` Signature for macOS installer -8. `Bisq-${NEW_VERSION}.deb` Debian package -9. `Bisq-${NEW_VERSION}.deb.asc` Signature for Debian package -10. `Bisq-${NEW_VERSION}.rpm` Redhat based distro package -11. `Bisq-${NEW_VERSION}.rpm.asc` Signature for Redhat based distro package -12. `Bisq-${NEW_VERSION}.exe` Windows installer -13. `Bisq-${NEW_VERSION}.exe.asc` Signature for Windows installer +5. `Bisq-${NEW_VERSION}.dmg` macOS installer +6. `Bisq-${NEW_VERSION}.dmg.asc` Signature for macOS installer +7. `Bisq-64bit-${NEW_VERSION}.deb` Debian package +8. `Bisq-64bit-${NEW_VERSION}.deb.asc` Signature for Debian package +9. `Bisq-64bit-${NEW_VERSION}.rpm` Redhat based distro package +10. `Bisq-64bit-${NEW_VERSION}.rpm.asc` Signature for Redhat based distro package +11. `Bisq-64bit-${NEW_VERSION}.exe` Windows installer +12. `Bisq-64bit-${NEW_VERSION}.exe.asc` Signature for Windows installer * Run a AV scan over all files on the Windows VM where the files got copied over. diff --git a/gradle/README.md b/gradle/README.md new file mode 100644 index 00000000000..4d88406b08b --- /dev/null +++ b/gradle/README.md @@ -0,0 +1,25 @@ +# How to upgrade the Gradle version + +Visit the [Gradle website](https://gradle.org/releases/) and decide the: + + - desired version + - desired distribution type + - what is the sha256 for the version and type chosen above + +Adjust the following command with tha arguments above and execute it twice: + + ./gradlew wrapper --gradle-version 6.6.1 \ + --distribution-type all \ + --gradle-distribution-sha256-sum 11657af6356b7587bfb37287b5992e94a9686d5c8a0a1b60b87b9928a2decde5 + +The first execution should automatically update: + + - `bisq/gradle/wrapper/gradle-wrapper.properties` + +The second execution should then update: + + - `bisq/gradle/wrapper/gradle-wrapper.jar` + - `bisq/gradlew` + - `bisq/gradlew.bat` + +The four updated files are ready to be committed. diff --git a/gradle/witness/gradle-witness.gradle b/gradle/witness/gradle-witness.gradle index fc84a3927d7..3fca613fdc1 100644 --- a/gradle/witness/gradle-witness.gradle +++ b/gradle/witness/gradle-witness.gradle @@ -31,7 +31,6 @@ dependencyVerification { 'com.github.bisq-network:bitcoinj:65ed08fa5777ea4a08599bdd575e7dc1f4ba2d4d5835472551439d6f6252e68a', 'com.github.bisq-network:jsonrpc4j:842b4a660440ef53cd436da2e21c3e1fed939b620a3fc7542307deb3e77fdeb6', 'com.github.ravn:jsocks:3c71600af027b2b6d4244e4ad14d98ff2352a379410daebefff5d8cd48d742a4', - 'com.github.sarxos:webcam-capture:d960b7ea8ec3ddf2df0725ef214c3fccc9699ea7772df37f544e1f8e4fd665f6', 'com.google.android:annotations:ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15', 'com.google.api.grpc:proto-google-common-protos:bd60cd7a423b00fb824c27bdd0293aaf4781be1daba6ed256311103fb4b84108', 'com.google.code.findbugs:jsr305:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', @@ -46,8 +45,7 @@ dependencyVerification { 'com.google.zxing:core:11aae8fd974ab25faa8208be50468eb12349cd239e93e7c797377fa13e381729', 'com.google.zxing:javase:0ec23e2ec12664ddd6347c8920ad647bb3b9da290f897a88516014b56cc77eb9', 'com.googlecode.jcsv:jcsv:73ca7d715e90c8d2c2635cc284543b038245a34f70790660ed590e157b8714a2', - 'com.jfoenix:jfoenix:4739e37a05e67c3bc9d5b391a1b93717b5a48fa872992616b0964d3f827f8fe6', - 'com.nativelibs4java:bridj:101bcd9b6637e6bc16e56deb3daefba62b1f5e8e9e37e1b3e56e3b5860d659cf', + 'com.jfoenix:jfoenix:8060235fec5eb49617ec8d81d379e8c945f6cc722d0645e97190045100de2084', 'commons-codec:commons-codec:61f7a3079e92b9fdd605238d0295af5fd11ac411a0a0af48deace1f6c5ffa072', 'commons-io:commons-io:f877d304660ac2a142f3865badfc971dec7ed73c747c7f8d5d2f5139ca736513', 'commons-logging:commons-logging:daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636', @@ -70,7 +68,7 @@ dependencyVerification { 'net.jcip:jcip-annotations:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', 'net.sf.jopt-simple:jopt-simple:df26cc58f235f477db07f753ba5a3ab243ebe5789d9f89ecf68dd62ea9a66c28', 'org.apache.commons:commons-compress:5f2df1e467825e4cac5996d44890c4201c000b43c0b23cffc0782d28a0beb9b0', - 'org.apache.commons:commons-lang3:9375aad1000cdd5bd3068e832de9802094fac1f145655251e141d5d0072fab9a', + 'org.apache.commons:commons-lang3:4ee380259c068d1dbe9e84ab52186f2acd65de067ec09beff731fca1697fdb16', 'org.apache.httpcomponents:httpclient:bc5f065aba5dd815ee559dd24d9bcb797fb102ff9cfa036f5091ebc529bd3b93', 'org.apache.httpcomponents:httpcore:e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424', 'org.bouncycastle:bcpg-jdk15on:dc4f51adfc46583c2543489c82708fef5660202bf264c7cd453f081a117ea536', diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf016b..e708b1c023e 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37cc5daee1c..0e422340018 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip -distributionSha256Sum=abc10bcedb58806e8654210f96031db541bcd2d6fc3161e81cb0572d6a15e821 +distributionSha256Sum=11657af6356b7587bfb37287b5992e94a9686d5c8a0a1b60b87b9928a2decde5 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 83f2acfdc31..4f906e0c811 100755 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -154,19 +156,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -175,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 9618d8d9607..107acd32c4e 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/relay/src/main/resources/version.txt b/relay/src/main/resources/version.txt index 66a7bbe68dc..fd1280b97c7 100644 --- a/relay/src/main/resources/version.txt +++ b/relay/src/main/resources/version.txt @@ -1 +1 @@ -1.6.1-SNAPSHOT +1.6.2-SNAPSHOT diff --git a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java index 5bb447b1651..e6e1172ac77 100644 --- a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java +++ b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java @@ -47,7 +47,7 @@ @Slf4j public class SeedNodeMain extends ExecutableForAppWithP2p { private static final long CHECK_CONNECTION_LOSS_SEC = 30; - private static final String VERSION = "1.6.1"; + private static final String VERSION = "1.6.2"; private SeedNode seedNode; private Timer checkConnectionLossTime;