Example #1
0
 //把member类型的证书加载到org下面的peer节点
 public override Task <RegistReply> Regist(RegistRequest request, ServerCallContext context)
 {
     try
     {
         if (_identityProvider.GetCAUserName() != request.Username ||
             _identityProvider.GetCAPassword() != request.Password)
         {
             return(Task.FromResult(new RegistReply()
             {
                 Status = false
             }));
         }
         //获取证书
         var ca = Newtonsoft.Json.JsonConvert.DeserializeObject <Certificate>(request.Certificate);
         //校验签名
         var rs = RSAHelper.VerifyData(_identityProvider.GetPublicKey(), ca.TBSCertificate, ca.SignatureValue);
         //如果是peer节点类型 则返回false
         //peer节点类型在组织加入通道的时候进行校验
         if (ca.TBSCertificate.CAType == CAType.Peer)
         {
             return(Task.FromResult(new RegistReply()
             {
                 Status = false,
                 Msg = "签名校验失败"
             }));
         }
         else
         {
             //把证书上链
             var caconfig = new OrgMemberConfig();
             caconfig.Name        = ca.TBSCertificate.Subject;
             caconfig.OrgId       = _identityProvider.GetPeerIdentity().OrgId;
             caconfig.Certificate = ca;
             var response = _invokeBLL.RegistMember(request.ChannelId, caconfig);
             return(Task.FromResult(new RegistReply()
             {
                 Status = true,
                 Msg = "注册成功!"
             }));
         }
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, ex.Message);
         return(Task.FromResult(new RegistReply()
         {
             Status = false,
             Msg = ex.Message
         }));
     }
 }
Example #2
0
        /// <summary>
        /// 向节点注册成员
        /// </summary>
        /// <param name="channelId"></param>
        /// <param name="ca"></param>
        /// <returns></returns>
        public async Task <TxResponse> RegistMember(string channelId, OrgMemberConfig ca)
        {
            var txHeader = new QMBlockSDK.TX.TxHeader();

            txHeader.ChannelId = channelId;
            //txHeader.ChaincodeName = ConfigKey.SysIdentityChaincode;
            txHeader.ChaincodeName = ConfigKey.SysNetConfigChaincode;
            txHeader.FuncName      = ConfigKey.AddOrgMemberFunc;
            txHeader.Args          = new string[] { Newtonsoft.Json.JsonConvert.SerializeObject(ca) };
            txHeader.Type          = TxType.Invoke;
            var rs = await _txService.InvokeTx(txHeader);

            return(rs);
        }
        /// <summary>
        /// 添加组织节点 只能更改自己的组织节点
        /// </summary>
        /// <param name="stub"></param>
        /// <returns></returns>
        private ChainCodeInvokeResponse AddOrgMember(IChaincodeStub stub)
        {
            if (stub.GetArgs().Count() != 1)
            {
                return(stub.Response("", StatusCode.BAD_ARGS_NUMBER));
            }
            var             arg          = stub.GetArgs()[0];
            OrgMemberConfig newOrgMember = Newtonsoft.Json.JsonConvert.DeserializeObject <OrgMemberConfig>(arg);

            #region 请求合法性校验
            //如果修改的组织节点等于本组织节点 则需要验证请求是否由本节点发出
            var identity = stub.GetPeerIdentity();
            if (newOrgMember.OrgId == identity.OrgId)
            {
                var signature = stub.GetTxRequestHeaderSignature();
                //这里添加验证
            }

            #endregion


            #region 成员数据完整性校验


            if (string.IsNullOrEmpty(newOrgMember.OrgId))
            {
                return(stub.Response("组织ID不能为空", StatusCode.BAD_OTHERS));
            }
            if (string.IsNullOrEmpty(newOrgMember.Name))
            {
                return(stub.Response("成员名称不能为空", StatusCode.BAD_OTHERS));
            }
            if (newOrgMember.Certificate == null)
            {
                return(stub.Response("证书不存在", StatusCode.BAD_OTHERS));
            }
            if (!newOrgMember.Certificate.Check())
            {
                return(stub.Response("证书数据不完整", StatusCode.BAD_OTHERS));
            }
            if (newOrgMember.Certificate.TBSCertificate.CAType == CAType.Peer)
            {
                return(stub.Response("证书类型不正确", StatusCode.BAD_OTHERS));
            }

            #endregion


            var channelconfig = stub.GetChannelConfig();
            var org           = channelconfig.OrgConfigs.Where(p => p.OrgId == newOrgMember.OrgId).FirstOrDefault();
            if (org == null)
            {
                return(stub.Response("组织不存在", StatusCode.BAD_OTHERS));
            }
            #region 成员唯一性检验

            if (org.OrgMember.Any(p => p.Name == newOrgMember.Name))
            {
                return(stub.Response("成员名称重复", StatusCode.BAD_OTHERS));
            }

            if (org.OrgMember.Any(p => p.Certificate.TBSCertificate.SerialNumber == p.Certificate.TBSCertificate.SerialNumber))
            {
                return(stub.Response("成员证书编号重复", StatusCode.BAD_OTHERS));
            }

            if (org.OrgMember.Any(p => p.Certificate.TBSCertificate.PublicKey == p.Certificate.TBSCertificate.PublicKey))
            {
                return(stub.Response("成员公钥重复", StatusCode.BAD_OTHERS));
            }
            #endregion

            org.OrgMember.Add(newOrgMember);
            stub.SetChannelConfig(channelconfig);
            return(stub.Response("", StatusCode.Successful));
        }
Example #4
0
 public Task <TxResponse> AddOrgMember(OrgMemberConfig config)
 {
     throw new NotImplementedException();
 }