Ejemplo n.º 1
0
            protected internal override void HandleInternal(ChannelHandlerContext ctx, RpcInfo
                                                            info)
            {
                // This is just like what's done in RpcProgramMountd#handleInternal and
                // RpcProgramNfs3#handleInternal.
                RpcCall rpcCall   = (RpcCall)info.Header();
                int     procedure = rpcCall.GetProcedure();

                if (procedure != 0)
                {
                    bool portMonitorSuccess = DoPortMonitoring(info.RemoteAddress());
                    if (!portMonitorSuccess)
                    {
                        SendRejectedReply(rpcCall, info.RemoteAddress(), ctx);
                        return;
                    }
                }
                resultSize = info.Data().ReadableBytes();
                RpcAcceptedReply reply = RpcAcceptedReply.GetAcceptInstance(1234, new VerifierNone
                                                                                ());
                XDR @out = new XDR();

                reply.Write(@out);
                ChannelBuffer b   = ChannelBuffers.WrappedBuffer(@out.AsReadOnlyWrap().Buffer());
                RpcResponse   rsp = new RpcResponse(b, info.RemoteAddress());

                RpcUtil.SendRpcResponse(ctx, rsp);
            }
Ejemplo n.º 2
0
            public override void MessageReceived(ChannelHandlerContext ctx, MessageEvent e)
            {
                ChannelBuffer buf = (ChannelBuffer)e.GetMessage();

                // Read reply
                if (!ValidMessageLength(buf.ReadableBytes()))
                {
                    e.GetChannel().Close();
                    return;
                }
                // handling fragment header for TCP, 4 bytes.
                byte[] fragmentHeader = Arrays.CopyOfRange(buf.Array(), 0, 4);
                int    fragmentSize   = XDR.FragmentSize(fragmentHeader);
                bool   isLast         = XDR.IsLastFragment(fragmentHeader);

                System.Diagnostics.Debug.Assert((fragmentSize == 28 && isLast == true));
                XDR xdr = new XDR();

                xdr.WriteFixedOpaque(Arrays.CopyOfRange(buf.Array(), 4, buf.ReadableBytes()));
                RpcReply reply = RpcReply.Read(xdr);

                if (reply.GetState() == RpcReply.ReplyState.MsgAccepted)
                {
                    RpcAcceptedReply acceptedReply = (RpcAcceptedReply)reply;
                    Handle(acceptedReply, xdr);
                }
                else
                {
                    RpcDeniedReply deniedReply = (RpcDeniedReply)reply;
                    Handle(deniedReply);
                }
                e.GetChannel().Close();
            }
Ejemplo n.º 3
0
            private void Handle(RpcAcceptedReply acceptedReply, XDR xdr)
            {
                RpcAcceptedReply.AcceptState acceptState = acceptedReply.GetAcceptState();
                System.Diagnostics.Debug.Assert((acceptState == RpcAcceptedReply.AcceptState.Success
                                                 ));
                bool answer = xdr.ReadBoolean();

                if (answer != true)
                {
                    Log.Warn("Portmap mapping registration failed, accept state:" + acceptState);
                }
                Log.Info("Portmap mapping registration succeeded");
            }
Ejemplo n.º 4
0
        public virtual void TestConstructor()
        {
            Verifier         verifier = new VerifierNone();
            RpcAcceptedReply reply    = new RpcAcceptedReply(0, RpcReply.ReplyState.MsgAccepted,
                                                             verifier, RpcAcceptedReply.AcceptState.Success);

            Assert.Equal(0, reply.GetXid());
            Assert.Equal(RpcMessage.Type.RpcReply, reply.GetMessageType());
            Assert.Equal(RpcReply.ReplyState.MsgAccepted, reply.GetState()
                         );
            Assert.Equal(verifier, reply.GetVerifier());
            Assert.Equal(RpcAcceptedReply.AcceptState.Success, reply.GetAcceptState
                             ());
        }
Ejemplo n.º 5
0
        private void SendAcceptedReply(RpcCall call, EndPoint remoteAddress, RpcAcceptedReply.AcceptState
                                       acceptState, ChannelHandlerContext ctx)
        {
            RpcAcceptedReply reply = RpcAcceptedReply.GetInstance(call.GetXid(), acceptState,
                                                                  Verifier.VerifierNone);
            XDR @out = new XDR();

            reply.Write(@out);
            if (acceptState == RpcAcceptedReply.AcceptState.ProgMismatch)
            {
                @out.WriteInt(lowProgVersion);
                @out.WriteInt(highProgVersion);
            }
            ChannelBuffer b   = ChannelBuffers.WrappedBuffer(@out.AsReadOnlyWrap().Buffer());
            RpcResponse   rsp = new RpcResponse(b, remoteAddress);

            RpcUtil.SendRpcResponse(ctx, rsp);
        }
Ejemplo n.º 6
0
        public static RpcReply Read(XDR xdr)
        {
            int xid = xdr.ReadInt();

            RpcMessage.Type messageType = RpcMessage.Type.FromValue(xdr.ReadInt());
            Preconditions.CheckState(messageType == RpcMessage.Type.RpcReply);
            RpcReply.ReplyState stat = RpcReply.ReplyState.FromValue(xdr.ReadInt());
            switch (stat)
            {
            case RpcReply.ReplyState.MsgAccepted:
            {
                return(RpcAcceptedReply.Read(xid, stat, xdr));
            }

            case RpcReply.ReplyState.MsgDenied:
            {
                return(RpcDeniedReply.Read(xid, stat, xdr));
            }
            }
            return(null);
        }