diff --git a/.docker-test b/.docker-test new file mode 100644 index 0000000..d36fad8 --- /dev/null +++ b/.docker-test @@ -0,0 +1,32 @@ +#!/bin/bash + +ruby_version=${1:-2.4.2} + +if ! rvm use ruby-${ruby_version} &>/dev/null ; then + echo "The ruby version '${ruby_version}' doesn't exist!" + echo "Available versions are:" + rvm list rubies strings | cut -d '-' -f2 + exit 2 +fi + +echo '# ---------------------------------' +echo "# Use ruby version: ${ruby_version}" +echo '# ---------------------------------' + +cp -r /mpw ~/mpw +cd ~/mpw +gem install bundler --no-ri --no-rdoc +bundle install +gem build mpw.gemspec +gem install mpw-$(cat VERSION).gem +cp -a /dev/urandom /dev/random + +rubocop +ruby ./test/init.rb +ruby ./test/test_config.rb +ruby ./test/test_item.rb +ruby ./test/test_mpw.rb +ruby ./test/test_translate.rb +ruby ./test/init.rb +ruby ./test/test_cli.rb +ruby ./test/test_import.rb diff --git a/.rubocop.yml b/.rubocop.yml index ce1de33..56d1540 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -6,116 +6,33 @@ AllCops: - Vagrantfile TargetRubyVersion: 2.3 -Style/AccessorMethodName: +Naming/AccessorMethodName: Enabled: false -Style/NumericLiteralPrefix: - Enabled: false -Style/TrailingCommaInArguments: - Enabled: false -Style/TrailingCommaInLiteral: - Enabled: false -Style/FrozenStringLiteralComment: - Enabled: false -Metrics/ParameterLists: - Max: 5 - CountKeywordArgs: false -Style/MutableConstant: + +Lint/RescueWithoutErrorClass: Enabled: false + Metrics/LineLength: Max: 120 -Metrics/AbcSize: +Metrics/CyclomaticComplexity: + Enabled: false +Metrics/PerceivedComplexity: Enabled: false Metrics/MethodLength: Enabled: false Metrics/BlockLength: Enabled: false -Metrics/CyclomaticComplexity: - Enabled: false -Metrics/PerceivedComplexity: - Enabled: false Metrics/ClassLength: Enabled: false -Style/SpaceInsideHashLiteralBraces: - Enabled: false -Style/AsciiComments: - Enabled: true -Style/Documentation: - Enabled: false -Style/SignalException: - Enabled: false -Style/OptionHash: - Enabled: true -Style/SymbolArray: - Enabled: true -Performance/Casecmp: - Enabled: false -Style/DoubleNegation: - Enabled: false -Style/Alias: - EnforcedStyle: prefer_alias_method -Style/MultilineMethodCallIndentation: - EnforcedStyle: indented -Style/RaiseArgs: - EnforcedStyle: exploded -Style/SpaceInLambdaLiteral: - Enabled: false -Lint/UnneededSplatExpansion: +Metrics/AbcSize: Enabled: false - -# Generated configuration -Style/HashSyntax: - Enabled: true - EnforcedStyle: ruby19 - UseHashRocketsWithSymbolValues: false -Style/MethodDefParentheses: - Enabled: true - EnforcedStyle: require_parentheses -Style/MultilineAssignmentLayout: - Enabled: true - EnforcedStyle: new_line -Style/IndentationConsistency: - Enabled: true - EnforcedStyle: normal -Style/AlignParameters: - Enabled: true - EnforcedStyle: with_fixed_indentation -Style/BlockDelimiters: - Enabled: true - EnforcedStyle: line_count_based -Style/AndOr: - Enabled: true -Style/DotPosition: - Enabled: true - EnforcedStyle: leading -Style/EmptyLinesAroundClassBody: - Enabled: true - EnforcedStyle: no_empty_lines -Style/EmptyLinesAroundModuleBody: - Enabled: true - EnforcedStyle: no_empty_lines -Style/NumericPredicate: - Enabled: true - EnforcedStyle: comparison -Style/EvenOdd: +Style/NumericLiteralPrefix: + Enabled: false +Style/FrozenStringLiteralComment: Enabled: false -Style/CollectionMethods: - Enabled: true - PreferredMethods: - collect: map - collect!: map! - inject: reduce - detect: find - find_all: select -Style/EmptyLinesAroundAccessModifier: - Enabled: true Style/CommandLiteral: Enabled: true EnforcedStyle: percent_x -Style/StringLiterals: - Enabled: true - EnforcedStyle: single_quotes -Style/SpaceInsideBlockBraces: - EnforcedStyle: space -Style/VariableNumber: - EnforcedStyle: snake_case +Style/Documentation: + Enabled: false diff --git a/.travis.yml b/.travis.yml index 525a9d0..14d696a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,16 @@ language: ruby +dist: precise rvm: - - 2.4.1 - - 2.3.4 - - 2.2.7 + - 2.4.2 + - 2.3.5 + - 2.2.8 - 2.1.10 install: + - sudo cp -a /dev/urandom /dev/random + - sudo apt-get purge -y gnupg-agent gnupg2 - bundle install - - echo 9999 > VERSION - gem build mpw.gemspec - - gem install mpw-9999.gem + - gem install mpw-$(cat VERSION).gem script: - rubocop - ruby ./test/init.rb @@ -18,3 +20,4 @@ script: - ruby ./test/test_translate.rb - ruby ./test/init.rb - ruby ./test/test_cli.rb + - ruby ./test/test_import.rb diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6654780 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM debian:stretch +MAINTAINER Adrien Waksberg "mpw@yae.im" + +RUN apt update +RUN apt dist-upgrade -y + +RUN apt install -y procps gnupg1 curl git +RUN ln -snvf /usr/bin/gpg1 /usr/bin/gpg +RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB +RUN curl -sSL https://get.rvm.io | bash -s stable +RUN echo 'source "/usr/local/rvm/scripts/rvm"' >> /etc/bash.bashrc + +RUN /bin/bash -l -c "rvm install 2.4.2" +RUN /bin/bash -l -c "rvm install 2.3.5" +RUN /bin/bash -l -c "rvm install 2.2.8" +RUN /bin/bash -l -c "rvm install 2.1.10" diff --git a/Gemfile b/Gemfile index de2741f..a76b2c1 100644 --- a/Gemfile +++ b/Gemfile @@ -1,14 +1,14 @@ source 'https://rubygems.org' gem 'clipboard', '~> 1.1', '>= 1.1.1' gem 'colorize', '~> 0.8', '>= 0.8.1' -gem 'gpgme', '~> 2.0', '>= 2.0.12' +gem 'gpgme', '~> 2.0', '>= 2.0.14' gem 'highline', '~> 1.7', '>= 1.7.8' -gem 'i18n', '~> 0.7', '>= 0.7.0' +gem 'i18n', '~> 0.9', '>= 0.9.1' gem 'locale', '~> 2.1', '>= 2.1.2' -gem 'rotp', '~> 3.1', '>= 3.1.0' +gem 'rotp', '~> 3.3', '>= 3.3.0' group :development do - gem 'rubocop', '0.48.1' + gem 'rubocop', '0.50.0' gem 'test-unit' gem 'yard' end diff --git a/LICENSE b/LICENSE index d159169..0c5ea8e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,339 +1,201 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - Preamble + 1. Definitions. - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - 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 -this service 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. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). - The precise terms and conditions for copying, distribution and -modification follow. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + END OF TERMS AND CONDITIONS -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + APPENDIX: How to apply the Apache License to your work. -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + Copyright 2017 Adrien Waksberg - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. + http://www.apache.org/licenses/LICENSE-2.0 - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the 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 a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. - - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 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 General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 9c2c5d6..be9e7cb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # MPW: Manage your passwords! [](https://github.com/nishiki/manage-password/releases) [](https://travis-ci.org/nishiki/manage-password) -[](https://github.com/nishiki/manage-password/blob/master/LICENSE) +[](https://github.com/nishiki/manage-password/blob/master/LICENSE) mpw is a little software which stores your passwords in [GnuPG](http://www.gnupg.org/) encrypted files. @@ -33,7 +33,6 @@ Add your first item: ``` mpw add --host assurance.com --port 443 --user user_2132 --protocol https --random mpw add --host fric.com --user 230403 --otp-code 23434113 --protocol https --comment 'I love my bank' --random - ``` And list your items: @@ -161,3 +160,36 @@ Configuration password_length | 16 ``` + +## Development + +Don't run the tests on your local machine, you risk to lost your datas. + +### Test on local machine with docker + + * install [docker](https://docs.docker.com/engine/installation/) + * run the tests + +``` +docker run -v $(pwd):/mpw:ro -it nishiki/ruby:stretch /bin/bash -l /mpw/.docker-test +``` + +## License + +``` +* Author:: Adrien Waksberg <mpw@yae.im> + +Copyright (c) 2013-2017 Adrien Waksberg + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` diff --git a/bin/mpw b/bin/mpw index 811322e..11bc726 100755 --- a/bin/mpw +++ b/bin/mpw @@ -1,20 +1,23 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> +#!/usr/bin/env ruby # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. $LOAD_PATH << File.expand_path('../../lib', __FILE__) diff --git a/bin/mpw-add b/bin/mpw-add index 2c2e996..e08caae 100644 --- a/bin/mpw-add +++ b/bin/mpw-add @@ -1,20 +1,22 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' @@ -48,22 +50,10 @@ OptionParser.new do |opts| exit 0 end - opts.on('-H', '--host HOST', I18n.t('option.host')) do |host| - values[:host] = host - end - opts.on('-o', '--otp-code CODE', I18n.t('option.otp_code')) do |otp| values[:otp_key] = otp end - opts.on('-O', '--protocol PROTOCOL', I18n.t('option.protocol')) do |protocol| - values[:protocol] = protocol - end - - opts.on('-P', '--port NUMBER', I18n.t('option.port')) do |port| - values[:port] = port - end - opts.on('-r', '--random', I18n.t('option.random_password')) do options[:password] = true end @@ -72,7 +62,11 @@ OptionParser.new do |opts| options[:text_editor] = true end - opts.on('-u', '--user USER', I18n.t('option.user')) do |user| + opts.on('-u', '--url URL', I18n.t('option.url')) do |url| + values[:url] = url + end + + opts.on('-U', '--user USER', I18n.t('option.user')) do |user| values[:user] = user end diff --git a/bin/mpw-config b/bin/mpw-config index 0af88bd..2ac0f77 100644 --- a/bin/mpw-config +++ b/bin/mpw-config @@ -1,20 +1,22 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' diff --git a/bin/mpw-copy b/bin/mpw-copy index 95c01d6..fc3b6e0 100644 --- a/bin/mpw-copy +++ b/bin/mpw-copy @@ -1,20 +1,22 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' diff --git a/bin/mpw-delete b/bin/mpw-delete index ea352c4..48eb792 100644 --- a/bin/mpw-delete +++ b/bin/mpw-delete @@ -1,20 +1,22 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' diff --git a/bin/mpw-export b/bin/mpw-export index 83d35ae..92eb7bd 100644 --- a/bin/mpw-export +++ b/bin/mpw-export @@ -1,20 +1,19 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# http://www.apache.org/licenses/LICENSE-2.0 # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' diff --git a/bin/mpw-genpwd b/bin/mpw-genpwd index 051c5c4..f6ca795 100644 --- a/bin/mpw-genpwd +++ b/bin/mpw-genpwd @@ -1,20 +1,19 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# http://www.apache.org/licenses/LICENSE-2.0 # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/mpw' diff --git a/bin/mpw-import b/bin/mpw-import index 0502b2b..d0deae9 100644 --- a/bin/mpw-import +++ b/bin/mpw-import @@ -1,20 +1,19 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# http://www.apache.org/licenses/LICENSE-2.0 # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' @@ -24,7 +23,13 @@ require 'mpw/cli' # Options # --------------------------------------------------------- # -options = {} +formats = + Dir["#{File.expand_path('../../lib/mpw/import', __FILE__)}/*.rb"] + .map { |v| File.basename(v, '.rb') } + .join(', ') +options = { + format: 'mpw' +} OptionParser.new do |opts| opts.banner = "#{I18n.t('option.usage')}: mpw import [options]" @@ -37,6 +42,10 @@ OptionParser.new do |opts| options[:file] = file end + opts.on('-F', '--format STRING', I18n.t('option.file_format', formats: formats)) do |format| + options[:format] = format + end + opts.on('-h', '--help', I18n.t('option.help')) do puts opts exit 0 @@ -53,4 +62,4 @@ cli = MPW::Cli.new(config) cli.load_config cli.get_wallet(options[:wallet]) cli.decrypt -cli.import(options[:file]) +cli.import(options[:file], options[:format]) diff --git a/bin/mpw-list b/bin/mpw-list index 434ea11..fb7899c 100644 --- a/bin/mpw-list +++ b/bin/mpw-list @@ -1,20 +1,19 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# http://www.apache.org/licenses/LICENSE-2.0 # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' diff --git a/bin/mpw-update b/bin/mpw-update index 143e187..26a55c9 100644 --- a/bin/mpw-update +++ b/bin/mpw-update @@ -1,20 +1,19 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# http://www.apache.org/licenses/LICENSE-2.0 # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' @@ -53,26 +52,14 @@ OptionParser.new do |opts| exit 0 end - opts.on('-H', '--host HOST', I18n.t('option.host')) do |host| - values[:host] = host - end - opts.on('-o', '--otp-code CODE', I18n.t('option.otp_code')) do |otp| values[:otp_key] = otp end - opts.on('-O', '--protocol PROTOCOL', I18n.t('option.protocol')) do |protocol| - values[:protocol] = protocol - end - opts.on('-p', '--pattern PATTERN', I18n.t('option.pattern')) do |pattern| search[:pattern] = pattern end - opts.on('-P', '--port NUMBER', I18n.t('option.port')) do |port| - values[:port] = port - end - opts.on('-r', '--random', I18n.t('option.random_password')) do options[:password] = true end @@ -81,7 +68,11 @@ OptionParser.new do |opts| options[:text_editor] = true end - opts.on('-u', '--user USER', I18n.t('option.user')) do |user| + opts.on('-u', '--url URL', I18n.t('option.url')) do |url| + values[:url] = url + end + + opts.on('-U', '--user USER', I18n.t('option.user')) do |user| values[:user] = user end diff --git a/bin/mpw-wallet b/bin/mpw-wallet index caee35d..6518283 100644 --- a/bin/mpw-wallet +++ b/bin/mpw-wallet @@ -1,20 +1,19 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# http://www.apache.org/licenses/LICENSE-2.0 # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'optparse' require 'mpw/config' diff --git a/i18n/en.yml b/i18n/en.yml index 962b6ef..9df7bda 100644 --- a/i18n/en.yml +++ b/i18n/en.yml @@ -22,7 +22,7 @@ en: write_data: "Can't write the MPW file!" import: "Can't import, unable to read %{file}!" update: - host_empty: "You must define a host!" + host_and_comment_empty: "You must define a host or a comment!" warning: select: 'Your choice is not a valid item!' @@ -55,6 +55,7 @@ en: disable_special_chars: "Don't use special char to create a password" export: "Export a wallet in an yaml file" file_export: "Specify the file to export data" + file_format: "Format of import file (default: mpw; available: %{formats})" file_import: "Specify the file to import" force: "Do not ask confirmation when deleting an item" generate_password: "Create a random password (default 8 characters)" @@ -62,7 +63,6 @@ en: gpg_key: "Specify a GPG key (ex: user@example.com)" group: "Search the items with specified group" help: "Show this help message" - host: "Specify a host or ip" init: "Initialize mpw" import: "Import item from an yaml file" key: "Define the key name" @@ -76,8 +76,6 @@ en: path: "Move the wallet in new specify directory" pattern: "Given search pattern" pinmode: "Enable pinentry mode (available with gpg >= 2.1)" - port: "Set a port of connexion" - protocol: "Set a protocol of connexion" random_password: "Generate a random password" setup: "Create a new configuration file" setup_wallet: "Create a new configuration file for a wallet" @@ -86,6 +84,7 @@ en: show_all: "Listing all items" text_editor: "Use text editor to edit the item" usage: "Use" + url: "Set an url (ex: https://example.com/path)" user: "Set an user" wallet: "Specify a wallet to use" wallet_dir: "Set the wallets folder" @@ -130,6 +129,7 @@ en: ask: "Are you sure you want to import this file %{file} ?" file_empty: "The import file is empty!" file_not_exist: "The import file doesn't exist!" + format_unknown: "The import format '%{file_format} is unknown!" valid: "The import is successful!" not_valid: "No data to import!" set_config: diff --git a/i18n/fr.yml b/i18n/fr.yml index e117c1f..04583ad 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -22,7 +22,7 @@ fr: write_data: "Impossible d'écrire le fichier MPW!" import: "Impossible d'importer le fichier %{file}, car il n'est pas lisible!" update: - host_empty: "Vous devez définir un host!" + host_and_comment_empty: "Vous devez définir un host ou un commentaire!" warning: select: "Votre choix n'est pas un élément valide!" @@ -55,6 +55,7 @@ fr: disable_special_chars: "Désactive l'utilisation des charactères speciaux dans la génération d'un mot de passe" export: "Exporte un portefeuille dans un fichier yaml" file_export: "Spécifie le fichier où exporter les données" + file_format: "Format du fichier d'import (défault: mpw; disponible: %{formats})" file_import: "Spécifie le fichier à importer" force: "Ne demande pas de confirmation pour la suppression d'un élément" generate_password: "Génére un mot de passe aléatoire (défaut 8 caractères)" @@ -62,7 +63,6 @@ fr: gpg_key: "Spécifie une clé GPG (ex: user@example.com)" group: "Recherche les éléments appartenant au groupe spécifié" help: "Affiche ce message d'aide" - host: "Spécifie le nom du serveur ou l'ip" import: "Importe des éléments depuis un fichier yaml" init: "Initialise mpw" key: "Spécifie le nom d'une clé" @@ -76,8 +76,6 @@ fr: path: "Déplace le portefeuille dans un nouveau dossier" pattern: "Motif de donnée à chercher" pinmode: "Active le mode pinentry (valable avec gpg >= 2.1)" - port: "Spécifie un port de connexion" - protocol: "Spécifie un protocol de connexion" random_password: "Génére un mot de passe aléatoire" setup: "Création d'un nouveau fichier de configuration" setup_wallet: "Création d'un nouveau fichier de configuration pour un portefeuille" @@ -86,6 +84,7 @@ fr: show_all: "Liste tous les éléments" text_editor: "Active l'édition avec un éditeur de texte" usage: "Utilisation" + url: "Spécifie l'url (ex: http://example.com/path)" user: "Spécifie un utilisateur" wallet: "Spécifie le portefeuille à utiliser" wallet_dir: "Spécifie le répertoire des portefeuilles" @@ -130,6 +129,7 @@ fr: ask: "Êtes vous sûre de vouloir importer le fichier %{file} ?" file_empty: "Le fichier d'import est vide!" file_not_exist: "Le fichier d'import n'existe pas" + format_unknown: "Le format d'import '%{file_format}' est inconnu!" valid: "L'import est un succès!" not_valid: "Aucune donnée à importer!" set_config: diff --git a/lib/mpw/cli.rb b/lib/mpw/cli.rb index 02d6eb9..e64d27c 100644 --- a/lib/mpw/cli.rb +++ b/lib/mpw/cli.rb @@ -1,20 +1,22 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'readline' require 'locale' @@ -374,7 +376,8 @@ module MPW # List all wallets def list_wallet - wallets = [] + wallets = @config.wallet_paths.keys + Dir.glob("#{@config.wallet_dir}/*.mpw").each do |f| wallet = File.basename(f, '.mpw') wallet += ' *'.green if wallet == @config.default_wallet @@ -563,16 +566,14 @@ module MPW items.each do |item| data.merge!( item.id => { - 'host' => item.host, - 'user' => item.user, - 'group' => item.group, - 'password' => @mpw.get_password(item.id), - 'protocol' => item.protocol, - 'port' => item.port, - 'otp_key' => @mpw.get_otp_key(item.id), 'comment' => item.comment, - 'last_edit' => item.last_edit, 'created' => item.created, + 'group' => item.group, + 'last_edit' => item.last_edit, + 'otp_key' => @mpw.get_otp_key(item.id), + 'password' => @mpw.get_password(item.id), + 'url' => item.url, + 'user' => item.user } ) end @@ -586,17 +587,24 @@ module MPW # Import items from an yaml file # @param file [String] path of import file - def import(file) + # @param format [String] the software import file format + def import(file, format = 'mpw') raise I18n.t('form.import.file_empty') if file.to_s.empty? raise I18n.t('form.import.file_not_exist') unless File.exist?(file) - YAML.load_file(file).each_value do |row| - item = Item.new(group: row['group'], - host: row['host'], - protocol: row['protocol'], - user: row['user'], - port: row['port'], - comment: row['comment']) + begin + require "mpw/import/#{format}" + rescue LoadError + raise I18n.t('form.import.format_unknown', file_format: format) + end + + Import.send(format, file).each_value do |row| + item = Item.new( + comment: row['comment'], + group: row['group'], + url: row['url'], + user: row['user'] + ) next if item.empty? diff --git a/lib/mpw/config.rb b/lib/mpw/config.rb index 95390a4..f3974b5 100644 --- a/lib/mpw/config.rb +++ b/lib/mpw/config.rb @@ -1,20 +1,22 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'gpgme' require 'yaml' @@ -39,9 +41,9 @@ module MPW def initialize(config_file = nil) @config_file = config_file @config_dir = - if /darwin/ =~ RUBY_PLATFORM + if RUBY_PLATFORM =~ /darwin/ "#{Dir.home}/Library/Preferences/mpw" - elsif /cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM + elsif RUBY_PLATFORM =~ /cygwin|mswin|mingw|bccwin|wince|emx/ "#{Dir.home}/AppData/Local/mpw" else "#{Dir.home}/.config/mpw" diff --git a/lib/mpw/import/gorilla.rb b/lib/mpw/import/gorilla.rb new file mode 100644 index 0000000..feffce6 --- /dev/null +++ b/lib/mpw/import/gorilla.rb @@ -0,0 +1,53 @@ +# +# Copyright:: 2013, Adrien Waksberg +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +require 'csv' + +module MPW + module Import + # Import an export mpw file + # @param file [String] the file path to import + def self.gorilla(file) + data = {} + + CSV.foreach(file, headers: true) do |row| + id = row['uuid'] + comment = + if row['title'] && row['notes'] + "#{row['title']} #{row['notes']}" + elsif row['title'] + row['title'] + elsif row['notes'] + row['notes'] + end + + data[id] = { + 'comment' => comment, + 'group' => row['group'], + 'password' => row['password'], + 'url' => row['url'], + 'user' => row['user'] + } + end + + data + end + end +end diff --git a/lib/mpw/import/keepass.rb b/lib/mpw/import/keepass.rb new file mode 100644 index 0000000..0b961d4 --- /dev/null +++ b/lib/mpw/import/keepass.rb @@ -0,0 +1,53 @@ +# +# Copyright:: 2013, Adrien Waksberg +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +require 'csv' + +module MPW + module Import + # Import an keepass2 export csv file + # @param file [String] the file path to import + def self.keepass(file) + data = {} + + CSV.foreach(file, headers: true) do |row| + id = "#{row['Group']} #{row['Title']}" + comment = + if row['Title'] && row['Notes'] + "#{row['Title']} #{row['Notes']}" + elsif row['Title'] + row['Title'] + elsif row['Notes'] + row['Notes'] + end + + data[id] = { + 'comment' => comment, + 'group' => row['Group'], + 'password' => row['Password'], + 'url' => row['URL'], + 'user' => row['Username'] + } + end + + data + end + end +end diff --git a/lib/mpw/import/mpw.rb b/lib/mpw/import/mpw.rb new file mode 100644 index 0000000..a287357 --- /dev/null +++ b/lib/mpw/import/mpw.rb @@ -0,0 +1,31 @@ +# +# Copyright:: 2013, Adrien Waksberg +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +require 'yaml' + +module MPW + module Import + # Import an export mpw file + # @param file [String] the file path to import + def self.mpw(file) + YAML.load_file(file) + end + end +end diff --git a/lib/mpw/import/mpw_old.rb b/lib/mpw/import/mpw_old.rb new file mode 100644 index 0000000..923bf16 --- /dev/null +++ b/lib/mpw/import/mpw_old.rb @@ -0,0 +1,48 @@ +# +# Copyright:: 2013, Adrien Waksberg +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +require 'yaml' + +module MPW + module Import + # Import an export mpw file + # @param file [String] the file path to import + def self.mpw_old(file) + data = {} + YAML.load_file(file).each do |id, item| + url = '' + url += "#{item['protocol']}://" if item['protocol'] + url += item['host'] + url += ":#{item['port']}" if item['port'] + + data[id] = { + 'comment' => item['comment'], + 'group' => item['group'], + 'otp' => item['otp'], + 'password' => item['password'], + 'url' => url, + 'user' => item['user'] + } + end + + data + end + end +end diff --git a/lib/mpw/item.rb b/lib/mpw/item.rb index be03dba..9da60b1 100644 --- a/lib/mpw/item.rb +++ b/lib/mpw/item.rb @@ -1,43 +1,45 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'i18n' +require 'uri' module MPW class Item - attr_accessor :id + attr_accessor :created + attr_accessor :comment attr_accessor :group attr_accessor :host - attr_accessor :protocol - attr_accessor :user - attr_accessor :port + attr_accessor :id attr_accessor :otp - attr_accessor :comment + attr_accessor :port + attr_accessor :protocol attr_accessor :last_edit - attr_accessor :created + attr_accessor :url + attr_accessor :user # @param options [Hash] the option :host is required def initialize(**options) - if !options.key?(:host) || options[:host].to_s.empty? - raise I18n.t('error.update.host_empty') - end + @host = '' - if !options.key?(:id) || options[:id].to_s.empty? || !options.key?(:created) || options[:created].to_s.empty? + if !options[:id] || !options[:created] @id = generate_id @created = Time.now.to_i else @@ -53,43 +55,38 @@ module MPW # Update the item # @param options [Hash] def update(**options) - if options.key?(:host) && options[:host].to_s.empty? - raise I18n.t('error.update.host_empty') + unless options[:url] || options[:comment] + raise I18n.t('error.update.host_and_comment_empty') end - @group = options[:group] if options.key?(:group) - @host = options[:host] if options.key?(:host) - @protocol = options[:protocol] if options.key?(:protocol) - @user = options[:user] if options.key?(:user) - @port = options[:port].to_i if options.key?(:port) && !options[:port].to_s.empty? - @otp = options[:otp] if options.key?(:otp) - @comment = options[:comment] if options.key?(:comment) - @last_edit = Time.now.to_i unless options.key?(:no_update_last_edit) + if options[:url] + uri = URI(options[:url]) + @host = uri.host || options[:url] + @port = uri.port || nil + @protocol = uri.scheme || nil + @url = options[:url] + end + + @comment = options[:comment] if options.key?(:comment) + @group = options[:group] if options.key?(:group) + @last_edit = Time.now.to_i unless options.key?(:no_update_last_edit) + @otp = options[:otp] if options.key?(:otp) + @user = options[:user] if options.key?(:user) end # Delete all data def delete @id = nil - @group = nil - @host = nil - @protocol = nil - @user = nil - @port = nil - @otp = nil @comment = nil @created = nil + @group = nil + @host = nil @last_edit = nil - end - - # Return data on url format - # @return [String] an url - def url - url = '' - url += "#{@protocol}://" if @protocol - url += @host - url += ":#{@port}" if @port - - url + @otp = nil + @port = nil + @protocol = nil + @url = nil + @user = nil end def empty? diff --git a/lib/mpw/mpw.rb b/lib/mpw/mpw.rb index 81a0231..191caae 100644 --- a/lib/mpw/mpw.rb +++ b/lib/mpw/mpw.rb @@ -1,20 +1,22 @@ -#!/usr/bin/ruby -# MPW is a software to crypt and manage your passwords -# Copyright (C) 2017 Adrien Waksberg <mpw@yae.im> # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. +# Copyright:: 2013, Adrien Waksberg # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. require 'rubygems/package' require 'gpgme' @@ -84,14 +86,12 @@ module MPW Item.new( id: d['id'], group: d['group'], - host: d['host'], - protocol: d['protocol'], user: d['user'], - port: d['port'], + url: d['url'], otp: @otp_keys.key?(d['id']), comment: d['comment'], last_edit: d['last_edit'], - created: d['created'], + created: d['created'] ) ) end @@ -114,13 +114,11 @@ module MPW item.id => { 'id' => item.id, 'group' => item.group, - 'host' => item.host, - 'protocol' => item.protocol, 'user' => item.user, - 'port' => item.port, + 'url' => item.url, 'comment' => item.comment, 'last_edit' => item.last_edit, - 'created' => item.created, + 'created' => item.created } ) end diff --git a/mpw.gemspec b/mpw.gemspec index 4afbe3b..abcb375 100644 --- a/mpw.gemspec +++ b/mpw.gemspec @@ -1,5 +1,3 @@ -# coding: utf-8 - lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) @@ -20,11 +18,11 @@ Gem::Specification.new do |spec| spec.required_ruby_version = '>= 2.1' - spec.add_dependency 'i18n', '~> 0.7', '>= 0.7.0' - spec.add_dependency 'gpgme', '~> 2.0', '>= 2.0.12' + spec.add_dependency 'i18n', '~> 0.9', '>= 0.9.1' + spec.add_dependency 'gpgme', '~> 2.0', '>= 2.0.14' spec.add_dependency 'highline', '~> 1.7', '>= 1.7.8' spec.add_dependency 'locale', '~> 2.1', '>= 2.1.2' spec.add_dependency 'colorize', '~> 0.8', '>= 0.8.1' spec.add_dependency 'clipboard', '~> 1.1', '>= 1.1.1' - spec.add_dependency 'rotp', '~> 3.1', '>= 3.1.0' + spec.add_dependency 'rotp', '~> 3.3', '>= 3.3.0' end diff --git a/templates/add_form.erb b/templates/add_form.erb index 89b750e..e2aea20 100644 --- a/templates/add_form.erb +++ b/templates/add_form.erb @@ -1,16 +1,12 @@ --- -# <%= I18n.t('form.add_item.host') %> -host: <%= options[:host] %> +# <%= I18n.t('form.add_item.url') %> +url: <%= options[:url] %> # <%= I18n.t('form.add_item.login') %> user: <%= options[:user] %> # <%= I18n.t('form.add_item.group') %> -group: <%= options[:group] %> -# <%= I18n.t('form.add_item.protocol') %> -protocol: <%= options[:protocol] %><% unless password %> +group: <%= options[:group] %><% unless password %> # <%= I18n.t('form.add_item.password') %> password:<% end %> -# <%= I18n.t('form.add_item.port') %> -port: <%= options[:port] %> # <%= I18n.t('form.add_item.comment') %> comment: <%= options[:comment] %> # <%= I18n.t('form.add_item.otp_key') %> diff --git a/templates/update_form.erb b/templates/update_form.erb index 5037568..eafeb1b 100644 --- a/templates/update_form.erb +++ b/templates/update_form.erb @@ -1,16 +1,12 @@ --- -# <%= I18n.t('form.update_item.host') %> -host: <% if options[:host] %><%= options[:host] %><% else %><%= item.host %><% end %> +# <%= I18n.t('form.update_item.url') %> +host: <% if options[:url] %><%= options[:url] %><% else %><%= item.url %><% end %> # <%= I18n.t('form.update_item.login') %> user: <% if options[:user] %><%= options[:user] %><% else %><%= item.user %><% end %><% unless password %> # <%= I18n.t('form.update_item.password') %> password: <% end %> # <%= I18n.t('form.update_item.group') %> group: <% if options[:group] %><%= options[:group] %><% else %><%= item.group %><% end %> -# <%= I18n.t('form.update_item.protocol') %> -protocol: <% if options[:protocol] %><%= options[:protocol] %><% else %><%= item.protocol %><% end %> -# <%= I18n.t('form.update_item.port') %> -port: <% if options[:port] %><%= options[:port] %><% else %><%= item.port %><% end %> # <%= I18n.t('form.update_item.otp_key') %> otp_key: <% if options[:otp_key] %><%= options[:otp_key] %><% end %> # <%= I18n.t('form.update_item.comment') %> diff --git a/test/files/fixtures-import.yml b/test/files/fixtures-import.yml index f79ab0a..8cb1ff4 100644 --- a/test/files/fixtures-import.yml +++ b/test/files/fixtures-import.yml @@ -1,19 +1,16 @@ --- 1: - host: fric.com + url: https://fric.com user: 230403 group: Bank password: 5XdiTQOubRDw9B0aJoMlcEyL - protocol: https - port: otp_key: 330223432 comment: I love my bank 2: - host: assurance.com + url: https://assurance.com:443 user: user_2132 + host: assurance.com group: Assurance password: DMyK6B3v4bWO52VzU7aTHIem - protocol: https - port: 443 otp_key: comment: diff --git a/test/files/fixtures.yml b/test/files/fixtures.yml index 765314e..d8927cb 100644 --- a/test/files/fixtures.yml +++ b/test/files/fixtures.yml @@ -1,4 +1,5 @@ add: + url: 'https://example.com:8080' group: 'Bank' host: 'example.com' protocol: 'https' @@ -9,6 +10,7 @@ add: import: id: 'TEST-ID-XXXXX' + url: 'https://gogole.com:8081/toto' group: 'Cloud' host: 'gogole.com' protocol: 'https' @@ -19,6 +21,7 @@ import: created: 1386752948 update: + url: 'ssh://example2.com:2222' group: 'Assurance' host: 'example2.com' protocol: 'ssh' diff --git a/test/files/import-gorilla.txt b/test/files/import-gorilla.txt new file mode 100644 index 0000000..a5fc604 --- /dev/null +++ b/test/files/import-gorilla.txt @@ -0,0 +1,4 @@ +uuid,group,title,url,user,password,notes +49627979-e393-48c4-49ca-1cf66603238e,Bank,Fric,http://fric.com,12345,secret,money money +49627979-e393-48c4-49ca-1cf66603238f,,My little server,server.com,secret2, +49627979-e393-48c4-49ca-1cf66603238g,Cloud,,ssh://fric.com:4333,username,secret,bastion diff --git a/test/files/import-keepass.txt b/test/files/import-keepass.txt new file mode 100644 index 0000000..61ce7ad --- /dev/null +++ b/test/files/import-keepass.txt @@ -0,0 +1,3 @@ +"Group","Title","Username","Password","URL","Notes" +"Racine","Bank","123456","ywcExJW8qmBVTSyi","http://bank.com/login","My little bank" +"Racine/Cloud","GAFAM","wesh","superpassword","localhost.local","" diff --git a/test/files/import-mpw_old.txt b/test/files/import-mpw_old.txt new file mode 100644 index 0000000..fd162aa --- /dev/null +++ b/test/files/import-mpw_old.txt @@ -0,0 +1,35 @@ +--- +1: + host: fric.com + user: 12345 + group: Bank + password: secret + protocol: http + port: + otp_key: + comment: Fric money money + last_edit: 1487623641 + created: 1485729356 +2: + host: server.com + user: sercret2 + group: + password: + protocol: + port: 4222 + otp_key: + comment: My little server + last_edit: 1487623641 + created: 1485729356 +3: + host: fric.com + user: username + group: Cloud + password: + protocol: ssh + port: 4333 + otp_key: + comment: bastion + last_edit: 1487623641 + created: 1485729356 + diff --git a/test/init.rb b/test/init.rb index 6da9ecb..08ebbb8 100644 --- a/test/init.rb +++ b/test/init.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby - require 'fileutils' require 'gpgme' diff --git a/test/test_cli.rb b/test/test_cli.rb index 8f5d546..8bae4cc 100644 --- a/test/test_cli.rb +++ b/test/test_cli.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby - require 'i18n' require 'test/unit' @@ -19,7 +17,11 @@ class TestConfig < Test::Unit::TestCase end def test_00_init_config - output = %x(echo "#{@password}\n#{@password}" | mpw config --init #{@gpg_key}) + output = %x( + echo "#{@password}\n#{@password}" | mpw config \ + --init #{@gpg_key} \ + 2>/dev/null + ) assert_match(I18n.t('form.setup_config.valid'), output) assert_match(I18n.t('form.setup_gpg_key.valid'), output) end @@ -29,19 +31,16 @@ class TestConfig < Test::Unit::TestCase output = %x( echo #{@password} | mpw add \ - --host #{data['host']} \ - --port #{data['port']} \ - --protocol #{data['protocol']} \ + --url #{data['url']} \ --user #{data['user']} \ --comment '#{data['comment']}' \ --group #{data['group']} \ - --random + --random \ + 2>/dev/null ) - puts output assert_match(I18n.t('form.add_item.valid'), output) - output = %x(echo #{@password} | mpw list) - puts output + output = %x(echo #{@password} | mpw list 2>/dev/null) assert_match(%r{#{data['protocol']}://.+#{data['host']}.+:#{data['port']}}, output) assert_match(data['user'], output) assert_match(data['comment'], output) @@ -51,19 +50,19 @@ class TestConfig < Test::Unit::TestCase def test_02_search data = @fixtures['add'] - output = %x(echo #{@password} | mpw list --group #{data['group']}) + output = %x(echo #{@password} | mpw list --group #{data['group']} 2>/dev/null) assert_match(%r{#{data['protocol']}://.+#{data['host']}.+:#{data['port']}}, output) - output = %x(echo #{@password} | mpw list --pattern #{data['host']}) + output = %x(echo #{@password} | mpw list --pattern #{data['host']} 2>/dev/null) assert_match(%r{#{data['protocol']}://.+#{data['host']}.+:#{data['port']}}, output) - output = %x(echo #{@password} | mpw list --pattern #{data['comment']}) + output = %x(echo #{@password} | mpw list --pattern #{data['comment']} 2>/dev/null) assert_match(%r{#{data['protocol']}://.+#{data['host']}.+:#{data['port']}}, output) - output = %x(echo #{@password} | mpw list --group R1Pmfbp626TFpjlr) + output = %x(echo #{@password} | mpw list --group R1Pmfbp626TFpjlr 2>/dev/null) assert_match(I18n.t('display.nothing'), output) - output = %x(echo #{@password} | mpw list --pattern h1IfnKqamaGM9oEX) + output = %x(echo #{@password} | mpw list --pattern h1IfnKqamaGM9oEX 2>/dev/null) assert_match(I18n.t('display.nothing'), output) end @@ -73,18 +72,15 @@ class TestConfig < Test::Unit::TestCase output = %x( echo #{@password} | mpw update \ -p #{@fixtures['add']['host']} \ - --host #{data['host']} \ - --port #{data['port']} \ - --protocol #{data['protocol']} \ + --url #{data['url']} \ --user #{data['user']} \ --comment '#{data['comment']}' \ - --new-group #{data['group']} + --new-group #{data['group']} \ + 2>/dev/null ) - puts output assert_match(I18n.t('form.update_item.valid'), output) - output = %x(echo #{@password} | mpw list) - puts output + output = %x(echo #{@password} | mpw list 2>/dev/null) assert_match(%r{#{data['protocol']}://.+#{data['host']}.+:#{data['port']}}, output) assert_match(data['user'], output) assert_match(data['comment'], output) @@ -92,12 +88,14 @@ class TestConfig < Test::Unit::TestCase end def test_04_delete_item - output = %x(echo "#{@password}\ny" | mpw delete -p #{@fixtures['update']['host']}) - puts output + output = %x( + echo "#{@password}\ny" | mpw delete \ + -p #{@fixtures['update']['host']} \ + 2>/dev/null + ) assert_match(I18n.t('form.delete_item.valid'), output) - output = %x(echo #{@password} | mpw list) - puts output + output = %x(echo #{@password} | mpw list 2>/dev/null) assert_match(I18n.t('display.nothing'), output) end @@ -105,10 +103,10 @@ class TestConfig < Test::Unit::TestCase file_import = './test/files/fixtures-import.yml' file_export = '/tmp/test-mpw.yml' - output = %x(echo #{@password} | mpw import --file #{file_import}) + output = %x(echo #{@password} | mpw import --file #{file_import} 2>/dev/null) assert_match(I18n.t('form.import.valid', file: file_import), output) - output = %x(echo #{@password} | mpw export --file #{file_export}) + output = %x(echo #{@password} | mpw export --file #{file_export} 2>/dev/null) assert_match(I18n.t('form.export.valid', file: file_export), output) assert(File.exist?(file_export)) assert_equal(YAML.load_file(file_export).length, 2) @@ -117,83 +115,80 @@ class TestConfig < Test::Unit::TestCase error = true YAML.load_file(file_export).each_value do |export| - next if import['host'] != export['host'] + next if import['url'] != export['url'] %w[user group password protocol port otp_key comment].each do |key| assert_equal(import[key].to_s, export[key].to_s) end error = false + break end + assert(!error) end end def test_06_copy - data = YAML.load_file('./test/files/fixtures-import.yml')[1] + data = YAML.load_file('./test/files/fixtures-import.yml')[2] output = %x( echo "#{@password}\np\nq" | mpw copy \ --disable-clipboard \ - -p #{data['host']} + -p #{data['host']} \ + 2>/dev/null ) - puts output assert_match(data['password'], output) end def test_07_setup_wallet gpg_key = 'test2@example.com' - output = %x(echo #{@password} | mpw wallet --add-gpg-key #{gpg_key}) - puts output + output = %x(echo #{@password} | mpw wallet --add-gpg-key #{gpg_key} 2>/dev/null) assert_match(I18n.t('form.add_key.valid'), output) - output = %x(echo #{@password} | mpw wallet --list-keys) - puts output + output = %x(echo #{@password} | mpw wallet --list-keys 2>/dev/null) assert_match("| #{@gpg_key}", output) assert_match("| #{gpg_key}", output) - output = %x(echo #{@password} | mpw wallet --delete-gpg-key #{gpg_key}) - puts output + output = %x(echo #{@password} | mpw wallet --delete-gpg-key #{gpg_key} 2>/dev/null) assert_match(I18n.t('form.delete_key.valid'), output) - output = %x(echo #{@password} | mpw wallet --list-keys) - puts output + output = %x(echo #{@password} | mpw wallet --list-keys 2>/dev/null) assert_match("| #{@gpg_key}", output) assert_no_match(/\| #{gpg_key}/, output) output = %x(mpw wallet) - puts output assert_match('| default', output) output = %x(mpw wallet --path '.') - puts output assert_match(I18n.t('form.set_wallet_path.valid'), output) output = %x(mpw config) - puts output assert_match(%r{path_wallet_default.+\| #{Dir.pwd}/default.mpw}, output) assert(File.exist?("#{Dir.pwd}/default.mpw")) + output = %x(mpw wallet) + assert_match('default', output) + output = %x(mpw wallet --default-path) - puts output assert_match(I18n.t('form.set_wallet_path.valid'), output) output = %x(mpw config) - puts output assert_no_match(/path_wallet_default/, output) end def test_08_setup_config - gpg_key = 'user@example2.com' + gpg_key = 'test2@example.com' gpg_exe = '/usr/bin/gpg2' - wallet_dir = '/tmp/mpw' + wallet_dir = '/tmp' length = 24 wallet = 'work' output = %x( mpw config \ --gpg-exe #{gpg_exe} \ + --key #{gpg_key} \ --enable-pinmode \ --disable-alpha \ --disable-special-chars \ @@ -202,12 +197,10 @@ class TestConfig < Test::Unit::TestCase --wallet-dir #{wallet_dir} \ --default-wallet #{wallet} ) - puts output assert_match(I18n.t('form.set_config.valid'), output) output = %x(mpw config) - puts output - assert_match(/gpg_key.+\| #{@gpg_key}/, output) + assert_match(/gpg_key.+\| #{gpg_key}/, output) assert_match(/gpg_exe.+\| #{gpg_exe}/, output) assert_match(/pinmode.+\| true/, output) assert_match(/default_wallet.+\| #{wallet}/, output) @@ -219,18 +212,17 @@ class TestConfig < Test::Unit::TestCase output = %x( mpw config \ - --key #{gpg_key} \ + --gpg-exe '' \ + --key #{@gpg_key} \ --alpha \ --special-chars \ --numeric \ --disable-pinmode ) - puts output assert_match(I18n.t('form.set_config.valid'), output) output = %x(mpw config) - puts output - assert_match(/gpg_key.+\| #{gpg_key}/, output) + assert_match(/gpg_key.+\| #{@gpg_key}/, output) assert_match(/pinmode.+\| false/, output) %w[numeric alpha special].each do |k| assert_match(/password_#{k}.+\| true/, output) diff --git a/test/test_config.rb b/test/test_config.rb index 8ad7369..2b88b54 100644 --- a/test/test_config.rb +++ b/test/test_config.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby - require 'mpw/config' require 'test/unit' require 'locale' diff --git a/test/test_import.rb b/test/test_import.rb new file mode 100644 index 0000000..f1a8727 --- /dev/null +++ b/test/test_import.rb @@ -0,0 +1,79 @@ +require 'i18n' +require 'test/unit' + +class TestImport < Test::Unit::TestCase + def setup + if defined?(I18n.enforce_available_locales) + I18n.enforce_available_locales = true + end + + I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) + I18n.load_path = ["#{File.expand_path('../../i18n', __FILE__)}/en.yml"] + I18n.locale = :en + + @password = 'password' + end + + def test_00_import_mpw_old + file = './test/files/import-mpw_old.txt' + format = 'mpw_old' + + output = %x( + mpw import \ + --file #{file} \ + --format #{format} \ + --wallet #{format} + ) + assert_match(I18n.t('form.import.valid'), output) + + output = %x(echo #{@password} | mpw list --group Bank --wallet #{format}) + assert_match(%r{http://.*fric\.com.*12345.*Fric money money}, output) + + output = %x(echo #{@password} | mpw list --group Cloud --wallet #{format}) + assert_match(%r{ssh://.*fric\.com.*:4333.*username.*bastion}, output) + + output = %x(echo #{@password} | mpw list --wallet #{format}) + assert_match(/server\.com.*My little server/, output) + end + + def test_01_import_gorilla + file = './test/files/import-gorilla.txt' + format = 'gorilla' + + output = %x( + mpw import \ + --file #{file} \ + --format #{format} \ + --wallet #{format} + ) + assert_match(I18n.t('form.import.valid'), output) + + output = %x(echo #{@password} | mpw list --group Bank --wallet #{format}) + assert_match(%r{http://.*fric\.com.*12345.*Fric money money}, output) + + output = %x(echo #{@password} | mpw list --group Cloud --wallet #{format}) + assert_match(%r{ssh://.*fric\.com.*:4333.*username.*bastion}, output) + + output = %x(echo #{@password} | mpw list --wallet #{format}) + assert_match(/server\.com.*My little server/, output) + end + + def test_02_import_keepass + file = './test/files/import-keepass.txt' + format = 'keepass' + + output = %x( + mpw import \ + --file #{file} \ + --format #{format} \ + --wallet #{format} + ) + assert_match(I18n.t('form.import.valid'), output) + + output = %x(echo #{@password} | mpw list --group 'Racine/Cloud' --wallet #{format}) + assert_match(/localhost\.local.*wesh.*GAFAM/, output) + + output = %x(echo #{@password} | mpw list --wallet #{format}) + assert_match(%r{http://.*bank\.com.*123456.*Bank My little bank}, output) + end +end diff --git a/test/test_item.rb b/test/test_item.rb index c83cbc3..97503c0 100644 --- a/test/test_item.rb +++ b/test/test_item.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby - require 'mpw/item' require 'test/unit' require 'yaml' @@ -23,10 +21,8 @@ class TestItem < Test::Unit::TestCase def test_01_add data = { group: @fixtures['add']['group'], - host: @fixtures['add']['host'], - protocol: @fixtures['add']['protocol'], user: @fixtures['add']['user'], - port: @fixtures['add']['port'], + url: @fixtures['add']['url'], comment: @fixtures['add']['comment'] } @@ -35,6 +31,7 @@ class TestItem < Test::Unit::TestCase assert(!item.nil?) assert(!item.empty?) + assert_equal(@fixtures['add']['url'], item.url) assert_equal(@fixtures['add']['group'], item.group) assert_equal(@fixtures['add']['host'], item.host) assert_equal(@fixtures['add']['protocol'], item.protocol) @@ -47,10 +44,8 @@ class TestItem < Test::Unit::TestCase data = { id: @fixtures['import']['id'], group: @fixtures['import']['group'], - host: @fixtures['import']['host'], - protocol: @fixtures['import']['protocol'], user: @fixtures['import']['user'], - port: @fixtures['import']['port'], + url: @fixtures['import']['url'], comment: @fixtures['import']['comment'], created: @fixtures['import']['created'] } @@ -61,6 +56,7 @@ class TestItem < Test::Unit::TestCase assert(!item.empty?) assert_equal(@fixtures['import']['id'], item.id) + assert_equal(@fixtures['import']['url'], item.url) assert_equal(@fixtures['import']['group'], item.group) assert_equal(@fixtures['import']['host'], item.host) assert_equal(@fixtures['import']['protocol'], item.protocol) @@ -73,10 +69,8 @@ class TestItem < Test::Unit::TestCase def test_03_update data = { group: @fixtures['add']['group'], - host: @fixtures['add']['host'], - protocol: @fixtures['add']['protocol'], user: @fixtures['add']['user'], - port: @fixtures['add']['port'], + url: @fixtures['add']['url'], comment: @fixtures['add']['comment'] } @@ -90,10 +84,8 @@ class TestItem < Test::Unit::TestCase data = { group: @fixtures['update']['group'], - host: @fixtures['update']['host'], - protocol: @fixtures['update']['protocol'], user: @fixtures['update']['user'], - port: @fixtures['update']['port'], + url: @fixtures['update']['url'], comment: @fixtures['update']['comment'] } @@ -102,6 +94,7 @@ class TestItem < Test::Unit::TestCase assert(!item.empty?) + assert_equal(@fixtures['update']['url'], item.url) assert_equal(@fixtures['update']['group'], item.group) assert_equal(@fixtures['update']['host'], item.host) assert_equal(@fixtures['update']['protocol'], item.protocol) @@ -116,10 +109,8 @@ class TestItem < Test::Unit::TestCase def test_05_update_one_element data = { group: @fixtures['add']['group'], - host: @fixtures['add']['host'], - protocol: @fixtures['add']['protocol'], user: @fixtures['add']['user'], - port: @fixtures['add']['port'], + url: @fixtures['add']['url'], comment: @fixtures['add']['comment'] } @@ -131,8 +122,9 @@ class TestItem < Test::Unit::TestCase last_edit = item.last_edit sleep(1) - assert(item.update(comment: @fixtures['update']['comment'])) + item.update(comment: @fixtures['update']['comment']) + assert_equal(@fixtures['add']['url'], item.url) assert_equal(@fixtures['add']['group'], item.group) assert_equal(@fixtures['add']['host'], item.host) assert_equal(@fixtures['add']['protocol'], item.protocol) @@ -146,10 +138,8 @@ class TestItem < Test::Unit::TestCase def test_05_delete data = { group: @fixtures['add']['group'], - host: @fixtures['add']['host'], - protocol: @fixtures['add']['protocol'], user: @fixtures['add']['user'], - port: @fixtures['add']['port'], + url: @fixtures['add']['url'], comment: @fixtures['add']['comment'] } @@ -163,6 +153,7 @@ class TestItem < Test::Unit::TestCase assert(item.empty?) assert_equal(nil, item.id) + assert_equal(nil, item.url) assert_equal(nil, item.group) assert_equal(nil, item.host) assert_equal(nil, item.protocol) diff --git a/test/test_mpw.rb b/test/test_mpw.rb index a783225..8fc544e 100644 --- a/test/test_mpw.rb +++ b/test/test_mpw.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby - require 'mpw/mpw' require 'mpw/item' require 'test/unit' @@ -33,10 +31,8 @@ class TestMPW < Test::Unit::TestCase def test_02_add_item data = { group: @fixtures['add']['group'], - host: @fixtures['add']['host'], - protocol: @fixtures['add']['protocol'], user: @fixtures['add']['user'], - port: @fixtures['add']['port'], + url: @fixtures['add']['url'], comment: @fixtures['add']['comment'] } @@ -93,10 +89,8 @@ class TestMPW < Test::Unit::TestCase @fixtures.each_value do |v| data = { group: v['group'], - host: v['host'], - protocol: v['protocol'], user: v['user'], - port: v['port'], + url: v['url'], comment: v['comment'] } diff --git a/test/test_translate.rb b/test/test_translate.rb index d4bb002..d7cbceb 100644 --- a/test/test_translate.rb +++ b/test/test_translate.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby - require 'yaml' require 'test/unit'