diff --git a/changelog.d/17608.feature b/changelog.d/17608.feature new file mode 100644 index 0000000000000000000000000000000000000000..adf9ac55333f222e3a090f6507d8073a088e3114 --- /dev/null +++ b/changelog.d/17608.feature @@ -0,0 +1 @@ +Make `hash_password` accept password input from stdin. \ No newline at end of file diff --git a/debian/hash_password.1 b/debian/hash_password.1 index 39fa3ffcbfefb5542faf50620110d1b9fdc55385..af55e09c45d2bc181db1288ccce130ff753988f7 100644 --- a/debian/hash_password.1 +++ b/debian/hash_password.1 @@ -1,10 +1,13 @@ -.\" generated with Ronn-NG/v0.8.0 -.\" http://github.com/apjanke/ronn-ng/tree/0.8.0 -.TH "HASH_PASSWORD" "1" "July 2021" "" "" +.\" generated with Ronn-NG/v0.10.1 +.\" http://github.com/apjanke/ronn-ng/tree/0.10.1 +.TH "HASH_PASSWORD" "1" "August 2024" "" .SH "NAME" \fBhash_password\fR \- Calculate the hash of a new password, so that passwords can be reset .SH "SYNOPSIS" -\fBhash_password\fR [\fB\-p\fR|\fB\-\-password\fR [password]] [\fB\-c\fR|\fB\-\-config\fR \fIfile\fR] +.TS +allbox; +\fBhash_password\fR [\fB\-p\fR \fB\-\-password\fR [password]] [\fB\-c\fR \fB\-\-config\fR \fIfile\fR] +.TE .SH "DESCRIPTION" \fBhash_password\fR calculates the hash of a supplied password using bcrypt\. .P @@ -20,7 +23,7 @@ bcrypt_rounds: 17 password_config: pepper: "random hashing pepper" .SH "OPTIONS" .TP \fB\-p\fR, \fB\-\-password\fR -Read the password form the command line if [password] is supplied\. If not, prompt the user and read the password form the \fBSTDIN\fR\. It is not recommended to type the password on the command line directly\. Use the STDIN instead\. +Read the password form the command line if [password] is supplied, or from \fBSTDIN\fR\. If not, prompt the user and read the password from the tty prompt\. It is not recommended to type the password on the command line directly\. Use the STDIN instead\. .TP \fB\-c\fR, \fB\-\-config\fR Read the supplied YAML \fIfile\fR containing the options \fBbcrypt_rounds\fR and the \fBpassword_config\fR section containing the \fBpepper\fR value\. @@ -33,7 +36,17 @@ $2b$12$VJNqWQYfsWTEwcELfoSi4Oa8eA17movHqqi8\.X8fWFpum7SxZ9MFe .fi .IP "" 0 .P -Hash from the STDIN: +Hash from the stdin: +.IP "" 4 +.nf +$ cat password_file | hash_password +Password: +Confirm password: +$2b$12$AszlvfmJl2esnyhmn8m/kuR2tdXgROWtWxnX\.rcuAbM8ErLoUhybG +.fi +.IP "" 0 +.P +Hash from the prompt: .IP "" 4 .nf $ hash_password @@ -53,6 +66,6 @@ $2b$12$CwI\.wBNr\.w3kmiUlV3T5s\.GT2wH7uebDCovDrCOh18dFedlANK99O .fi .IP "" 0 .SH "COPYRIGHT" -This man page was written by Rahul De <\fI\%mailto:rahulde@swecha\.net\fR> for Debian GNU/Linux distribution\. +This man page was written by Rahul De «rahulde@swecha\.net» for Debian GNU/Linux distribution\. .SH "SEE ALSO" synctl(1), synapse_port_db(1), register_new_matrix_user(1), synapse_review_recent_signups(1) diff --git a/debian/hash_password.1.html b/debian/hash_password.1.html new file mode 100644 index 0000000000000000000000000000000000000000..7a62787780c16569f9049ab8d71e197dc9ae1d46 --- /dev/null +++ b/debian/hash_password.1.html @@ -0,0 +1,182 @@ +<!DOCTYPE html> +<html> +<head> + <meta http-equiv='content-type' content='text/html;charset=utf-8'> + <meta name='generator' content='Ronn-NG/v0.10.1 (http://github.com/apjanke/ronn-ng/tree/0.10.1)'> + <title>hash_password(1) - Calculate the hash of a new password, so that passwords can be reset</title> + <style type='text/css' media='all'> + /* style: man */ + body#manpage {margin:0} + .mp {max-width:100ex;padding:0 9ex 1ex 4ex} + .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0} + .mp h2 {margin:10px 0 0 0} + .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex} + .mp h3 {margin:0 0 0 4ex} + .mp dt {margin:0;clear:left} + .mp dt.flush {float:left;width:8ex} + .mp dd {margin:0 0 0 9ex} + .mp h1,.mp h2,.mp h3,.mp h4 {clear:left} + .mp pre {margin-bottom:20px} + .mp pre+h2,.mp pre+h3 {margin-top:22px} + .mp h2+pre,.mp h3+pre {margin-top:5px} + .mp img {display:block;margin:auto} + .mp h1.man-title {display:none} + .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143} + .mp h2 {font-size:16px;line-height:1.25} + .mp h1 {font-size:20px;line-height:2} + .mp {text-align:justify;background:#fff} + .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211} + .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201} + .mp u {text-decoration:underline} + .mp code,.mp strong,.mp b {font-weight:bold;color:#131211} + .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none} + .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff} + .mp b.man-ref {font-weight:normal;color:#434241} + .mp pre {padding:0 4ex} + .mp pre code {font-weight:normal;color:#434241} + .mp h2+pre,h3+pre {padding-left:0} + ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px} + ol.man-decor {width:100%} + ol.man-decor li.tl {text-align:left} + ol.man-decor li.tc {text-align:center;letter-spacing:4px} + ol.man-decor li.tr {text-align:right;float:right} + </style> +</head> +<!-- + The following styles are deprecated and will be removed at some point: + div#man, div#man ol.man, div#man ol.head, div#man ol.man. + + The .man-page, .man-decor, .man-head, .man-foot, .man-title, and + .man-navigation should be used instead. +--> +<body id='manpage'> + <div class='mp' id='man'> + + <div class='man-navigation' style='display:none'> + <a href="#NAME">NAME</a> + <a href="#SYNOPSIS">SYNOPSIS</a> + <a href="#DESCRIPTION">DESCRIPTION</a> + <a href="#FILES">FILES</a> + <a href="#OPTIONS">OPTIONS</a> + <a href="#EXAMPLES">EXAMPLES</a> + <a href="#COPYRIGHT">COPYRIGHT</a> + <a href="#SEE-ALSO">SEE ALSO</a> + </div> + + <ol class='man-decor man-head man head'> + <li class='tl'>hash_password(1)</li> + <li class='tc'></li> + <li class='tr'>hash_password(1)</li> + </ol> + + + +<h2 id="NAME">NAME</h2> +<p class="man-name"> + <code>hash_password</code> - <span class="man-whatis">Calculate the hash of a new password, so that passwords can be reset</span> +</p> +<h2 id="SYNOPSIS">SYNOPSIS</h2> + +<table> + <tbody> + <tr> + <td> +<code>hash_password</code> [<code>-p</code> +</td> + <td> +<code>--password</code> [password]] [<code>-c</code> +</td> + <td> +<code>--config</code> <var>file</var>]</td> + </tr> + </tbody> +</table> + +<h2 id="DESCRIPTION">DESCRIPTION</h2> + +<p><strong>hash_password</strong> calculates the hash of a supplied password using bcrypt.</p> + +<p><code>hash_password</code> takes a password as an parameter either on the command line +or the <code>STDIN</code> if not supplied.</p> + +<p>It accepts an YAML file which can be used to specify parameters like the +number of rounds for bcrypt and password_config section having the pepper +value used for the hashing. By default <code>bcrypt_rounds</code> is set to <strong>12</strong>.</p> + +<p>The hashed password is written on the <code>STDOUT</code>.</p> + +<h2 id="FILES">FILES</h2> + +<p>A sample YAML file accepted by <code>hash_password</code> is described below:</p> + +<p>bcrypt_rounds: 17 + password_config: + pepper: "random hashing pepper"</p> + +<h2 id="OPTIONS">OPTIONS</h2> + +<dl> +<dt> +<code>-p</code>, <code>--password</code> +</dt> +<dd>Read the password form the command line if [password] is supplied, or from <code>STDIN</code>. +If not, prompt the user and read the password from the tty prompt. +It is not recommended to type the password on the command line +directly. Use the STDIN instead.</dd> +<dt> +<code>-c</code>, <code>--config</code> +</dt> +<dd>Read the supplied YAML <var>file</var> containing the options <code>bcrypt_rounds</code> +and the <code>password_config</code> section containing the <code>pepper</code> value.</dd> +</dl> + +<h2 id="EXAMPLES">EXAMPLES</h2> + +<p>Hash from the command line:</p> + +<pre><code>$ hash_password -p "p@ssw0rd" +$2b$12$VJNqWQYfsWTEwcELfoSi4Oa8eA17movHqqi8.X8fWFpum7SxZ9MFe +</code></pre> + +<p>Hash from the stdin:</p> + +<pre><code>$ cat password_file | hash_password +Password: +Confirm password: +$2b$12$AszlvfmJl2esnyhmn8m/kuR2tdXgROWtWxnX.rcuAbM8ErLoUhybG +</code></pre> + +<p>Hash from the prompt:</p> + +<pre><code>$ hash_password +Password: +Confirm password: +$2b$12$AszlvfmJl2esnyhmn8m/kuR2tdXgROWtWxnX.rcuAbM8ErLoUhybG +</code></pre> + +<p>Using a config file:</p> + +<pre><code>$ hash_password -c config.yml +Password: +Confirm password: +$2b$12$CwI.wBNr.w3kmiUlV3T5s.GT2wH7uebDCovDrCOh18dFedlANK99O +</code></pre> + +<h2 id="COPYRIGHT">COPYRIGHT</h2> + +<p>This man page was written by Rahul De «rahulde@swecha.net» +for Debian GNU/Linux distribution.</p> + +<h2 id="SEE-ALSO">SEE ALSO</h2> + +<p><span class="man-ref">synctl<span class="s">(1)</span></span>, <span class="man-ref">synapse_port_db<span class="s">(1)</span></span>, <span class="man-ref">register_new_matrix_user<span class="s">(1)</span></span>, <span class="man-ref">synapse_review_recent_signups<span class="s">(1)</span></span></p> + + <ol class='man-decor man-foot man foot'> + <li class='tl'></li> + <li class='tc'>August 2024</li> + <li class='tr'>hash_password(1)</li> + </ol> + + </div> +</body> +</html> diff --git a/debian/hash_password.ronn b/debian/hash_password.ronn index 5d0df538020e4301e619cba4f759e4bffa1fd113..b68d4a210e2f9593b5d223f0d8e7de9b92af7148 100644 --- a/debian/hash_password.ronn +++ b/debian/hash_password.ronn @@ -29,8 +29,8 @@ A sample YAML file accepted by `hash_password` is described below: ## OPTIONS * `-p`, `--password`: - Read the password form the command line if [password] is supplied. - If not, prompt the user and read the password form the `STDIN`. + Read the password form the command line if [password] is supplied, or from `STDIN`. + If not, prompt the user and read the password from the tty prompt. It is not recommended to type the password on the command line directly. Use the STDIN instead. @@ -45,7 +45,14 @@ Hash from the command line: $ hash_password -p "p@ssw0rd" $2b$12$VJNqWQYfsWTEwcELfoSi4Oa8eA17movHqqi8.X8fWFpum7SxZ9MFe -Hash from the STDIN: +Hash from the stdin: + + $ cat password_file | hash_password + Password: + Confirm password: + $2b$12$AszlvfmJl2esnyhmn8m/kuR2tdXgROWtWxnX.rcuAbM8ErLoUhybG + +Hash from the prompt: $ hash_password Password: diff --git a/synapse/_scripts/hash_password.py b/synapse/_scripts/hash_password.py index 3bed367be29d849b7a5b8b148e65e41d18f6048b..2b7d3585cb9cdfe78ca83f070fdfa61550eefee0 100755 --- a/synapse/_scripts/hash_password.py +++ b/synapse/_scripts/hash_password.py @@ -56,7 +56,9 @@ def main() -> None: password_pepper = password_config.get("pepper", password_pepper) password = args.password - if not password: + if not password and not sys.stdin.isatty(): + password = sys.stdin.readline().strip() + elif not password: password = prompt_for_pass() # On Python 2, make sure we decode it to Unicode before we normalise it