示例#1
0
 public WriteResult CreateObjectInDatastore(EmergencyObject data, string store)
 {
     try
     {
         var bson = data.ToBsonDocument();
         db.GetCollection <BsonDocument>(store).InsertOne(bson);
         return(WriteResult.OK);
     }
     catch (TimeoutException timeoutEx)
     {
         return(WriteResult.ServerError);
     }
     catch (MongoWriteException we)
     {
         if (we.WriteError.Code == 11000)
         {
             /* Duplicated */
             return(WriteResult.Duplicated);
         }
         else
         {
             return(WriteResult.ServerError);
         }
     }
 }
        public CreateObjectResult CreateObjectInDatastore(EmergencyObject data)
        {
            CreateObjectResult result = new CreateObjectResult();

            result.writeResult   = db.CreateObjectInDatastore(data, "objects");
            result.createdObject = data;

            return(result);
        }
示例#3
0
 public static void DeserializeEmergencyObjectBody(EmergencyObject obj)
 {
     if (obj.Data is JObject)
     {
         if (obj.Header.DataType.HasValue)
         {
             var typ = registeredDataTypes[obj.Header.DataType.Value];
             obj.Data = ((JObject)obj.Data).ToObject(typ);
         }
     }
 }
        public async Task <ActionResult <object> > UpdateObject(Guid uid, [FromBody] EmergencyObject data)
        {
            var result   = db.GetObjectFromDatastore(uid);
            var identity = GetCurrentIdentity();

            if (result.data == null)
            {
                return(NotFound());
            }

            var res = result.data as EmergencyObject;

            if (!CanWrite(res, identity, null))
            {
                return(Forbid());
            }

            var dataType = EmergencyModelInformation.RegisteredDataTypes[res.header.dataType].Typ;

            var body = ((JObject)data.data).ToObject(dataType);

            try
            {
                TryValidateModel(body);
            }
            catch (Exception ex)
            {
                var problems = new ValidationProblemDetails(ModelState);
                return(BadRequest(problems));
            }

            res.data = body;

            res.header.documentVersion++;
            res.header.lastUpdated   = DateTime.UtcNow;
            res.header.lastUpdatedBy = identity.uid;

            if (ModelState.IsValid)
            {
                db.UpdateObjectInDatastore(res);

                changeTracker.ObjectChanged(res.uid.Value, Websocket.Message.MessageSentTrigger.Updated, res, null);

                return(Ok(res));
            }
            else
            {
                var problems = new ValidationProblemDetails(ModelState);
                return(BadRequest(problems));
            }
        }
        public ActionResult <EmergencyObject> UpdateObjectInDatastore(EmergencyObject data)
        {
            var res = db.UpdateObjectInDatastore(data, "objects");

            if (res == WriteResult.OK)
            {
                return(new CreatedResult("/object/" + data.uid.Value.ToString(), data));
            }
            else if (res == WriteResult.Duplicated)
            {
                return(new ConflictResult());
            }
            else
            {
                return(new StatusCodeResult(500));
            }
        }
示例#6
0
        /// <summary>
        /// Checks if the user can change Permissions on the document
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        private bool CanGrant(EmergencyObject obj, EndpointIdentity id)
        {
            bool isOwner = (obj.header.createdBy == id.uid);

            if (isOwner)
            {
                return(true);
            }

            /* Berechtigung über AccessLevel prüfen */
            if (access.CheckAccessForPath("*", id.accessIdentity, obj.header.Access, AccessLevelEnum.Grant) >= AccessLevelEnum.Grant)
            {
                return(true);
            }

            return(false);
        }
示例#7
0
        public List <string> GetAccessPaths(AccessLevelEnum requiredAccessLevel, EmergencyObject obj, EndpointIdentity id)
        {
            List <string> res;
            bool          isOwner = (obj.header.createdBy == id.uid);

            if (isOwner)
            {
                res = new List <string>()
                {
                    "*"
                };
                return(res);
            }

            res = access.GetPathsByAccessLevel(requiredAccessLevel, id.accessIdentity, obj.header.Access);

            return(res);
        }
示例#8
0
        /// <summary>
        /// Checks if the user can read the Subpath on the given Document
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="id"></param>
        /// <param name="subPath"></param>
        /// <returns></returns>
        private bool CanRead(EmergencyObject obj, EndpointIdentity id, string subPath)
        {
            bool isOwner = (obj.header.createdBy == id.uid);

            /* Nutzer ist Besitzer des Objekts */
            if (isOwner)
            {
                return(true);
            }

            /* Berechtigung über AccessLevel prüfen */
            if (access.CheckAccessForPath(subPath, id.accessIdentity, obj.header.Access, AccessLevelEnum.Read) >= AccessLevelEnum.Read)
            {
                return(true);
            }

            return(false);
        }
示例#9
0
        public void ObjectChanged(Guid uid, MessageSentTrigger trigger, EmergencyObject edxo, object subData, string subPath = null)
        {
            var eventMsg = new EmergencyObjectMessage()
            {
                uid            = uid,
                header         = edxo.header,
                messageTrigger = trigger,
            };

            if (subPath != null)
            {
                eventMsg.isParted = true;
                eventMsg.partPath = subPath;
                eventMsg.data     = subData;
            }
            else
            {
                eventMsg.isParted = false;
                eventMsg.data     = edxo.data;
            }

            ws.PropagateChange(eventMsg);
        }
        public ActionResult <EmergencyObject> CreateObject([FromBody] EmergencyObject data)
        {
            var identity = GetCurrentIdentity();

            if (data == null)
            {
                return(new NoContentResult());
            }

            if (!data.uid.HasValue)
            {
                data.uid = Guid.NewGuid();
            }

            if (data.header == null)
            {
                data.header = new EmergencyObjectHeader();
            }
            data.header.created         = DateTime.UtcNow;
            data.header.createdBy       = identity.uid;
            data.header.lastUpdated     = DateTime.UtcNow;
            data.header.documentVersion = 1;
            /* Minimum TTL is 120 minutes */
            if (data.header.timeToLive < 120 && data.header.timeToLive != 0)
            {
                data.header.timeToLive = 120;
            }
            /* Maximum TTL on this Server = 30 days */
            if (data.header.timeToLive > 60 * 24 * 30)
            {
                data.header.timeToLive = 60 * 24 * 30;
            }

            if (!EmergencyModelInformation.RegisteredDataTypes.ContainsKey(data.header.dataType))
            {
                var details = new ProblemDetails();
                details.Status = 400;
                details.Title  = "Specified Data Type \"" + data.header.dataType + "\" is not known!";
                return(new BadRequestObjectResult(details));
            }

            var dataType = EmergencyModelInformation.RegisteredDataTypes[data.header.dataType];

            /* Check TTL for datatype */
            if (dataType.MaximumTimeToLive != 0)
            {
                if (data.header.timeToLive > dataType.MaximumTimeToLive || data.header.timeToLive == 0)
                {
                    data.header.timeToLive = dataType.MaximumTimeToLive;
                }
            }


            var body = ((JObject)data.data).ToObject(dataType.Typ);

            var valid = ModelState.IsValid;

            TryValidateModel(body);

            if (ModelState.IsValid)
            {
                data.data = body;

                var res = db.CreateObjectInDatastore(data);

                if (res.writeResult == WriteResult.OK)
                {
                    changeTracker.ObjectChanged(data.uid.Value, Websocket.Message.MessageSentTrigger.Created, data, null);

                    return(new CreatedResult("/object/" + data.uid.Value.ToString(), data));
                }
                else if (res.writeResult == WriteResult.Duplicated)
                {
                    return(new ConflictResult());
                }
                else
                {
                    return(new StatusCodeResult(500));
                }
            }
            else
            {
                var problems = new ValidationProblemDetails(ModelState);

                return(BadRequest(problems));
            }
        }
示例#11
0
 private List <string> GetAccessablePaths(AccessLevelEnum acl, EmergencyObject obj, EndpointIdentity id)
 {
     return(access.GetPathsByAccessLevel(acl, id.accessIdentity, obj.header.Access));
 }