예제 #1
0
        /// <summary>
        ///     The only parameter we recognize is a UUID.If an asset with this identification is
        ///     found, it's content, base-64 encoded, is returned to the client.
        /// </summary>
        private void DoGet(AssetRequestData rdata)
        {
            Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method);

            if (rdata.Parameters.Length == 1)
            {
                UUID      uuid  = new UUID(rdata.Parameters[0]);
                AssetBase asset = Rest.AssetServices.Get(uuid.ToString());

                if (asset != null)
                {
                    Rest.Log.DebugFormat("{0}  Asset located <{1}>", MsgId, rdata.Parameters[0]);
                    rdata.initXmlWriter();
                    rdata.writer.WriteStartElement(String.Empty, "Asset", String.Empty);
                    rdata.writer.WriteAttributeString("id", asset.ID);
                    rdata.writer.WriteAttributeString("name", asset.Name);
                    rdata.writer.WriteAttributeString("desc", asset.Description);
                    rdata.writer.WriteAttributeString("type", asset.Type.ToString());
                    rdata.writer.WriteAttributeString("local", asset.Local.ToString());
                    rdata.writer.WriteAttributeString("temporary", asset.Temporary.ToString());
                    rdata.writer.WriteBase64(asset.Data, 0, asset.Data.Length);
                    rdata.writer.WriteFullEndElement();
                }
                else
                {
                    Rest.Log.DebugFormat("{0} Invalid parameters: <{1}>", MsgId, rdata.path);
                    rdata.Fail(Rest.HttpStatusCodeNotFound, "invalid parameters");
                }
            }

            rdata.Complete();
            rdata.Respond(String.Format("Asset <{0}> : Normal completion", rdata.method));
        }
예제 #2
0
        /// <summary>
        /// CREATE new item, replace if it exists. URI identifies the context for the item in question.
        /// No parameters are required for POST, just thepayload.
        /// </summary>

        private void DoPost(AssetRequestData rdata)
        {
            bool modified = false;
            bool created  = false;

            Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method);

            if (rdata.Parameters.Length != 0)
            {
                Rest.Log.WarnFormat("{0} Parameters ignored <{1}>", MsgId, rdata.path);
                Rest.Log.InfoFormat("{0} POST of an asset has no parameters", MsgId, rdata.path);
            }

            rdata.initXmlReader();
            XmlReader xml = rdata.reader;

            if (!xml.ReadToFollowing("Asset"))
            {
                Rest.Log.DebugFormat("{0} Invalid request data: <{1}>", MsgId, rdata.path);
                rdata.Fail(Rest.HttpStatusCodeBadRequest, "invalid request data");
            }

            UUID      uuid  = new UUID(xml.GetAttribute("id"));
            AssetBase asset = Rest.AssetServices.Get(uuid.ToString());

            modified = (asset != null);
            created  = !modified;

            asset             = new AssetBase();
            asset.FullID      = uuid;
            asset.Name        = xml.GetAttribute("name");
            asset.Description = xml.GetAttribute("desc");
            asset.Type        = SByte.Parse(xml.GetAttribute("type"));
            asset.Local       = Int32.Parse(xml.GetAttribute("local")) != 0;
            asset.Temporary   = Int32.Parse(xml.GetAttribute("temporary")) != 0;
            asset.Data        = Convert.FromBase64String(xml.ReadElementContentAsString("Asset", ""));

            Rest.AssetServices.Store(asset);

            if (created)
            {
                rdata.appendStatus(String.Format("<p> Created asset {0}, UUID {1} <p>", asset.Name, asset.FullID));
                rdata.Complete(Rest.HttpStatusCodeCreated);
            }
            else
            {
                if (modified)
                {
                    rdata.appendStatus(String.Format("<p> Modified asset {0}, UUID {1} <p>", asset.Name, asset.FullID));
                    rdata.Complete(Rest.HttpStatusCodeOK);
                }
                else
                {
                    rdata.Complete(Rest.HttpStatusCodeNoContent);
                }
            }

            rdata.Respond(String.Format("Asset {0} : Normal completion", rdata.method));
        }
예제 #3
0
        /// <summary>
        /// CREATE new item, replace if it exists. URI identifies the context for the item in question.
        /// No parameters are required for POST, just thepayload.
        /// </summary>

        private void DoPost(AssetRequestData rdata)
        {

            bool modified = false;
            bool created  = false;

            Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method);

            if (rdata.Parameters.Length != 0)
            {
                Rest.Log.WarnFormat("{0} Parameters ignored <{1}>", MsgId, rdata.path);
                Rest.Log.InfoFormat("{0} POST of an asset has no parameters", MsgId, rdata.path);
            }

            rdata.initXmlReader();
            XmlReader xml = rdata.reader;

            if (!xml.ReadToFollowing("Asset"))
            {
                Rest.Log.DebugFormat("{0} Invalid request data: <{1}>", MsgId, rdata.path);
                rdata.Fail(Rest.HttpStatusCodeBadRequest,"invalid request data");
            }

            UUID uuid = new UUID(xml.GetAttribute("id"));
            AssetBase asset = Rest.AssetServices.Get(uuid.ToString());

            modified = (asset != null);
            created  = !modified;

            asset             = new AssetBase(uuid, xml.GetAttribute("name"), SByte.Parse(xml.GetAttribute("type")));
            asset.Description = xml.GetAttribute("desc");
            asset.Local       = Int32.Parse(xml.GetAttribute("local")) != 0;
            asset.Temporary   = Int32.Parse(xml.GetAttribute("temporary")) != 0;
            asset.Data        = Convert.FromBase64String(xml.ReadElementContentAsString("Asset", ""));

            Rest.AssetServices.Store(asset);

            if (created)
            {
                rdata.appendStatus(String.Format("<p> Created asset {0}, UUID {1} <p>", asset.Name, asset.FullID));
                rdata.Complete(Rest.HttpStatusCodeCreated);
            }
            else
            {
                if (modified)
                {
                    rdata.appendStatus(String.Format("<p> Modified asset {0}, UUID {1} <p>", asset.Name, asset.FullID));
                    rdata.Complete(Rest.HttpStatusCodeOK);
                }
                else
                {
                    rdata.Complete(Rest.HttpStatusCodeNoContent);
                }
            }

            rdata.Respond(String.Format("Asset {0} : Normal completion", rdata.method));

        }
예제 #4
0
        /// <summary>
        /// The only parameter we recognize is a UUID.If an asset with this identification is
        /// found, it's content, base-64 encoded, is returned to the client.
        /// </summary>

        private void DoGet(AssetRequestData rdata)
        {
            Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method);

            if (rdata.Parameters.Length == 1)
            {
                UUID uuid = new UUID(rdata.Parameters[0]);
                AssetBase asset = Rest.AssetServices.Get(uuid.ToString());

                if (asset != null)
                {
                    Rest.Log.DebugFormat("{0}  Asset located <{1}>", MsgId, rdata.Parameters[0]);

                    rdata.initXmlWriter();

                    rdata.writer.WriteStartElement(String.Empty,"Asset",String.Empty);

                    rdata.writer.WriteAttributeString("id", asset.ID);
                    rdata.writer.WriteAttributeString("name", asset.Name);
                    rdata.writer.WriteAttributeString("desc", asset.Description);
                    rdata.writer.WriteAttributeString("type", asset.Type.ToString());
                    rdata.writer.WriteAttributeString("local", asset.Local.ToString());
                    rdata.writer.WriteAttributeString("temporary", asset.Temporary.ToString());

                    rdata.writer.WriteBase64(asset.Data,0,asset.Data.Length);

                    rdata.writer.WriteFullEndElement();

                }
                else
                {
                    Rest.Log.DebugFormat("{0} Invalid parameters: <{1}>", MsgId, rdata.path);
                    rdata.Fail(Rest.HttpStatusCodeNotFound, "invalid parameters");
                }
            }

            rdata.Complete();
            rdata.Respond(String.Format("Asset <{0}> : Normal completion", rdata.method));

        }
예제 #5
0
        // Asset Handler

        private void DoAsset(RequestData rparm)
        {
            if (!enabled)
            {
                return;
            }

            AssetRequestData rdata = (AssetRequestData)rparm;

            Rest.Log.DebugFormat("{0} REST Asset handler ({1}) ENTRY", MsgId, qPrefix);

            // Now that we know this is a serious attempt to
            // access inventory data, we should find out who
            // is asking, and make sure they are authorized
            // to do so. We need to validate the caller's
            // identity before revealing anything about the
            // status quo. Authenticate throws an exception
            // via Fail if no identity information is present.
            //
            // With the present HTTP server we can't use the
            // builtin authentication mechanisms because they
            // would be enforced for all in-bound requests.
            // Instead we look at the headers ourselves and
            // handle authentication directly.

            try
            {
                if (!rdata.IsAuthenticated)
                {
                    rdata.Fail(Rest.HttpStatusCodeNotAuthorized, String.Format("user \"{0}\" could not be authenticated"));
                }
            }
            catch (RestException e)
            {
                if (e.statusCode == Rest.HttpStatusCodeNotAuthorized)
                {
                    Rest.Log.WarnFormat("{0} User not authenticated", MsgId);
                    Rest.Log.DebugFormat("{0} Authorization header: {1}", MsgId,
                                         rdata.request.Headers.Get("Authorization"));
                }
                else
                {
                    Rest.Log.ErrorFormat("{0} User authentication failed", MsgId);
                    Rest.Log.DebugFormat("{0} Authorization header: {1}", MsgId,
                                         rdata.request.Headers.Get("Authorization"));
                }
                throw (e);
            }

            // Remove the prefix and what's left are the parameters. If we don't have
            // the parameters we need, fail the request. Parameters do NOT include
            // any supplied query values.

            if (rdata.Parameters.Length > 0)
            {
                switch (rdata.method)
                {
                case "get":
                    DoGet(rdata);
                    break;

                case "put":
                    DoPut(rdata);
                    break;

                case "post":
                    DoPost(rdata);
                    break;

                case "delete":
                default:
                    Rest.Log.WarnFormat("{0} Asset: Method not supported: {1}",
                                        MsgId, rdata.method);
                    rdata.Fail(Rest.HttpStatusCodeBadRequest, String.Format("method <{0}> not supported", rdata.method));
                    break;
                }
            }
            else
            {
                Rest.Log.WarnFormat("{0} Asset: No agent information provided", MsgId);
                rdata.Fail(Rest.HttpStatusCodeBadRequest, "no agent information provided");
            }

            Rest.Log.DebugFormat("{0} REST Asset handler EXIT", MsgId);
        }
예제 #6
0
        /// <summary>
        ///     UPDATE existing item, if it exists. URI identifies the item in question.
        ///     The only parameter we recognize is a UUID. The enclosed asset data (base-64 encoded)
        ///     is decoded and stored in the database, identified by the supplied UUID.
        /// </summary>
        private void DoPut(AssetRequestData rdata)
        {
            bool modified = false;
            bool created  = false;

            AssetBase asset = null;

            Rest.Log.DebugFormat("{0} REST Asset handler, Method = <{1}> ENTRY", MsgId, rdata.method);

            if (rdata.Parameters.Length == 1)
            {
                rdata.initXmlReader();
                XmlReader xml = rdata.reader;

                if (!xml.ReadToFollowing("Asset"))
                {
                    Rest.Log.DebugFormat("{0} Invalid request data: <{1}>", MsgId, rdata.path);
                    rdata.Fail(Rest.HttpStatusCodeBadRequest, "invalid request data");
                }

                UUID uuid = new UUID(rdata.Parameters[0]);
                asset = Rest.AssetServices.Get(uuid.ToString());

                modified = (asset != null);
                created  = !modified;

                asset             = new AssetBase(uuid, xml.GetAttribute("name"), SByte.Parse(xml.GetAttribute("type")), UUID.Zero.ToString());
                asset.Description = xml.GetAttribute("desc");
                asset.Local       = Int32.Parse(xml.GetAttribute("local")) != 0;
                asset.Temporary   = Int32.Parse(xml.GetAttribute("temporary")) != 0;
                asset.Data        = Convert.FromBase64String(xml.ReadElementContentAsString("Asset", ""));

                if (asset.ID != rdata.Parameters[0])
                {
                    Rest.Log.WarnFormat("{0} URI and payload disagree on UUID U:{1} vs P:{2}", MsgId, rdata.Parameters[0], asset.ID);
                }

                Rest.AssetServices.Store(asset);
            }
            else
            {
                Rest.Log.DebugFormat("{0} Invalid parameters: <{1}>", MsgId, rdata.path);
                rdata.Fail(Rest.HttpStatusCodeNotFound, "invalid parameters");
            }

            if (created)
            {
                rdata.appendStatus(String.Format("<p> Created asset {0}, UUID {1} <p>", asset.Name, asset.FullID));
                rdata.Complete(Rest.HttpStatusCodeCreated);
            }
            else
            {
                if (modified)
                {
                    rdata.appendStatus(String.Format("<p> Modified asset {0}, UUID {1} <p>", asset.Name, asset.FullID));
                    rdata.Complete(Rest.HttpStatusCodeOK);
                }
                else
                {
                    rdata.Complete(Rest.HttpStatusCodeNoContent);
                }
            }

            rdata.Respond(String.Format("Asset {0} : Normal completion", rdata.method));
        }