Beispiel #1
0
        private void WriteFields()
        {
            var properties = this.EntityMeta.EntityProperties;

            for (int i = 0, c = properties.Count; i < c; i++)
            {
                var property = properties[i];
                var mp       = property.ManagedProperty;

                //只为树状实体输出以下两个属性。
                if (mp == Entity.TreePIdProperty || mp == Entity.TreeIndexProperty)
                {
                    if (!_entityModel.isTree)
                    {
                        continue;
                    }
                }

                var serverType = ServerTypeHelper.GetServerType(property.PropertyType);
                if (serverType.Name == SupportedServerType.Unknown)
                {
                    continue;
                }

                var pName = property.Name;
                var field = new EntityField
                {
                    name    = pName,
                    type    = serverType,
                    persist = property.Runtime.CanWrite,
                };

                if (mp != null)
                {
                    //为外键添加一个视图属性
                    if (mp is IRefProperty)
                    {
                        _entityModel.fields.Add(field);

                        var refMp = mp as IRefProperty;
                        field = new EntityField
                        {
                            name    = LabeledRefProperty(pName),
                            type    = ServerTypeHelper.GetServerType(typeof(string)),
                            persist = false,
                        };
                    }
                    else
                    {
                        var v = mp.GetMeta(this.EntityMeta.EntityType).DefaultValue;
                        field.defaultValue = EntityJsonConverter.ToClientValue(property.PropertyType, v);
                    }
                }

                _entityModel.fields.Add(field);
            }
        }
        public static void Start(IApplicationBuilder app)
        {
            TypeHelpServer.Start(app);
            SignumControllerFactory.RegisterArea(MethodInfo.GetCurrentMethod());
            ReflectionServer.OverrideIsNamespaceAllowed.Add(typeof(ExchangeVersion).Namespace !, () => TypeAuthLogic.GetAllowed(typeof(EmailSenderConfigurationEntity)).MaxUI() > TypeAllowedBasic.None);
            ReflectionServer.OverrideIsNamespaceAllowed.Add(typeof(SmtpDeliveryMethod).Namespace !, () => TypeAuthLogic.GetAllowed(typeof(EmailSenderConfigurationEntity)).MaxUI() > TypeAllowedBasic.None);


            TemplatingServer.Start(app);

            EntityJsonConverter.AfterDeserilization.Register((EmailTemplateEntity et) =>
            {
                if (et.Query != null)
                {
                    var qd = QueryLogic.Queries.QueryDescription(et.Query.ToQueryName());
                    et.ParseData(qd);
                }
            });

            QueryDescriptionTS.AddExtension += qd =>
            {
                object type = QueryLogic.ToQueryName(qd.queryKey);
                if (Schema.Current.IsAllowed(typeof(EmailTemplateEntity), true) == null)
                {
                    var templates = EmailTemplateLogic.GetApplicableEmailTemplates(type, null, EmailTemplateVisibleOn.Query);

                    if (templates.HasItems())
                    {
                        qd.Extension.Add("emailTemplates", templates);
                    }
                }
            };


            if (Schema.Current.Tables.ContainsKey(typeof(EmailSenderConfigurationEntity)))
            {
                var piPassword = ReflectionTools.GetPropertyInfo((SmtpNetworkDeliveryEmbedded e) => e.Password);
                var pcs        = PropertyConverter.GetPropertyConverters(typeof(SmtpNetworkDeliveryEmbedded));
                pcs.GetOrThrow("password").CustomWriteJsonProperty = ctx => { };
                pcs.Add("newPassword", new PropertyConverter
                {
                    AvoidValidate           = true,
                    CustomWriteJsonProperty = ctx => { },
                    CustomReadJsonProperty  = ctx =>
                    {
                        EntityJsonConverter.AssertCanWrite(ctx.ParentPropertyRoute.Add(piPassword));

                        var password = (string)ctx.JsonReader.Value !;

                        ((SmtpNetworkDeliveryEmbedded)ctx.Entity).Password = EmailSenderConfigurationLogic.EncryptPassword(password);
                    }
                });
Beispiel #3
0
        private static TreeEntityJson ConvertRecur(Entity entity, EntityViewMeta evm)
        {
            var jEntity = new TreeEntityJson();

            EntityJsonConverter.EntityToJson(evm, entity, jEntity);

            foreach (Entity child in entity.TreeChildren)
            {
                var c = ConvertRecur(child, evm);
                jEntity.children.Add(c);
            }

            return(jEntity);
        }
Beispiel #4
0
        /// <summary>
        /// 参数输入
        /// </summary>
        /// <param name="service"></param>
        /// <param name="jsonInput"></param>
        /// <param name="properties"></param>
        private static void SetInputProperties(IService service, string jsonInput, System.Reflection.PropertyInfo[] properties)
        {
            var jInput = JObject.Parse(jsonInput);

            foreach (var property in properties)
            {
                if (ServiceHelper.IsInput(property))
                {
                    JToken jToken = null;
                    if (jInput.TryGetValue(property.Name, out jToken))
                    {
                        //如果是一般属性,则直接赋值。
                        var jValue = jToken as JValue;
                        if (jValue != null)
                        {
                            var value = TypeHelper.CoerceValue(property.PropertyType, jValue.Value);
                            property.SetValue(service, value, null);
                        }
                        else
                        {
                            //如果不是一般的属性,则表示这是一个引用属性,
                            //目前,引用属性只支持实体及实体列表。
                            var jEntityList   = jToken as JObject;
                            var modelProperty = jEntityList.Property("_model");
                            if (modelProperty == null)
                            {
                                throw new NotSupportedException("目前,服务输入中的引用属性只支持实体及实体列表。");
                            }
                            var list = EntityJsonConverter.JsonToEntityList(jEntityList);

                            //如果有这个属性,表明这只是一个用实体列表包装起来的单个实体。
                            var isEntity = jEntityList.Property(Consts.isEntityProperty) != null;
                            if (isEntity)
                            {
                                if (list.Count > 0)
                                {
                                    var entity = list[0];
                                    property.SetValue(service, entity, null);
                                }
                            }
                            else
                            {
                                property.SetValue(service, list, null);
                            }
                        }
                    }
                }
            }
        }
Beispiel #5
0
        private static object ConvertOutputComponent(object value)
        {
            //服务的输出属性如果类型是一个实体或者实体列表,则需要进行格式转换。
            if (value is IDomainComponent)
            {
                var model = (value as IDomainComponent).GetRepository().EntityType;

                //TODO:这里可能存在问题:当一个非默认的视图请求这个服务得到一个默认视图的实体数据时,可能会因为列不一致而出现问题。
                var defaultVM = UIModel.Views.CreateBaseView(model);

                if (value is EntityList)
                {
                    var listRes = new EntityJsonList {
                        model = model
                    };

                    EntityJsonConverter.EntityToJson(defaultVM, value as EntityList, listRes.entities);
                    listRes.total = listRes.entities.Count;

                    value = listRes;
                }
                else if (value is Entity)
                {
                    var entityJson = new EntityJson();
                    EntityJsonConverter.EntityToJson(defaultVM, value as Entity, entityJson);

                    //在纯数据的基础上添加以下两个约定的属性:标记这是一个实体以及它在客户端的类型名称。
                    entityJson.SetProperty(Consts.isEntityProperty, BooleanBoxes.True);
                    entityJson.SetProperty(Consts.modelProperty, ClientEntities.GetClientName(model));

                    value = entityJson;
                }
                else
                {
                    throw new NotSupportedException("只支持对实体、实体列表进行格式转换。");
                }
            }

            return(value);
        }
Beispiel #6
0
        private JsonModel SaveEntityList(HttpRequest request, EntityMeta meta)
        {
            var clientResult = new ClientResult();

            var entityListJson = request.Form["entityList"];

            if (!string.IsNullOrWhiteSpace(entityListJson))
            {
                var repo = RF.Find(meta.EntityType);

                JObject jEntityList = JObject.Parse(entityListJson);

                var list = EntityJsonConverter.JsonToEntityList(jEntityList, repo);

                if (RafyEnvironment.IsDebuggingEnabled)
                {
                    SaveList(repo, list);

                    clientResult.Success = true;
                }
                else
                {
                    try
                    {
                        SaveList(repo, list);

                        clientResult.Success = true;
                    }
                    catch (Exception ex)
                    {
                        clientResult.Message = ex.Message
                                               .Replace("\"", string.Empty)
                                               .Replace("'", string.Empty)
                                               .Replace(Environment.NewLine, string.Empty);
                    }
                }
            }

            return(clientResult);
        }
Beispiel #7
0
        public static void Start(IApplicationBuilder app, Func <AuthTokenConfigurationEmbedded> tokenConfig, string hashableEncryptionKey)
        {
            SignumControllerFactory.RegisterArea(MethodInfo.GetCurrentMethod());

            AuthTokenServer.Start(tokenConfig, hashableEncryptionKey);

            ReflectionServer.GetContext = () => new
            {
                Culture = ReflectionServer.GetCurrentValidCulture(),
                Role    = UserEntity.Current == null ? null : RoleEntity.Current,
            };

            AuthLogic.OnRulesChanged += () => ReflectionServer.cache.Clear();

            if (TypeAuthLogic.IsStarted)
            {
                ReflectionServer.AddTypeExtension += (ti, t) =>
                {
                    if (typeof(Entity).IsAssignableFrom(t))
                    {
                        var ta = UserEntity.Current != null?TypeAuthLogic.GetAllowed(t) : null;

                        ti.Extension.Add("maxTypeAllowed", ta == null ? TypeAllowedBasic.None : ta.MaxUI());
                        ti.Extension.Add("minTypeAllowed", ta == null ? TypeAllowedBasic.None : ta.MinUI());
                        ti.RequiresEntityPack |= ta != null && ta.Conditions.Any();
                    }
                };


                EntityPackTS.AddExtension += ep =>
                {
                    var typeAllowed =
                        UserEntity.Current == null ? TypeAllowedBasic.None :
                        ep.entity.IsNew ? TypeAuthLogic.GetAllowed(ep.entity.GetType()).MaxUI() :
                        TypeAuthLogic.IsAllowedFor(ep.entity, TypeAllowedBasic.Write, true) ? TypeAllowedBasic.Write :
                        TypeAuthLogic.IsAllowedFor(ep.entity, TypeAllowedBasic.Read, true) ? TypeAllowedBasic.Read :
                        TypeAllowedBasic.None;

                    ep.extension.Add("typeAllowed", typeAllowed);
                };

                OperationController.AnyReadonly += (Lite <Entity>[] lites) =>
                {
                    return(lites.GroupBy(ap => ap.EntityType).Any(gr =>
                    {
                        var ta = TypeAuthLogic.GetAllowed(gr.Key);

                        if (ta.Min(inUserInterface: true) == TypeAllowedBasic.Write)
                        {
                            return false;
                        }

                        if (ta.Max(inUserInterface: true) <= TypeAllowedBasic.Read)
                        {
                            return true;
                        }

                        return giCountReadonly.GetInvoker(gr.Key)() > 0;
                    }));
                };
            }

            if (QueryAuthLogic.IsStarted)
            {
                ReflectionServer.AddTypeExtension += (ti, t) =>
                {
                    if (ti.QueryDefined)
                    {
                        ti.Extension.Add("queryAllowed", UserEntity.Current == null ? QueryAllowed.None : QueryAuthLogic.GetQueryAllowed(t));
                    }
                };

                ReflectionServer.AddFieldInfoExtension += (mi, fi) =>
                {
                    if (fi.DeclaringType !.Name.EndsWith("Query"))
                    {
                        mi.Extension.Add("queryAllowed", UserEntity.Current == null ? QueryAllowed.None : QueryAuthLogic.GetQueryAllowed(fi.GetValue(null) !));
                    }
                };
            }

            if (PropertyAuthLogic.IsStarted)
            {
                ReflectionServer.AddPropertyRouteExtension += (mi, pr) =>
                {
                    mi.Extension.Add("propertyAllowed", UserEntity.Current == null ? PropertyAllowed.None : pr.GetPropertyAllowed());
                };
            }

            if (OperationAuthLogic.IsStarted)
            {
                ReflectionServer.AddOperationExtension += (oits, oi, type) =>
                {
                    oits.Extension.Add("operationAllowed",
                                       UserEntity.Current == null ? false :
                                       OperationAuthLogic.GetOperationAllowed(oi.OperationSymbol, type, inUserInterface: true));
                };
            }

            if (PermissionAuthLogic.IsStarted)
            {
                ReflectionServer.AddFieldInfoExtension += (mi, fi) =>
                {
                    if (fi.FieldType == typeof(PermissionSymbol))
                    {
                        mi.Extension.Add("permissionAllowed",
                                         UserEntity.Current == null ? false :
                                         PermissionAuthLogic.IsAuthorized((PermissionSymbol)fi.GetValue(null) !));
                    }
                };
            }


            var piPasswordHash = ReflectionTools.GetPropertyInfo((UserEntity e) => e.PasswordHash);
            var pcs            = PropertyConverter.GetPropertyConverters(typeof(UserEntity));

            pcs.GetOrThrow("passwordHash").CustomWriteJsonProperty = ctx => { };
            pcs.Add("newPassword", new PropertyConverter
            {
                AvoidValidate           = true,
                CustomWriteJsonProperty = ctx => { },
                CustomReadJsonProperty  = ctx =>
                {
                    EntityJsonConverter.AssertCanWrite(ctx.ParentPropertyRoute.Add(piPasswordHash));

                    var password = (string)ctx.JsonReader.Value !;

                    var error = UserEntity.OnValidatePassword(password);
                    if (error != null)
                    {
                        throw new ApplicationException(error);
                    }

                    ((UserEntity)ctx.Entity).PasswordHash = Security.EncodePassword(password);
                }
            });
Beispiel #8
0
        public static void Start(HttpConfiguration config, Func <AuthTokenConfigurationEmbedded> tokenConfig, string hashableEncryptionKey)
        {
            SignumControllerFactory.RegisterArea(MethodInfo.GetCurrentMethod());

            AuthTokenServer.Start(tokenConfig, hashableEncryptionKey);

            ReflectionServer.GetContext = () => new
            {
                Culture = ReflectionServer.GetCurrentValidCulture(),
                Role    = UserEntity.Current == null ? null : RoleEntity.Current,
            };

            AuthLogic.OnRulesChanged += () => ReflectionServer.cache.Clear();

            if (TypeAuthLogic.IsStarted)
            {
                ReflectionServer.AddTypeExtension += (ti, t) =>
                {
                    if (typeof(Entity).IsAssignableFrom(t))
                    {
                        ti.Extension.Add("typeAllowed", UserEntity.Current == null ? TypeAllowedBasic.None : TypeAuthLogic.GetAllowed(t).MaxUI());
                    }
                };
            }

            if (QueryAuthLogic.IsStarted)
            {
                ReflectionServer.AddTypeExtension += (ti, t) =>
                {
                    if (ti.QueryDefined)
                    {
                        ti.Extension.Add("queryAllowed", UserEntity.Current == null ? QueryAllowed.None : QueryAuthLogic.GetQueryAllowed(t));
                    }
                };

                ReflectionServer.AddFieldInfoExtension += (mi, fi) =>
                {
                    if (fi.DeclaringType.Name.EndsWith("Query"))
                    {
                        mi.Extension.Add("queryAllowed", UserEntity.Current == null ? QueryAllowed.None : QueryAuthLogic.GetQueryAllowed(fi.GetValue(null)));
                    }
                };
            }

            if (PropertyAuthLogic.IsStarted)
            {
                ReflectionServer.AddPropertyRouteExtension += (mi, pr) =>
                {
                    mi.Extension.Add("propertyAllowed", UserEntity.Current == null ? PropertyAllowed.None : pr.GetPropertyAllowed());
                };
            }

            if (OperationAuthLogic.IsStarted)
            {
                ReflectionServer.AddFieldInfoExtension += (mi, fi) =>
                {
                    if (fi.DeclaringType.Name.EndsWith("Operation"))
                    {
                        if (fi.GetValue(null) is IOperationSymbolContainer container)
                        {
                            mi.Extension.Add("operationAllowed",
                                             UserEntity.Current == null ? false
                                    : OperationAuthLogic.GetOperationAllowed(container.Symbol, inUserInterface: true));
                        }
                    }
                };
            }

            if (PermissionAuthLogic.IsStarted)
            {
                ReflectionServer.AddFieldInfoExtension += (mi, fi) =>
                {
                    if (fi.FieldType == typeof(PermissionSymbol))
                    {
                        mi.Extension.Add("permissionAllowed",
                                         UserEntity.Current == null
                                ? false
                                : PermissionAuthLogic.IsAuthorized((PermissionSymbol)fi.GetValue(null)));
                    }
                };
            }


            var piPasswordHash = ReflectionTools.GetPropertyInfo((UserEntity e) => e.PasswordHash);
            var pcs            = PropertyConverter.GetPropertyConverters(typeof(UserEntity));

            pcs.GetOrThrow("passwordHash").CustomWriteJsonProperty = ctx => { };
            pcs.Add("newPassword", new PropertyConverter
            {
                AvoidValidate           = true,
                CustomWriteJsonProperty = ctx => { },
                CustomReadJsonProperty  = ctx =>
                {
                    EntityJsonConverter.AssertCanWrite(ctx.ParentPropertyRoute.Add(piPasswordHash));

                    var password = (string)ctx.JsonReader.Value;

                    var error = UserEntity.OnValidatePassword(password);
                    if (error != null)
                    {
                        throw new ApplicationException(error);
                    }

                    ((UserEntity)ctx.Entity).PasswordHash = Security.EncodePassword(password);
                }
            });

            if (TypeAuthLogic.IsStarted)
            {
                Omnibox.OmniboxServer.IsNavigable += type => TypeAuthLogic.GetAllowed(type).MaxUI() >= TypeAllowedBasic.Read;
            }

            SchemaMap.GetColorProviders += GetMapColors;
        }
Beispiel #9
0
        public static void SetSetters(ModifiableEntity entity, List <PropertySetter> setters, PropertyRoute route)
        {
            JsonSerializer serializer = JsonSerializer.Create(SignumServer.JsonSerializerSettings);

            foreach (var setter in setters)
            {
                var pr = route.Add(setter.Property);

                EntityJsonConverter.AssertCanWrite(pr, entity);

                if (pr.Type.IsMList())
                {
                    var elementPr = pr.Add("Item");
                    var mlist     = pr.GetLambdaExpression <ModifiableEntity, IMListPrivate>(false).Compile()(entity);
                    switch (setter.Operation)
                    {
                    case PropertyOperation.AddElement:
                    {
                        var item = (ModifiableEntity)Activator.CreateInstance(elementPr.Type) !;
                        SetSetters(item, setter.Setters !, elementPr);
                        ((IList)mlist).Add(item);
                    }
                    break;

                    case PropertyOperation.ChangeElements:
                    {
                        var predicate = GetPredicate(setter.Predicate !, elementPr, serializer);
                        var toChange  = ((IEnumerable <object>)mlist).Where(predicate.Compile()).ToList();
                        foreach (var item in toChange)
                        {
                            SetSetters((ModifiableEntity)item, setter.Setters !, elementPr);
                        }
                    }
                    break;

                    case PropertyOperation.RemoveElements:
                    {
                        var predicate = GetPredicate(setter.Predicate !, elementPr, serializer);
                        var toRemove  = ((IEnumerable <object>)mlist).Where(predicate.Compile()).ToList();
                        foreach (var item in toRemove)
                        {
                            ((IList)mlist).Remove(item);
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
                else if (setter.Operation == PropertyOperation.CreateNewEntiy)
                {
                    var subPr = pr.Type.IsEmbeddedEntity() ? pr : PropertyRoute.Root(TypeLogic.GetType(setter.EntityType !));
                    var item  = (ModifiableEntity)Activator.CreateInstance(subPr.Type) !;
                    SetSetters(item, setter.Setters !, subPr);
                    SetProperty(entity, pr, route, item);
                }
                else if (setter.Operation == PropertyOperation.ModifyEntity)
                {
                    var item = GetProperty(entity, pr, route);
                    if (!(item is ModifiableEntity mod))
                    {
                        throw new InvalidOperationException($"Unable to change entity in {pr}: {item}");
                    }

                    SetSetters(mod, setter.Setters !, pr);
                    SetProperty(entity, pr, route, mod);
                }
                else
                {
                    var value = ConvertObject(setter.Value, pr, serializer);
                    SetProperty(entity, pr, route, value);
                }
            }
        }
Beispiel #10
0
        private JsonModel QueryEntityList(HttpRequest request, EntityViewMeta evm)
        {
            var repo = RF.Find(evm.EntityType);

            var pagingInfo = ParsePagingInfo(request, repo);

            var entities = QueryEntityListCore(request, repo, pagingInfo);

            var list = new EntityJsonList {
                model = evm.EntityType
            };

            if (repo.SupportTree)
            {
                var roots = entities;
                foreach (var rootItem in roots)
                {
                    var i = ConvertRecur(rootItem, evm);
                    i.expanded = true;
                    list.entities.Add(i);
                }

                list.total = (entities as ITreeComponent).CountNodes();
            }
            else
            {
                //如果此时,还需要进行统计,表示在数据层查询时,并没有对分页进行处理。这时,只能在内存中对实体进行分页。
                if (pagingInfo.IsNeedCount)
                {
                    entities = JumpToPageInMemory(repo, entities, pagingInfo);
                }

                EntityJsonConverter.EntityToJson(evm, entities, list.entities);

                list.total = pagingInfo.TotalCount;
            }

            return(list);

            #region //暂时不用

            //var repo = RF.Create(evm.EntityType);

            //EntityList entities = QueryEntityListCore(request, repo);

            //if (repo.SupportTree)
            //{
            //    entities.EnsureObjectRelations();

            //    var root = new RootTreeEntityJson();

            //    var roots = entities.FindRoots();
            //    foreach (var rootItem in roots)
            //    {
            //        var i = ConvertRecur(rootItem, evm);
            //        root.children.Add(i);
            //    }

            //    return root;
            //}
            //else
            //{
            //    var page = request.GetQueryStringOrDefault("page", 1);
            //    var limit = request.GetQueryStringOrDefault("limit", 10);
            //    var pagerInfo = new PagerInfo(page, limit, true);
            //    entities = JumpToPage(repo, entities, pagerInfo);

            //    var list = new EntityJsonList
            //    {
            //        totalCount = pagerInfo.TotalCount,
            //    };

            //    EntityJsonConverter.EntityToJson(evm, entities, list.entities);

            //    return list;
            //}

            #endregion
        }