v0.1 64c03e0

password.ts RawHistoryFolder

1import crypto from 'crypto';
2
3/**
4 * Securely hashes a password using PBKDF2 with a random salt.
5 * @param password The plain text password to hash
6 * @returns A promise that resolves to the hashed password in the format 'salt:hash'
7 */
8export async function hashPassword(password: string): Promise<string> {
9    return new Promise((resolve, reject) => {
10        const salt = crypto.randomBytes(16).toString('hex');
11        crypto.pbkdf2(password, salt, 100000, 64, 'sha512', (err, derivedKey) => {
12            if (err) return reject(err);
13            resolve(`${salt}:${derivedKey.toString('hex')}`);
14        });
15    });
16}
17
18/**
19 * Verify a password hash created by hashPassword()
20 * @param password The plain text password to verify
21 * @param hash The hashed password to verify against
22 * @returns A promise that resolves to true if the password matches, false otherwise
23 */
24export async function verifyPassword(password: string, hash: string): Promise<boolean> {
25    return new Promise((resolve, reject) => {
26        const [salt, key] = hash.split(':');
27        crypto.pbkdf2(password, salt, 100000, 64, 'sha512', (err, derivedKey) => {
28            if (err) return reject(err);
29            resolve(key === derivedKey.toString('hex'));
30        });
31    });
32} 

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 3

Tags 9

↑↓ moveenter openesc close