Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gzupanda
code-server
提交
a14ea39c
C
code-server
项目概览
gzupanda
/
code-server
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
code-server
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
a14ea39c
编写于
6月 02, 2021
作者:
J
Joe Previte
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: add handlePasswordValidation + tests
上级
7ff41175
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
150 addition
and
0 deletion
+150
-0
src/node/util.ts
src/node/util.ts
+60
-0
test/unit/node/util.test.ts
test/unit/node/util.test.ts
+90
-0
未找到文件。
src/node/util.ts
浏览文件 @
a14ea39c
...
...
@@ -189,6 +189,66 @@ export function getPasswordMethod(hashedPassword: string | undefined): PasswordM
return
"
SHA256
"
}
type
PasswordValidation
=
{
isPasswordValid
:
boolean
hashedPassword
:
string
}
type
HandlePasswordValidationArgs
=
{
/** The PasswordMethod */
passwordMethod
:
PasswordMethod
/** The password provided by the user */
passwordFromRequestBody
:
string
/** The password set in PASSWORD or config */
passwordFromArgs
:
string
|
undefined
/** The hashed-password set in HASHED_PASSWORD or config */
hashedPasswordFromArgs
:
string
|
undefined
}
/**
* Checks if a password is valid and also returns the hash
* using the PasswordMethod
*/
export
async
function
handlePasswordValidation
(
passwordValidationArgs
:
HandlePasswordValidationArgs
,
):
Promise
<
PasswordValidation
>
{
const
{
passwordMethod
,
passwordFromArgs
,
passwordFromRequestBody
,
hashedPasswordFromArgs
}
=
passwordValidationArgs
// TODO implement
const
passwordValidation
=
<
PasswordValidation
>
{
isPasswordValid
:
false
,
hashedPassword
:
""
,
}
switch
(
passwordMethod
)
{
case
"
PLAIN_TEXT
"
:
{
const
isValid
=
passwordFromArgs
?
safeCompare
(
passwordFromRequestBody
,
passwordFromArgs
)
:
false
passwordValidation
.
isPasswordValid
=
isValid
const
hashedPassword
=
await
hash
(
passwordFromRequestBody
)
passwordValidation
.
hashedPassword
=
hashedPassword
break
}
case
"
SHA256
"
:
{
const
isValid
=
isHashLegacyMatch
(
passwordFromRequestBody
,
hashedPasswordFromArgs
||
""
)
passwordValidation
.
isPasswordValid
=
isValid
passwordValidation
.
hashedPassword
=
hashedPasswordFromArgs
||
(
await
hashLegacy
(
passwordFromRequestBody
))
break
}
case
"
ARGON2
"
:
{
const
isValid
=
await
isHashMatch
(
passwordFromRequestBody
,
hashedPasswordFromArgs
||
""
)
passwordValidation
.
isPasswordValid
=
isValid
passwordValidation
.
hashedPassword
=
hashedPasswordFromArgs
||
""
break
}
default
:
break
}
return
passwordValidation
}
const
mimeTypes
:
{
[
key
:
string
]:
string
}
=
{
"
.aac
"
:
"
audio/x-aac
"
,
"
.avi
"
:
"
video/x-msvideo
"
,
...
...
test/unit/node/util.test.ts
浏览文件 @
a14ea39c
import
{
hash
,
isHashMatch
,
handlePasswordValidation
,
PasswordMethod
,
getPasswordMethod
,
hashLegacy
,
...
...
@@ -232,3 +233,92 @@ describe("getPasswordMethod", () => {
expect
(
passwordMethod
).
toEqual
(
expected
)
})
})
describe
.
only
(
"
handlePasswordValidation
"
,
()
=>
{
it
(
"
should return true with a hashedPassword for a PLAIN_TEXT password
"
,
async
()
=>
{
const
p
=
"
password
"
const
passwordValidation
=
await
handlePasswordValidation
({
passwordMethod
:
"
PLAIN_TEXT
"
,
passwordFromRequestBody
:
p
,
passwordFromArgs
:
p
,
hashedPasswordFromArgs
:
undefined
,
})
const
matchesHash
=
await
isHashMatch
(
p
,
passwordValidation
.
hashedPassword
)
expect
(
passwordValidation
.
isPasswordValid
).
toBe
(
true
)
expect
(
matchesHash
).
toBe
(
true
)
})
it
(
"
should return false when PLAIN_TEXT password doesn't match args
"
,
async
()
=>
{
const
p
=
"
password
"
const
passwordValidation
=
await
handlePasswordValidation
({
passwordMethod
:
"
PLAIN_TEXT
"
,
passwordFromRequestBody
:
"
password1
"
,
passwordFromArgs
:
p
,
hashedPasswordFromArgs
:
undefined
,
})
const
matchesHash
=
await
isHashMatch
(
p
,
passwordValidation
.
hashedPassword
)
expect
(
passwordValidation
.
isPasswordValid
).
toBe
(
false
)
expect
(
matchesHash
).
toBe
(
false
)
})
it
(
"
should return true with a hashedPassword for a SHA256 password
"
,
async
()
=>
{
const
p
=
"
helloworld
"
const
passwordValidation
=
await
handlePasswordValidation
({
passwordMethod
:
"
SHA256
"
,
passwordFromRequestBody
:
p
,
passwordFromArgs
:
undefined
,
hashedPasswordFromArgs
:
"
936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af
"
,
})
const
matchesHash
=
isHashLegacyMatch
(
p
,
passwordValidation
.
hashedPassword
)
expect
(
passwordValidation
.
isPasswordValid
).
toBe
(
true
)
expect
(
matchesHash
).
toBe
(
true
)
})
it
(
"
should return false when SHA256 password doesn't match hash
"
,
async
()
=>
{
const
p
=
"
helloworld1
"
const
passwordValidation
=
await
handlePasswordValidation
({
passwordMethod
:
"
SHA256
"
,
passwordFromRequestBody
:
p
,
passwordFromArgs
:
undefined
,
hashedPasswordFromArgs
:
"
936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af
"
,
})
const
matchesHash
=
isHashLegacyMatch
(
p
,
passwordValidation
.
hashedPassword
)
expect
(
passwordValidation
.
isPasswordValid
).
toBe
(
false
)
expect
(
matchesHash
).
toBe
(
false
)
})
it
(
"
should return true with a hashedPassword for a ARGON2 password
"
,
async
()
=>
{
const
p
=
"
password
"
const
passwordValidation
=
await
handlePasswordValidation
({
passwordMethod
:
"
ARGON2
"
,
passwordFromRequestBody
:
p
,
passwordFromArgs
:
undefined
,
hashedPasswordFromArgs
:
"
$argon2i$v=19$m=4096,t=3,p=1$0qR/o+0t00hsbJFQCKSfdQ$oFcM4rL6o+B7oxpuA4qlXubypbBPsf+8L531U7P9HYY
"
,
})
const
matchesHash
=
await
isHashMatch
(
p
,
passwordValidation
.
hashedPassword
)
expect
(
passwordValidation
.
isPasswordValid
).
toBe
(
true
)
expect
(
matchesHash
).
toBe
(
true
)
})
it
(
"
should return false when ARGON2 password doesn't match hash
"
,
async
()
=>
{
const
p
=
"
password1
"
const
passwordValidation
=
await
handlePasswordValidation
({
passwordMethod
:
"
ARGON2
"
,
passwordFromRequestBody
:
p
,
passwordFromArgs
:
undefined
,
hashedPasswordFromArgs
:
"
$argon2i$v=19$m=4096,t=3,p=1$0qR/o+0t00hsbJFQCKSfdQ$oFcM4rL6o+B7oxpuA4qlXubypbBPsf+8L531U7P9HYY
"
,
})
const
matchesHash
=
await
isHashMatch
(
p
,
passwordValidation
.
hashedPassword
)
expect
(
passwordValidation
.
isPasswordValid
).
toBe
(
false
)
expect
(
matchesHash
).
toBe
(
false
)
})
})
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录