diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba077a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..473edf4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + 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. + + Preamble + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 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". + +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. + + 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. + +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. + + 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 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 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) 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.) + +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. + +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. + +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. + + 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: + + 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, + + 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, + + 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.) + +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. + +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. + + 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. + + 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. + + 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. + + 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. + + zx2c4 pass manager addon for firefox + Copyright (C) 2013 Johan Venant + + 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2599473 --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +passff-host +=========== + +[![Join the chat at https://gitter.im/jvenant/passff](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jvenant/passff?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +Host app for the WebExtension **[PassFF](https://addons.mozilla.org/firefox/addon/passff)** + +### Overview +This piece of software wraps around the **[zx2c4 pass](http://www.zx2c4.com/projects/password-store/)** shell command. It has to be installed for the PassFF browser extension to work properly. + +### Installation +Download the `install_host_app.sh` script from [our releases page](https://github.com/passff/passff-host/releases) and execute it. You can do this in one line like so: + +``` +$ curl -sSL https://github.com/passff/passff-host/releases/download/1.0/install_host_app.sh | bash -s -- [firefox|chrome|opera|chromium|vivaldi] +``` + +This script will download the host application (a small python script) and the add-on's manifest file (a JSON config file) and put them in the right place. +If you're concerned about executing a script that downloads files from the web, you can download the files yourself and run the script with the `--local` option instead or link the files yourself. Details below. + +#### Windows +Download the `install_host_app.bat` script from [our releases page](https://github.com/passff/passff-host/releases) and execute it from within a shell with a correct PATH. +*The rule of thumb is: if you can execute pass and python from your shell, then your host application will be installed correctly.* + +``` +> install_host_app.bat [firefox|chrome|opera|chromium|vivaldi] +``` + +Note: Older Windows versions might require powershell to be installed manually as the install script uses powershell internally. Windows 10 users should be fine out of the box. + +#### Latest from GitHub +This is not recommended! Only for developers and for testing purposes! + +Clone the repository. Then, from the project's `src/` directory, run `make` and execute the installation script in `bin/testing` for your desired browser (`firefox`, `chrome`, `opera`, `chromium`, or `vivaldi`): + +``` +$ cd ./src +$ make +$ cd ../bin/testing +$ ./install_host_app.sh --local [firefox|chrome|opera|chromium|vivaldi] +``` + +This will copy the host application and manifest files to the right place for your browser. The `--local` option makes the script use the files on disk rather than downloading them from GitHub. + +If this doesn't work, you can link the files yourself. First, change the `path` value in the `passff.json` file to be the absolute path to the project's `bin/testing/passff.py` file. Then symlink (or copy) the file `bin/testing/passff.json` to the appropriate location for your browser and OS: + +- Firefox + - Linux + - Per-user: `~/.mozilla/native-messaging-hosts/passff.json` + - System-wide: `/usr/{lib,lib64,share}/mozilla/native-messaging-hosts/passff.json` + - OS X + - `/Library/Application Support/Mozilla/NativeMessagingHosts/passff.json` + - Windows + - Per-user: `Path contained in registry key HKEY_CURRENT_USER\Software\Mozilla\NativeMessagingHosts\passff` + - System-wide: `Path contained in registry key HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\NativeMessagingHosts\passff` +- Chrome + - Linux + - Per-user: `~/.config/google-chrome/NativeMessagingHosts/passff.json` + - System-wide: `/etc/opt/chrome/native-messaging-hosts/passff.json` + - OS X + - Per-user: `~/Library/Application Support/Google/Chrome/NativeMessagingHosts/passff.json` + - System-wide: `/Library/Google/Chrome/NativeMessagingHosts/passff.json` + - Windows + - Per-user: `HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\passff` + - System-wide: `HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\passff` +- Chromium + - Linux + - Per-user: `~/.config/chromium/NativeMessagingHosts/passff.json` + - System-wide: `/etc/chromium/native-messaging-hosts/passff.json` + - OS X + - Per-user: `~/Library/Application Support/Chromium/NativeMessagingHosts/passff.json` + - System-wide: `/Library/Application Support/Chromium/NativeMessagingHosts/passff.json` +- Opera + - Same as Chrome +- Vivaldi + - Linux + - Per-user: `~/.config/vivaldi/NativeMessagingHosts/passff.json` + - System-wide: `/etc/vivaldi/native-messaging-hosts/passff.json` + - OS X + - Per-user: `~/Library/Application Support/Vivaldi/NativeMessagingHosts/passff.json` + - System-wide: `/Library/Application Support/Vivaldi/NativeMessagingHosts/passff.json` + +### Preferences +By modifying the `preferences section` in `passff.py` you will be able to set + - the path to the `pass` script, + - additional command line arguments that are passed to `pass`, + - the shell `stdout` charset, + - additional environment variables. diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..0752a3a --- /dev/null +++ b/src/Makefile @@ -0,0 +1,34 @@ + +VERSION := testing + +SRC_DIR := . +TARGET_DIR := ../bin/$(VERSION) + +INSTALL_WIN_FILE := install_host_app.bat +INSTALL_WIN_SRC := $(SRC_DIR)/$(INSTALL_WIN_FILE) +INSTALL_WIN_TARGET := $(TARGET_DIR)/$(INSTALL_WIN_FILE) + +INSTALL_UNIX_FILE := install_host_app.sh +INSTALL_UNIX_SRC := $(SRC_DIR)/$(INSTALL_UNIX_FILE) +INSTALL_UNIX_TARGET := $(TARGET_DIR)/$(INSTALL_UNIX_FILE) + +HOST_APP_FILES := passff.py passff.json +HOST_APP_SRC := $(addprefix $(SRC_DIR)/,$(HOST_APP_FILES)) +HOST_APP_TARGET := $(addprefix $(TARGET_DIR)/,$(HOST_APP_FILES)) + +HOST_TARGETS := $(INSTALL_WIN_TARGET) $(INSTALL_UNIX_TARGET) $(HOST_APP_TARGET) + +all: $(HOST_TARGETS) + +%/.d: + mkdir -p $(@D) + @touch $@ + +$(HOST_TARGETS): $(TARGET_DIR)/%: $(SRC_DIR)/% $(TARGET_DIR)/.d + cp $(SRC_DIR)/$* $@ + sed -i "s/_VERSIONHOLDER_/$(VERSION)/g" $@ + +clean: + rm -rf $(TARGET_DIR) + +.PRECIOUS: %/.d diff --git a/src/install_host_app.bat b/src/install_host_app.bat new file mode 100644 index 0000000..d28d43d --- /dev/null +++ b/src/install_host_app.bat @@ -0,0 +1,109 @@ +@ECHO OFF +SETLOCAL + +SET "APP_NAME=passff" +SET "VERSION=_VERSIONHOLDER_" +SET "HOST_URL=https://github.com/passff/passff-host/releases/download/%VERSION%/passff.py" +SET "MANIFEST_URL=https://github.com/passff/passff-host/releases/download/%VERSION%/passff.json" + +SET "TARGET_DIR=%APPDATA%\%APP_NAME%" +SET "HOST_MANIFEST=%APP_NAME%.json" +SET "HOST_SCRIPT=%APP_NAME%.py" +SET "HOST_BATCH=%APP_NAME%.bat" + +SET "HOST_MANIFEST_FULL=%TARGET_DIR%\%HOST_MANIFEST%" +SET "HOST_SCRIPT_FULL=%TARGET_DIR%\%HOST_SCRIPT%" +SET "HOST_BATCH_FULL=%TARGET_DIR%\%HOST_BATCH%" + +SET "USE_LOCAL_FILES=" +SET "TARGET_REG=" + +REM check prerequisites: is python installed & in path? +python --version >NUL 2> NUL || ( + ECHO "python not found in PATH. Please execute this command in a shell where python is in PATH" + EXIT /B +) + +:loop +IF NOT "%1"=="" ( + IF "%1"=="--local" ( + SET "USE_LOCAL_FILES=true" + SHIFT + ) ELSE IF "%1"=="--help" ( + GOTO :help + ) ELSE IF "%1"=="firefox" ( + SET "TARGET_REG=HKCU\SOFTWARE\Mozilla\NativeMessagingHosts\%APP_NAME%" + SHIFT + ) ELSE IF "%1"=="chrome" ( + SET "TARGET_REG=HKCU\Software\Google\Chrome\NativeMessagingHosts\%APP_NAME%" + SHIFT + ) ELSE IF "%1"=="chromium" ( + ECHO Chromium registry key location for Native Messaging Hosts is undocumented. Assuming key for Chrome. Please provide feedback if this worked: https://github.com/passff/passff/issues/202 + SET "TARGET_REG=HKCU\Software\Google\Chrome\NativeMessagingHosts\%APP_NAME%" + SHIFT + ) ELSE IF "%1"=="opera" ( + ECHO Opera registry key location for Native Messaging Hosts is undocumented. Assuming key for Chrome. Please provide feedback if this worked: https://github.com/passff/passff/issues/202 + SET "TARGET_REG=HKCU\Software\Google\Chrome\NativeMessagingHosts\%APP_NAME%" + SHIFT + ) ELSE IF "%1"=="vivaldi" ( + ECHO Vivaldi registry key location for Native Messaging Hosts is undocumented. Assuming key for Chrome. Please provide feedback if this worked: https://github.com/passff/passff/issues/202 + SET "TARGET_REG=HKCU\Software\Google\Chrome\NativeMessagingHosts\%APP_NAME%" + SHIFT + ) ELSE ( + SHIFT + ) + GOTO :loop +) + +IF "%TARGET_REG%"=="" ( + GOTO :help +) + +IF EXIST "%TARGET_DIR%" ( + dir /AD "%TARGET_DIR%" > nul || ( + ECHO "%TARGET_DIR%" is not a directory + EXIT /B + ) +) ELSE ( + MKDIR "%TARGET_DIR%" 2> nul +) + +IF "%USE_LOCAL_FILES%"=="true" ( + IF NOT EXIST "%~dp0%HOST_MANIFEST%" ( + ECHO local file "%~dp0%HOST_MANIFEST%" not found + EXIT /B + ) + IF NOT EXIST "%~dp0%HOST_SCRIPT%" ( + ECHO local file "%~dp0%HOST_SCRIPT%" not found + EXIT /B + ) + COPY /Y "%~dp0%HOST_MANIFEST%" "%HOST_MANIFEST_FULL%" + COPY /Y "%~dp0%HOST_SCRIPT%" "%HOST_SCRIPT_FULL%" +) ELSE ( + powershell -Command "(New-Object Net.WebClient).DownloadFile('%HOST_URL%', '%HOST_SCRIPT_FULL%')" + powershell -Command "(New-Object Net.WebClient).DownloadFile('%MANIFEST_URL%', '%HOST_MANIFEST_FULL%')" +) + +powershell -Command "(Get-Content '%HOST_MANIFEST_FULL%') -replace 'PLACEHOLDER', '%HOST_BATCH_FULL:\=/%' | Set-Content '%HOST_MANIFEST_FULL%'" + +( + ECHO @ECHO OFF + ECHO SET "PATH=%PATH%" + ECHO SET "GNUPGHOME=%GNUPGHOME%" + ECHO python "%HOST_SCRIPT_FULL%" %%* +)>"%HOST_BATCH_FULL%" + +REG ADD "%TARGET_REG%" /ve /d "%HOST_MANIFEST_FULL%" /f || ( + ECHO Adding key to registry failed - maybe you need Administrator rights for this. Please run + ECHO REG ADD "%TARGET_REG%" /ve /d "%HOST_MANIFEST_FULL%" /f + ECHO manually in an administrative shell. +) +EXIT /B + +:help +ECHO Usage: %0 [OPTION] [chrome^|chromium^|firefox^|opera^|vivaldi] +ECHO +ECHO Options: +ECHO --local Install files from disk instead of downloading them +ECHO --help Show this message" +EXIT /B diff --git a/src/install_host_app.sh b/src/install_host_app.sh new file mode 100755 index 0000000..79f468c --- /dev/null +++ b/src/install_host_app.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash + +# This script is derived from `install.sh` in Danny van Kooten's "browserpass": +# https://github.com/dannyvankooten/browserpass + +set -e + +APP_NAME="passff" +VERSION="_VERSIONHOLDER_" +HOST_URL="https://github.com/passff/passff-host/releases/download/$VERSION/passff.py" +MANIFEST_URL="https://github.com/passff/passff-host/releases/download/$VERSION/passff.json" + +# Find target dirs for various browsers & OS'es +# https://developer.chrome.com/extensions/nativeMessaging#native-messaging-host-location +# https://wiki.mozilla.org/WebExtensions/Native_Messaging +if [ $(uname -s) == 'Darwin' ]; then + if [ "$(whoami)" == "root" ]; then + TARGET_DIR_CHROME="/Library/Google/Chrome/NativeMessagingHosts" + TARGET_DIR_CHROMIUM="/Library/Application Support/Chromium/NativeMessagingHosts" + TARGET_DIR_FIREFOX="/Library/Application Support/Mozilla/NativeMessagingHosts" + TARGET_DIR_VIVALDI="/Library/Application Support/Vivaldi/NativeMessagingHosts" + else + TARGET_DIR_CHROME="$HOME/Library/Application Support/Google/Chrome/NativeMessagingHosts" + TARGET_DIR_CHROMIUM="$HOME/Library/Application Support/Chromium/NativeMessagingHosts" + TARGET_DIR_FIREFOX="$HOME/Library/Application Support/Mozilla/NativeMessagingHosts" + TARGET_DIR_VIVALDI="$HOME/Library/Application Support/Vivaldi/NativeMessagingHosts" + fi +else + if [ "$(whoami)" == "root" ]; then + TARGET_DIR_CHROME="/etc/opt/chrome/native-messaging-hosts" + TARGET_DIR_CHROMIUM="/etc/chromium/native-messaging-hosts" + TARGET_DIR_FIREFOX="/usr/lib/mozilla/native-messaging-hosts" + TARGET_DIR_VIVALDI="/etc/vivaldi/native-messaging-hosts" + else + TARGET_DIR_CHROME="$HOME/.config/google-chrome/NativeMessagingHosts" + TARGET_DIR_CHROMIUM="$HOME/.config/chromium/NativeMessagingHosts" + TARGET_DIR_FIREFOX="$HOME/.mozilla/native-messaging-hosts" + TARGET_DIR_VIVALDI="$HOME/.config/vivaldi/NativeMessagingHosts" + fi +fi + +function usage { + echo "Usage: $0 [OPTION] [chrome|chromium|firefox|opera|vivaldi] + + Options: + -l, --local Install files from disk instead of downloading them + -h, --help Show this message" +} + +while [[ $# -gt 0 ]]; do + case $1 in + chrome) + BROWSER_NAME="Chrome" + TARGET_DIR="$TARGET_DIR_CHROME" + ;; + chromium) + BROWSER_NAME="Chromium" + TARGET_DIR="$TARGET_DIR_CHROMIUM" + ;; + firefox) + BROWSER_NAME="Firefox" + TARGET_DIR="$TARGET_DIR_FIREFOX" + ;; + opera) + BROWSER_NAME="Opera" + TARGET_DIR="$TARGET_DIR_VIVALDI" + ;; + vivaldi) + BROWSER_NAME="Vivaldi" + TARGET_DIR="$TARGET_DIR_VIVALDI" + ;; + -l|--local) + USE_LOCAL_FILES=true + ;; + -h|--help) + usage + exit 0 + ;; + *) + usage + exit 1 + ;; + esac + shift +done + +PYTHON3_PATH="$(which python3)" +if [ -x "$PYTHON3_PATH" ]; then + echo "Python 3 executable located at $PYTHON3_PATH" +else + echo "Python 3 executable not found, but Python 3 is required for PassFF to work!" + exit 1 +fi + +if [ -z "$TARGET_DIR" ]; then + usage + exit 1 +fi + +HOST_FILE_PATH="$TARGET_DIR/$APP_NAME.py" +MANIFEST_FILE_PATH="$TARGET_DIR/$APP_NAME.json" +ESCAPED_HOST_FILE_PATH="${HOST_FILE_PATH////\\/}" + +echo "Installing $BROWSER_NAME host config" + +# Create config dir if not existing +mkdir -p "$TARGET_DIR" + +if [ "$USE_LOCAL_FILES" = true ]; then + DIR="$( cd "$( dirname "$0" )" && pwd )" + cp "$DIR/passff.py" "$HOST_FILE_PATH" + cp "$DIR/passff.json" "$MANIFEST_FILE_PATH" +else + # Download native host script and manifest + curl -sSL "$HOST_URL" > "$HOST_FILE_PATH" + curl -sSL "$MANIFEST_URL" > "$MANIFEST_FILE_PATH" +fi + +# Replace path to host +sed -i -e "s/PLACEHOLDER/$ESCAPED_HOST_FILE_PATH/" "$MANIFEST_FILE_PATH" + +# Replace path to python3 executable +sed -i "1c#\!${PYTHON3_PATH}" "$HOST_FILE_PATH" + +# Set permissions for the manifest so that all users can read it. +chmod a+x "$HOST_FILE_PATH" +chmod o+r "$MANIFEST_FILE_PATH" + +echo "Native messaging host for $BROWSER_NAME has been installed to $TARGET_DIR." diff --git a/src/passff.json b/src/passff.json new file mode 100644 index 0000000..e954a43 --- /dev/null +++ b/src/passff.json @@ -0,0 +1,7 @@ +{ + "name": "passff", + "description": "Host for communicating with zx2c4 pass", + "path": "PLACEHOLDER", + "type": "stdio", + "allowed_extensions": [ "passff@invicem.pro" ] +} diff --git a/src/passff.py b/src/passff.py new file mode 100755 index 0000000..17ea50b --- /dev/null +++ b/src/passff.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 + +""" + Host application of the browser extension PassFF + that wraps around the zx2c4 pass script. +""" + +import os, sys, json, struct, subprocess + +VERSION = "_VERSIONHOLDER_" + +################################################################################ +######################## Begin preferences section ############################# +################################################################################ +# Default command for MacOS: +#command = "/usr/local/bin/pass" +command = "/usr/bin/pass" +commandArgs = [] +commandEnv = { + "TREE_CHARSET": "ISO-8859-1", + # Default PATH for MacOS: + #"PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin", +} +charset = "UTF-8" +################################################################################ +######################### End preferences section ############################## +################################################################################ + +def getMessage(): + """ Read a message from stdin and decode it. """ + rawLength = sys.stdin.buffer.read(4) + if len(rawLength) == 0: + sys.exit(0) + messageLength = struct.unpack('@I', rawLength)[0] + message = sys.stdin.buffer.read(messageLength).decode("utf-8") + return json.loads(message) + +def encodeMessage(messageContent): + """ Encode a message for transmission, given its content. """ + encodedContent = json.dumps(messageContent) + encodedLength = struct.pack('@I', len(encodedContent)) + return {'length': encodedLength, 'content': encodedContent} + +def sendMessage(encodedMessage): + """ Send an encoded message to stdout. """ + sys.stdout.buffer.write(encodedMessage['length']) + sys.stdout.write(encodedMessage['content']) + sys.stdout.flush() + +if __name__ == "__main__": + # Read message from standard input + receivedMessage = getMessage() + args = [] + stdin = None + + if len(receivedMessage) == 0: + pass + elif receivedMessage[0] == "insert": + args = ["insert", "-m", receivedMessage[1]] + stdin = receivedMessage[2] + elif receivedMessage[0] == "generate": + args = ["generate", receivedMessage[1], receivedMessage[2]] + if "-n" in receivedMessage: + args.append("-n") + else: + key = receivedMessage[0] + key = "/" + key if key[0] != "/" else key + args.append(key) + + # Set up (modified) command environment + env = dict(os.environ) + if "HOME" not in env: + env["HOME"] = os.path.expanduser('~') + for key, val in commandEnv.items(): + env[key] = val + + # Set up subprocess params + cmd = [command] + args + commandArgs + proc_params = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + 'env': env + } + if 'stdin' is not None: + proc_params['stdin'] = subprocess.PIPE + + # Run and communicate with pass script + proc = subprocess.Popen(cmd, **proc_params) + if stdin is not None: + proc_in = bytes(stdin, charset) + proc_out, proc_err = proc.communicate(input=proc_in) + else: + proc_out, proc_err = proc.communicate() + + # Send response + sendMessage(encodeMessage({ + "exitCode": proc.returncode, + "stdout": proc_out.decode(charset), + "stderr": proc_err.decode(charset), + "version": VERSION + }))