新注册的用户请输入邮箱并保存,随后登录邮箱激活账号。后续可直接使用邮箱登录!

...
 
Commits (146)
.idea
bin
logs
\ No newline at end of file
logs
commonservice
did-mgr-common-service
*.zip
cover.out
FROM hub-dev.cnbn.org.cn/tools/ubuntu-core:20.04
WORKDIR /did
COPY ./commonservice ./did-mgr-common-service
COPY ./bin/commonservice ./did-mgr-common-service
COPY ./etc ./etc
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
......
DATETIME=$(shell date +"%Y-%m-%dT%H:%M:%S%z")
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
COMMIT := $(shell git rev-parse --short HEAD)
VERSION = v0.1
VERSION = v1.1.0
api-build:
@goctl api go -api template/did-mgr-common-service.api -dir .
build:
go build -ldflags "-X did-mgr-common-service/internal/logic.BuildTime=$(DATETIME) -X did-mgr-common-service/internal/logic.GitCommit=$(COMMIT) -X did-mgr-common-service/internal/logic.GitBranch=$(GIT_BRANCH)" did-mgr-common-service.go
go build -ldflags "-X did-mgr-common-service/internal/logic.BuildTime=$(DATETIME) -X did-mgr-common-service/internal/logic.GitCommit=$(COMMIT) -X did-mgr-common-service/internal/logic.GitBranch=$(GIT_BRANCH)" -o bin/commonservice
ut:
go test -coverprofile cover.out ./...
go tool cover -func=cover.out | tail -1 | grep -P "\\d+\\.\\d+(?=\\%)" -o
......@@ -28,5 +28,5 @@ docker-push:
k8s-configmap:
@sed -i '' '/#/d' ./etc/did-mgr-common-service-api.yaml
configmap=$$(kubectl create configmap did-mgr-common-configmap --from-file=./etc/did-mgr-common-service-api.yaml --dry-run=client -o yaml) && rest_of_deployment=$$(awk '/^---$$/{flag++} flag>=1' ./k8s/dev-deployment.yaml) && echo "$$configmap\n$$rest_of_deployment" > ./k8s/dev-deployment.yaml
configmap=$$(kubectl create configmap did-mgr-common-configmap --from-file=./etc/did-mgr-common-service-api.yaml --dry-run=client -o yaml) && rest_of_deployment=$$(awk '/^---$$/{flag++} flag>=1' ./k8s/test-deployment.yaml) && echo "$$configmap\n$$rest_of_deployment" > ./k8s/test-deployment.yaml
configmap=$$(kubectl create configmap did-mgr-common-configmap -n did --from-file=./etc/did-mgr-common-service-api.yaml --dry-run=client -o yaml) && rest_of_deployment=$$(awk '/^---$$/{flag++} flag>=1' ./k8s/dev-deployment.yaml) && echo "$$configmap\n$$rest_of_deployment" > ./k8s/dev-deployment.yaml
configmap=$$(kubectl create configmap did-mgr-common-configmap -n did --from-file=./etc/did-mgr-common-service-api.yaml --dry-run=client -o yaml) && rest_of_deployment=$$(awk '/^---$$/{flag++} flag>=1' ./k8s/test-deployment.yaml) && echo "$$configmap\n$$rest_of_deployment" > ./k8s/test-deployment.yaml
package main
import (
"chainweaver.org.cn/chainweaver/did/did-kms/kms"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/handler"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"flag"
"fmt"
"github.com/zeromicro/go-zero/zrpc"
"google.golang.org/grpc"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/rest"
)
var configFile = flag.String("f", "etc/commonservice.yaml", "the config file")
var configFile = flag.String("f", "etc/did-mgr-common-service-api.yaml", "the config file")
func main() {
flag.Parse()
......@@ -24,7 +28,25 @@ func main() {
server := rest.MustNewServer(c.RestConf)
defer server.Stop()
ctx := svc.NewServiceContext(c, db.GetTables())
gormDB, err := utils.NewDb(c)
if err != nil {
panic(err)
}
err = gormDB.AutoMigrate(db.GetTables()...)
if err != nil {
panic(err)
}
// set kms grpc client RecvMsgSize and SendMsgSize to 512M
dialOption := grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(5368709120),
grpc.MaxCallSendMsgSize(5368709120))
kmsClient := kms.NewKms(zrpc.MustNewClient(zrpc.RpcClientConf{
Target: c.Service.Kms,
Timeout: 60000,
}, zrpc.WithDialOption(dialOption)))
ctx := svc.NewServiceContext(c, kmsClient, gormDB)
config.DB = gormDB
handler.RegisterHandlers(server, ctx)
// 注册转发路由
handler.RegisterExtraHandlers(server, ctx)
......
services:
did-mgr-common-service:
image: hub-dev.cnbn.org.cn:17754/opennet/did-mgr-common-service:latest
did-common-mgr-service:
image: hub-dev.cnbn.org.cn/opennet/did-mgr-common-service:latest
ports:
- "17782:17782"
volumes:
......
......@@ -5,7 +5,7 @@
package errorcode
import "chainmaker.org/chainmaker/opennet/servicecommon/res"
import "chainweaver.org.cn/chainweaver/servicecommon/res"
const (
RedisErrorQueryCode = 101000 + iota //调用SDK工具相关错误
......@@ -19,6 +19,11 @@ const (
MysqlErrorInsertInfoCode
MysqlErrorQueryCode
MysqlErrorQueryEnterpriseCertCode
DidAlreadyExistErrorCode
DidPrivateKeyUsageErrorCode
UserAlreadyExistErrorCode
EnterpriseRealNameQueryErrorCode
PasswordErrorCode
)
var (
......@@ -27,12 +32,17 @@ var (
MarshalOrUnMarshalError = res.ErrorMessageCode(MarshalOrUnMarshalErrorCode, "内部数据处理错误")
ExpiredInterfaceError = res.ErrorMessageCode(ExpiredInterfaceErrorCode, "过期接口")
UserLoginError = res.ErrorMessageCode(UserLoginErrorCode, "用户登录失败")
PasswordError = res.ErrorMessageCode(PasswordErrorCode, "密码错误")
MysqlErrorQueryLogOperations = res.ErrorMessageCode(MysqlErrorQueryLogOperationsCode, "内部查询操作日志错误")
MysqlErrorQueryUserinfo = res.ErrorMessageCode(MysqlErrorQueryUserinfoCode, "内部查询用户信息错误")
MysqlErrorUpdate = res.ErrorMessageCode(MysqlErrorUpdateCode, "内部数据更新错误")
MysqlErrorInsertInfo = res.ErrorMessageCode(MysqlErrorInsertInfoCode, "内部添加信息错误")
MysqlErrorQuery = res.ErrorMessageCode(MysqlErrorQueryCode, "内部查询数据错误")
MysqlErrorQueryEnterpriseCert = res.ErrorMessageCode(MysqlErrorQueryEnterpriseCertCode, "内部查询企业实名认证信息错误")
DidAlreadyExistError = res.ErrorMessageCode(DidAlreadyExistErrorCode, "当前企业已经存在DID")
DidPrivateKeyUsageError = res.ErrorMessageCode(DidPrivateKeyUsageErrorCode, "该私钥已被占用,请重新输入其他私钥")
EnterpriseRealNameQueryError = res.ErrorMessageCode(EnterpriseRealNameQueryErrorCode, "使用航贸通DID服务前,须先注册企业实名DID")
UserAlreadyExistError = res.ErrorMessageCode(UserAlreadyExistErrorCode, "用户已经存在,无法注册")
)
const (
......@@ -80,11 +90,13 @@ var (
const (
PrivilegeErrorCode = 401000 + iota //权限错误
TokenGenerateErrorCode
OperationCenterErrorDidCode
)
var (
PrivilegeError = res.ErrorMessageCode(PrivilegeErrorCode, "权限错误")
TokenGenerateError = res.ErrorMessageCode(TokenGenerateErrorCode, "token生成错误")
PrivilegeError = res.ErrorMessageCode(PrivilegeErrorCode, "权限错误")
TokenGenerateError = res.ErrorMessageCode(TokenGenerateErrorCode, "token生成错误")
OperationCenterErrorDid = res.ErrorMessageCode(OperationCenterErrorDidCode, "运营中心did权限错误")
)
const (
......@@ -101,6 +113,7 @@ const (
EnterpriseAuthVerifyErrorCode
EnterpriseAuthNumberErrorCode
EnterpriseAuthenticationErrorCode
EnterpriseDidRegisterErrorCode
EnterpriseRealNameErrorCode
EnterpriseRealNameAuthNumberErrorCode
EnterpriseRealNameAuthVerifyErrorCode
......@@ -110,6 +123,8 @@ const (
DidDelTrustIssuerErrorCode
DidAddTrustIssuerErrorCode
IssuerOrgQueryErrorCode
RealNameAuthVerifyErrorCode
DidIsNotExistErrorCode
)
var (
......@@ -119,6 +134,7 @@ var (
EnterpriseAuthVerifyError = res.ErrorMessageCode(EnterpriseAuthVerifyErrorCode, "向远端运营方进行实名认证请求")
EnterpriseAuthNumberError = res.ErrorMessageCode(EnterpriseAuthNumberErrorCode, "向远端运营方请求实名认证二维码错误")
EnterpriseAuthenticationError = res.ErrorMessageCode(EnterpriseAuthenticationErrorCode, "向远端运营方进行实名认证错误")
EnterpriseDidRegisterError = res.ErrorMessageCode(EnterpriseDidRegisterErrorCode, "向远端检查实名企业是否已注册did错误")
EnterpriseRealNameError = res.ErrorMessageCode(EnterpriseRealNameErrorCode, "第三方实名认证错误")
EnterpriseRealNameAuthNumberError = res.ErrorMessageCode(EnterpriseRealNameAuthNumberErrorCode, "向第三方请求实名认证二维码错误")
EnterpriseRealNameAuthVerifyError = res.ErrorMessageCode(EnterpriseRealNameAuthVerifyErrorCode, "向第三方进行获取实名信息错误")
......@@ -128,6 +144,8 @@ var (
DidDelTrustIssuerError = res.ErrorMessageCode(DidDelTrustIssuerErrorCode, "删除did发行者错误")
DidAddDelTrustIssuerError = res.ErrorMessageCode(DidAddTrustIssuerErrorCode, "添加did发行者错误")
IssuerOrgQueryError = res.ErrorMessageCode(IssuerOrgQueryErrorCode, "查询机构信息错误")
RealNameAuthVerifyError = res.ErrorMessageCode(RealNameAuthVerifyErrorCode, "实名认证未通过,请重新认证")
DidIsNotExistError = res.ErrorMessageCode(DidIsNotExistErrorCode, "did不存在")
)
const (
......@@ -142,11 +160,13 @@ var (
const (
RegisterErrorCode = 801000 + iota //注册通知
RegisterErrorUserExistCode
RegisterErrorPhoneNumberExistCode
)
var (
RegisterError = res.ErrorMessageCode(RegisterErrorCode, "注册失败")
RegisterErrorUserExist = res.ErrorMessageCode(RegisterErrorUserExistCode, "用户已存在")
RegisterError = res.ErrorMessageCode(RegisterErrorCode, "注册失败")
RegisterErrorUserExist = res.ErrorMessageCode(RegisterErrorUserExistCode, "用户已存在")
RegisterErrorPhoneNumberExist = res.ErrorMessageCode(RegisterErrorPhoneNumberExistCode, "手机号已被注册,请更换手机号")
)
const (
......
Name: did-mgr-common-service-api
Host: 0.0.0.0
Port: 18782
Port: 17782
MaxBytes: 5368709120
Timeout: 10000
IsOperatorCenter: 1
Kms: 127.0.0.1:18781
# 1.表示是运营中心,0. 表示用户
IsOperatorCenter: 0
Service:
issuer: http://192.168.1.181:17783
holder: http://192.168.1.181:17784
did: https://36.112.40.10:41138
kms: 127.0.0.1:17781
# did-mgr-issuer服务的地址
issuer: http://192.168.3.170:18784
# did-mgr-holder服务的地址
holder: http://127.0.0.1:17783
# did-mgr-kms服务的地址(grpc)
kms: 192.168.3.170:18781
# did服务地址
did: https://192.168.1.181:30003
didProxy: ""
# 存证服务地址
tdh: http://192.168.1.135:8280
tdhProxy: ""
# did服务地址(did-gateway地址)
authority: "http://127.0.0.1:18782"
authorityProxy: ""
# mysql链接地址,满足 $user:$password@tcp($ip:$port)/$db?$queries 格式即可
#DataSource: root:passw0rd@tcp(192.168.1.181:13306)/holder_database?parseTime=true
Database:
DbType: "mysql"
DSN: "root:passw0rd@tcp(192.168.1.182:13306)/common_database?parseTime=true"
DSN: "root:passw0rd@tcp(192.168.1.182:13306)/en1common_database?parseTime=true"
# DbType: "kingbase"
# DSN: "host=192.168.1.181 port=54321 user=SYSTEM password=passw0rd dbname=test sslmode=disable"
EnterpriseConfig:
urlAddr: "https://api.shumaidata.com/v4/company-three/check/v2"
accessKey: "bMFHxFsO2QM607irHy8fym5QHRKQkSFg"
appId: "bMFHxFsO2QM607ir"
AdminUser:
user: admin
password: password
Jwt:
expiresTime: 7200
issuer: did-Mgr
key: "!@#$abcd%^&*++``123"
issuer: http://did-issuer-mgr-service:17784
key: "IUAjJGFiY2QlXiYqKytgYDEyMw=="
# IsOperatorCenter为1运营中心时配置
EnterpriseConfig:
proxy: ""
urlAddr: "https://xxx/check/v2"
accessKey: "bMFHxFxxxy2m5QHRKQ11kSFg"
appId: "bMFxxx07ir"
# IsOperatorCenter为1运营中心时配置
authService:
proxy: ""
url: http://222.128.3.35:7001/authenticationService/httpserver.do
sysCode: SAIC_BIZ_1101000H
authCode: 6b1b7f48645d495c9523bf15fe8955d4
sign: vevHKBjCl8kC/kqjn2JdOs1waIizT5tOurzxPs1/8iEEMw2TuX9iJg==
url: http://xxx/httpserver.do
sysCode: xxx
authCode: xxx
sign: xxx
version: "1"
Log:
# 服务名称
ServiceName: did-mgr-common-service
......
......@@ -2,31 +2,38 @@ module chainweaver.org.cn/chainweaver/did/did-mgr-common-service
go 1.22.0
replace chainmaker.org/chainmaker/sdk-go/v2 => chainweaver.org.cn/chainweaver/sdk-go/v2 v2.3.6-0.20240730063620-2d7127f68f97
require (
chainmaker.org/chainmaker/common/v2 v2.3.4-0.20240409093808-7d65defc997b
chainmaker.org/chainmaker/opennet/servicecommon v0.5.21
chainmaker.org/chainmaker/sdk-go/v2 v2.3.4
chainweaver.org.cn/chainweaver/did/core v0.5.1
chainweaver.org.cn/chainweaver/did/did-kms v0.5.1-0.20240618074250-4e5aaa1432d8
chainmaker.org/chainmaker/common/v2 v2.3.4
chainmaker.org/chainmaker/sdk-go/v2 v2.3.6-0.20240711031433-57b7514c63ba
chainweaver.org.cn/chainweaver/did/core v1.1.0
chainweaver.org.cn/chainweaver/did/did-kms v1.1.0
chainweaver.org.cn/chainweaver/servicecommon v1.1.3
github.com/golang-jwt/jwt/v4 v4.5.0
github.com/stretchr/testify v1.9.0
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.936
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.936
github.com/test-go/testify v1.1.4
github.com/xuri/excelize/v2 v2.8.1
github.com/zeromicro/go-zero v1.6.5
golang.org/x/crypto v0.23.0
google.golang.org/grpc v1.64.0
google.golang.org/protobuf v1.34.1
golang.org/x/crypto v0.26.0
google.golang.org/grpc v1.65.0
google.golang.org/protobuf v1.34.2
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gorm.io/driver/mysql v1.5.6
gorm.io/driver/postgres v1.5.7
gorm.io/driver/sqlite v1.5.6
gorm.io/gorm v1.25.10
)
require (
chainmaker.org/chainmaker/pb-go/v2 v2.3.4 // indirect
chainmaker.org/chainmaker/protocol/v2 v2.3.4 // indirect
chainmaker.org/chainmaker/utils/v2 v2.3.4 // indirect
chainmaker.org/chainmaker/pb-go/v2 v2.3.5 // indirect
chainmaker.org/chainmaker/protocol/v2 v2.3.5 // indirect
chainmaker.org/chainmaker/utils/v2 v2.3.5 // indirect
cloud.google.com/go/auth v0.9.1 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
cloud.google.com/go/compute/metadata v0.5.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/GuoxinL/gorm-cache v1.0.2 // indirect
github.com/Rican7/retry v0.1.0 // indirect
......@@ -34,7 +41,7 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/btcsuite/btcd v0.21.0-beta // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/coreos/go-semver v0.3.1 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
......@@ -43,8 +50,9 @@ require (
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.4 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
......@@ -78,11 +86,13 @@ require (
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v2.0.1+incompatible // indirect
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
github.com/miekg/pkcs11 v1.0.3 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/opentracing/opentracing-go v1.1.0 // indirect
......@@ -102,6 +112,8 @@ require (
github.com/prometheus/procfs v0.12.0 // indirect
github.com/redis/go-redis/v9 v9.5.1 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.3 // indirect
github.com/shirou/gopsutil v2.19.10+incompatible // indirect
github.com/sirupsen/logrus v1.6.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
......@@ -116,37 +128,36 @@ require (
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tidwall/tinylru v1.1.0 // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect
github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect
go.etcd.io/etcd/api/v3 v3.5.13 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.13 // indirect
go.etcd.io/etcd/client/v3 v3.5.13 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
go.opentelemetry.io/otel v1.27.0 // indirect
go.opentelemetry.io/otel v1.28.0 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.19.0 // indirect
go.opentelemetry.io/otel/metric v1.27.0 // indirect
go.opentelemetry.io/otel/sdk v1.27.0 // indirect
go.opentelemetry.io/otel/trace v1.27.0 // indirect
go.opentelemetry.io/otel/metric v1.28.0 // indirect
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/automaxprocs v1.5.3 // indirect
go.uber.org/multierr v1.9.0 // indirect
go.uber.org/zap v1.24.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/oauth2 v0.18.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/term v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
golang.org/x/net v0.28.0 // indirect
golang.org/x/oauth2 v0.22.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.24.0 // indirect
golang.org/x/term v0.23.0 // indirect
golang.org/x/text v0.17.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect
google.golang.org/genproto v0.0.0-20240604185151-ef581f913117 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
......
This diff is collapsed.
package config
import (
"chainmaker.org/chainmaker/opennet/servicecommon/gorm"
"chainweaver.org.cn/chainweaver/servicecommon/gorm"
"github.com/zeromicro/go-zero/rest"
gorm2 "gorm.io/gorm"
)
var (
ConfigIns = &Config{}
DB = &gorm2.DB{}
)
type Config struct {
......@@ -27,6 +29,7 @@ type DatabaseConf struct {
// 企业实名认证查询
type EnterpriseConfig struct {
Proxy string `mapstructure:"proxy" json:"proxy"` // 代理服务器IP
UrlAddr string `mapstructure:"urlAddr" json:"urlAddr"` // 企业实名认证url
AccessKey string `mapstructure:"accessKey" json:"accessKey"` // 服务商分配的accessKey
AppId string `mapstructure:"appId" json:"appId"` // 服务商分配的appid
......@@ -34,7 +37,7 @@ type EnterpriseConfig struct {
type AuthService struct {
Url string `mapstructure:"url" json:"url"`
Proxy string `mapstructure:"proxy" json:"proxy"` // 验证码域名
Proxy string `mapstructure:"proxy" json:"proxy"` // 代理服务器IP
SysCode string `mapstructure:"sys_code" json:"sysCode"`
AuthCode string `mapstructure:"auth_code" json:"authCode"`
Sign string `mapstructure:"sign" json:"sign"`
......
package config
import "chainweaver.org.cn/chainweaver/servicecommon/encrypt"
type Service struct {
Issuer string `mapstructure:"issuer" json:"issuer"`
Holder string `mapstructure:"holder" json:"holder"`
Did string `mapstructure:"did" json:"did"`
Authority string `mapstructure:"authority" json:"authority"` //机构路由
Kms string `mapstructure:"kms" json:"kms"` //kms服务路由
Issuer string `mapstructure:"issuer" json:"issuer"`
Holder string `mapstructure:"holder" json:"holder"`
Did string `mapstructure:"did" json:"did"`
Authority string `mapstructure:"authority" json:"authority"` //机构路由
Kms string `mapstructure:"kms" json:"kms"` //kms服务路由
Tdh string `mapstructure:"tdh" json:"tdh"` //存证服务
TdhProxy string `mapstructure:"tdhProxy" json:"tdhProxy"` //存证代理路由服务
DidProxy string `mapstructure:"didProxy" json:"didProxy"` //did代理路由服务
AuthorityProxy string `mapstructure:"authorityProxy" json:"authorityProxy"` //机构代理路由
}
// Jwt jwt相关配置
......@@ -14,3 +20,11 @@ type Jwt struct {
Issuer string `mapstructure:"issuer" json:"issuer"` // 签名者
Key string `mapstructure:"key" json:"key"` // 密钥
}
func (j Jwt) GetKey() string {
dkey, err := encrypt.DecryptString(j.Key)
if err != nil {
panic("decrypt Jwt key error:" + err.Error())
}
return dkey
}
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"time"
)
func FindContactsInfoByUserId(userId int64) (*ContactsInfo, error) {
func FindContactsInfo() (*ContactsInfo, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
contractsInfo := &ContactsInfo{}
tx := svc.DB.WithContext(ctx)
if err := tx.Where("user_id = ?", userId).First(contractsInfo).Error; err != nil {
count := int64(0)
tx := config.DB.WithContext(ctx)
tx = tx.Order("created_at desc")
err := tx.First(contractsInfo).Offset(-1).Limit(-1).Count(&count).Error
if err != nil {
return nil, err
}
return contractsInfo, nil
}
......@@ -23,9 +28,16 @@ func FindContactsInfoByOrgId(orgId int64) (*ContactsInfo, error) {
defer cancel()
contractsInfo := &ContactsInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("org_id = ?", orgId).First(contractsInfo).Error; err != nil {
return nil, err
}
return contractsInfo, nil
}
func UpdateContactsInfo(info *ContactsInfo) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return config.DB.WithContext(ctx).Model(info).Where("id = ?", info.Id).Updates(info).Error
}
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"github.com/test-go/testify/require"
"os"
"sync"
"testing"
"time"
)
var (
once sync.Once
)
func initDB() {
once.Do(func() {
err := os.Remove("./test.db")
if err != nil {
panic(err)
}
c := config.Config{
DatabaseConfig: &config.DatabaseConf{
DbType: "sqlite",
DSN: "./test.db",
},
}
gormDB, err := utils.NewDb(c)
if err != nil {
panic(err)
}
err = gormDB.AutoMigrate(GetTables()...)
if err != nil {
panic(err)
}
config.DB = gormDB
})
}
func TestContactsInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&ContactsInfo{
OrgId: 1,
UserName: "test",
PhoneNumber: "12345678901",
Email: "test@test.com",
ServiceEndpoint: "test.com",
})
if err != nil {
t.Error(err)
}
info, err := FindContactsInfoByOrgId(1)
if err != nil {
t.Error(err)
}
info.UserName = "test2"
err = UpdateContactsInfo(info)
if err != nil {
t.Error(err)
}
infos, err := FindContactsInfo()
if err != nil {
t.Error(err)
}
require.Equal(t, infos.UserName, "test2")
}
func TestDownloadInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&DownloadInfo{
KeyId: 1,
UserName: "test",
UserID: 1,
})
if err != nil {
t.Error(err)
}
info, err := FindDownloadInfoById(1)
if err != nil {
t.Error(err)
}
require.Equal(t, info[0].UserName, "test")
}
func TestEnterpriseInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&EnterpriseInfo{
OrgId: 1,
EnterpriseCName: "Ctest",
EnterpriseEName: "Etest",
IsIssuer: 1,
PhoneNumber: "12345678901",
Email: "test@test.com",
LogoImages: "test.com",
CertificationState: 1,
})
if err != nil {
t.Error(err)
}
info, err := FindEnterpriseInfoById(1)
if err != nil {
t.Error(err)
}
info.EnterpriseCName = "Ctest2"
err = UpdateEnterpriseInfo(info)
if err != nil {
t.Error(err)
}
infos, err := FindEnterpriseInfoById(1)
if err != nil {
t.Error(err)
}
require.Equal(t, infos.EnterpriseCName, "Ctest2")
}
func TestEnterpriseCertInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&EnterpriseCertInfo{
EnterpriseID: 1,
EnterpriseName: "test",
Uniscid: "test",
LegalName: "testName",
LegalIDCard: "654989079070",
LegalPhone: "12345678901",
EnterCardType: 1,
Opscope: "test3",
Dom: "test2",
Opfrom: "test4",
Opto: "test5",
Licencesn: "test1",
CardType: 1,
})
if err != nil {
t.Error(err)
}
info, err := FindEnterpriseCertInfoByEnterId(1)
require.Equal(t, info.EnterpriseName, "test")
}
func TestDidInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&DidInfo{
EnterpriseID: 1,
Did: "did:cnbn:qiye01@0x4a3e3f4a5f88x9f00e0a0f86",
DocumentPlaintext: "test",
})
if err != nil {
t.Error(err)
}
info, err := FindDidInfo()
if err != nil {
t.Error(err)
}
info2, err := FindDidInfoByEnterpriseID(1)
if err != nil {
t.Error(err)
}
require.Equal(t, info2.Did, "did:cnbn:qiye01@0x4a3e3f4a5f88x9f00e0a0f86")
require.Equal(t, info2.Did, info.Did)
}
func TestIssueOrganizationInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&IssueOrganizationInfo{
EnterpriseCName: "Ctest",
EnterpriseEName: "Etest",
Did: "did:cnbn:qiye01@0x4a3e3f4a5f88x9f00e0a0f86",
AuditState: 1,
EnterpriseName: "test",
ContactsName: "test",
PhoneNumber: "12345678901",
Email: "<EMAIL>",
OldEmail: "old_<EMAIL>",
OldContactsName: "old_test",
OldPhoneNumber: "12345678901",
AuditTime: time.Now().Add(time.Hour * -12),
CertificateName: "test",
OrgType: 1,
IssuerName: "did:cnbn:qiye01@0x4a3e3f4a5f88x9f00e0a0f86",
Operator: "did:cnbn:qiye01@0x4a3e3f4a5f88x9f00e0a0f86",
Uniscid: "test",
LegalName: "testName",
Opscope: "test3",
Dom: "test2",
Opfrom: "test4",
Opto: "test5",
Licencesn: "test1",
ServiceEndpoint: "test6@.com",
})
if err != nil {
t.Error(err)
}
info, err := FindIssueOrganizationInfoByOrgId(1)
if err != nil {
t.Error(err)
}
_, err = FindIssueOrganizationInfoByOrgId(167980)
require.Equal(t, err.Error(), utils.RecordNotFound)
info.CertificateName = "test2"
err = UpdateIssueOrganizationInfo(info)
if err != nil {
t.Error(err)
}
info, err = FindIssueOrganizationInfoByOrgId(1)
if err != nil {
t.Error(err)
}
require.Equal(t, info.CertificateName, "test2")
infos, count, err := GetIssueOrganizationInfos("test", 0, 100, time.Now().Add(time.Hour*-24), time.Now(), 1)
if err != nil {
t.Error(err)
}
require.Equal(t, int(count), len(infos))
}
func TestKeyInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&KeyInfo{
Address: "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
UserId: 1,
AdminName: "test",
State: 1,
Enable: 1,
})
if err != nil {
t.Error(err)
}
info, err := FindKeyByAddress("bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh")
if err != nil {
t.Error(err)
}
info.AdminName = "test2"
err = UpdateKeyInfo(info)
if err != nil {
t.Error(err)
}
info, err = FindKeyInfoByEnable()
if err != nil {
t.Error(err)
}
require.Equal(t, info.AdminName, "test2")
infos, count, err := GetKeyInfos(0, 100)
require.Equal(t, int(count), len(infos))
}
func TestNotificationInfo_TableName(t *testing.T) {
initDB()
err := CreateTable(&NotificationInfo{
Topic: "test_topic",
Context: "test_context",
})
if err != nil {
t.Error(err)
}
_, err = FindNotificationById(1)
if err != nil {
t.Error(err)
}
err = CreateTable(&NotificationInfo{
Topic: "test_topic2",
Context: "test_context",
})
if err != nil {
t.Error(err)
}
infos, count, err := GetNotificationInfos(0, 100)
if err != nil {
t.Error(err)
}
require.Equal(t, int(count), len(infos))
}
func TestOperationLogs_TableName(t *testing.T) {
initDB()
err := CreateTable(&OperationLogs{
Event: "test_topic",
Level: 1,
Url: "test_context",
UserId: "1",
UserName: "test",
Result: 1,
Ip: "127.0.0.1",
})
if err != nil {
t.Error(err)
}
logs, count, err := GetOperationLogs("test", time.Now().Add(-1*time.Hour), 0, 100)
if err != nil {
t.Error(err)
}
require.Equal(t, int(count), len(logs))
require.Equal(t, int(count), 1)
logs, count, err = GetAllOperationLogs("test", time.Now().Add(-1*time.Hour))
if err != nil {
t.Error(err)
}
require.Equal(t, int(count), len(logs))
require.Equal(t, int(count), 1)
}
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"time"
)
......@@ -12,7 +12,7 @@ func FindDownloadInfoById(id int64) (downloadInfos []*DownloadInfo, err error) {
infos := make([]*DownloadInfo, 0)
count := int64(0)
tx := svc.DB.WithContext(ctx).Where("key_id = ?", id).Order("created_at desc")
tx := config.DB.WithContext(ctx).Where("key_id = ?", id).Order("created_at desc")
err = tx.Find(&infos).Offset(-1).Limit(-1).Count(&count).Error
if err != nil {
......
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"time"
)
......@@ -11,38 +11,38 @@ func FindEnterpriseCertInfoByEnterId(id int64) (*EnterpriseCertInfo, error) {
defer cancel()
enterpriseCertInfo := &EnterpriseCertInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("enterprise_id = ?", id).First(enterpriseCertInfo).Error; err != nil {
return nil, err
}
return enterpriseCertInfo, nil
}
func FindEnterpriseCertInfoByDid(did string) (*EnterpriseCertInfo, error) {
func FindDidInfo() (*DidInfo, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
didInfo := &DidInfo{}
count := int64(0)
enterpriseCertInfo := &EnterpriseCertInfo{}
tx := svc.DB.WithContext(ctx)
if err := tx.Where("did = ?", did).First(enterpriseCertInfo).Error; err != nil {
tx := config.DB.WithContext(ctx)
tx = tx.Order("created_at desc")
err := tx.First(&didInfo).Offset(-1).Limit(-1).Count(&count).Error
if err != nil {
return nil, err
}
return enterpriseCertInfo, nil
return didInfo, nil
}
func FindDidInfo() (*DidInfo, error) {
func FindDidInfoByEnterpriseID(id int64) (*DidInfo, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
didInfo := &DidInfo{}
count := int64(0)
tx := svc.DB.WithContext(ctx)
tx = tx.Order("created_at desc")
err := tx.First(&didInfo).Offset(-1).Limit(-1).Count(&count).Error
if err != nil {
tx := config.DB.WithContext(ctx)
if err := tx.Where("enterprise_id = ?", id).First(didInfo).Error; err != nil {
return nil, err
}
return didInfo, nil
}
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
)
func FindEnterpriseInfoByPhoneNumber(number string) (*EnterpriseInfo, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
enterpriseInfo := &EnterpriseInfo{}
tx := svc.DB.WithContext(ctx)
if err := tx.Where("phone_number = ?", number).First(enterpriseInfo).Error; err != nil {
return nil, err
}
return enterpriseInfo, nil
}
func FindEnterpriseInfoByDId(did string) (*EnterpriseInfo, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
enterpriseInfo := &EnterpriseInfo{}
tx := svc.DB.WithContext(ctx)
if err := tx.Where("did = ?", did).First(enterpriseInfo).Error; err != nil {
return nil, err
}
return enterpriseInfo, nil
}
func FindEnterpriseInfoById(id int64) (*EnterpriseInfo, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
enterpriseInfo := &EnterpriseInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("id = ?", id).First(enterpriseInfo).Error; err != nil {
return nil, err
}
......@@ -47,5 +22,5 @@ func UpdateEnterpriseInfo(enterInfo *EnterpriseInfo) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return svc.DB.WithContext(ctx).Model(enterInfo).Where("id = ?", enterInfo.EnterpriseID).Updates(enterInfo).Error
return config.DB.WithContext(ctx).Model(enterInfo).Where("id = ?", enterInfo.EnterpriseID).Updates(enterInfo).Error
}
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"context"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
)
func FindIssueOrganizationInfoByOrgId(orgId int64) (*IssueOrganizationInfo, error) {
......@@ -11,7 +12,7 @@ func FindIssueOrganizationInfoByOrgId(orgId int64) (*IssueOrganizationInfo, erro
defer cancel()
orgInfo := &IssueOrganizationInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("id = ?", orgId).First(orgInfo).Error; err != nil {
return nil, err
}
......@@ -22,7 +23,7 @@ func UpdateIssueOrganizationInfo(orgInfo *IssueOrganizationInfo) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return svc.DB.WithContext(ctx).Model(orgInfo).Where("id = ?", orgInfo.ID).Updates(orgInfo).Error
return config.DB.WithContext(ctx).Model(orgInfo).Where("id = ?", orgInfo.ID).Updates(orgInfo).Error
}
func GetIssueOrganizationInfos(name string, offset, limit int, start, end time.Time, state int) ([]*IssueOrganizationInfo, int64, error) {
......@@ -31,26 +32,29 @@ func GetIssueOrganizationInfos(name string, offset, limit int, start, end time.T
orgInfos := make([]*IssueOrganizationInfo, 0)
count := int64(0)
tx := svc.DB.WithContext(ctx).Offset(offset).Limit(limit)
tx := config.DB.WithContext(ctx).Offset(offset).Limit(limit)
args := []interface{}{}
sql := "audit_state = ? "
args = append(args, state)
sql := " 1=1 "
if state != 0 {
sql += "and audit_state = ? "
args = append(args, state)
}
if name != "" {
sql += "and (enterprise_name like ? or enterprise_cname like ? or enterprise_ename like ?)"
sql += "and (enterprise_name like ? or enterprise_cname like ? or enterprise_ename like ?) "
args = append(args, "%"+name+"%")
args = append(args, "%"+name+"%")
args = append(args, "%"+name+"%")
}
if !start.IsZero() && !end.IsZero() {
sql = sql + " and created_at > ? and created_at < ?"
sql = sql + "and created_at > ? and created_at < ? "
args = append(args, start)
args = append(args, end)
} else if !start.IsZero() {
sql = sql + " and created_at > ?"
sql = sql + "and created_at > ? "
args = append(args, start)
} else if !end.IsZero() {
sql = sql + " and created_at < ?"
sql = sql + "and created_at < ? "
args = append(args, end)
}
......
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"time"
)
......@@ -11,7 +11,7 @@ func FindKeyByAddress(address string) (*KeyInfo, error) {
defer cancel()
keyInfo := &KeyInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("address = ?", address).First(keyInfo).Error; err != nil {
return nil, err
}
......@@ -22,7 +22,7 @@ func UpdateKeyInfo(key *KeyInfo) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return svc.DB.WithContext(ctx).Model(key).Where("address = ?", key.Address).Updates(key).Error
return config.DB.WithContext(ctx).Model(key).Where("address = ?", key.Address).Updates(key).Error
}
func GetKeyInfos(offset, limit int) ([]*KeyInfo, int64, error) {
......@@ -31,7 +31,7 @@ func GetKeyInfos(offset, limit int) ([]*KeyInfo, int64, error) {
keyInfos := make([]*KeyInfo, 0)
count := int64(0)
tx := svc.DB.WithContext(ctx).Offset(offset).Limit(limit)
tx := config.DB.WithContext(ctx).Offset(offset).Limit(limit)
tx = tx.Order("created_at desc")
err := tx.Find(&keyInfos).Offset(-1).Limit(-1).Count(&count).Error
......@@ -45,7 +45,7 @@ func FindKeyInfoByEnable() (*KeyInfo, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
keyInfo := &KeyInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("enable = ?", 1).First(keyInfo).Error; err != nil {
return nil, err
}
......
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"time"
)
......@@ -11,7 +11,7 @@ func FindNotificationById(id int64) (*NotificationInfo, error) {
defer cancel()
nInfo := &NotificationInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("id = ?", id).First(nInfo).Error; err != nil {
return nil, err
}
......@@ -24,7 +24,7 @@ func GetNotificationInfos(offset, limit int) ([]*NotificationInfo, int64, error)
nInfos := make([]*NotificationInfo, 0)
count := int64(0)
tx := svc.DB.WithContext(ctx).Offset(offset).Limit(limit)
tx := config.DB.WithContext(ctx).Offset(offset).Limit(limit)
tx = tx.Order("created_at desc")
err := tx.Find(&nInfos).Offset(-1).Limit(-1).Count(&count).Error
......
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"time"
)
func GetOperationLogs(keyword, startTime string, offset, limit int) ([]*OperationLogs, int64, error) {
func GetOperationLogs(keyword string, startTime time.Time, offset, limit int) ([]*OperationLogs, int64, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
operationLogs := make([]*OperationLogs, 0)
count := int64(0)
tx := svc.DB.WithContext(ctx).Offset(offset).Limit(limit)
tx := config.DB.WithContext(ctx).Offset(offset).Limit(limit)
if keyword != "" {
tx = tx.Where("event like ? or url like ? and created_at > ? ", "%"+keyword+"%", "%"+keyword+"%", startTime)
} else {
}
if !startTime.IsZero() {
tx = tx.Where("created_at > ?", startTime)
}
tx = tx.Order("created_at desc")
......@@ -26,3 +27,26 @@ func GetOperationLogs(keyword, startTime string, offset, limit int) ([]*Operatio
}
return operationLogs, count, nil
}
func GetAllOperationLogs(keyword string, startTime time.Time) ([]*OperationLogs, int64, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
operationLogs := make([]*OperationLogs, 0)
count := int64(0)
tx := config.DB.WithContext(ctx)
if keyword != "" {
tx = tx.Where("event like ? or url like ? and created_at > ? ", "%"+keyword+"%", "%"+keyword+"%", startTime)
}
if !startTime.IsZero() {
tx = tx.Where("created_at > ?", startTime)
}
tx = tx.Order("created_at desc")
err := tx.Find(&operationLogs).Count(&count).Error
if err != nil {
return nil, count, err
}
return operationLogs, count, nil
}
This diff is collapsed.
package db
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"context"
"errors"
"fmt"
"github.com/zeromicro/go-zero/core/logx"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
)
......@@ -37,7 +38,7 @@ func CheckUser(phoneNumber, password string, userId int64) (*UserInfo, error) {
}
if userInfo.Password != password {
return nil, errors.New("password error")
return nil, errors.New("密码错误")
}
return userInfo, nil
......@@ -48,7 +49,7 @@ func FindUserByPhoneNumber(number string) (*UserInfo, error) {
defer cancel()
userInfo := &UserInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("phone_number = ?", number).First(userInfo).Error; err != nil {
return nil, err
}
......@@ -60,7 +61,7 @@ func FindUserByUserId(userId int64) (*UserInfo, error) {
defer cancel()
userInfo := &UserInfo{}
tx := svc.DB.WithContext(ctx)
tx := config.DB.WithContext(ctx)
if err := tx.Where("id = ?", userId).First(userInfo).Error; err != nil {
return nil, err
}
......@@ -69,7 +70,16 @@ func FindUserByUserId(userId int64) (*UserInfo, error) {
func CreateTable(value interface{}) error {
tx := svc.DB.Create(value)
tx := config.DB.Create(value)
if tx.Error != nil {
return tx.Error
}
return nil
}
func SaveTable(value interface{}) error {
tx := config.DB.Save(value)
if tx.Error != nil {
return tx.Error
}
......@@ -80,7 +90,7 @@ func UpdateUserInfo(userInfo *UserInfo) error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return svc.DB.WithContext(ctx).Model(userInfo).Where("id = ?", userInfo.UserID).Updates(userInfo).Error
return config.DB.WithContext(ctx).Model(userInfo).Where("id = ?", userInfo.UserID).Updates(userInfo).Error
}
func GetUserInfos(keyword string, offset, limit, memberType int) ([]*UserInfo, int64, error) {
......@@ -89,11 +99,11 @@ func GetUserInfos(keyword string, offset, limit, memberType int) ([]*UserInfo, i
userInfos := make([]*UserInfo, 0)
count := int64(0)
tx := svc.DB.WithContext(ctx).Offset(offset).Limit(limit)
tx := config.DB.WithContext(ctx).Offset(offset).Limit(limit)
if keyword != "" {
tx = tx.Where("user_name like ? or phone_number like ? or email like ? and member_type = ? ", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", memberType)
} else {
} else if memberType != 0 {
tx = tx.Where("member_type = ?", memberType)
}
tx = tx.Order("created_at desc")
......@@ -104,3 +114,32 @@ func GetUserInfos(keyword string, offset, limit, memberType int) ([]*UserInfo, i
return userInfos, count, nil
}
func UpdateTokenUser(uAddress, uDid string) (string, string) {
var address, did string
if uAddress != "" {
// 更新token user信息
keyInfo, err := FindKeyInfoByEnable()
if err != nil && err.Error() != "record not found" {
logx.Errorf("FindKeyInfo failed, err=%s", err.Error())
}
if keyInfo != nil {
address = keyInfo.Address
}
}
if uDid == "" {
// 更新token user信息
didInfo, err := FindDidInfo()
if err != nil && err.Error() != "record not found" {
logx.Errorf("FindDidInfo failed, err=%s", err.Error())
}
if didInfo != nil {
did = didInfo.Did
}
}
return address, did
}
package db
import (
"github.com/test-go/testify/require"
"testing"
)
func TestCreateTable(t *testing.T) {
initDB()
err := CreateTable(&UserInfo{
UserName: "test",
EnterpriseName: "test",
Password: "<PASSWORD>",
EnterpriseID: 1,
PhoneNumber: "1234567890",
Email: "<EMAIL>",
State: 1,
MemberType: 1,
})
if err != nil {
t.Error(err)
}
user, err := FindUserByUserId(1)
if err != nil {
t.Error(err)
}
user.UserName = "test1"
err = SaveTable(user)
if err != nil {
t.Error(err)
}
user, err = FindUserByPhoneNumber("1234567890")
if err != nil {
t.Error(err)
}
require.Equal(t, user.UserName, "test1")
user.UserName = "test2"
err = UpdateUserInfo(user)
if err != nil {
t.Error(err)
}
users, count, err := GetUserInfos("test", 1, 10, 1)
if err != nil {
t.Error(err)
}
println(count)
println(len(users))
}
......@@ -13,14 +13,40 @@ import (
// 签发机构服务接口
var issuerMap = map[string]bool{
"/api/v1/did-mgr/vc/issue": true,
"/api/v1/did-mgr/vc/revoke": true,
"/api/v1/did-mgr/vc/list/issued": true,
"/api/v1/did-mgr/vc/list/revoked": true,
"/api/v1/did-mgr/vc/get": true,
"/api/v1/did-mgr/vc/list": true,
"/api/v1/did-mgr/vctemplate/create": true,
"/api/v1/did-mgr/vctemplate/list": true,
// 模板管理
"/api/v1/did-mgr/vctemplate/issue": true,
"/api/v1/did-mgr/vctemplate/upgrade": true,
"/api/v1/did-mgr/vctemplate/getJsonSchema": true,
"/api/v1/did-mgr/vctemplate/listLocal": true,
"/api/v1/did-mgr/vctemplate/settingLocal": true,
"/api/v1/did-mgr/vctemplate/enableLocal": true,
"/api/v1/did-mgr/vctemplate/downloadLocal": true,
"/api/v1/did-mgr/vctemplate/create": true,
"/api/v1/did-mgr/vctemplate/getById": true,
"/api/v1/did-mgr/vctemplate/list": true,
"/api/v1/did-mgr/vctemplate/download": true,
"/api/v1/did-mgr/vctemplate/getLocal": true,
"/api/v1/did-mgr/vctemplate/pull": true,
// 签发管理
"/api/v1/did-mgr/application/add": true,
"/api/v1/did-mgr/application/list": true,
"/api/v1/did-mgr/application/getById": true,
"/api/v1/did-mgr/application/sign": true,
"/api/v1/did-mgr/application/download": true,
// 凭证管理
"/api/v1/did-mgr/vc/list/query": true,
"/api/v1/did-mgr/vc/details": true,
"/api/v1/did-mgr/vc/issue": true,
"/api/v1/did-mgr/vc/revoke": true,
"/api/v1/did-mgr/vc/list/download": true,
"/api/v1/did-mgr/vc/list/issued": true,
"/api/v1/did-mgr/vc/list/revoked": true,
"/api/v1/did-mgr/vc/list": true,
"/api/v1/did-mgr/vc/get": true,
// 签发信息
"/api/v1/did-mgr/issuer/getById": true,
"/api/v1/did-mgr/issuer/log/list": true,
"/api/v1/did-mgr/issuer/log/download": true,
}
// 持证人服务接口
......@@ -31,6 +57,10 @@ var holderMap = map[string]bool{
"/api/v1/did-mgr/msg/decrypt": true,
"/api/v1/did-mgr/vc/list/latest": true,
"/api/v1/did-mgr/vc/list/local": true,
"/api/v1/did-mgr/vc/list/vc": true,
"/api/v1/did-mgr/vc/detail/vc": true,
"/api/v1/did-mgr/vc/log/download": true,
"/api/v1/did-mgr/vc/log/operation": true,
"/api/v1/did-mgr/vp/create/authView": true,
"/api/v1/did-mgr/vp/create/applyBusinessLicense": true,
}
......
package login
import (
"io"
"net/http"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/login"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"github.com/zeromicro/go-zero/rest/httpx"
)
func DecryptHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
//http body content
b, err := io.ReadAll(r.Body)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := login.NewDecryptLogic(r.Context(), svcCtx, b)
resp, err := l.Decrypt()
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
package login
import (
"io"
"net/http"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/login"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"github.com/zeromicro/go-zero/rest/httpx"
)
func EncryptHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
//http body content
b, err := io.ReadAll(r.Body)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := login.NewEncryptLogic(r.Context(), svcCtx, b)
resp, err := l.Encrypt()
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
package login
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/tail"
"net/http"
"strconv"
"strings"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/login"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
......@@ -19,6 +23,24 @@ func LoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
l := login.NewLoginLogic(r.Context(), svcCtx)
resp, err := l.Login(&req)
opRes := 1
token := &middleware.TokenUser{
Id: "",
UserName: req.PhoneNumber,
}
if resp.Code != types.SucceedCode {
opRes = 2
} else {
loginResp := resp.Data.(*types.LoginResp)
token.Id = strconv.FormatInt(loginResp.UserId, 10)
token.UserName = loginResp.UserName
}
defer func() {
ip := strings.Split(r.RemoteAddr, ":")[0]
tail.InsertOperation(tail.Login, ip, token, opRes)
}()
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
......
package login
import (
"net/http"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/login"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/rest/httpx"
)
func LoginOldHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.LoginReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := login.NewLoginLogic(r.Context(), svcCtx)
if req.PhoneNumber == "" {
req.PhoneNumber = req.UserName
}
resp, err := l.Login(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
package manager
import (
"bytes"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"io"
"net/http"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/manager"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/rest/httpx"
)
func DownloadGrantedAuthsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.DownloadGrantedAuthRecordsReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
token := r.Header.Get("x-token")
l := manager.NewDownloadGrantedAuthsLogic(r.Context(), svcCtx)
resp, err := l.DownloadGrantedAuths(&req, token)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
if resp.Code != types.SucceedCode {
httpx.OkJsonCtx(r.Context(), w, resp)
return
}
data, _ := resp.Data.([]byte)
w.Header().Set("Content-Disposition", "attachment; filename=authorizeRecords.xlsx")
w.Header().Set("Content-Type", "text/html; charset=utf-8")
_, err = io.Copy(w, bytes.NewBuffer(data))
if err != nil {
resp.Code = errorcode.SystemInternalErrorCode
resp.Msg = "系统内部错误,文件下载失败,请稍后再尝试"
}
resp.Data = nil
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
package manager
import (
"bytes"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"io"
"net/http"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/manager"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/rest/httpx"
)
func DownloadReceivedAuthsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.DownloadReceivedAuthRecordsReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
token := r.Header.Get("x-token")
l := manager.NewDownloadReceivedAuthsLogic(r.Context(), svcCtx)
resp, err := l.DownloadReceivedAuths(&req, token)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
if resp.Code != types.SucceedCode {
httpx.OkJsonCtx(r.Context(), w, resp)
return
}
data, _ := resp.Data.([]byte)
w.Header().Set("Content-Disposition", "attachment; filename=authorizedRecords.xlsx")
w.Header().Set("Content-Type", "text/html; charset=utf-8")
_, err = io.Copy(w, bytes.NewBuffer(data))
if err != nil {
resp.Code = errorcode.SystemInternalErrorCode
resp.Msg = "系统内部错误,文件下载失败,请稍后再尝试"
}
resp.Data = nil
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
package manager
import (
"net/http"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/manager"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/rest/httpx"
)
func GrantedAuthorizedRecordsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.GrantedAuthorizedRecordsReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := manager.NewGrantedAuthorizedRecordsLogic(r.Context(), svcCtx)
resp, err := l.GrantedAuthorizedRecords(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
......@@ -11,7 +11,7 @@ import (
func KeyListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.Page
var req types.PageReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
......
package manager
import (
"bytes"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/manager"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"fmt"
"github.com/xuri/excelize/v2"
"github.com/zeromicro/go-zero/rest/httpx"
"io"
"net/http"
"time"
)
func LogOpDownloadHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.LogDownloadReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := manager.NewLogOpDownloadLogic(r.Context(), svcCtx)
resp, err := l.LogOpDownload(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
if resp.Code != types.SucceedCode {
httpx.OkJsonCtx(r.Context(), w, resp)
return
}
logs, _ := resp.Data.(*manager.LogOperations)
data, err := CreateLogOperationExcelFile(logs.List)
resp.Data = nil
if err != nil {
resp.Code = errorcode.SystemInternalErrorCode
resp.Msg = "系统内部错误,文件转换失败,请稍后再尝试"
httpx.OkJsonCtx(r.Context(), w, resp)
return
}
w.Header().Set("Content-Disposition", "attachment; filename=vclist.xlsx")
w.Header().Set("Content-Type", "text/html; charset=utf-8")
_, err = io.Copy(w, data)
if err != nil {
resp.Code = errorcode.SystemInternalErrorCode
resp.Msg = "系统内部错误,文件下载失败,请稍后再尝试"
}
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
func CreateLogOperationExcelFile(logs []*manager.LogsResp) (*bytes.Buffer, error) {
excel := excelize.NewFile()
defer excel.Close()
excel.SetSheetRow("Sheet1", "A1", &[]string{
"事件名称", "事件级别", "URL/参数", "操作用户", "IP地址", "操作结果", "操作时间"})
for idx, log := range logs {
exis := fmt.Sprintf("A%d", idx+2)
optime, _ := time.Parse(time.RFC3339, log.OpTime)
excel.SetSheetRow("Sheet1", exis, &[]interface{}{
log.EventName,
GetEventLevel(log.EventLevel),
log.Url,
log.OpName,
log.Ip,
GetResLevel(log.OpResult),
optime.Format("2006/01/02 15:04:05"),
})
}
buf, err := excel.WriteToBuffer()
if err != nil {
return nil, err
}
return buf, nil
}
func GetEventLevel(level int) string {
switch level {
case 1:
return "重要"
case 2:
return "一般"
default:
return "一般"
}
}
func GetResLevel(res int) string {
switch res {
case 1:
return "成功"
case 2:
return "失败"
default:
return "失败"
}
}
......@@ -11,7 +11,7 @@ import (
func NotificationQueryHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.Page
var req types.PageReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
......
package manager
import (
"net/http"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/manager"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/rest/httpx"
)
func ReceivedAuthorizedRecordsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.ReceivedAuthorizedRecordsReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := manager.NewReceivedAuthorizedRecordsLogic(r.Context(), svcCtx)
resp, err := l.ReceivedAuthorizedRecords(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}
......@@ -11,7 +11,7 @@ import (
func VcListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.Page
var req types.PageReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
......
......@@ -6,7 +6,6 @@ import (
"time"
authority "chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/handler/authority"
did "chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/handler/did"
login "chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/handler/login"
manager "chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/handler/manager"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
......@@ -14,7 +13,34 @@ import (
"github.com/zeromicro/go-zero/rest"
)
// /v2/did-mgr/document/get
func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
server.AddRoutes(
rest.WithMiddlewares(
[]rest.Middleware{serverCtx.JWTAuth},
[]rest.Route{
{
Method: http.MethodPost,
Path: "/v1/did-mgr/document/get",
Handler: GetDocumentHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/v1/did-mgr/msg/verify",
Handler: MsgVerifyHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/v1/did-mgr/vp/verify",
Handler: VpVerifyHandler(serverCtx),
},
}...,
),
rest.WithPrefix("/api"),
rest.WithTimeout(60000*time.Millisecond),
rest.WithMaxBytes(5368709120),
)
server.AddRoutes(
[]rest.Route{
{
......@@ -73,32 +99,6 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
rest.WithMaxBytes(5368709120),
)
server.AddRoutes(
rest.WithMiddlewares(
[]rest.Middleware{serverCtx.JWTAuth},
[]rest.Route{
{
Method: http.MethodPost,
Path: "/document/get",
Handler: did.GetDocumentHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/msg/verify",
Handler: did.MsgVerifyHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/vp/verify",
Handler: did.VpVerifyHandler(serverCtx),
},
}...,
),
rest.WithPrefix("/api/v1/did-mgr"),
rest.WithTimeout(60000*time.Millisecond),
rest.WithMaxBytes(5368709120),
)
server.AddRoutes(
[]rest.Route{
{
......@@ -108,8 +108,13 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
},
{
Method: http.MethodPost,
Path: "/health",
Handler: login.HealthHandler(serverCtx),
Path: "/decrypt",
Handler: login.DecryptHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/encrypt",
Handler: login.EncryptHandler(serverCtx),
},
{
Method: http.MethodPost,
......@@ -127,6 +132,24 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
rest.WithMaxBytes(5368709120),
)
server.AddRoutes(
[]rest.Route{
{
Method: http.MethodGet,
Path: "/health",
Handler: login.HealthHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/login",
Handler: login.LoginOldHandler(serverCtx),
},
},
rest.WithPrefix("/api/v1/did-mgr"),
rest.WithTimeout(60000*time.Millisecond),
rest.WithMaxBytes(5368709120),
)
server.AddRoutes(
rest.WithMiddlewares(
[]rest.Middleware{serverCtx.JWTAuth},
......@@ -191,6 +214,26 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Path: "/authority/update",
Handler: manager.AuthorityUpdateHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/authorization/downloadGrantedAuths",
Handler: manager.DownloadGrantedAuthsHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/authorization/downloadReceivedAuths",
Handler: manager.DownloadReceivedAuthsHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/authorization/grantedAuthorizedRecords",
Handler: manager.GrantedAuthorizedRecordsHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/authorization/receivedAuthorizedRecords",
Handler: manager.ReceivedAuthorizedRecordsHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/keys/add",
......@@ -221,6 +264,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Path: "/keys/stopTouse",
Handler: manager.KeyStopHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/log/download",
Handler: manager.LogOpDownloadHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/log/operation",
......
......@@ -7,6 +7,7 @@ import (
"context"
"encoding/json"
"fmt"
"net/url"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
......@@ -48,6 +49,16 @@ func (l *AuthorityAddLogic) AuthorityAdd(req *types.AuthorityRegisterReq) (resp
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
// 检查ServiceEndpoint 结构
if req.ServiceEndpoint != "" {
_, err = url.ParseRequestURI(req.ServiceEndpoint)
if err != nil {
errorcode.RequestErrorParametersFormat.BuildResult(resp, fmt.Errorf("ServiceEndpoint must is url"))
l.Errorf("parse serviceEndpoint failed,err[%s]", err.Error())
return resp, nil
}
}
orgInfo := &db.IssueOrganizationInfo{}
// 1.首先检查orgId是否为空,如果为空,则表示是新增机构,如果不为空,则属于update
// 2.需要检查vc的格式是否正确
......@@ -102,19 +113,23 @@ func (l *AuthorityAddLogic) AuthorityAdd(req *types.AuthorityRegisterReq) (resp
} else {
// 查询本地数据库,并update
orgInfo, err = db.FindIssueOrganizationInfoByOrgId(req.OrgId)
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, fmt.Errorf("更新颁证机构申请数据不存在"))
l.Errorf("find issueOrganizationInfo failed,err[%s]", err.Error())
return resp, nil
}
orgInfo.Email = req.Email
orgInfo.PhoneNumber = req.Phone
orgInfo.ContactsName = req.Name
orgInfo.ServiceEndpoint = req.ServiceEndpoint
if orgInfo.AuditState == 1 || orgInfo.AuditState == 3 {
if orgInfo.AuditState == 1 {
orgInfo.AuditState = 1
}
if orgInfo.AuditState == 3 {
} else if orgInfo.AuditState == 3 { // 如果当前申请状态等于驳回,则新建一条申请数据
orgInfo.ID = 0
orgInfo.AuditState = 1
err = db.CreateTable(orgInfo)
} else {
err = db.UpdateIssueOrganizationInfo(orgInfo)
}
err = db.UpdateIssueOrganizationInfo(orgInfo)
if err != nil {
errorcode.MysqlErrorUpdate.BuildResult(resp, err)
l.Errorf("Update issueOrganizationInfo failed,err[%s]", err.Error())
......
......@@ -51,7 +51,8 @@ func (l *AuthorityAuditLogic) AuthorityAudit(req *types.AuditReq) (resp *types.C
if req.AuditState == 2 { // 通过审核
//调用第三方进行通过增加颁证机构操作
targetUrl := config.ConfigIns.Service.Did + utils.AddTrustIssuerUrl
err = utils.AddTrustIssuer(targetUrl, orgInfo.Did)
proxy := config.ConfigIns.Service.DidProxy
err = utils.AddTrustIssuer(targetUrl, proxy, orgInfo.Did)
if err != nil {
errorcode.DidAddDelTrustIssuerError.BuildResult(resp, err)
l.Errorf("AddTrustIssuer[%s] failed,err[%s]", orgInfo.Did, err.Error())
......@@ -70,7 +71,7 @@ func (l *AuthorityAuditLogic) AuthorityAudit(req *types.AuditReq) (resp *types.C
if err != nil {
errorcode.MysqlErrorUpdate.BuildResult(resp, err)
l.Logger.Errorf("update issueOrganizationInfo failed,err[%s]", err.Error())
return
return resp, nil
}
return resp, nil
......
......@@ -34,8 +34,8 @@ func (l *AuthorityBatchAuditLogic) AuthorityBatchAudit(req *types.BatchAuditReq)
}
// 当前只支持审核通过与审核驳回两种批量操作
if req.AuditState != 1 || req.AuditState != 2 {
errorcode.SystemInternalError.BuildResult(resp, fmt.Errorf("The request state cannot supply "))
if !(req.AuditState == 2 || req.AuditState == 3) {
errorcode.SystemInternalError.BuildResult(resp, fmt.Errorf("请求操作类型只能是审核通过与驳回"))
return resp, nil
}
orgInfos := make([]*db.IssueOrganizationInfo, 0)
......@@ -59,6 +59,11 @@ func (l *AuthorityBatchAuditLogic) AuthorityBatchAudit(req *types.BatchAuditReq)
}
for _, orgInfo := range orgInfos {
if req.AuditState == 2 {
orgInfo.OldEmail = orgInfo.Email
orgInfo.OldPhoneNumber = orgInfo.PhoneNumber
orgInfo.OldContactsName = orgInfo.ContactsName
}
// 更新本地数据库
orgInfo.AuditTime = time.Now()
orgInfo.AuditState = req.AuditState
......
......@@ -68,12 +68,12 @@ func (l *AuthorityDetailLogic) AuthorityDetail(req *types.OrgReq) (resp *types.C
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
l.Logger.Errorf("query issueOrganizationInfo failed,err[%s]", err.Error())
return
return resp, nil
}
detail := &DetailResp{
BasicInfo: &BasicResp{
RegisterTime: orgInfo.CreatedAt.Format(time.RFC3339),
RegisterTime: orgInfo.CreatedAt.Format(time.DateTime),
EnterpriseCName: orgInfo.EnterpriseCName,
EnterpriseEName: orgInfo.EnterpriseEName,
EnterpriseType: orgInfo.OrgType,
......@@ -89,11 +89,20 @@ func (l *AuthorityDetailLogic) AuthorityDetail(req *types.OrgReq) (resp *types.C
LicenseImage: "",
},
Contracts: &ContractsResp{
Name: orgInfo.ContactsName,
Phone: orgInfo.PhoneNumber,
Email: orgInfo.Email,
ServiceEndpoint: orgInfo.ServiceEndpoint,
},
}
if orgInfo.AuditState == 2 {
detail.Contracts = &ContractsResp{
Name: orgInfo.OldContactsName,
Phone: orgInfo.OldPhoneNumber,
Email: orgInfo.OldEmail,
ServiceEndpoint: orgInfo.ServiceEndpoint,
}}
}
}
resp.Data = detail
return
return resp, nil
}
......@@ -38,18 +38,19 @@ func (l *AuthorityForbiddenLogic) AuthorityForbidden(req *types.OrgReq) (resp *t
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
l.Logger.Errorf("query issueOrganizationInfo failed,err[%s]", err.Error())
return
return resp, nil
}
//调用第三方进行禁用操作
if orgInfo.AuditState == 2 {
//调用第三方进行通过增加颁证机构操作
proxy := config.ConfigIns.Service.DidProxy
targetUrl := config.ConfigIns.Service.Did + utils.DelTrustIssuerUrl
err = utils.DelTrustIssuer(targetUrl, orgInfo.Did)
err = utils.DelTrustIssuer(targetUrl, proxy, orgInfo.Did)
if err != nil {
errorcode.DidDelTrustIssuerError.BuildResult(resp, err)
l.Errorf("DelTrustIssuer[%s] failed,err[%s]", orgInfo.Did, err.Error())
return
return resp, nil
}
}
orgInfo.AuditState = 4
......@@ -57,7 +58,7 @@ func (l *AuthorityForbiddenLogic) AuthorityForbidden(req *types.OrgReq) (resp *t
if err != nil {
errorcode.MysqlErrorUpdate.BuildResult(resp, err)
l.Logger.Errorf("update issueOrganizationInfo failed,err[%s]", err.Error())
return
return resp, nil
}
return
}
......@@ -4,6 +4,7 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"context"
"strconv"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
......@@ -27,8 +28,8 @@ func NewAuthorityListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Aut
}
type AuthorityInfosResp struct {
Page types.Page
List []*OrgInfoResp
Page types.Page `json:"page"`
List []*OrgInfoResp `json:"list"`
}
type OrgInfoResp struct {
......@@ -61,10 +62,20 @@ func (l *AuthorityListLogic) AuthorityList(req *types.ListReq) (resp *types.Comm
offset = 0
}
//TODO
orgInfos, count, err := db.GetIssueOrganizationInfos(req.EnterpriseName, offset, limit, time.Time{}, time.Time{}, req.State)
startTime := time.Time{}
endTime := time.Time{}
starUni, _ := strconv.ParseInt(req.StartTime, 10, 0)
endUni, _ := strconv.ParseInt(req.EndTime, 10, 0)
if starUni != 0 {
startTime = time.Unix(starUni, 0)
}
if endUni != 0 {
endTime = time.Unix(endUni, 0)
}
orgInfos, count, err := db.GetIssueOrganizationInfos(req.EnterpriseName, offset, limit, startTime, endTime, req.State)
if err != nil {
errorcode.MysqlErrorQueryLogOperations.BuildResult(resp, err)
errorcode.MysqlErrorQuery.BuildResult(resp, err)
l.Logger.Errorf("GetOperationLogs failed,err[%s]", err.Error())
return resp, nil
}
......
......@@ -34,11 +34,11 @@ func (l *AuthorityQueryLogic) AuthorityQuery(req *types.OrgReq) (resp *types.Com
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
l.Logger.Errorf("query issueOrganizationInfo info failed,err[%s]", err.Error())
return
return resp, nil
}
resp.Data = struct {
State int
}{orgInfo.AuditState}
return
return resp, nil
}
......@@ -45,11 +45,11 @@ func (l *OperatorAuthenticationLogic) OperatorAuthentication(req *types.Authenti
err = fmt.Errorf("enterprise[%s] real name verify failed, err[%s]", req.EnterpriseName, err)
errorcode.EnterpriseRealNameError.BuildResult(resp, err)
l.Logger.Error(err.Error())
return
return resp, nil
}
resp.Data = info.Data.Result
return
return resp, nil
}
type checkData struct {
......
......@@ -26,6 +26,7 @@ const (
QueryQrType = "1101"
CreateRetType = "1"
QueryRetType = "1"
QrImagesPrefix = "data:image/image/png;base64,"
)
type AuthServiceCreateReq struct {
......@@ -88,14 +89,14 @@ func (l *OperatorAuthNumberLogic) OperatorAuthNumber() (resp *types.CommonResp,
err = fmt.Errorf("get auth number failed, err[%s]", err)
errorcode.EnterpriseRealNameAuthNumberError.BuildResult(resp, err)
l.Logger.Error(err.Error())
return
return resp, nil
}
splits := strings.Split(enterpriseAuthNumberResp.Random, ";")
enterpriseAuthNumberResp.Random = splits[0]
resp.Data = enterpriseAuthNumberResp
return
return resp, nil
}
func GetAuthNumber(auth *config.AuthService) (authNumberResp *EnterpriseAuthNumberResp, err error) {
......@@ -123,7 +124,7 @@ func GetAuthNumber(auth *config.AuthService) (authNumberResp *EnterpriseAuthNumb
return nil, err
}
if respAuth.MessageHeader.ErrorCode != 0 {
return nil, err
return nil, fmt.Errorf("request err code[%d],err info[%s]", respAuth.MessageHeader.ErrorCode, respAuth.MessageHeader.ErrorInfo)
}
// "qrinfo": "https://zzapp.gsxt.gov.cn/ebl?ebl=main&parm={\"random\":\"110001M100177140517010002271401694890688F960768;true\",\"sysName\":\"航运贸易公共服务平台\"}",
......@@ -145,7 +146,7 @@ func GetAuthNumber(auth *config.AuthService) (authNumberResp *EnterpriseAuthNumb
if internalErr != nil {
return nil, err
}
enterpriseAuthNumberResp.Qrimage = respAuth.MessageContent.Qrimage
enterpriseAuthNumberResp.Qrimage = QrImagesPrefix + respAuth.MessageContent.Qrimage
return enterpriseAuthNumberResp, nil
}
......@@ -43,12 +43,12 @@ func (l *OperatorAuthVerifyLogic) OperatorAuthVerify(req *types.AuthVerifyReq) (
err = fmt.Errorf("get auth number failed, err[%s]", err)
errorcode.EnterpriseRealNameAuthVerifyError.BuildResult(resp, err)
l.Logger.Error(err.Error())
return
return resp, nil
}
// 将实名认证信息返回给调用方
resp.Data = authResp.MessageContent
return
resp.Data = authResp
return resp, nil
}
func EnterpriseAuthVerify(auth *config.AuthService, random string) (*AuthServiceCreateReq, error) {
......@@ -76,10 +76,10 @@ func EnterpriseAuthVerify(auth *config.AuthService, random string) (*AuthService
if internalErr != nil {
return nil, internalErr
}
if respAuth.MessageHeader.ErrorCode != 0 {
return nil, fmt.Errorf("EnterpriseAuthVerify HttpServerReq response errorCode is not 0, errorCode=%d",
respAuth.MessageHeader.ErrorCode)
}
//if respAuth.MessageHeader.ErrorCode != 0 {
// return nil, fmt.Errorf("EnterpriseAuthVerify HttpServerReq response errorCode is not 0, errorCode=%d",
// respAuth.MessageHeader.ErrorCode)
//}
return respAuth, nil
}
......@@ -25,6 +25,6 @@ func NewGetDocumentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetDo
func (l *GetDocumentLogic) GetDocument(req *types.GetDocumentReq) (resp *types.GetDocumentResp, err error) {
// todo: add your logic here and delete this line
return
}
......@@ -48,9 +48,10 @@ func (l *GetDocumentLogic) GetDocument(req *types.GetDocumentReq) (resp *types.C
documentReq := &getDocumentReq{
Did: []string{req.Did},
}
proxy := config.ConfigIns.Service.DidProxy
targetUrl := config.ConfigIns.Service.Did + DIdGetDocumentUrl
param, _ := json.Marshal(documentReq)
respBz, err := DidServerReq(targetUrl, http.MethodPost, param)
respBz, err := DidServerReq(targetUrl, http.MethodPost, proxy, param)
// todo 返回resp.Msg增加错误日志
if err != nil {
resp.Code = types.ErrorDidServerCode
......@@ -66,7 +67,7 @@ func (l *GetDocumentLogic) GetDocument(req *types.GetDocumentReq) (resp *types.C
resp.Msg = types.ErrorDidServerMsg
return
}
if respDid.Code != http.StatusOK {
if int32(respDid.Code) != types.SucceedCode {
resp.Code = types.ErrorDidServerCode
resp.Msg = types.ErrorDidServerMsg
resp.Data = respDid
......
......@@ -7,18 +7,34 @@ import (
"github.com/zeromicro/go-zero/core/logx"
"io"
"net/http"
"net/url"
"strings"
)
func DidServerReq(targetUrl, method string, param []byte) ([]byte, error) {
logx.Debugf("did server request [targetUrl:%s] [method:%s] [param:%s]", targetUrl, method, param)
func DidServerReq(targetUrl, method, proxy string, param []byte) ([]byte, error) {
// 创建一个 http.Client 对象
client := &http.Client{}
// 创建一个 http.Transport 对象
tr := &http.Transport{}
// 如果目标 URL 以 https:// 开头,则不验证服务器证书
if strings.HasPrefix(targetUrl, "https://") {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
tr.TLSClientConfig = &tls.Config{
// nolint:gosec // need insecure TLS option for testing and development
InsecureSkipVerify: true,
}
client.Transport = tr
}
// 如果提供了代理地址,则设置代理
if proxy != "" {
proxyURL, err := url.Parse(proxy)
if err != nil {
return nil, err
}
tr.Proxy = http.ProxyURL(proxyURL)
}
// 将 transport 设置到 http.Client 中
client.Transport = tr
// 创建一个新的 HTTP 请求
req, err := http.NewRequest(method, targetUrl, bytes.NewBuffer(param))
if err != nil {
......
package login
import (
"context"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"chainweaver.org.cn/chainweaver/servicecommon/encrypt"
"github.com/zeromicro/go-zero/core/logx"
)
type DecryptLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
body []byte
}
func NewDecryptLogic(ctx context.Context, svcCtx *svc.ServiceContext, body []byte) *DecryptLogic {
return &DecryptLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
body: body,
}
}
func (l *DecryptLogic) Decrypt() (resp *types.CommonResp, err error) {
data, err := encrypt.DecryptString(string(l.body))
if err != nil {
l.Logger.Errorf("decrypt failed, err=%s", err.Error())
return nil, err
}
return &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
Data: data,
}, nil
}
package login
import (
"context"
"encoding/hex"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"chainweaver.org.cn/chainweaver/servicecommon/encrypt"
"github.com/zeromicro/go-zero/core/logx"
)
type EncryptLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
body []byte
}
func NewEncryptLogic(ctx context.Context, svcCtx *svc.ServiceContext, body []byte) *EncryptLogic {
return &EncryptLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
body: body,
}
}
func (l *EncryptLogic) Encrypt() (resp *types.CommonResp, err error) {
edata, err := encrypt.Encrypt(l.body)
if err != nil {
l.Logger.Errorf("encrypt failed, err=%s", err.Error())
return nil, err
}
response := hex.EncodeToString(edata)
return &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
Data: response,
}, nil
}
......@@ -4,11 +4,9 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/tail"
"context"
"encoding/base64"
"fmt"
"strconv"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
......@@ -37,31 +35,30 @@ func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.CommonResp, err err
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
opRes := 1
pwd, internalErr := base64.StdEncoding.DecodeString(req.Password)
if internalErr != nil {
err = fmt.Errorf("password is not base64")
errorcode.RequestErrorParameters.BuildResult(resp, err)
errorcode.RequestErrorParameters.BuildResult(resp, internalErr)
l.Logger.Errorf("pwd=%s [%s] [%s]", req.Password, err.Error(), internalErr.Error())
return resp, nil
}
req.Password = string(pwd)
userInfo, internalErr := db.CheckUser(req.Phone, req.Password, int64(0))
userInfo, internalErr := db.CheckUser(req.PhoneNumber, req.Password, int64(0))
if internalErr != nil {
errorcode.UserLoginError.BuildResult(resp, err)
if internalErr.Error() == "record not found" {
errorcode.UserLoginError.BuildResult(resp, fmt.Errorf("用户不存在"))
} else {
errorcode.UserLoginError.BuildResult(resp, internalErr)
}
l.Logger.Errorf("CheckUser failed, internalErr=%s", internalErr.Error())
return resp, nil
}
defer func() {
tail.InsertOperation(tail.Login, "", &middleware.TokenUser{Id: strconv.FormatInt(userInfo.UserID, 10), UserName: userInfo.UserName}, opRes)
}()
if userInfo.State != 1 {
err = fmt.Errorf("user already disabled")
errorcode.UserLoginError.BuildResult(resp, err)
errorcode.UserLoginError.BuildResult(resp, fmt.Errorf("当前用户不可用"))
l.Logger.Errorf("user is not enable, internalErr")
opRes = 2
return resp, nil
}
didInfo, err := db.FindDidInfo()
......@@ -74,38 +71,65 @@ func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.CommonResp, err err
did = didInfo.Did
}
enterpriseCName := ""
enterInfo, err := db.FindEnterpriseInfoById(userInfo.EnterpriseID)
if err != nil {
l.Logger.Errorf("FindEnterprise Info failed, err=%s", err.Error())
}
if enterInfo != nil {
enterpriseCName = enterInfo.EnterpriseCName
}
address := ""
keyInfo, err := db.FindKeyInfoByEnable()
if err != nil && err.Error() != "record not found" {
l.Logger.Errorf("Find enable key failed, err=%s", err.Error())
}
if keyInfo != nil {
address = keyInfo.Address
}
enterpriseName := userInfo.EnterpriseName
enCert, err := db.FindEnterpriseCertInfoByEnterId(userInfo.EnterpriseID)
if err != nil && err.Error() != "record not found" {
errorcode.UserLoginError.BuildResult(resp)
l.Logger.Errorf("FindEnterpriseCertInfoByEnterId [%d] failed, internalErr=%s", userInfo.EnterpriseID, internalErr.Error())
return resp, nil
}
if enCert != nil {
enterpriseName = enCert.EnterpriseName
}
tokenS := &middleware.JsonWebToken{
User: &middleware.TokenUser{
Id: fmt.Sprintf("%d", userInfo.UserID),
UserName: userInfo.UserName,
EnterpriseName: userInfo.EnterpriseName,
MemberType: userInfo.MemberType,
EnterpriseDid: did,
UserPhoneName: userInfo.PhoneNumber,
EnterpriseId: userInfo.EnterpriseID,
Type: 1,
EnableAddress: keyInfo.Address,
Id: fmt.Sprintf("%d", userInfo.UserID),
UserName: userInfo.UserName,
EnterpriseName: enterpriseName,
MemberType: userInfo.MemberType,
EnterpriseDid: "",
UserPhoneName: userInfo.PhoneNumber,
EnterpriseId: userInfo.EnterpriseID,
EnterpriseCName: enterpriseCName,
Type: 1,
EnableAddress: address,
},
}
internalErr = tokenS.GenerateJwtToken()
if internalErr != nil {
opRes = 2
errorcode.TokenGenerateError.BuildResult(resp, internalErr)
l.Logger.Errorf("GenerateJwtToken failed, internalErr=%s", internalErr.Error())
return resp, nil
}
loginResp := types.LoginResp{
loginResp := &types.LoginResp{
AccessToken: tokenS.Token,
ExpiresIn: time.Now().Unix() + l.svcCtx.Config.Jwt.ExpiresTime,
UserId: userInfo.UserID,
Did: did,
Username: userInfo.EnterpriseName,
UserName: userInfo.UserName,
EnterpriseCName: enterpriseCName,
MemberType: userInfo.MemberType,
IsOperatingCenter: l.svcCtx.Config.IsOperatorCenter,
IsFirst: userInfo.IsFirst,
......
package login
import (
"context"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type LoginOldLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewLoginOldLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginOldLogic {
return &LoginOldLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *LoginOldLogic) LoginOld(req *types.LoginReq) (resp *types.CommonResp, err error) {
// todo: add your logic here and delete this line
return
}
......@@ -68,11 +68,18 @@ func (l *RegisterLogic) Register(req *types.RegisterReq) (resp *types.CommonResp
l.Logger.Errorf("phone number is invalid, phone=%s", req.PhoneNumber)
return resp, nil
}
// 保证只能不存在用户时,才能通过注册接口注册
_, count, err := db.GetUserInfos("", 0, 10, 0)
if count != 0 {
errorcode.UserAlreadyExistError.BuildResult(resp)
l.Logger.Errorf("already exist user,can not register, phone=%s", req.PhoneNumber)
return resp, nil
}
// 用户是否存在检查
userInfo, err := db.CheckUser(req.PhoneNumber, req.Password, int64(0))
if userInfo != nil || err.Error() != "record not found" {
err = fmt.Errorf("phone number has already used or happy err[%s]", err)
errorcode.RegisterErrorUserExist.BuildResult(resp, err)
l.Logger.Errorf("phone number has already used or happy err[%s]", err)
errorcode.RegisterErrorPhoneNumberExist.BuildResult(resp)
return resp, nil
}
......@@ -97,7 +104,7 @@ func (l *RegisterLogic) Register(req *types.RegisterReq) (resp *types.CommonResp
EnterpriseName: "",
PhoneNumber: req.PhoneNumber,
Password: password,
MemberType: int(0),
MemberType: int(1),
State: int(1),
StartTime: time.Now(),
}
......
......@@ -38,7 +38,7 @@ func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.CommonResp, err err
tokenS := &middleware.JsonWebToken{
User: &middleware.TokenUser{
UserName: req.Phone,
UserName: req.PhoneNumber,
},
}
......@@ -56,6 +56,6 @@ func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.CommonResp, err err
}
resp.Data = loginResp
// TODO record login to db
logx.Infof("Login username %s", req.Phone)
logx.Infof("Login username %s", req.PhoneNumber)
return
}
package manager
import (
"chainmaker.org/chainmaker/opennet/servicecommon/res/code"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"strings"
"chainweaver.org.cn/chainweaver/did/core"
"chainweaver.org.cn/chainweaver/did/core/crypto"
"chainweaver.org.cn/chainweaver/did/did-kms/kms"
......@@ -10,21 +15,17 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/logic/authority"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"google.golang.org/grpc/metadata"
"strings"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"chainweaver.org.cn/chainweaver/servicecommon/res/code"
"google.golang.org/grpc/metadata"
"github.com/zeromicro/go-zero/core/logx"
)
const OperatorCenterDID = "did:cndid:cndid"
type AddDidLogic struct {
logx.Logger
ctx context.Context
......@@ -60,19 +61,48 @@ func (l *AddDidLogic) AddDid(req *types.KeyPairReq) (resp *types.CommonResp, err
pkPem, _ := privateKey.PublicKey().String()
address, _ := utils.ComputeEVMAddressFromPKPEM([]string{pkPem})
// check did 是否已经绑定
did, err := db.FindDidInfo()
if err != nil && err.Error() != "record not found" {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
logx.Errorf("did [%s] has exist", address[0])
return resp, nil
}
if did != nil {
errorcode.DidAlreadyExistError.BuildResult(resp)
logx.Errorf("did has exist,dup add did")
return resp, nil
}
//去运营端根据did address查询did,以及实名vc信息
targetUrl := config.ConfigIns.Service.Did + utils.DIdGetDocumentByAddressUrl
proxy := config.ConfigIns.Service.DidProxy
docReq := &utils.DocumentGetByAddressRequest{Address: address[0]}
document, err := utils.GetDocument(targetUrl, docReq)
document, err := utils.GetDocument(targetUrl, proxy, docReq)
if err != nil {
if strings.Contains(err.Error(), "record not found") {
errorcode.DidIsNotExistError.BuildResult(resp)
logx.Errorf("get [%s] vc by address of remote did service, err[%s]", address[0], err.Error())
return resp, nil
}
errorcode.DocumentRequestError.BuildResult(resp, err)
logx.Errorf("get [%s] document by address of remote did service, err[%s]", address[0], err.Error())
return resp, nil
}
// 运营平台 did 必须是固定的
if config.ConfigIns.IsOperatorCenter == 1 {
if document.Id != OperatorCenterDID {
err = fmt.Errorf("add operationCenter did failed,did id expected [%s],but get [%s]", OperatorCenterDID, document.Id)
errorcode.OperationCenterErrorDid.BuildResult(resp, err)
logx.Errorf(err.Error())
return resp, nil
}
}
//去远端拉取vc信息,并将vc信息存储
proxy = config.ConfigIns.Service.DidProxy
targetUrl = config.ConfigIns.Service.Did + utils.VcListUser
vcByte, err := utils.GetRealNameVc(targetUrl, document.Id)
vcByte, err := utils.GetRealNameVc(targetUrl, proxy, document.Id)
if err != nil {
errorcode.DocumentRequestError.BuildResult(resp, err)
logx.Errorf("get [%s] vc by address of remote did service, err[%s]", address[0], err.Error())
......@@ -96,15 +126,11 @@ func (l *AddDidLogic) AddDid(req *types.KeyPairReq) (resp *types.CommonResp, err
}
token := l.ctx.Value("claims").(*middleware.TokenUser)
// 2. 记录到数据库
opFromDate, _ := time.Parse(time.RFC3339, "1900-01-01T00:00:00Z")
opToDate, _ := time.Parse(time.RFC3339, "1900-01-01T00:00:00Z")
if enterAuthority.Opfrom != "" {
opFromDate, _ = time.Parse(time.RFC3339, enterAuthority.Opfrom)
}
if enterAuthority.Opto != "" {
opToDate, _ = time.Parse(time.RFC3339, enterAuthority.Opto)
}
opFromDate := utils.ParseAndFormatTime(enterAuthority.Opfrom)
opToDate := utils.ParseAndFormatTime(enterAuthority.Opto)
enterC := &db.EnterpriseCertInfo{
EnterpriseID: token.EnterpriseId,
EnterpriseName: enterAuthority.Entname,
......@@ -200,7 +226,7 @@ func (l *AddDidLogic) AddKeyPair(req *types.KeyPairReq) (*kms.AddKeyPairResponse
in := &kms.AddKeyPairRequest{
PrivateKey: req.PrivateKey,
Mnemonic: strings.Split(req.Mnemonic, ","),
Mnemonic: strings.Split(req.Mnemonic, " "),
}
// 在请求头中设置自定义参数
......
......@@ -39,39 +39,43 @@ func (l *AuthenticationLogic) Authentication(req *types.AuthenticationReq) (resp
// 2. 将结果记录到数据库
// 3. 返回结果
targetUrl := config.ConfigIns.Service.Authority + utils.AuthenticationUrl
proxy := config.ConfigIns.Service.AuthorityProxy
info, err := utils.Authentication(targetUrl, req)
info, err := utils.Authentication(targetUrl, proxy, req)
if err != nil || info != 1 {
errorcode.EnterpriseAuthenticationError.BuildResult(resp, err)
l.Errorf("EnterpriseAuthenticationError failed,err[%s]", err.Error())
errorcode.RealNameAuthVerifyError.BuildResult(resp)
l.Errorf("EnterpriseAuthenticationError failed,err[%+v]", err)
return resp, nil
}
// 验证企业是否已经注册过did
targetUrl = config.ConfigIns.Service.Authority + utils.FindDidByCompanyNameUrl
did, err := utils.FindDidByCompanyName(targetUrl, struct {
proxy = config.ConfigIns.Service.AuthorityProxy
did, err := utils.FindDidByCompanyName(targetUrl, proxy, struct {
CompanyName string `json:"companyName"`
}{
CompanyName: req.EnterpriseName,
})
if did != "" {
authResp.Result = 2
errorcode.EnterpriseDupRegisterDidError.BuildResult(resp, err)
//errorcode.EnterpriseDupRegisterDidError.BuildResult(resp, err)
resp.Data = authResp
resp.Msg = "机构已注册过did"
return resp, nil
}
if err != nil && !strings.Contains(err.Error(), "record not found") {
authResp.Result = 3
errorcode.EnterpriseAuthenticationError.BuildResult(resp, err)
errorcode.RealNameAuthVerifyError.BuildResult(resp, err)
l.Errorf("FindDidByCompanyName[%s] failed,err[%s]", req.EnterpriseName, err.Error())
resp.Data = authResp
return resp, nil
}
authResp.Data = &utils.EnterRealNameAuthInfo{
Entname: req.EnterpriseName,
Uniscid: req.Uniscid,
LegalName: req.LegalName,
Entname: req.EnterpriseName,
Uniscid: req.Uniscid,
LegalName: req.LegalName,
LegalIDCard: req.LegalIDCard,
}
resp.Data = authResp
......
......@@ -10,6 +10,7 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"fmt"
"net/url"
"github.com/zeromicro/go-zero/core/logx"
)
......@@ -38,22 +39,40 @@ func (l *AuthorityApplyLogic) AuthorityApply(req *types.ApplyReq) (resp *types.C
enterCertInfo, err := db.FindEnterpriseCertInfoByEnterId(token.EnterpriseId)
if err != nil {
err = fmt.Errorf("find enterpriseCertInfo failed, err[%s]", err.Error())
errorcode.MysqlErrorQuery.BuildResult(resp, err)
errorcode.EnterpriseRealNameQueryError.BuildResult(resp)
l.Errorf(err.Error())
return resp, nil
}
// 将orgId信息写入
enterInfo, err := db.FindEnterpriseInfoById(token.EnterpriseId)
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
errorcode.EnterpriseRealNameQueryError.BuildResult(resp)
l.Errorf("find enterprise info failed,err[%s]", err.Error())
return resp, nil
}
// 检查ServiceEndpoint 结构
_, err = url.ParseRequestURI(req.ServiceEndpoint)
if err != nil {
errorcode.RequestErrorParametersFormat.BuildResult(resp, fmt.Errorf("ServiceEndpoint must is url"))
l.Errorf("parse serviceEndpoint failed,err[%s]", err.Error())
return resp, nil
}
didInfo, err := db.FindDidInfoByEnterpriseID(token.EnterpriseId)
if err != nil && err.Error() != "record not found" {
l.Logger.Errorf("FindDidInfo failed, err=%s", err.Error())
}
did := ""
if didInfo != nil {
did = didInfo.Did
}
authReq := &types.AuthorityRegisterReq{
enterInfo.EnterpriseCName,
enterInfo.EnterpriseEName,
token.EnterpriseDid,
did,
0,
req.Name,
req.Phone,
......@@ -63,19 +82,44 @@ func (l *AuthorityApplyLogic) AuthorityApply(req *types.ApplyReq) (resp *types.C
}
targetUrl := config.ConfigIns.Service.Authority + utils.AddAuthorityUrl
orgId, err := utils.AddAuthorityInfo(targetUrl, authReq)
proxy := config.ConfigIns.Service.AuthorityProxy
orgId, err := utils.AddAuthorityInfo(targetUrl, proxy, authReq)
if err != nil {
errorcode.AddAuthorityError.BuildResult(resp, err)
l.Errorf("find authority info failed,err[%s]", err.Error())
return resp, nil
}
//这里需要先检查是否已经创建联系人了,如果已经创建,我们将更新。而不是create
contacts, err := db.FindContactsInfo()
if err != nil && err.Error() != utils.RecordNotFound {
l.Errorf("find contacts info failed,err[%s]", err.Error())
}
//创建联系人
id := int64(0)
if contacts != nil {
id = contacts.Id
}
contacts = &db.ContactsInfo{
Id: id,
OrgId: orgId,
UserName: req.Name,
PhoneNumber: req.Phone,
Email: req.Email,
ServiceEndpoint: req.ServiceEndpoint,
}
err = db.SaveTable(contacts)
if err != nil {
l.Errorf("create contacts info failed,err[%s]", err.Error())
}
enterInfo.OrgId = orgId
err = db.UpdateEnterpriseInfo(enterInfo)
if err != nil {
errorcode.MysqlErrorUpdate.BuildResult(resp, err)
//errorcode.MysqlErrorUpdate.BuildResult(resp, err)
l.Errorf("update enterprise info failed,err[%s]", err.Error())
return resp, nil
//return resp, nil
}
return resp, nil
......
......@@ -10,7 +10,6 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"fmt"
"github.com/zeromicro/go-zero/core/logx"
)
......@@ -29,7 +28,20 @@ func NewAuthorityCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Au
}
type AuthCheckResp struct {
State int `json:"state"` //1 表示未申请 2.表示申请审核中 3.表示申请未通过 4.表示申请已通过 5. 表示已经禁用
State int `json:"state"` //1 表示未申请 2.表示申请审核中 3.表示申请未通过 4.表示申请已通过 5. 表示已经禁用
ApplyInfo *ApplyInfo `json:"applyInfo"`
}
type ApplyInfo struct {
Name string `json:"name"`
Phone string `json:"phone"`
Email string `json:"email"`
ServiceEndpoint string `json:"serviceEndpoint"`
}
type IssuerSetReq struct {
Did string `json:"did"`
Name string `json:"name"`
SvcEndpoint string `json:"svcEndpoint"`
}
// AuthorityCheck 检查当前用户是否已经进行了颁证机构申请,以及最新的状态
......@@ -41,23 +53,38 @@ func (l *AuthorityCheckLogic) AuthorityCheck() (resp *types.CommonResp, err erro
// 查询本地数据库,检查本地颁证机构状态
var enterInfo *db.EnterpriseInfo
token := l.ctx.Value("claims").(*middleware.TokenUser)
if token.EnterpriseDid == "" {
token.EnableAddress, token.EnterpriseDid = db.UpdateTokenUser(token.EnableAddress, token.EnterpriseDid)
}
enterInfo, err = db.FindEnterpriseInfoById(token.EnterpriseId)
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
l.Logger.Errorf("query enterprise info failed,err[%s]", err.Error())
return resp, nil
}
authCheckResp := &AuthCheckResp{}
if enterInfo.OrgId == 0 { //TODO 修改int 为string
if enterInfo.OrgId == 0 {
authCheckResp.State = 1
} else if enterInfo.IsIssuer == 2 {
resp.Data = authCheckResp
return resp, nil
}
contactsInfo, err := db.FindContactsInfoByOrgId(enterInfo.OrgId)
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
l.Logger.Errorf("query contacts failed, err=%s", err.Error())
return resp, nil
}
if enterInfo.IsIssuer == 2 {
authCheckResp.State = 4
} else {
// 去机构方进行申请状态查询
targetUrl := config.ConfigIns.Service.Authority + utils.QueryAuthorityUrl
proxy := config.ConfigIns.Service.AuthorityProxy
// res 1.待审核 2.审核通过 3.审核驳回 4.已禁用
res, err := utils.QueryAuthorityInfo(targetUrl, struct {
res, err := utils.QueryAuthorityInfo(targetUrl, proxy, struct {
OrgId int64 `json:"orgId"`
}{OrgId: enterInfo.OrgId})
......@@ -75,7 +102,32 @@ func (l *AuthorityCheckLogic) AuthorityCheck() (resp *types.CommonResp, err erro
err = db.UpdateEnterpriseInfo(enterInfo)
if err != nil {
l.Logger.Errorf("update enterprise info to db failed, err=%s", err.Error())
} else {
if token.EnterpriseName == "" {
certInfo, err := db.FindEnterpriseCertInfoByEnterId(token.EnterpriseId)
if err != nil && err.Error() != "record not found" {
logx.Errorf("FindEnterpriseCertInfoByEnterId failed, err=%s", err.Error())
errorcode.SystemInternalError.BuildResult(resp, fmt.Errorf("请稍后重试"))
return resp, nil
}
if certInfo != nil {
token.EnterpriseName = certInfo.EnterpriseName
}
}
// invoke issuer service interface for setting did info
setReq := &IssuerSetReq{
Did: token.EnterpriseDid,
Name: token.EnterpriseName,
SvcEndpoint: contactsInfo.ServiceEndpoint,
}
targetUrl = config.ConfigIns.Service.Issuer + utils.IssuerInfoSetting
_, err := utils.IssuerServerReq(targetUrl, setReq)
if err != nil {
l.Logger.Errorf("invoke issuer service setting interface failed, err=%s", err.Error())
}
}
} else if res == 3 {
authCheckResp.State = 3
} else { //禁用
......@@ -88,6 +140,12 @@ func (l *AuthorityCheckLogic) AuthorityCheck() (resp *types.CommonResp, err erro
}
}
authCheckResp.ApplyInfo = &ApplyInfo{
Name: contactsInfo.UserName,
Email: contactsInfo.Email,
Phone: contactsInfo.PhoneNumber,
ServiceEndpoint: contactsInfo.ServiceEndpoint,
}
resp.Data = authCheckResp
return resp, nil
}
......@@ -10,8 +10,8 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"fmt"
"github.com/zeromicro/go-zero/core/logx"
"net/url"
)
type AuthorityUpdateLogic struct {
......@@ -42,11 +42,32 @@ func (l *AuthorityUpdateLogic) AuthorityUpdate(req *types.ApplyReq) (resp *types
l.Errorf("find enterprise info failed,err[%s]", err.Error())
return resp, nil
}
// 检查ServiceEndpoint 结构
if req.ServiceEndpoint != "" {
_, err = url.ParseRequestURI(req.ServiceEndpoint)
if err != nil {
errorcode.RequestErrorParametersFormat.BuildResult(resp, fmt.Errorf("ServiceEndpoint must is url"))
l.Errorf("parse serviceEndpoint failed,err[%s]", err.Error())
return resp, nil
}
}
//如果orgId为0 说明还没有申请组织信息,我们需要把它的信息记录到本地。
if enterInfo.OrgId == 0 {
errorcode.PrivilegeError.BuildResult(resp, fmt.Errorf("issuer organization hasn't applied yet"))
contacts := &db.ContactsInfo{
UserName: req.Name,
PhoneNumber: req.Phone,
Email: req.Email,
ServiceEndpoint: req.ServiceEndpoint,
}
err = db.SaveTable(contacts)
if err != nil {
l.Errorf("create contacts info failed,err[%s]", err.Error())
}
return resp, nil
}
authReq := &types.AuthorityRegisterReq{
enterInfo.EnterpriseCName,
enterInfo.EnterpriseEName,
......@@ -60,12 +81,34 @@ func (l *AuthorityUpdateLogic) AuthorityUpdate(req *types.ApplyReq) (resp *types
}
targetUrl := config.ConfigIns.Service.Authority + utils.AddAuthorityUrl
_, err = utils.AddAuthorityInfo(targetUrl, authReq)
proxy := config.ConfigIns.Service.AuthorityProxy
_, err = utils.AddAuthorityInfo(targetUrl, proxy, authReq)
if err != nil {
errorcode.AddAuthorityError.BuildResult(resp, err)
l.Errorf("find authority info failed,err[%s]", err.Error())
return resp, nil
}
contacts, err := db.FindContactsInfoByOrgId(enterInfo.OrgId)
if err != nil {
l.Errorf("find contacts info failed,err[%s]", err.Error())
}
if req.Phone != "" {
contacts.PhoneNumber = req.Phone
}
if req.Email != "" {
contacts.Email = req.Email
}
if req.ServiceEndpoint != "" {
contacts.ServiceEndpoint = req.ServiceEndpoint
}
if req.Name != "" {
contacts.UserName = req.Name
}
err = db.UpdateContactsInfo(contacts)
if err != nil {
l.Errorf("update contacts info failed,err[%s]", err.Error())
}
return
}
package manager
import (
"chainmaker.org/chainmaker/opennet/servicecommon/res/code"
"context"
"fmt"
"strconv"
"strings"
"chainweaver.org.cn/chainweaver/did/did-kms/kms"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"context"
"fmt"
"strconv"
"strings"
"chainweaver.org.cn/chainweaver/servicecommon/res/code"
"github.com/zeromicro/go-zero/core/logx"
)
......@@ -64,10 +65,10 @@ func (l *BackupsLogic) Backups(req *types.BackupsKayReq) (resp *types.CommonResp
}
}
resp.Data = struct {
PrivateKey string `json:"private_key"`
PrivateKey string `json:"privateKey"`
Mnemonic string `json:"mnemonic"`
}{
kmsRes.Data.PrivateKey, strings.Join(kmsRes.Data.Mnemonic, ","),
kmsRes.Data.PrivateKey, strings.Join(kmsRes.Data.Mnemonic, " "),
}
return resp, nil
}
......
......@@ -49,7 +49,7 @@ func (l *CheckLogic) Check(req *types.AuthorityCheckReq) (resp *types.CommonResp
id, _ := strconv.ParseInt(userId, 10, 64)
_, internalErr = db.CheckUser("", req.Password, id)
if internalErr != nil {
errorcode.UserLoginError.BuildResult(resp, err)
errorcode.PasswordError.BuildResult(resp)
l.Logger.Errorf("CheckUser failed, internalErr[%s]", internalErr.Error())
return resp, nil
}
......
package manager
import (
"chainweaver.org.cn/chainweaver/did/core/crypto"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"encoding/base64"
"fmt"
"github.com/test-go/testify/require"
"testing"
"time"
)
var (
sk = []byte(`-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgV4llBon6Q9B3D6a8
qSbllHygpFrLAIyzyutaECopZq6gCgYIKoEcz1UBgi2hRANCAAQVxKKDqPfoS/zl
vCuq8SVDdU0usvXWzik4hF7p+Qw1uyW8Dk43nY4JlStPDb5DhvEz7CckImgDeQSZ
049kXuC5
-----END PRIVATE KEY-----
`)
plaintext = `{"@context":["https://www.w3.org/ns/did/v1"],"authentication":["did:cnbn:010d295c105845aba89771dc9c37dd50#key-1"],"controller":["did:cnbn:cnbn","did:cnbn:010d295c105845aba89771dc9c37dd50"],"created":"2024-06-17T17:55:40+08:00","id":"did:cnbn:010d295c105845aba89771dc9c37dd50","service":[null],"updated":"2024-06-17T17:55:40+08:00","verificationMethod":[{"address":"3c09ba119b36c59dd41eaf58baab0b5a2d89e2f2","controller":"did:cnbn:010d295c105845aba89771dc9c37dd50","id":"did:cnbn:010d295c105845aba89771dc9c37dd50#key-1","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFcSig6j36Ev85bwrqvElQ3VNLrL1\n1s4pOIRe6fkMNbslvA5ON52OCZUrTw2+Q4bxM+wnJCJoA3kEmdOPZF7guQ==\n-----END PUBLIC KEY-----\n","type":"SM2VerificationKey"}]}`
)
func TestRegisterDocument(t *testing.T) {
privateKey, err := crypto.ParsePrivateKeyFromPEM([]byte(sk))
require.Equal(t, err, nil)
sign, err := crypto.Sign(privateKey, []byte(plaintext))
require.Equal(t, err, nil)
proof := &Proof{
Created: time.Now().Format(time.RFC3339),
Type: "SM2Signature",
ProofValue: base64.StdEncoding.EncodeToString(sign),
VerificationMethod: "did:cnbn:010d295c105845aba89771dc9c37dd50#key-1",
}
didDoc := &db.DidInfo{
Did: "did:cnbn:010d295c105845aba89771dc9c37dd50",
DocumentPlaintext: plaintext,
EnterpriseID: 1,
}
// 2.2 使用签名信息进行注册,did 返回realname vc
doc, err := registerDocument(didDoc, proof, &utils.EnterRealNameAuthInfo{})
require.Equal(t, err, nil)
fmt.Printf("resp %+v", doc)
fmt.Printf("resp %+v", doc.VC)
}
package manager
import (
"chainmaker.org/chainmaker/opennet/servicecommon/res/code"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"strings"
"time"
"chainweaver.org.cn/chainweaver/did/core"
"chainweaver.org.cn/chainweaver/did/core/crypto"
"chainweaver.org.cn/chainweaver/did/did-kms/kms"
......@@ -10,12 +17,7 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"time"
"chainweaver.org.cn/chainweaver/servicecommon/res/code"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
......@@ -68,6 +70,13 @@ func (l *CreateDidLogic) CreateDid(req *types.CreateDIdReq) (resp *types.CommonR
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
// 运营平台 did 必须是固定的
if config.ConfigIns.IsOperatorCenter == 1 {
err = fmt.Errorf("OperationCenter can not create did")
errorcode.OperationCenterErrorDid.BuildResult(resp, err)
logx.Errorf(err.Error())
return resp, nil
}
// 首先进行实名
token := l.ctx.Value("claims").(*middleware.TokenUser)
......@@ -85,13 +94,44 @@ func (l *CreateDidLogic) CreateDid(req *types.CreateDIdReq) (resp *types.CommonR
return resp, err
}
pkPem, _ := privateKey.PublicKey().String()
address, _ := utils.ComputeEVMAddressFromPKPEM([]string{pkPem})
//去运营端根据did address查询did,以及实名vc信息
proxy := config.ConfigIns.Service.DidProxy
targetUrl := config.ConfigIns.Service.Did + utils.DIdGetDocumentByAddressUrl
docReq := &utils.DocumentGetByAddressRequest{Address: address[0]}
qdoc, err := utils.GetDocument(targetUrl, proxy, docReq)
if err != nil && !strings.Contains(err.Error(), "record not found") {
errorcode.DocumentRequestError.BuildResult(resp, err)
logx.Errorf("get [%s] document by address of remote did service, err[%s]", address[0], err.Error())
return resp, nil
}
if qdoc != nil {
errorcode.DidPrivateKeyUsageError.BuildResult(resp)
logx.Errorf("address[%s] document[%s] already exist", address[0], qdoc.Id)
return resp, nil
}
// check did 是否已经绑定
did, err := db.FindDidInfo()
if err != nil && err.Error() != "record not found" {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
logx.Errorf("did [%s] has exist", address[0])
return resp, nil
}
if did != nil {
errorcode.DidPrivateKeyUsageError.BuildResult(resp)
logx.Errorf("did has exist,dup add did")
return resp, nil
}
getDocumentReq := &GetDocumentReq{
PublicKey: []string{pkPem},
}
param, _ := json.Marshal(getDocumentReq)
targetUrl := config.ConfigIns.Service.Did + utils.DIdCreateGenerateUrl
respBz, internalErr := utils.DidServerReq(targetUrl, "", http.MethodPost, param)
targetUrl = config.ConfigIns.Service.Did + utils.DIdCreateGenerateUrl
proxy = config.ConfigIns.Service.DidProxy
respBz, internalErr := utils.DidServerReq(targetUrl, proxy, http.MethodPost, param)
if internalErr != nil {
errorcode.DocumentGenerateError.BuildResult(resp, internalErr)
l.Logger.Errorf("generate document of did service failed, internalErr=%s", internalErr.Error())
......@@ -104,7 +144,7 @@ func (l *CreateDidLogic) CreateDid(req *types.CreateDIdReq) (resp *types.CommonR
l.Logger.Errorf("GetDocument didResp json.Unmarshal failed.err = %s", internalErr.Error())
return resp, err
}
if didResp.Code != code.CodeOk.Int32() { //TODO 这里比较奇怪
if didResp.Code != code.CodeOk.Int32() {
errorcode.DocumentRequestError.BuildResult(resp, fmt.Errorf("didResp.Code != 200000"))
l.Logger.Errorf("GetDocument didResp.Code != 200000.didResp = %v", *didResp)
return resp, err
......@@ -199,6 +239,22 @@ func (l *CreateDidLogic) CreateDid(req *types.CreateDIdReq) (resp *types.CommonR
logx.Errorf("create enterpriseCerrt info failed.err[%s]", err.Error())
return resp, err
}
// 更新 enterprise 实名状态
enterInfo, err := db.FindEnterpriseInfoById(token.EnterpriseId)
if err != nil {
errorcode.MysqlErrorQuery.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
}
enterInfo.CertificationState = 1
err = db.UpdateEnterpriseInfo(enterInfo)
if err != nil {
errorcode.MysqlErrorInsertInfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
}
// 将did document信息保存至kms
_, err = AddDidInfo(l.svcCtx.KmsClient, didResp.Data.Plaintext, document.Document.Id)
if err != nil {
......@@ -280,11 +336,14 @@ func registerDocument(didDoc *db.DidInfo, proof *Proof, cert *utils.EnterRealNam
Proof: proof,
}
opFromDate := utils.ParseAndFormatTime(cert.Opfrom)
opToDate := utils.ParseAndFormatTime(cert.Opto)
didRegisterProof.Issue = &Issue{}
didRegisterProof.Issue.TemplateId = enterpriseTemplateId
didRegisterProof.Issue.ExpirationDate = time.Now().AddDate(3,
0, 0).Format(time.RFC3339)
didRegisterProof.Issue.IssuanceDate = time.Now().Format(time.RFC3339)
didRegisterProof.Issue.IssuanceDate = time.Now().Format(time.DateOnly)
didRegisterProof.Issue.CredentialSubject = &CredentialSubject{}
didRegisterProof.Issue.CredentialSubject.CertificateName = "企业实名认证证书"
didRegisterProof.Issue.CredentialSubject.Dom = cert.Dom
......@@ -293,15 +352,15 @@ func registerDocument(didDoc *db.DidInfo, proof *Proof, cert *utils.EnterRealNam
didRegisterProof.Issue.CredentialSubject.LegalName = cert.LegalName
didRegisterProof.Issue.CredentialSubject.Licencesn = cert.Licencesn
didRegisterProof.Issue.CredentialSubject.Operator = ""
didRegisterProof.Issue.CredentialSubject.Opfrom = cert.Opfrom
didRegisterProof.Issue.CredentialSubject.Opfrom = opFromDate
didRegisterProof.Issue.CredentialSubject.Opscope = cert.Opscope
didRegisterProof.Issue.CredentialSubject.Opto = cert.Opto
didRegisterProof.Issue.CredentialSubject.Opto = opToDate
didRegisterProof.Issue.CredentialSubject.Uniscid = cert.Uniscid
param, _ := json.Marshal(didRegisterProof)
targetUrl := "https://36.112.40.10:41138" + utils.DIdRegisterUrl
respBz, internalErr := utils.DidServerReq(targetUrl, "", http.MethodPost, param)
targetUrl := config.ConfigIns.Service.Did + utils.DIdRegisterUrl
proxy := config.ConfigIns.Service.DidProxy
respBz, internalErr := utils.DidServerReq(targetUrl, proxy, http.MethodPost, param)
if internalErr != nil {
err := fmt.Errorf("RegisterDocument HttpServerReq failed, internalErr=%s", internalErr.Error())
return nil, err
......
package manager
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type DownloadGrantedAuthsLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewDownloadGrantedAuthsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DownloadGrantedAuthsLogic {
return &DownloadGrantedAuthsLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *DownloadGrantedAuthsLogic) DownloadGrantedAuths(req *types.DownloadGrantedAuthRecordsReq, tokenStr string) (resp *types.CommonResp, err error) {
resp = &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
startTime, endTime := convertTime(req.StartTime, req.EndTime)
if !startTime.IsZero() {
req.StartTime = startTime.Format(time.RFC3339)
}
if !endTime.IsZero() {
req.EndTime = endTime.Format(time.RFC3339)
}
token := l.ctx.Value("claims").(*middleware.TokenUser)
vp, err := createVp(req, token)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
// 调用holder
targetUrl := config.ConfigIns.Service.Holder + utils.HolderVpSignUrl
res, err := utils.VpSign(targetUrl, vp, tokenStr)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
// 调用tdh
proxy := config.ConfigIns.Service.TdhProxy
targetUrl = config.ConfigIns.Service.Tdh + utils.DownloadGrantedAuthsUrl
tdh, err := utils.TdhServerDownloadReq(targetUrl, proxy, res)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
resp.Data = tdh
// 将返回参数进行整理
return
}
package manager
import (
"chainmaker.org/chainmaker/opennet/servicecommon/res/code"
"chainweaver.org.cn/chainweaver/did/did-kms/kms"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"context"
"fmt"
"strconv"
"strings"
"chainweaver.org.cn/chainweaver/did/did-kms/kms"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/servicecommon/res/code"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
......@@ -51,10 +52,10 @@ func (l *DownloadKeyLogic) DownloadKey(req *types.BackupsKayReq) (resp *types.Co
return resp, nil
}
resp.Data = struct {
PrivateKey string `json:"private_key"`
PrivateKey string `json:"privateKey"`
Mnemonic string `json:"mnemonic"`
}{
kmsRes.Data.PrivateKey, strings.Join(kmsRes.Data.Mnemonic, ","),
kmsRes.Data.PrivateKey, strings.Join(kmsRes.Data.Mnemonic, " "),
}
token := l.ctx.Value("claims").(*middleware.TokenUser)
......
package manager
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type DownloadReceivedAuthsLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewDownloadReceivedAuthsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DownloadReceivedAuthsLogic {
return &DownloadReceivedAuthsLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *DownloadReceivedAuthsLogic) DownloadReceivedAuths(req *types.DownloadReceivedAuthRecordsReq, tokenStr string) (resp *types.CommonResp, err error) {
resp = &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
startTime, endTime := convertTime(req.StartTime, req.EndTime)
if !startTime.IsZero() {
req.StartTime = startTime.Format(time.RFC3339)
}
if !endTime.IsZero() {
req.EndTime = endTime.Format(time.RFC3339)
}
token := l.ctx.Value("claims").(*middleware.TokenUser)
if token.EnterpriseDid == "" {
token.EnableAddress, token.EnterpriseDid = db.UpdateTokenUser(token.EnableAddress, token.EnterpriseDid)
}
vp, err := createVp(req, token)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
// 调用holder
targetUrl := config.ConfigIns.Service.Holder + utils.HolderVpSignUrl
res, err := utils.VpSign(targetUrl, vp, tokenStr)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
// 调用tdh
proxy := config.ConfigIns.Service.TdhProxy
targetUrl = config.ConfigIns.Service.Tdh + utils.DownloadReceivedAuthsUrl
tdh, err := utils.TdhServerDownloadReq(targetUrl, proxy, res)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
resp.Data = tdh
// 将返回参数进行整理
return
}
......@@ -34,13 +34,14 @@ func (l *EnterpriseAuthNumberLogic) EnterpriseAuthNumber() (resp *types.CommonRe
Msg: types.SucceedMsg,
}
proxy := config.ConfigIns.Service.AuthorityProxy
targetUrl := config.ConfigIns.Service.Authority + utils.EnterpriseAuthNumberUrl
info, err := utils.EnterpriseAuthNumber(targetUrl)
info, err := utils.EnterpriseAuthNumber(targetUrl, proxy)
if err != nil {
errorcode.EnterpriseAuthNumberError.BuildResult(resp, err)
l.Errorf("EnterpriseAuthNumberError failed,err[%s]", err.Error())
return
return resp, nil
}
resp.Data = info.Data
return
return resp, nil
}
......@@ -9,7 +9,7 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"github.com/zeromicro/go-zero/core/logx"
"time"
"strings"
)
type EnterpriseAuthVerifyLogic struct {
......@@ -27,8 +27,8 @@ func NewEnterpriseAuthVerifyLogic(ctx context.Context, svcCtx *svc.ServiceContex
}
type AuthCacheInfo struct {
Result int // 1. 成功 2.企业已经注册过 did 3. 认证失败 4. wait
Data *utils.EnterRealNameAuthInfo
Result int `json:"result"` // 1. 成功 2.企业已经注册过 did 3. 认证失败 4. wait
Data *utils.EnterRealNameAuthInfo `json:"data"`
}
func (l *EnterpriseAuthVerifyLogic) EnterpriseAuthVerify(req *types.AuthVerifyReq) (resp *types.CommonResp, err error) {
......@@ -42,58 +42,61 @@ func (l *EnterpriseAuthVerifyLogic) EnterpriseAuthVerify(req *types.AuthVerifyRe
authResp := &AuthCacheInfo{
Result: 1,
}
proxy := config.ConfigIns.Service.AuthorityProxy
targetUrl := config.ConfigIns.Service.Authority + utils.EnterpriseAuthVerifyUrl
info, err := utils.EnterpriseAuthVerify(targetUrl, req)
info, err := utils.EnterpriseAuthVerify(targetUrl, proxy, req)
if err != nil {
errorcode.EnterpriseAuthVerifyError.BuildResult(resp, err)
l.Errorf("enterprise auth verify failed,err[%s]", err.Error())
return
return resp, nil
} else if info.Data.MessageHeader.ErrorCode != 0 {
authResp.Result = 4
resp.Msg = info.Data.MessageHeader.ErrorInfo
resp.Data = authResp
l.Errorf("enterprise auth verify res error code[%s],err info [%s]", info.Data.MessageHeader.ErrorCode, info.Data.MessageHeader.ErrorInfo)
return resp, nil
}
// 验证企业是否已经注册过did
targetUrl = config.ConfigIns.Service.Authority + utils.FindDidByCompanyNameUrl
did, err := utils.FindDidByCompanyName(targetUrl, struct {
proxy = config.ConfigIns.Service.DidProxy
targetUrl = config.ConfigIns.Service.Did + utils.FindDidByCompanyNameUrl
did, err := utils.FindDidByCompanyName(targetUrl, proxy, struct {
CompanyName string `json:"companyName"`
}{
CompanyName: info.Data.Entname,
CompanyName: info.Data.MessageContent.Entname,
})
if did != "" {
authResp.Result = 2
errorcode.EnterpriseDupRegisterDidError.BuildResult(resp, err)
//errorcode.EnterpriseDupRegisterDidError.BuildResult(resp, err)
resp.Data = authResp
return
return resp, nil
}
if err != nil {
if err != nil && !strings.Contains(err.Error(), "record not found") {
authResp.Result = 3
errorcode.EnterpriseAuthenticationError.BuildResult(resp, err)
l.Errorf("FindDidByCompanyName[%s] failed,err[%s]", info.Data.Entname, err.Error())
errorcode.EnterpriseDidRegisterError.BuildResult(resp, err)
l.Errorf("FindDidByCompanyName[%s] failed,err[%s]", info.Data.MessageContent.Entname, err.Error())
resp.Data = authResp
return
return resp, nil
}
authResp.Data = info.Data
authResp.Data = info.Data.MessageContent
resp.Data = authResp
return
return resp, nil
}
func createEnterCert(enterPriseId int64, vcPlaintext string, data *utils.EnterRealNameAuthInfo) error {
// 2. 记录到数据库
opFromDate, _ := time.Parse(time.RFC3339, "1900-01-01T00:00:00Z")
opToDate, _ := time.Parse(time.RFC3339, "1900-01-01T00:00:00Z")
if data.Opfrom != "" {
opFromDate, _ = time.Parse(time.RFC3339, data.Opfrom)
}
if data.Opto != "" {
opToDate, _ = time.Parse(time.RFC3339, data.Opto)
}
opFromDate := utils.ParseAndFormatTime(data.Opfrom)
opToDate := utils.ParseAndFormatTime(data.Opto)
enterC := &db.EnterpriseCertInfo{
EnterpriseID: enterPriseId,
EnterpriseName: data.Entname,
Uniscid: data.Uniscid,
LegalName: data.LegalName,
Dom: data.Dom,
LegalIDCard: "",
LegalIDCard: data.LegalIDCard,
LegalPhone: "",
EnterCardType: 1, // 企业证件类型
Opscope: data.Opscope, // 经营范围
......
......@@ -4,6 +4,7 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"fmt"
"strconv"
......@@ -30,10 +31,10 @@ func NewGetAccountCenterLogic(ctx context.Context, svcCtx *svc.ServiceContext) *
}
type AccountCenterResp struct {
UserInfo *AccountCenterUserInfoResp `json:"user_info"`
EnterpriseInfo *AccountCenterEnterpriseInfoResp `json:"enterprise_info"`
DidInfo *AccountCenterDidInfoResp `json:"did_info"`
ContractsInfo *AccountCenterContractsInfoResp `json:"contracts_info"`
UserInfo *AccountCenterUserInfoResp `json:"userInfo"`
EnterpriseInfo *AccountCenterEnterpriseInfoResp `json:"enterpriseInfo"`
DidInfo *AccountCenterDidInfoResp `json:"didInfo"`
ContactsInfo *AccountCenterContractsInfoResp `json:"contactsInfo"`
}
type AccountCenterUserInfoResp struct {
......@@ -44,6 +45,7 @@ type AccountCenterUserInfoResp struct {
Did string `json:"did"`
PhoneNumber string `json:"phoneNumber"`
Email string `json:"email"`
LogoImage string `json:"logoImage"`
}
type AccountCenterEnterpriseInfoResp struct {
......@@ -118,40 +120,59 @@ func Query(Id string, l logx.Logger) (resp *types.CommonResp, err error) {
return resp, nil
}
keyInfo, err := db.FindKeyInfoByEnable()
if err != nil {
err = fmt.Errorf("find enable keyinfo failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
if err.Error() == utils.RecordNotFound {
keyInfo = &db.KeyInfo{}
} else {
err = fmt.Errorf("find enable keyinfo failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
}
}
certInfo, err := db.FindEnterpriseCertInfoByEnterId(enterInfo.EnterpriseID)
if err != nil {
err = fmt.Errorf("find enterpriseCertinfo failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
if err.Error() == utils.RecordNotFound {
certInfo = &db.EnterpriseCertInfo{}
} else {
err = fmt.Errorf("find enterpriseCertinfo failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
}
}
//4.获得联系人info
contractsInfo, err := db.FindContactsInfoByUserId(userIdInt)
contractsInfo, err := db.FindContactsInfo()
if err != nil {
err = fmt.Errorf("find contracts info failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
if err.Error() == utils.RecordNotFound {
contractsInfo = &db.ContactsInfo{}
} else {
err = fmt.Errorf("find contracts info failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
}
}
didInfo, err := db.FindDidInfo()
if err != nil {
err = fmt.Errorf("find did info failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
if err.Error() == utils.RecordNotFound {
didInfo = &db.DidInfo{}
} else {
err = fmt.Errorf("find did info failed, err[%s]", err.Error())
errorcode.MysqlErrorQueryUserinfo.BuildResult(resp, err)
l.Errorf(err.Error())
return resp, nil
}
}
//5.组合
resp.Data = &AccountCenterResp{
dataResp := &AccountCenterResp{
UserInfo: &AccountCenterUserInfoResp{
EnterpriseCName: enterInfo.EnterpriseCName,
EnterpriseEName: enterInfo.EnterpriseEName,
......@@ -160,6 +181,7 @@ func Query(Id string, l logx.Logger) (resp *types.CommonResp, err error) {
Did: didInfo.Did,
PhoneNumber: userInfo.PhoneNumber,
Email: userInfo.Email,
LogoImage: enterInfo.LogoImages,
},
EnterpriseInfo: &AccountCenterEnterpriseInfoResp{
IsEnterprise: 1,
......@@ -170,17 +192,21 @@ func Query(Id string, l logx.Logger) (resp *types.CommonResp, err error) {
CardType: certInfo.CardType,
CertificationTime: certInfo.CreatedAt.Format(time.RFC3339),
LegalIDCard: certInfo.LegalIDCard,
License: certInfo.Licencesn,
License: certInfo.Uniscid, // 这里使用同一社会信用码
},
DidInfo: &AccountCenterDidInfoResp{
Address: keyInfo.Address,
EnterpriseDid: didInfo.Did,
},
ContractsInfo: &AccountCenterContractsInfoResp{
}
if contractsInfo != nil {
dataResp.ContactsInfo = &AccountCenterContractsInfoResp{
ContactsName: contractsInfo.UserName,
PhoneNumber: contractsInfo.PhoneNumber,
Email: contractsInfo.Email,
},
}
}
resp.Data = dataResp
return resp, nil
}
package manager
import (
"chainmaker.org/chainmaker/common/v2/random/uuid"
"chainweaver.org.cn/chainweaver/did/core"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/middleware"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"encoding/json"
"fmt"
"strconv"
"time"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type GrantedAuthorizedRecordsLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGrantedAuthorizedRecordsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GrantedAuthorizedRecordsLogic {
return &GrantedAuthorizedRecordsLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GrantedAuthorizedRecordsLogic) GrantedAuthorizedRecords(req *types.GrantedAuthorizedRecordsReq) (resp *types.CommonResp, err error) {
resp = &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
startTime, endTime := convertTime(req.StartTime, req.EndTime)
if !startTime.IsZero() {
req.StartTime = startTime.Format(time.RFC3339)
}
if !endTime.IsZero() {
req.EndTime = endTime.Format(time.RFC3339)
}
token := l.ctx.Value("claims").(*middleware.TokenUser)
if token.EnterpriseDid == "" {
token.EnableAddress, token.EnterpriseDid = db.UpdateTokenUser(token.EnableAddress, token.EnterpriseDid)
}
vp, err := createVp(req, token)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
// 调用holder
tokenS := &middleware.JsonWebToken{
User: token,
}
err = tokenS.GenerateJwtToken()
if err != nil {
errorcode.SystemInternalError.BuildResult(resp, fmt.Errorf("请稍后再试"))
l.Logger.Errorf("GenerateJwtToken failed, internalErr=%s", err.Error())
return resp, nil
}
targetUrl := config.ConfigIns.Service.Holder + utils.HolderVpSignUrl
res, err := utils.VpSign(targetUrl, vp, tokenS.Token)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
// 调用tdh
proxy := config.ConfigIns.Service.TdhProxy
targetUrl = config.ConfigIns.Service.Tdh + utils.GrantedAuthorizedRecordsUrl
tdh, err := utils.TdhServerReq(targetUrl, proxy, res)
if err != nil {
errorcode.MarshalOrUnMarshalError.BuildResult(resp, err)
l.Errorf("Unmarshal document failed,err[%s]", err.Error())
return resp, nil
}
resp.Data = tdh
// 将返回参数进行整理
return
}
func createVp(req interface{}, token *middleware.TokenUser) (vp *core.VerifiablePresentation, err error) {
extend, _ := json.Marshal(req)
id := time.Now().Format("200601021504050") + uuid.GetUUID()[:8]
expirationDate := time.Now().Add(time.Hour)
did, err := db.FindDidInfo()
if err != nil {
return nil, fmt.Errorf("query did failed,err[%s]", err.Error())
}
doc := &core.Document{}
err = json.Unmarshal([]byte(did.DocumentPlaintext), doc)
if err != nil {
return nil, fmt.Errorf("unmarshal document failed,err[%s]", err.Error())
}
verificationMethod := ""
for _, vm := range doc.VerificationMethod {
if vm.Address == token.EnableAddress {
verificationMethod = vm.Id
break
}
}
proof := core.NewProof(core.ProofTypeSM2Signature, core.ProofPurpose, verificationMethod, "", nil, nil, nil)
// 构建vp
vp = core.NewVerifiablePresentationBytesExtend(
[]string{"https://cnbn.org.cn/ns/vp/v2"},
id,
"",
core.VPType,
"",
nil,
[]*core.Proof{proof},
expirationDate,
extend,
)
return vp, nil
}
func convertTime(startT, endT string) (startTime, endTime time.Time) {
startTime = time.Time{}
starUni, _ := strconv.ParseInt(startT, 10, 0)
if starUni != 0 {
startTime = time.Unix(starUni, 0)
}
endTime = time.Time{}
endUni, _ := strconv.ParseInt(endT, 10, 0)
if endUni != 0 {
endTime = time.Unix(endUni, 0)
}
return startTime, endTime
}
package manager
import (
"chainmaker.org/chainmaker/opennet/servicecommon/res/code"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"strings"
"chainweaver.org.cn/chainweaver/did/core"
"chainweaver.org.cn/chainweaver/did/core/crypto"
"chainweaver.org.cn/chainweaver/did/did-kms/kms"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/config"
......@@ -11,13 +18,8 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/utils"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"chainweaver.org.cn/chainweaver/servicecommon/res/code"
"google.golang.org/grpc/metadata"
"net/http"
"strings"
"github.com/zeromicro/go-zero/core/logx"
)
......@@ -42,8 +44,10 @@ func (l *KeyAddLogic) KeyAdd(req *types.KeyPairReq) (resp *types.CommonResp, err
Msg: types.SucceedMsg,
}
token := l.ctx.Value("claims").(*middleware.TokenUser)
if req.Mnemonic != "" && len(strings.Split(req.Mnemonic, ",")) != 12 {
errorcode.RequestErrorParametersFormat.BuildResult(resp, fmt.Errorf("expect 12 words,mnemonic[%s]", req.Mnemonic))
if req.Mnemonic != "" && len(strings.Split(req.Mnemonic, " ")) != 12 {
err = fmt.Errorf("expect 12 words,mnemonic[%s]", req.Mnemonic)
errorcode.RequestErrorParametersFormat.BuildResult(resp, err)
l.Logger.Info("add key failed,err[%s]", err.Error())
return resp, nil
}
......@@ -54,7 +58,45 @@ func (l *KeyAddLogic) KeyAdd(req *types.KeyPairReq) (resp *types.CommonResp, err
return resp, nil
}
// 检查秘钥对是否有效,并计算address
privateKey, err := crypto.ParsePrivateKeyFromPEM(priKey)
if err != nil {
errorcode.ParseErrorParsePrivateKeyFromPEM.BuildResult(resp, err)
logx.Errorf("private key [%s] Parse err[%s]", req.PrivateKey, err.Error())
return resp, nil
}
pkPem, _ := privateKey.PublicKey().String()
address, _ := utils.ComputeEVMAddressFromPKPEM([]string{pkPem})
// 检查是否已经存在did中了,如果已经存在,则只需添加到本地数据库,并将keypair 添加到kms中
req.PrivateKey = string(priKey)
isExist, err := l.checkKeyIsExist(req, address[0], token.UserName)
if err != nil {
errorcode.MysqlErrorUpdate.BuildResult(resp, err)
l.Logger.Info("check key isExist failed,err[%s]", err.Error())
return resp, nil
}
if isExist {
return resp, nil
}
//去运营端根据did address查询did 是否已经存在,不存在则添加到当前did中
proxy := config.ConfigIns.Service.DidProxy
targetUrl := config.ConfigIns.Service.Did + utils.DIdGetDocumentByAddressUrl
docReq := &utils.DocumentGetByAddressRequest{Address: address[0]}
qdoc, err := utils.GetDocument(targetUrl, proxy, docReq)
if err != nil && !strings.Contains(err.Error(), "record not found") {
errorcode.DocumentRequestError.BuildResult(resp, err)
logx.Errorf("get [%s] document by address of remote did service, err[%s]", address[0], err.Error())
return resp, nil
}
if qdoc != nil {
errorcode.DidPrivateKeyUsageError.BuildResult(resp)
logx.Errorf("address[%s] document[%s] already exist", address[0], qdoc.Id)
return resp, nil
}
//1.kms 添加
res, err := l.AddKeyPair(req)
if err != nil {
......@@ -63,19 +105,12 @@ func (l *KeyAddLogic) KeyAdd(req *types.KeyPairReq) (resp *types.CommonResp, err
return resp, nil
}
plaintext, err := l.genAddKeyDocument(token.EnterpriseDid, []string{res.Data}, []string{string(priKey)})
plaintext, err := l.genAddKeyDocument(token.EnterpriseDid, []string{res.Data}, []string{pkPem})
if err != nil {
errorcode.DocumentGenerateError.BuildResult(resp, err)
l.Logger.Info("document generate failed,err[%s]", err.Error())
return resp, nil
}
plaintextStr := base64.StdEncoding.EncodeToString(plaintext)
signResp, err := Sign(l.svcCtx.KmsClient, plaintextStr, res.Data, token.EnterpriseDid)
if err != nil {
errorcode.KmsSignRequestError.BuildResult(resp, err)
l.Logger.Info("kms sign failed,err[%s]", err.Error())
return resp, nil
}
doc := &core.Document{}
err = json.Unmarshal(plaintext, doc)
......@@ -85,13 +120,31 @@ func (l *KeyAddLogic) KeyAdd(req *types.KeyPairReq) (resp *types.CommonResp, err
return resp, nil
}
plaintextStr := base64.StdEncoding.EncodeToString(plaintext)
signResp, err := Sign(l.svcCtx.KmsClient, plaintextStr, res.Data, token.EnterpriseDid)
if err != nil {
errorcode.KmsSignRequestError.BuildResult(resp, err)
l.Logger.Info("kms sign failed,err[%s]", err.Error())
return resp, nil
}
verificationMetho := signResp.Data.VerificationMethod
if signResp.Data.VerificationMethod == "" {
for _, v := range doc.VerificationMethod {
verificationMetho = v.Id
break
if v.Address == res.Data {
verificationMetho = v.Id
break
}
}
}
if verificationMetho == "" {
err = fmt.Errorf("did does not have the expected address")
errorcode.DocumentGenerateError.BuildResult(resp, err)
l.Logger.Info(err.Error())
return resp, nil
}
proof := &Proof{
Created: signResp.Data.Created,
Type: signResp.Data.Type,
......@@ -134,7 +187,7 @@ func (l *KeyAddLogic) AddKeyPair(req *types.KeyPairReq) (*kms.AddKeyPairResponse
in := &kms.AddKeyPairRequest{
PrivateKey: req.PrivateKey,
Mnemonic: strings.Split(req.Mnemonic, ","),
Mnemonic: strings.Split(req.Mnemonic, " "),
}
res, err := l.svcCtx.KmsClient.AddKeyPair(l.ctx, in)
......@@ -183,8 +236,9 @@ func (l *KeyAddLogic) genAddKeyDocument(enterpriseDid string, addresses, pubKeys
// DID绑定链地址
// 公钥和DID发给DID服务,DID服务返回document,让用户对document签名
param, _ := json.Marshal(updateResp)
proxy := config.ConfigIns.Service.DidProxy
targetUrl := config.ConfigIns.Service.Did + utils.DIdUpdateGenerateUrl + utils.DIdUpdateGenerateActionAdd
respBz, internalErr := utils.DidServerReq(targetUrl, "", http.MethodPost, param)
respBz, internalErr := utils.DidServerReq(targetUrl, proxy, http.MethodPost, param)
if internalErr != nil {
l.Logger.Errorf("GetDocument HttpServerReq failed, internalErr=%s", internalErr.Error())
return nil, internalErr
......@@ -218,8 +272,9 @@ func (l *KeyAddLogic) registerAddKeyDocument(enterpriseDid string, proof *Proof)
param, _ := json.Marshal(didUpdateProof)
targetUrl := config.ConfigIns.Service.Did + utils.DIdUpdateUrl
proxy := config.ConfigIns.Service.DidProxy
// 发送更新企业did请求到did服务
respBz, internalErr := utils.DidServerReq(targetUrl, "", http.MethodPost, param)
respBz, internalErr := utils.DidServerReq(targetUrl, proxy, http.MethodPost, param)
if internalErr != nil {
l.Logger.Errorf("RegisterDocument HttpServerReq failed, internalErr=%s", internalErr.Error())
return nil, internalErr
......@@ -260,3 +315,58 @@ func Sign(client kms.Kms, plaintext, address, did string) (*kms.SignResponse, er
return res, err
}
func (l *KeyAddLogic) checkKeyIsExist(req *types.KeyPairReq, address, userName string) (bool, error) {
// 获得本地document
did, err := db.FindDidInfo()
if err != nil {
return false, fmt.Errorf("query did failed,err[%s]", err.Error())
}
doc := &core.Document{}
err = json.Unmarshal([]byte(did.DocumentPlaintext), doc)
if err != nil {
return false, fmt.Errorf("unmarshal document failed,err[%s]", err.Error())
}
isExist := false
for _, vm := range doc.VerificationMethod {
if vm.Address == address {
isExist = true
break
}
}
if !isExist {
return false, nil
}
//2.本地数据库检查是否已经存在
keyInfo, err := db.FindKeyByAddress(address)
if keyInfo != nil {
return false, nil
} else if err != nil {
l.Logger.Errorf("FindKeyByAddress %s failed,err: %s", address, err.Error())
}
//1.kms 添加
res, err := l.AddKeyPair(req)
if err != nil {
err = fmt.Errorf("add key to kms failed,err[%s]", err.Error())
l.Logger.Info(err.Error())
return false, err
}
//2.local save
err = db.CreateTable(&db.KeyInfo{
Address: res.Data,
AdminName: userName,
State: 1,
Enable: 1,
Remark: req.Mnemonic,
})
if err != nil {
err = fmt.Errorf("insert key info failed,err[%s]", err.Error())
l.Logger.Info("insert key info failed,err[%s]", err.Error())
return false, err
}
return true, nil
}
......@@ -37,23 +37,23 @@ type KeyResp struct {
}
type KeyInfosResp struct {
Page types.Page
List []*KeyResp
Page types.Page `json:"page"`
List []*KeyResp `json:"list"`
}
func (l *KeyListLogic) KeyList(req *types.Page) (resp *types.CommonResp, err error) {
func (l *KeyListLogic) KeyList(req *types.PageReq) (resp *types.CommonResp, err error) {
resp = &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
if req.Size == 0 {
req.Size = 10
if req.Page.Size == 0 {
req.Page.Size = 10
}
offset := req.Size * (req.Page - 1)
limit := req.Size
if req.Page == 0 {
offset := req.Page.Size * (req.Page.Page - 1)
limit := req.Page.Size
if req.Page.Page == 0 {
limit = 10
offset = 0
}
......@@ -68,8 +68,8 @@ func (l *KeyListLogic) KeyList(req *types.Page) (resp *types.CommonResp, err err
resp.Data = &KeyInfosResp{
Page: types.Page{
Total: int(count),
Page: req.Page,
Size: req.Size,
Page: req.Page.Page,
Size: req.Page.Size,
},
List: converter(keyInfos),
}
......
package manager
import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"context"
"github.com/zeromicro/go-zero/core/logx"
"strconv"
"time"
)
type LogOpDownloadLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewLogOpDownloadLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LogOpDownloadLogic {
return &LogOpDownloadLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *LogOpDownloadLogic) LogOpDownload(req *types.LogDownloadReq) (resp *types.CommonResp, err error) {
resp = &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
startTime := time.Time{}
starUni, _ := strconv.ParseInt(req.StartTime, 10, 0)
if starUni != 0 {
startTime = time.Unix(starUni, 0)
}
opLogs, _, err := db.GetAllOperationLogs(req.Keyword, startTime)
if err != nil {
errorcode.MysqlErrorQueryLogOperations.BuildResult(resp, err)
l.Logger.Errorf("GetOperationLogs failed,err[%s]", err.Error())
return
}
resp.Data = &LogOperations{
Page: types.Page{},
List: ConvertLog(opLogs),
}
return
}
......@@ -6,6 +6,8 @@ import (
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"
"context"
"strconv"
"time"
"github.com/zeromicro/go-zero/core/logx"
)
......@@ -25,8 +27,18 @@ func NewLogOperationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LogO
}
type LogOperations struct {
Page types.Page
Data []*db.OperationLogs
Page types.Page `json:"page"`
List []*LogsResp `json:"list"`
}
type LogsResp struct {
EventName string `json:"eventName"`
EventLevel int `json:"eventLevel"`
Url string `json:"url"`
OpName string `json:"opName"`
Ip string `json:"ip"`
OpTime string `json:"opTime"`
OpResult int `json:"opResult"`
}
func (l *LogOperationLogic) LogOperation(req *types.LogQueryReq) (resp *types.CommonResp, err error) {
......@@ -46,7 +58,13 @@ func (l *LogOperationLogic) LogOperation(req *types.LogQueryReq) (resp *types.Co
offset = 0
}
opLogs, count, err := db.GetOperationLogs(req.Keyword, req.StartTime, offset, limit)
startTime := time.Time{}
starUni, _ := strconv.ParseInt(req.StartTime, 10, 0)
if starUni != 0 {
startTime = time.Unix(starUni, 0)
}
opLogs, count, err := db.GetOperationLogs(req.Keyword, startTime, offset, limit)
if err != nil {
errorcode.MysqlErrorQueryLogOperations.BuildResult(resp, err)
l.Logger.Errorf("GetOperationLogs failed,err[%s]", err.Error())
......@@ -59,8 +77,27 @@ func (l *LogOperationLogic) LogOperation(req *types.LogQueryReq) (resp *types.Co
Page: req.Page.Page,
Size: req.Page.Size,
},
Data: opLogs,
List: ConvertLog(opLogs),
}
return
}
func ConvertLog(opLogs []*db.OperationLogs) []*LogsResp {
logs := make([]*LogsResp, 0)
for _, opLog := range opLogs {
log := &LogsResp{
EventName: opLog.Event,
EventLevel: opLog.Level,
Url: opLog.Url,
OpName: opLog.UserName,
Ip: opLog.Ip,
OpTime: opLog.CreatedAt.Format(time.RFC3339),
OpResult: opLog.Result,
}
logs = append(logs, log)
}
return logs
}
......@@ -80,6 +80,19 @@ func (l *MemberAddLogic) MemberAdd(req *types.AddReq) (resp *types.CommonResp, e
errorcode.PrivilegeError.BuildResult(resp, err)
return resp, nil
}
if token.EnterpriseName == "" {
certInfo, err := db.FindEnterpriseCertInfoByEnterId(token.EnterpriseId)
if err != nil && err.Error() != "record not found" {
logx.Errorf("FindEnterpriseCertInfoByEnterId failed, err=%s", err.Error())
errorcode.SystemInternalError.BuildResult(resp, fmt.Errorf("请稍后重试"))
return resp, nil
}
if certInfo != nil {
token.EnterpriseName = certInfo.EnterpriseName
}
}
// 密码加密
password, _, _, err := utils.GetPwd(req.PassWord, "", -1)
//create user
......
......@@ -35,7 +35,7 @@ func (l *MemberChangeTypeLogic) MemberChangeType(req *types.ChangeReq) (resp *ty
Msg: types.SucceedMsg,
}
if req.MemberType != 1 || req.MemberType != 2 || req.MemberType != 3 {
if req.MemberType != 1 && req.MemberType != 2 && req.MemberType != 3 {
err = fmt.Errorf("member type error")
errorcode.RequestErrorParameters.BuildResult(resp, err)
return resp, nil
......@@ -49,12 +49,18 @@ func (l *MemberChangeTypeLogic) MemberChangeType(req *types.ChangeReq) (resp *ty
}
// 判断当前用户是否有权限修改
if cUserInfo.MemberType >= token.MemberType {
if cUserInfo.MemberType < token.MemberType {
err = fmt.Errorf("insufficient administrator privileges ")
errorcode.PrivilegeError.BuildResult(resp, err)
return resp, nil
}
if req.MemberType != 0 && req.MemberType < token.MemberType {
err = fmt.Errorf("非法的操作")
errorcode.PrivilegeError.BuildResult(resp, err)
return resp, nil
}
if req.MemberType == 1 && token.MemberType == 1 {
userId, _ := strconv.Atoi(token.Id)
userInfo, err := db.FindUserByUserId(int64(userId))
......
......@@ -41,8 +41,8 @@ func (l *MemberDelLogic) MemberDel(req *types.DelReq) (resp *types.CommonResp, e
return resp, nil
}
if userInfo.MemberType >= token.MemberType {
err = fmt.Errorf("insufficient administrator privileges ")
if userInfo.MemberType <= token.MemberType {
err = fmt.Errorf("管理员权限不足")
errorcode.PrivilegeError.BuildResult(resp, err)
return resp, nil
}
......
This diff is collapsed.
......@@ -38,8 +38,8 @@ type MemberResp struct {
}
type UserInfosResp struct {
Page types.Page
List []*MemberResp
Page types.Page `json:"page"`
List []*MemberResp `json:"list"`
}
func (l *MemberListLogic) MemberList(req *types.MemberListReq) (resp *types.CommonResp, err error) {
......
......@@ -26,23 +26,23 @@ func NewNotificationQueryLogic(ctx context.Context, svcCtx *svc.ServiceContext)
}
type NotificationInfosResp struct {
Page types.Page
List []*db.NotificationInfo
Page types.Page `json:"page"`
List []*db.NotificationInfo `json:"list"`
}
func (l *NotificationQueryLogic) NotificationQuery(req *types.Page) (resp *types.CommonResp, err error) {
func (l *NotificationQueryLogic) NotificationQuery(req *types.PageReq) (resp *types.CommonResp, err error) {
resp = &types.CommonResp{
Code: types.SucceedCode,
Msg: types.SucceedMsg,
}
if req.Size == 0 {
req.Size = 10
if req.Page.Size == 0 {
req.Page.Size = 10
}
offset := req.Size * (req.Page - 1)
limit := req.Size
if req.Page == 0 {
offset := req.Page.Size * (req.Page.Page - 1)
limit := req.Page.Size
if req.Page.Page == 0 {
limit = 10
offset = 0
}
......@@ -57,7 +57,7 @@ func (l *NotificationQueryLogic) NotificationQuery(req *types.Page) (resp *types
resp.Data = &NotificationInfosResp{
Page: types.Page{
Total: int(count),
Page: req.Page,
Page: req.Page.Page,
},
List: nInfos,
}
......
This diff is collapsed.
This diff is collapsed.
......@@ -47,7 +47,7 @@ func (l *UpdateEnterpriseInfoDidLogic) UpdateEnterpriseInfoDid(req *types.Update
l.Logger.Errorf("find user by user id failed, err[%s]", err.Error())
return
}
if userInfo.MemberType != 0 {
if userInfo.MemberType != 1 {
err = fmt.Errorf("user is not a admin user")
errorcode.PrivilegeError.BuildResult(resp, err)
l.Logger.Errorf("user is not a admin user, err[%s]", err.Error())
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.