:: pass.bat: passwordstore.org `pass' utility partially ported to Windows NT :: 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 3 of the License, or :: ^(at your option^) any later version. :: This program is distributed in the hope that it will be useful, :: but WITHOUT ANY WARRANTY; without even the implied warranty of :: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the :: GNU General Public License for more details. :: You should have received a copy of the GNU General Public License :: along with this program. If not, see ^. ::Copyright ^(c^) 2012-2018, Jason A. Donenfeld ^ ::Copyright ^(c^) 2019-2021, Miquel Lionel @echo off IF ["%~1"] EQU ["help"] ( echo.Copyright ^(c^) 2012-2018, Jason A. Donenfeld ^ echo.Copyright ^(c^) 2019-2021, Miquel Lionel echo. echo.Here's the available parameters for pass. Params between [] are MANDATORY: echo. echo. ls - without arguments, it list the entire password store as a tree. echo. show [passname] - decrypt the password with name [passname], output the result to the console echo. insert [passname] - insert a password with name [passname], prompt for input. Stop and save with a newline and by pressing Ctrl+Z on your keyboard. echo. rm [passname] - delete the password matching [passname]. Prompts for confirmation. echo. rmf [passname] - force the deletion of password matching [passname]. echo. rmrf [passname] - recursively and forcefully delete a directory in the password store. echo. clip [passname] [linenumber] - copy into the clipboard the text at line [linenumber] for password matching [passname]. echo. echo. echo.ENVIRONNEMENT VARIABLES: echo. PASSWORD_STORE_KEY The key^(s^) ID in 0xlong form. Can alternatively be in a .gpg-id file in the password store directory: by default, pass.bat will look in it. echo. PASSWORD_STORE_DIR The directory which contains the password, with .gpg %GPG_OPTS% extension. echo. PASSWORD_STORE_CLIP_TIME The time remaining for which a password copied to the clipboard. echo. PASSWORD_STORE_GPG_OPTS Additional options to be passed to all invocations of GPG. echo. ) where gpg.exe >nul 2>nul IF NOT %ERRORLEVEL% EQU 0 ( echo GPG isn't installed. Exiting... exit /B 1 ) for /F "tokens=1,* delims=:" %%a in ('chcp') do set ORIGCP=%%b set tmpfile="%TMP%\pass-%RANDOM%%RANDOM%.txt" set GPG_OPTS="%PASSWORD_STORE_GPG_OPTS% --quiet --yes --compress-algo=none --no-encrypt-to --batch --use-agent" IF NOT DEFINED PASSWORD_STORE_CLIP_TIME ( set PASSWORD_STORE_CLIP_TIME=45 ) IF NOT DEFINED PASSWORD_STORE_KEY ( FOR /F "delims=" %%k in (%PASSWORD_STORE_DIR%\.gpg-id) DO set "PASSWORD_STORE_KEY=%%k" ) IF NOT DEFINED PASSWORD_STORE_DIR ( echo.PASSWORD_STORE_DIR system variable not defined, defaulting to "%USERPROFILE%\.password-store\" echo.You can change this sysvar anytime in SystemPropertiesAdvanced.exe or via setx. See setx/? for help. set PASSWORD_STORE_DIR="%USERPROFILE%\.password-store" ::setx PASSWORD_STORE_DIR "%USERPROFILE%\.password-store" ) IF [%~1] EQU [] ( pass ls goto :eof ) IF ["%1"] EQU ["init"] ( shift if [%~1] EQU [] ( md %PASSWORD_STORE_DIR%\.extensions echo.%PASSWORD_STORE_KEY%>%PASSWORD_STORE_DIR%\.gpg-id ) ELSE ( md "%PASSWORD_STORE_DIR%\%~1\.extensions" echo.%PASSWORD_STORE_KEY%>"%PASSWORD_STORE_DIR%\%~1\.gpg-id" ) goto :eof ) IF ["%1"] EQU ["ls"] ( tree /F "%PASSWORD_STORE_DIR%" goto :eof ) IF ["%1"] EQU ["show"] ( :: remove 2>nul for debug info chcp 65001 >nul gpg %GPG_OPTS% --default-key %PASSWORD_STORE_KEY% -d "%PASSWORD_STORE_DIR%\%~2.gpg" chcp %ORIGCP% >nul goto :eof ) IF ["%1"] EQU ["insert"] ( shift gpg %GPG_OPTS% -r %PASSWORD_STORE_KEY% -e -a -o "%PASSWORD_STORE_DIR%\%~2.gpg" goto :eof ) IF ["%1"] EQU ["md"] ( shift md "%PASSWORD_STORE_DIR%\%~2.gpg" goto :eof ) IF ["%1"] EQU ["rm"] ( shift IF NOT ["%~2"] EQU [] ( del /P "%PASSWORD_STORE_DIR%\%~2.gpg" ) goto :eof ) IF ["%1"] EQU ["rmf"] ( shift IF NOT ["%~2"] EQU [] ( del /F "%PASSWORD_STORE_DIR%\%~2.gpg" ) goto :eof ) IF ["%1"] EQU ["rmrf"] ( shift IF NOT ["%~2"] EQU [] ( rmdir /S /Q "%PASSWORD_STORE_DIR%\%~2.gpg" ) goto :eof ) IF ["%1"] EQU ["mv"] ( shift IF NOT ["%~2"] EQU [] ( move "%PASSWORD_STORE_DIR%\%~2.gpg" "%PASSWORD_STORE_DIR%\%~3.gpg" >nul echo."%PASSWORD_STORE_DIR%\%~2.gpg" -^> "%PASSWORD_STORE_DIR%\%~3.gpg" ) goto :eof ) IF ["%1"] EQU ["clip"] ( shift set LINENUMBER=%~3 if defined LINENUMBER ( for /F "tokens=1,2* delims=:" %%a in ('chcp 65001 ^>nul ^&^& pass show "%~2" ^| findstr/n ^^^^ ^| findstr /i /b "%~3:" ^&^& chcp %ORIGCP% ^>nul') do ( echo.%%b|clip start /MIN /B "" "cmd /c ping ::1 -n %PASSWORD_STORE_CLIP_TIME% >nul && cmd /c echo.|C:\Windows\System32\clip.exe" ) ) else ( for /F "tokens=1,2* delims=:" %%a in ('chcp 65001 ^>nul ^&^& pass show "%~2" ^| findstr/n ^^^^ ^| findstr /i /b "1:" ^&^& chcp %ORIGCP% ^>nul') do ( echo.%%b|clip start /MIN /B "" "cmd /c ping ::1 -n %PASSWORD_STORE_CLIP_TIME% >nul && cmd /c echo.|C:\Windows\System32\clip.exe" ) ) goto :eof ) IF ["%1"] EQU ["edit"] ( shift gpg %GPG_OPTS% -o %tmpfile% -d "%PASSWORD_STORE_DIR%\%~2.gpg" start /W "" notepad %tmpfile% gpg %GPG_OPTS% -r %PASSWORD_STORE_KEY% -e -a -o "%PASSWORD_STORE_DIR%\%~2.gpg" %tmpfile% del /Q %tmpfile% goto :eof ) IF EXIST "%PASSWORD_STORE_DIR%\%~1.gpg" ( pass show "%~1" goto :eof ) goto :eof