From f989dc509d8a0cda18f460b56517fb85ff52d93b Mon Sep 17 00:00:00 2001 From: Adphi Date: Mon, 21 Jan 2019 12:37:07 +0100 Subject: [PATCH] init --- .travis.yml | 64 ++ COPYING | 661 +++++++++++++++++++ Makefile | 157 +++++ README.md | 53 ++ appinfo/info.xml | 20 + appinfo/routes.php | 12 + build/artifacts/appstore/work.tar.gz | Bin 0 -> 52685 bytes build/artifacts/source/work.tar.gz | Bin 0 -> 25081 bytes composer.json | 15 + lib/Controller/AppsAutoUpdateController.php | 16 + lib/Cron/AppsAutoUpdateTask.php | 55 ++ phpunit.integration.xml | 7 + phpunit.xml | 7 + tests/Integration/AppTest.php | 29 + tests/Unit/Controller/PageControllerTest.php | 31 + tests/bootstrap.php | 19 + 16 files changed, 1146 insertions(+) create mode 100644 .travis.yml create mode 100644 COPYING create mode 100644 Makefile create mode 100644 README.md create mode 100644 appinfo/info.xml create mode 100644 appinfo/routes.php create mode 100644 build/artifacts/appstore/work.tar.gz create mode 100644 build/artifacts/source/work.tar.gz create mode 100644 composer.json create mode 100644 lib/Controller/AppsAutoUpdateController.php create mode 100644 lib/Cron/AppsAutoUpdateTask.php create mode 100644 phpunit.integration.xml create mode 100644 phpunit.xml create mode 100644 tests/Integration/AppTest.php create mode 100644 tests/Unit/Controller/PageControllerTest.php create mode 100644 tests/bootstrap.php diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..76db853 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,64 @@ +sudo: false +dist: trusty +language: php +php: + - 5.6 + - 7 + - 7.1 +env: + global: + - CORE_BRANCH=stable13 + matrix: + - DB=pgsql + +matrix: + allow_failures: + - env: DB=pgsql CORE_BRANCH=master + include: + - php: 5.6 + env: DB=sqlite + - php: 5.6 + env: DB=mysql + - php: 5.6 + env: DB=pgsql CORE_BRANCH=master + fast_finish: true + + +before_install: + # enable a display for running JavaScript tests + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - nvm install 8 + - npm install -g npm@latest + - make + - make appstore + # install core + - cd ../ + - git clone https://github.com/nextcloud/server.git --recursive --depth 1 -b $CORE_BRANCH nextcloud + - mv "$TRAVIS_BUILD_DIR" nextcloud/apps/applicationsautoupdater + +before_script: + - if [[ "$DB" == 'pgsql' ]]; then createuser -U travis -s oc_autotest; fi + - if [[ "$DB" == 'mysql' ]]; then mysql -u root -e 'create database oc_autotest;'; fi + - if [[ "$DB" == 'mysql' ]]; then mysql -u root -e "CREATE USER 'oc_autotest'@'localhost' IDENTIFIED BY '';"; fi + - if [[ "$DB" == 'mysql' ]]; then mysql -u root -e "grant all on oc_autotest.* to 'oc_autotest'@'localhost';"; fi + - cd nextcloud + - mkdir data + - ./occ maintenance:install --database-name oc_autotest --database-user oc_autotest --admin-user admin --admin-pass admin --database $DB --database-pass='' + - ./occ app:enable applicationsautoupdater + - php -S localhost:8080 & + - cd apps/applicationsautoupdater + +script: + - make test + +after_failure: + - cat ../../data/nextcloud.log + +addons: + firefox: 'latest' + mariadb: '10.1' + +services: + - postgresql + - mariadb diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/COPYING @@ -0,0 +1,661 @@ + 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/Makefile b/Makefile new file mode 100644 index 0000000..ada504f --- /dev/null +++ b/Makefile @@ -0,0 +1,157 @@ +# This file is licensed under the Affero General Public License version 3 or +# later. See the COPYING file. +# @author Bernhard Posselt +# @copyright Bernhard Posselt 2016 + +# Generic Makefile for building and packaging a Nextcloud app which uses npm and +# Composer. +# +# Dependencies: +# * make +# * which +# * curl: used if phpunit and composer are not installed to fetch them from the web +# * tar: for building the archive +# * npm: for building and testing everything JS +# +# If no composer.json is in the app root directory, the Composer step +# will be skipped. The same goes for the package.json which can be located in +# the app root or the js/ directory. +# +# The npm command by launches the npm build script: +# +# npm run build +# +# The npm test command launches the npm test script: +# +# npm run test +# +# The idea behind this is to be completely testing and build tool agnostic. All +# build tools and additional package managers should be installed locally in +# your project, since this won't pollute people's global namespace. +# +# The following npm scripts in your package.json install and update the bower +# and npm dependencies and use gulp as build system (notice how everything is +# run from the node_modules folder): +# +# "scripts": { +# "test": "node node_modules/gulp-cli/bin/gulp.js karma", +# "prebuild": "npm install && node_modules/bower/bin/bower install && node_modules/bower/bin/bower update", +# "build": "node node_modules/gulp-cli/bin/gulp.js" +# }, + +app_name=$(notdir $(CURDIR)) +build_tools_directory=$(CURDIR)/build/tools +source_build_directory=$(CURDIR)/build/artifacts/source +source_package_name=$(source_build_directory)/$(app_name) +appstore_build_directory=$(CURDIR)/build/artifacts/appstore +appstore_package_name=$(appstore_build_directory)/$(app_name) +npm=$(shell which npm 2> /dev/null) +composer=$(shell which composer 2> /dev/null) + +all: build + +# Fetches the PHP and JS dependencies and compiles the JS. If no composer.json +# is present, the composer step is skipped, if no package.json or js/package.json +# is present, the npm step is skipped +.PHONY: build +build: +ifneq (,$(wildcard $(CURDIR)/composer.json)) + make composer +endif +ifneq (,$(wildcard $(CURDIR)/package.json)) + make npm +endif +ifneq (,$(wildcard $(CURDIR)/js/package.json)) + make npm +endif + +# Installs and updates the composer dependencies. If composer is not installed +# a copy is fetched from the web +.PHONY: composer +composer: +ifeq (, $(composer)) + @echo "No composer command available, downloading a copy from the web" + mkdir -p $(build_tools_directory) + curl -sS https://getcomposer.org/installer | php + mv composer.phar $(build_tools_directory) + php $(build_tools_directory)/composer.phar install --prefer-dist + php $(build_tools_directory)/composer.phar update --prefer-dist +else + composer install --prefer-dist + composer update --prefer-dist +endif + +# Installs npm dependencies +.PHONY: npm +npm: +ifeq (,$(wildcard $(CURDIR)/package.json)) + cd js && $(npm) run build +else + npm run build +endif + +# Removes the appstore build +.PHONY: clean +clean: + rm -rf ./build + +# Same as clean but also removes dependencies installed by composer, bower and +# npm +.PHONY: distclean +distclean: clean + rm -rf vendor + rm -rf node_modules + rm -rf js/vendor + rm -rf js/node_modules + +# Builds the source and appstore package +.PHONY: dist +dist: + make source + make appstore + +# Builds the source package +.PHONY: source +source: + rm -rf $(source_build_directory) + mkdir -p $(source_build_directory) + tar cvzf $(source_package_name).tar.gz ../$(app_name) \ + --exclude-vcs \ + --exclude="../$(app_name)/build" \ + --exclude="../$(app_name)/js/node_modules" \ + --exclude="../$(app_name)/node_modules" \ + --exclude="../$(app_name)/*.log" \ + --exclude="../$(app_name)/js/*.log" \ + +# Builds the source package for the app store, ignores php and js tests +.PHONY: appstore +appstore: + rm -rf $(appstore_build_directory) + mkdir -p $(appstore_build_directory) + tar cvzf $(appstore_package_name).tar.gz ../$(app_name) \ + --exclude-vcs \ + --exclude="../$(app_name)/build" \ + --exclude="../$(app_name)/tests" \ + --exclude="../$(app_name)/Makefile" \ + --exclude="../$(app_name)/*.log" \ + --exclude="../$(app_name)/phpunit*xml" \ + --exclude="../$(app_name)/composer.*" \ + --exclude="../$(app_name)/js/node_modules" \ + --exclude="../$(app_name)/js/tests" \ + --exclude="../$(app_name)/js/test" \ + --exclude="../$(app_name)/js/*.log" \ + --exclude="../$(app_name)/js/package.json" \ + --exclude="../$(app_name)/js/bower.json" \ + --exclude="../$(app_name)/js/karma.*" \ + --exclude="../$(app_name)/js/protractor.*" \ + --exclude="../$(app_name)/package.json" \ + --exclude="../$(app_name)/bower.json" \ + --exclude="../$(app_name)/karma.*" \ + --exclude="../$(app_name)/protractor\.*" \ + --exclude="../$(app_name)/.*" \ + --exclude="../$(app_name)/js/.*" \ + +.PHONY: test +test: composer + $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.xml + $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml diff --git a/README.md b/README.md new file mode 100644 index 0000000..6dea633 --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# Applications Auto Updater + +Place this app in **nextcloud/apps/** + +## Building the app + +The app can be built by using the provided Makefile by running: + + make + +This requires the following things to be present: +* make +* which +* tar: for building the archive +* curl: used if phpunit and composer are not installed to fetch them from the web +* npm: for building and testing everything JS, only required if a package.json is placed inside the **js/** folder + +The make command will install or update Composer dependencies if a composer.json is present and also **npm run build** if a package.json is present in the **js/** folder. The npm **build** script should use local paths for build systems and package managers, so people that simply want to build the app won't need to install npm libraries globally, e.g.: + +**package.json**: +```json +"scripts": { + "test": "node node_modules/gulp-cli/bin/gulp.js karma", + "prebuild": "npm install && node_modules/bower/bin/bower install && node_modules/bower/bin/bower update", + "build": "node node_modules/gulp-cli/bin/gulp.js" +} +``` + + +## Publish to App Store + +First get an account for the [App Store](http://apps.nextcloud.com/) then run: + + make && make appstore + +The archive is located in build/artifacts/appstore and can then be uploaded to the App Store. + +## Running tests +You can use the provided Makefile to run all tests by using: + + make test + +This will run the PHP unit and integration tests and if a package.json is present in the **js/** folder will execute **npm run test** + +Of course you can also install [PHPUnit](http://phpunit.de/getting-started.html) and use the configurations directly: + + phpunit -c phpunit.xml + +or: + + phpunit -c phpunit.integration.xml + +for integration tests diff --git a/appinfo/info.xml b/appinfo/info.xml new file mode 100644 index 0000000..6480dfa --- /dev/null +++ b/appinfo/info.xml @@ -0,0 +1,20 @@ + + + applicationsautoupdater + Applications Auto Updater + Apllications auto updater + + 0.0.1 + agpl + Adphi Apps + ApplicationsAutoUpdater + tools + https://git.adphi.net/Adphi/ApplicationsAutoUpdater/issues + + + + + OCA\ApplicationsAutoUpdater\Cron\AppsAutoUpdateTask + + diff --git a/appinfo/routes.php b/appinfo/routes.php new file mode 100644 index 0000000..1f6eede --- /dev/null +++ b/appinfo/routes.php @@ -0,0 +1,12 @@ + OCA\ApplicationsAutoUpdater\Controller\PageController->index() + * + * The controller class has to be registered in the application.php file since + * it's instantiated in there + */ +return [ + 'routes' => [] +]; diff --git a/build/artifacts/appstore/work.tar.gz b/build/artifacts/appstore/work.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a857727c2a90dc69ffc6da072c1c1950cdb07785 GIT binary patch literal 52685 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 ME9oj3KtX~31)|Zc761SM literal 0 HcmV?d00001 diff --git a/build/artifacts/source/work.tar.gz b/build/artifacts/source/work.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d96e30e2f36845aedfbffbd350e1aed494d9a120 GIT binary patch literal 25081 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 * 60); + $this->log = $log; + $this->config =\OC::$server->getConfig(); + $this->installer = \OC::$server->query(Installer::class); + } + + protected function run($argument) + { + $ocApp = new \OC_App(); + $apps = $ocApp->listAllApps(); + + foreach($apps as $app) { + if(!$app["active"]) continue; + $appId = $app["id"]; + try { + if ($this->installer->isUpdateAvailable($appId)) { + $this->config->setSystemValue('maintenance', true); + $this->installer->updateAppstoreApp($appId); + $this->config->setSystemValue('maintenance', false); + } + } catch (\Exception $ex) { + $this->log->logException($ex, ['app' => 'appsautoupdate']); + $this->config->setSystemValue('maintenance', false); + } + } + } +} diff --git a/phpunit.integration.xml b/phpunit.integration.xml new file mode 100644 index 0000000..eae19f1 --- /dev/null +++ b/phpunit.integration.xml @@ -0,0 +1,7 @@ + + + + ./tests/Integration + + + diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..82c96d6 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,7 @@ + + + + ./tests/Unit + + + diff --git a/tests/Integration/AppTest.php b/tests/Integration/AppTest.php new file mode 100644 index 0000000..f3186d0 --- /dev/null +++ b/tests/Integration/AppTest.php @@ -0,0 +1,29 @@ +container = $app->getContainer(); + } + + public function testAppInstalled() { + $appManager = $this->container->query('OCP\App\IAppManager'); + $this->assertTrue($appManager->isInstalled('applicationsautoupdater')); + } + +} diff --git a/tests/Unit/Controller/PageControllerTest.php b/tests/Unit/Controller/PageControllerTest.php new file mode 100644 index 0000000..37bc3f8 --- /dev/null +++ b/tests/Unit/Controller/PageControllerTest.php @@ -0,0 +1,31 @@ +getMockBuilder('OCP\IRequest')->getMock(); + + $this->controller = new AppsAutoUpdateController( + 'applicationsautoupdater', $request, $this->userId + ); + } + + public function testIndex() { + $result = $this->controller->index(); + + $this->assertEquals('index', $result->getTemplateName()); + $this->assertTrue($result instanceof TemplateResponse); + } + +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..9eb0858 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,19 @@ +addValidRoot(OC::$SERVERROOT . '/tests'); + +// Fix for "Autoload path not allowed: .../applicationsautoupdater/tests/testcase.php" +\OC_App::loadApp('applicationsautoupdater'); + +if(!class_exists('PHPUnit_Framework_TestCase')) { + require_once('PHPUnit/Autoload.php'); +} + +OC_Hook::clear();