Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
281d5eaf
提交
281d5eaf
authored
1月 20, 2018
作者:
Dirk McCormick
提交者:
Steven Allen
1月 25, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update ipns validator
License: MIT Signed-off-by:
Dirk McCormick
<
dirkmdev@gmail.com
>
上级
8899e986
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
123 行增加
和
2 行删除
+123
-2
ipns_validate_test.go
namesys/ipns_validate_test.go
+93
-0
publisher.go
namesys/publisher.go
+30
-2
没有找到文件。
namesys/ipns_validate_test.go
0 → 100644
浏览文件 @
281d5eaf
package
namesys
import
(
"testing"
"time"
path
"github.com/ipfs/go-ipfs/path"
u
"gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
proto
"gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto"
ci
"gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
record
"gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record"
)
func
TestValidation
(
t
*
testing
.
T
)
{
// Create a record validator
validator
:=
make
(
record
.
Validator
)
validator
[
"ipns"
]
=
&
record
.
ValidChecker
{
ValidateIpnsRecord
,
true
}
// Generate a key for signing the records
r
:=
u
.
NewSeededRand
(
15
)
// generate deterministic keypair
priv
,
pubk
,
err
:=
ci
.
GenerateKeyPairWithReader
(
ci
.
RSA
,
1024
,
r
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Create entry with expiry in one hour
ts
:=
time
.
Now
()
entry
,
err
:=
CreateRoutingEntryData
(
priv
,
path
.
Path
(
"foo"
),
1
,
ts
.
Add
(
time
.
Hour
))
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Get IPNS record path
pubkb
,
err
:=
pubk
.
Bytes
()
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
pubkh
:=
u
.
Hash
(
pubkb
)
.
B58String
()
ipnsPath
:=
"/ipns/"
+
pubkh
val
,
err
:=
proto
.
Marshal
(
entry
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Create the record
r1
,
err
:=
record
.
MakePutRecord
(
priv
,
ipnsPath
,
val
,
true
)
// Validate the record
err
=
validator
.
VerifyRecord
(
r1
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Create IPNS record path with a different key
_
,
pubk2
,
err
:=
ci
.
GenerateKeyPairWithReader
(
ci
.
RSA
,
1024
,
r
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
pubkb2
,
err
:=
pubk2
.
Bytes
()
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
pubkh2
:=
u
.
Hash
(
pubkb2
)
.
B58String
()
ipnsWrongPath
:=
"/ipns/"
+
pubkh2
r2
,
err
:=
record
.
MakePutRecord
(
priv
,
ipnsWrongPath
,
val
,
true
)
// Record should fail validation because path doesn't match author
err
=
validator
.
VerifyRecord
(
r2
)
if
err
!=
ErrInvalidAuthor
{
t
.
Fatal
(
"ValidateIpnsRecord should have returned ErrInvalidAuthor"
)
}
// Create expired entry
expired
,
err
:=
CreateRoutingEntryData
(
priv
,
path
.
Path
(
"foo"
),
1
,
ts
.
Add
(
-
1
*
time
.
Hour
))
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
valExp
,
err
:=
proto
.
Marshal
(
expired
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
// Create record with the expired entry
r3
,
err
:=
record
.
MakePutRecord
(
priv
,
ipnsPath
,
valExp
,
true
)
// Record should fail validation because entry is expired
err
=
validator
.
VerifyRecord
(
r3
)
if
err
!=
ErrExpiredRecord
{
t
.
Fatal
(
"ValidateIpnsRecord should have returned ErrExpiredRecord"
)
}
}
namesys/publisher.go
浏览文件 @
281d5eaf
...
...
@@ -5,6 +5,7 @@ import (
"context"
"errors"
"fmt"
"strings"
"time"
pb
"github.com/ipfs/go-ipfs/namesys/pb"
...
...
@@ -31,6 +32,14 @@ var ErrExpiredRecord = errors.New("expired record")
// unknown validity type.
var
ErrUnrecognizedValidity
=
errors
.
New
(
"unrecognized validity type"
)
// ErrInvalidAuthor is returned when an IpnsRecord has an
// author that does not match the IPNS path
var
ErrInvalidAuthor
=
errors
.
New
(
"author does not match path"
)
// ErrInvalidPath should be returned when an ipns record path
// is not in a valid format
var
ErrInvalidPath
=
errors
.
New
(
"record path invalid"
)
const
PublishPutValTimeout
=
time
.
Minute
const
DefaultRecordTTL
=
24
*
time
.
Hour
...
...
@@ -295,12 +304,31 @@ func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) {
// ValidateIpnsRecord implements ValidatorFunc and verifies that the
// given 'val' is an IpnsEntry and that that entry is valid.
func
ValidateIpnsRecord
(
k
string
,
val
[]
byte
)
error
{
func
ValidateIpnsRecord
(
r
*
record
.
ValidationRecord
)
error
{
if
r
.
Namespace
!=
"ipns"
{
return
ErrInvalidPath
}
entry
:=
new
(
pb
.
IpnsEntry
)
err
:=
proto
.
Unmarshal
(
val
,
entry
)
err
:=
proto
.
Unmarshal
(
r
.
Value
,
entry
)
if
err
!=
nil
{
return
err
}
// Note: The DHT will actually check the signature so we don't
// need to do that here
// Author in key must match author in record
parts
:=
strings
.
Split
(
r
.
Key
,
"/"
)
pid
,
err
:=
peer
.
IDB58Decode
(
parts
[
0
])
if
err
!=
nil
{
return
ErrInvalidAuthor
}
if
string
(
pid
)
!=
string
(
r
.
Author
)
{
return
ErrInvalidAuthor
}
// Check that record has not expired
switch
entry
.
GetValidityType
()
{
case
pb
.
IpnsEntry_EOL
:
t
,
err
:=
u
.
ParseRFC3339
(
string
(
entry
.
GetValidity
()))
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论