示例#1
0
        public List<MusicianMember> GetMembers()
        {
            List<MusicianMember> members = new List<MusicianMember>();

            SelectQuery query = new SelectQuery(typeof(MusicianMember));
            query.AddField(new DataField(typeof(MusicianMember), "user_id"));
            query.AddCondition("musician_id", musicianId);

            DataTable membersTable = db.Query(query);

            List<long> memberIds = new List<long>();

            foreach (DataRow dr in membersTable.Rows)
            {
                memberIds.Add((long)dr["user_id"]);
            }

            core.LoadUserProfiles(memberIds);

            foreach (DataRow dr in membersTable.Rows)
            {
                members.Add(new MusicianMember(core, dr));
            }

            return members;
        }
示例#2
0
        public UserGroup(Core core, long groupId, UserGroupLoadOptions loadOptions)
            : base(core)
        {
            ItemLoad += new ItemLoadHandler(UserGroup_ItemLoad);

            bool containsInfoData = false;
            bool containsIconData = false;

            if (loadOptions == UserGroupLoadOptions.Key)
            {
                try
                {
                    LoadItem(groupId);
                }
                catch (InvalidItemException)
                {
                    throw new InvalidGroupException();
                }
            }
            else
            {
                SelectQuery query = new SelectQuery(UserGroup.GetTable(typeof(UserGroup)));
                query.AddFields(UserGroup.GetFieldsPrefixed(core, typeof(UserGroup)));
                query.AddCondition("`group_keys`.`group_id`", groupId);

                if ((loadOptions & UserGroupLoadOptions.Info) == UserGroupLoadOptions.Info)
                {
                    containsInfoData = true;

                    query.AddJoin(JoinTypes.Inner, UserGroupInfo.GetTable(typeof(UserGroupInfo)), "group_id", "group_id");
                    query.AddFields(UserGroupInfo.GetFieldsPrefixed(core, typeof(UserGroupInfo)));

                    if ((loadOptions & UserGroupLoadOptions.Icon) == UserGroupLoadOptions.Icon)
                    {
                        containsIconData = true;

                        query.AddJoin(JoinTypes.Left, new DataField("group_info", "group_icon"), new DataField("gallery_items", "gallery_item_id"));
                        query.AddField(new DataField("gallery_items", "gallery_item_uri"));
                        query.AddField(new DataField("gallery_items", "gallery_item_parent_path"));
                    }
                }

                DataTable groupTable = db.Query(query);

                if (groupTable.Rows.Count > 0)
                {
                    loadItemInfo(typeof(UserGroup), groupTable.Rows[0]);

                    if (containsInfoData)
                    {
                        groupInfo = new UserGroupInfo(core, groupTable.Rows[0]);
                    }

                    if (containsIconData)
                    {
                        loadUserGroupIcon(groupTable.Rows[0]);
                    }
                }
                else
                {
                    throw new InvalidGroupException();
                }
            }
        }
示例#3
0
        public static SelectQuery GetSelectQueryStub(Core core, MusicianLoadOptions loadOptions)
        {
            SelectQuery query = new SelectQuery(GetTable(typeof(Musician)));
            query.AddFields(Musician.GetFieldsPrefixed(core, typeof(Musician)));

            if ((loadOptions & MusicianLoadOptions.Icon) == MusicianLoadOptions.Icon)
            {
                query.AddJoin(JoinTypes.Left, new DataField(typeof(Musician), "musician_icon"), new DataField("gallery_items", "gallery_item_id"));
                query.AddField(new DataField("gallery_items", "gallery_item_uri"));
                query.AddField(new DataField("gallery_items", "gallery_item_parent_path"));
            }

            return query;
        }
示例#4
0
        public List<GroupMember> GetOperators(int page, int perPage)
        {
            List<GroupMember> operators = new List<GroupMember>();

            SelectQuery query = new SelectQuery("group_operators");
            query.AddFields(GroupMember.GetFieldsPrefixed(core, typeof(GroupMember)));
            query.AddFields(UserInfo.GetFieldsPrefixed(core, typeof(User)));
            query.AddJoin(JoinTypes.Inner, UserInfo.GetTable(typeof(User)), "user_id", "user_id");
            query.AddField(new DataField("group_operators", "user_id"));
            TableJoin tj = query.AddJoin(JoinTypes.Left, new DataField("group_operators", "user_id"), new DataField("group_members", "user_id"));
            tj.AddCondition(new DataField("group_members", "group_id"), groupId);
            query.AddCondition(new DataField("group_operators", "group_id"), groupId);

            System.Data.Common.DbDataReader membersReader = db.ReaderQuery(query);

            while(membersReader.Read())
            {
                operators.Add(new GroupMember(core, membersReader));
            }

            membersReader.Close();
            membersReader.Dispose();

            return operators;
        }
示例#5
0
        public bool IsGroupOperator(ItemKey member)
        {
            if (member != null)
            {
                if (groupOperatorCache.ContainsKey(member))
                {
                    return groupOperatorCache[member];
                }
                else
                {
                    SelectQuery query = new SelectQuery(typeof(GroupOperator));
                    query.AddField(new DataField(typeof(GroupOperator), "user_id"));
                    query.AddCondition(new DataField(typeof(GroupOperator), "group_id"), groupId);
                    query.AddCondition(new DataField(typeof(GroupOperator), "user_id"), member.Id);

                    System.Data.Common.DbDataReader operatorReader = db.ReaderQuery(query);

                    /*
                     string.Format("SELECT user_id FROM group_operators WHERE group_id = {0} AND user_id = {1}",
                        groupId, member.Id)
                     */

                    if (operatorReader.HasRows)
                    {
                        operatorReader.Close();
                        operatorReader.Dispose();

                        groupOperatorCache.Add(member, true);
                        return true;
                    }
                    else
                    {
                        operatorReader.Close();
                        operatorReader.Dispose();

                        groupOperatorCache.Add(member, false);
                        return false;
                    }
                }
            }
            return false;
        }
示例#6
0
        private bool canNotify(Core core, User owner)
        {
            SelectQuery query = new SelectQuery("notifications");
            query.AddField(new QueryFunction("notification_id", QueryFunctions.Count, "twentyfour")); //"COUNT(notification_id) as twentyfour");
            query.AddCondition("notification_primitive_id", owner.Id);
            query.AddCondition("notification_primitive_type_id", owner.TypeId);
            query.AddCondition("notification_application", applicationId);
            query.AddCondition("notification_time_ut", ConditionEquality.GreaterThan, UnixTime.UnixTimeStamp() - 60 * 60 * 24);

            // maximum ten per application per day
            // TODO: change this
            if ((long)core.Db.Query(query).Rows[0]["twentyfour"] < 20)
            {
                // this used to return true only if e-mail notifications which is should be checked separately
                return true;
            }
            return false;
        }
示例#7
0
        public List<GroupMember> GetMembers(int page, int perPage, string filter)
        {
            List<GroupMember> members = new List<GroupMember>();

            SelectQuery query = new SelectQuery("group_members");
            query.AddFields(UserInfo.GetFieldsPrefixed(core, typeof(User)));
            query.AddJoin(JoinTypes.Inner, UserInfo.GetTable(typeof(User)), "user_id", "user_id");
            query.AddFields(GroupMember.GetFieldsPrefixed(core, typeof(GroupMember)));
            query.AddField(new DataField("group_operators", "user_id", "user_id_go"));
            TableJoin tj = query.AddJoin(JoinTypes.Left, new DataField("group_members", "user_id"), new DataField("group_operators", "user_id"));
            tj.AddCondition(new DataField("group_members", "group_id"), new DataField("group_operators", "group_id"));
            query.AddCondition("`group_members`.`group_id`", groupId);
            query.AddCondition("group_member_approved", true);
            if (!string.IsNullOrEmpty(filter))
            {
                query.AddCondition(new DataField("user_keys", "user_name_first"), filter[0]);
            }
            query.AddSort(SortOrder.Ascending, "group_member_date_ut");
            query.LimitStart = (page - 1) * perPage;
            query.LimitCount = perPage;

            System.Data.Common.DbDataReader membersReader = db.ReaderQuery(query);

            while (membersReader.Read())
            {
                members.Add(new GroupMember(core, membersReader));
            }

            membersReader.Close();
            membersReader.Dispose();

            return members;
        }
示例#8
0
        public static SelectQuery GetSelectQueryStub(Core core, UserGroupLoadOptions loadOptions)
        {
            SelectQuery query = new SelectQuery(UserGroup.GetTable(typeof(UserGroup)));
            query.AddFields(UserGroup.GetFieldsPrefixed(core, typeof(UserGroup)));
            query.AddFields(ItemInfo.GetFieldsPrefixed(core, typeof(ItemInfo)));
            TableJoin join = query.AddJoin(JoinTypes.Left, new DataField(typeof(UserGroup), "group_id"), new DataField(typeof(ItemInfo), "info_item_id"));
            join.AddCondition(new DataField(typeof(ItemInfo), "info_item_type_id"), ItemKey.GetTypeId(core, typeof(UserGroup)));

            if ((loadOptions & UserGroupLoadOptions.Info) == UserGroupLoadOptions.Info)
            {
                query.AddJoin(JoinTypes.Inner, UserGroupInfo.GetTable(typeof(UserGroupInfo)), "group_id", "group_id");
                query.AddFields(UserGroupInfo.GetFieldsPrefixed(core, typeof(UserGroupInfo)));

                if ((loadOptions & UserGroupLoadOptions.Icon) == UserGroupLoadOptions.Icon)
                {
                    query.AddJoin(JoinTypes.Left, new DataField("group_info", "group_icon"), new DataField("gallery_items", "gallery_item_id"));
                    query.AddField(new DataField("gallery_items", "gallery_item_uri"));
                    query.AddField(new DataField("gallery_items", "gallery_item_parent_path"));
                }
            }

            return query;
        }
示例#9
0
        public UserGroup(Core core, string groupName, UserGroupLoadOptions loadOptions)
            : base(core)
        {
            ItemLoad += new ItemLoadHandler(UserGroup_ItemLoad);

            bool containsInfoData = false;
            bool containsIconData = false;

            if (loadOptions == UserGroupLoadOptions.Key)
            {
                try
                {
                    LoadItem("group_name", groupName);
                }
                catch (InvalidItemException)
                {
                    throw new InvalidGroupException();
                }
            }
            else
            {
                SelectQuery query = new SelectQuery(UserGroup.GetTable(typeof(UserGroup)));
                query.AddFields(UserGroup.GetFieldsPrefixed(core, typeof(UserGroup)));
                query.AddCondition("`group_keys`.`group_name`", groupName);

                if ((loadOptions & UserGroupLoadOptions.Info) == UserGroupLoadOptions.Info)
                {
                    containsInfoData = true;

                    query.AddJoin(JoinTypes.Inner, UserGroupInfo.GetTable(typeof(UserGroupInfo)), "group_id", "group_id");
                    query.AddFields(UserGroupInfo.GetFieldsPrefixed(core, typeof(UserGroupInfo)));

                    if ((loadOptions & UserGroupLoadOptions.Icon) == UserGroupLoadOptions.Icon)
                    {
                        containsIconData = true;

                        query.AddJoin(JoinTypes.Left, new DataField("group_info", "group_icon"), new DataField("gallery_items", "gallery_item_id"));
                        query.AddField(new DataField("gallery_items", "gallery_item_uri"));
                        query.AddField(new DataField("gallery_items", "gallery_item_parent_path"));
                    }
                }

                System.Data.Common.DbDataReader groupReader = db.ReaderQuery(query);

                if (groupReader.HasRows)
                {
                    groupReader.Read();

                    loadItemInfo(typeof(UserGroup), groupReader);

                    if (containsInfoData)
                    {
                        groupInfo = new UserGroupInfo(core, groupReader);
                    }

                    if (containsIconData)
                    {
                        loadUserGroupIcon(groupReader);
                    }

                    groupReader.Close();
                    groupReader.Dispose();
                }
                else
                {
                    groupReader.Close();
                    groupReader.Dispose();

                    throw new InvalidGroupException();
                }
            }
        }
示例#10
0
        public Relation GetRelations(ItemKey member)
        {
            Relation returnValue = Relation.None;

            if (member == null)
            {
                return Relation.None;
            }

            if (member.Id == userId)
            {
                return Relation.Owner;
            }

            SelectQuery query = new SelectQuery(typeof(UserRelation));
            query.AddField(new DataField(typeof(UserRelation), "relation_type"));
            query.AddField(new DataField(typeof(UserRelation), "relation_order"));
            query.AddCondition(new DataField(typeof(UserRelation), "relation_me"), userId);
            query.AddCondition(new DataField(typeof(UserRelation), "relation_you"), member.Id);

            System.Data.Common.DbDataReader relationReader = db.ReaderQuery(query);

            /*string.Format("SELECT relation_type, relation_order FROM user_relations WHERE relation_me = {0} AND relation_you = {1};",
                    userId, member.Id)*/

            while (relationReader.Read())
            {
                if ((string)relationReader["relation_type"] == "FRIEND")
                {
                    returnValue |= Relation.Friend;
                }

                if ((string)relationReader["relation_type"] == "FAMILY")
                {
                    returnValue |= Relation.Family;
                }

                if ((string)relationReader["relation_type"] == "BLOCKED")
                {
                    returnValue |= Relation.Blocked;
                }
            }

            relationReader.Close();
            relationReader.Dispose();

            return returnValue;
        }
示例#11
0
        /// <summary>
        /// Gets a list of entries in the blog fullfilling a given criteria.
        /// </summary>
        /// <param name="category">Category to select</param>
        /// <param name="post">Post id to select</param>
        /// <param name="year">Year to select</param>
        /// <param name="month">Month to select</param>
        /// <param name="currentPage">Current page</param>
        /// <param name="perPage">Number to show on each page</param>
        /// <param name="drafts">Flag to select draft posts or published posts (true for drafts)</param>
        /// <returns>A list of blog entries</returns>
        /// <remarks>A number of conditions may be omitted. Integer values can be omitted by passing -1. String values by passing a null or empty string.</remarks>
        private List<BlogEntry> GetEntries(string category, string tag, long post, int year, int month, int currentPage, int perPage, long currentOffset, bool drafts, bool future, out bool moreContent)
        {
            double pessimism = 1.2;

            List<BlogEntry> entries = new List<BlogEntry>();
            moreContent = false;

            long loggedIdUid = core.LoggedInMemberId;

            SelectQuery query = null;

            if (string.IsNullOrEmpty(category) && string.IsNullOrEmpty(tag))
            {
                query = Item.GetSelectQueryStub(core, typeof(BlogEntry));
                query.AddField(new DataField(typeof(BlogEntry), "post_id"));

                if (post > 0)
                {
                    query.AddCondition("post_id", post);
                }

                if (year > 0)
                {
                    query.AddCondition("YEAR(FROM_UNIXTIME(post_published_ut))", year);
                }

                if (month > 0)
                {
                    query.AddCondition("MONTH(FROM_UNIXTIME(post_published_ut))", month);
                }
            }
            else if (string.IsNullOrEmpty(tag))
            {
                query = Item.GetSelectQueryStub(core, typeof(BlogEntry));
                query.AddField(new DataField(typeof(BlogEntry), "post_id"));

                query.AddCondition("category_path", category);
                query.AddJoin(JoinTypes.Inner, "global_categories", "post_category", "category_id");
            }
            else
            {
                query = Item.GetSelectQueryStub(core, typeof(ItemTag));
                query.AddFields(Item.GetFieldsPrefixed(core, typeof(BlogEntry)));

                query.AddJoin(JoinTypes.Inner, new DataField(typeof(ItemTag), "item_id"), new DataField(typeof(BlogEntry), "post_id"));
                query.AddCondition("item_type_id", ItemType.GetTypeId(core, typeof(BlogEntry)));
                query.AddCondition("tag_text_normalised", tag);
            }

            // Include blog entries from the past only if future is false
            if (!future)
            {
                query.AddCondition(new DataField(typeof(BlogEntry), "post_published_ut"), ConditionEquality.LessThanEqual, UnixTime.UnixTimeStamp());
            }

            int bpage = currentPage;
            if (post > 0)
            {
                bpage = 1;
            }

            int limitStart = (bpage - 1) * perPage;

            PublishStatuses status = (drafts) ? PublishStatuses.Draft : ((future) ? PublishStatuses.Queued : PublishStatuses.Published);

            query.AddCondition("post_status", (byte)status);
            query.AddCondition("user_id", UserId);
            query.AddSort(SortOrder.Descending, "post_published_ut");
            /*query.LimitStart = (bpage - 1) * perPage;*/
            if ((currentOffset > 0 && currentPage > 1) || currentOffset == 0)
            {
                long lastId = 0;
                long lastPostTime = 0;
                QueryCondition qc1 = null;
                QueryCondition qc2 = null;

                SelectQuery offsetQuery = new SelectQuery(typeof(BlogEntry));
                offsetQuery.AddField(new DataField(typeof(BlogEntry), "post_published_ut"));
                offsetQuery.AddCondition("post_id", currentOffset);

                if (currentOffset > 0)
                {
                    qc1 = query.AddCondition("post_published_ut", ConditionEquality.LessThan, offsetQuery);
                }
                query.LimitCount = (int)(perPage * pessimism);

                while (entries.Count <= perPage)
                {
                    List<IPermissibleItem> tempBlogEntries = new List<IPermissibleItem>();

                    /*DataTable blogEntriesTable = db.Query(query);

                    if (blogEntriesTable.Rows.Count == 0)
                    {
                        break;
                    }

                    foreach (DataRow row in blogEntriesTable.Rows)
                    {
                        BlogEntry entry = new BlogEntry(core, this, owner, row);
                        tempBlogEntries.Add(entry);
                    }*/

                    System.Data.Common.DbDataReader blogReader = core.Db.ReaderQuery(query);

                    if (!blogReader.HasRows)
                    {
                        blogReader.Close();
                        blogReader.Dispose();
                        break;
                    }

                    while (blogReader.Read())
                    {
                        BlogEntry entry = new BlogEntry(core, this, owner, blogReader);
                        tempBlogEntries.Add(entry);
                    }

                    blogReader.Close();
                    blogReader.Dispose();

                    core.AcessControlCache.CacheGrants(tempBlogEntries);

                    foreach (IPermissibleItem entry in tempBlogEntries)
                    {
                        if (entry.Access.Can("VIEW"))
                        {
                            if (entries.Count == perPage)
                            {
                                moreContent = true;
                                break;
                            }
                            else
                            {
                                entries.Add((BlogEntry)entry);
                            }
                        }
                        lastId = entry.Id;
                        lastPostTime = ((BlogEntry)entry).PublishedDateRaw;
                    }

                    //query.LimitStart += query.LimitCount;
                    if (qc1 == null)
                    {
                        SelectQuery oQuery = new SelectQuery(typeof(BlogEntry));
                        oQuery.AddField(new DataField(typeof(BlogEntry), "post_published_ut"));
                        oQuery.AddCondition("post_id", currentOffset);

                        qc1 = query.AddCondition("post_published_ut", ConditionEquality.LessThan, oQuery);
                    }
                    else
                    {
                        qc1.Value = lastId;
                    }

                    if (qc2 == null)
                    {
                        qc2 = query.AddCondition("post_published_ut", ConditionEquality.LessThanEqual, lastPostTime);
                    }
                    else
                    {
                        qc2.Value = lastPostTime;
                    }

                    query.LimitCount = (int)(query.LimitCount * pessimism);

                    if (moreContent || post > 0)
                    {
                        break;
                    }
                }
            }
            else
            {
                DataTable blogEntriesTable = db.Query(query);

                /* Check ACLs, not the most efficient, but will only check mostly newer content which should be viewed first. */

                int offset = 0;
                int i = 0;

                while (i < limitStart + perPage + 1 && offset < blogEntriesTable.Rows.Count)
                {
                    List<IPermissibleItem> tempBlogEntries = new List<IPermissibleItem>();
                    int j = 0;
                    for (j = offset; j < Math.Min(offset + perPage * 2, blogEntriesTable.Rows.Count); j++)
                    {
                        BlogEntry entry = new BlogEntry(core, this, owner, blogEntriesTable.Rows[j]);
                        tempBlogEntries.Add(entry);
                    }

                    if (tempBlogEntries.Count > 0)
                    {
                        core.AcessControlCache.CacheGrants(tempBlogEntries);

                        foreach (IPermissibleItem entry in tempBlogEntries)
                        {
                            if (entry.Access.Can("VIEW"))
                            {
                                if (i >= limitStart + perPage)
                                {
                                    moreContent = true;
                                    break;
                                }
                                if (i >= limitStart)
                                {
                                    entries.Add((BlogEntry)entry);
                                }
                                i++;
                            }
                        }
                    }
                    else
                    {
                        break;
                    }

                    offset = j;
                }
            }

            return entries;
        }
示例#12
0
        public List<Friend> GetFriends(int page, int perPage, string filter, bool sortOnline)
        {
            List<Friend> friends = new List<Friend>();

            SelectQuery query = new SelectQuery("user_relations");
            query.AddFields(User.GetFieldsPrefixed(core, typeof(User)));
            query.AddFields(UserInfo.GetFieldsPrefixed(core, typeof(UserInfo)));
            query.AddFields(UserProfile.GetFieldsPrefixed(core, typeof(UserProfile)));
            query.AddFields(UserRelation.GetFieldsPrefixed(core, typeof(UserRelation)));
            query.AddField(new DataField("gallery_items", "gallery_item_uri"));
            query.AddField(new DataField("gallery_items", "gallery_item_parent_path"));
            query.AddFields(ItemInfo.GetFieldsPrefixed(core, typeof(ItemInfo)));
            query.AddJoin(JoinTypes.Inner, User.GetTable(typeof(User)), "relation_you", "user_id");
            query.AddJoin(JoinTypes.Inner, UserInfo.GetTable(typeof(UserInfo)), "relation_you", "user_id");
            query.AddJoin(JoinTypes.Inner, UserProfile.GetTable(typeof(UserProfile)), "relation_you", "user_id");
            query.AddJoin(JoinTypes.Left, new DataField("user_profile", "profile_country"), new DataField("countries", "country_iso"));
            query.AddJoin(JoinTypes.Left, new DataField("user_profile", "profile_religion"), new DataField("religions", "religion_id"));
            query.AddJoin(JoinTypes.Left, new DataField("user_info", "user_icon"), new DataField("gallery_items", "gallery_item_id"));

            TableJoin join = query.AddJoin(JoinTypes.Left, new DataField(typeof(UserRelation), "relation_you"), new DataField(typeof(ItemInfo), "info_item_id"));
            join.AddCondition(new DataField(typeof(ItemInfo), "info_item_type_id"), ItemKey.GetTypeId(core, typeof(User)));

            query.AddCondition("relation_me", userId);
            query.AddCondition("relation_type", "FRIEND");
            if ((!string.IsNullOrEmpty(filter)) && filter.Length == 1)
            {
                query.AddCondition(new DataField(typeof(User), "user_name_first"), filter);
            }
            if (sortOnline)
            {
                query.AddSort(SortOrder.Descending, "user_last_visit_ut");
                query.AddSort(SortOrder.Ascending, new QueryCondition("relation_order", ConditionEquality.Equal, 0));
            }
            else
            {
                query.AddSort(SortOrder.Ascending, new QueryCondition("relation_order", ConditionEquality.Equal, 0));
            }
            query.LimitStart = (page - 1) * perPage;
            query.LimitCount = perPage;
            if (sortOnline)
            {
                query.LimitOrder = SortOrder.Descending;
            }

            System.Data.Common.DbDataReader friendsReader = db.ReaderQuery(query);

            while (friendsReader.Read())
            {
                friends.Add(new Friend(core, friendsReader, UserLoadOptions.All));
            }

            friendsReader.Close();
            friendsReader.Dispose();

            return friends;
        }
示例#13
0
        public List<Friend> GetFriends(string namePart)
        {
            List<Friend> friends = new List<Friend>();

            SelectQuery query = new SelectQuery("user_relations");
            query.AddFields(User.GetFieldsPrefixed(core, typeof(User)));
            query.AddFields(UserInfo.GetFieldsPrefixed(core, typeof(UserInfo)));
            query.AddFields(UserProfile.GetFieldsPrefixed(core, typeof(UserProfile)));
            query.AddFields(UserRelation.GetFieldsPrefixed(core, typeof(UserRelation)));
            query.AddField(new DataField("gallery_items", "gallery_item_uri"));
            query.AddField(new DataField("gallery_items", "gallery_item_parent_path"));
            query.AddFields(ItemInfo.GetFieldsPrefixed(core, typeof(ItemInfo)));
            query.AddJoin(JoinTypes.Inner, User.GetTable(typeof(User)), "relation_you", "user_id");
            query.AddJoin(JoinTypes.Inner, UserInfo.GetTable(typeof(UserInfo)), "relation_you", "user_id");
            query.AddJoin(JoinTypes.Inner, UserProfile.GetTable(typeof(UserProfile)), "relation_you", "user_id");
            query.AddJoin(JoinTypes.Left, new DataField("user_info", "user_icon"), new DataField("gallery_items", "gallery_item_id"));

            TableJoin join = query.AddJoin(JoinTypes.Left, new DataField(typeof(UserRelation), "relation_you"), new DataField(typeof(ItemInfo), "info_item_id"));
            join.AddCondition(new DataField(typeof(ItemInfo), "info_item_type_id"), ItemKey.GetTypeId(core, typeof(User)));

            query.AddCondition("relation_me", userId);
            query.AddCondition("relation_type", "FRIEND");
            QueryCondition qc1 = query.AddCondition(new DataField("user_info", "user_name"), ConditionEquality.Like, namePart + "%");
            qc1.AddCondition(ConditionRelations.Or, new DataField("user_profile", "profile_name_first"), ConditionEquality.Like, namePart + "%");
            qc1.AddCondition(ConditionRelations.Or, new DataField("user_info", "user_name_display"), ConditionEquality.Like, namePart + "%");
            query.AddSort(SortOrder.Ascending, "(relation_order - 1)");
            query.LimitCount = 10;

            System.Data.Common.DbDataReader friendsReader = db.ReaderQuery(query);

            while (friendsReader.Read())
            {
                friends.Add(new Friend(core, friendsReader, UserLoadOptions.All));
            }

            friendsReader.Close();
            friendsReader.Dispose();

            return friends;
        }
示例#14
0
        public static void LoadAssemblies(Mysql db)
        {
            string assemblyPath = null;

            SelectQuery query = new SelectQuery("applications");
            query.AddField(new DataField("applications", "application_id"));
            query.AddField(new DataField("applications", "application_assembly_name"));
            query.AddField(new DataField("applications", "application_locked"));
            query.AddField(new DataField("applications", "application_update"));
            query.AddField(new DataField("applications", "application_primitive"));
            query.AddCondition("application_type", (byte)ApplicationType.Native);

            System.Data.Common.DbDataReader applicationReader = db.ReaderQuery(query);

            while (applicationReader.Read())
            {
                long applicationId = (long)applicationReader["application_id"];
                string assemblyName = (string)applicationReader["application_assembly_name"];
                bool isPrimitive = false;

                if (applicationReader["application_primitive"] is bool)
                {
                    isPrimitive = (bool)applicationReader["application_primitive"];
                }
                else if (applicationReader["application_primitive"] is byte)
                {
                    isPrimitive = ((byte)applicationReader["application_primitive"] > 0) ? true : false;
                }
                else if (applicationReader["application_primitive"] is sbyte)
                {
                    isPrimitive = ((sbyte)applicationReader["application_primitive"] > 0) ? true : false;
                }
                else
                {
                    isPrimitive = false;
                }

                if (isPrimitive)
                {
                    if (Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin")))
                    {
                        assemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin", assemblyName + ".dll");
                    }
                    else
                    {
                        assemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyName + ".dll");
                    }
                }
                else
                {
                    if (Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin")))
                    {
                        assemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin", "applications", assemblyName + ".dll");
                    }
                    else
                    {
                        assemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "applications", assemblyName + ".dll");
                    }
                }

                if (!string.IsNullOrEmpty(assemblyPath))
                {
                    Assembly assembly = Assembly.LoadFrom(assemblyPath);

                    LoadedAssemblies[applicationId] = assembly;
                    AssemblyNames[assemblyName] = applicationId;
                }
            }

            applicationReader.Close();
            applicationReader.Dispose();
        }
示例#15
0
        private static ItemViewDiscountedReason VerifyView(Core core, ItemView view)
        {
            ItemViewDiscountedReason returnValue = ItemViewDiscountedReason.None;

            if (SessionState.IsBotUserAgent(view.HttpUserAgent) != null)
            {
                return ItemViewDiscountedReason.BotDetected;
            }

            // Select the number of views within 24 hours of the view
            SelectQuery query = new SelectQuery(typeof(ItemView));
            query.AddField(new QueryFunction("view_id", QueryFunctions.Count, "real_views"));
            query.AddCondition("view_item_id", view.ViewKey.Id);
            query.AddCondition("view_item_type_id", view.ViewKey.TypeId);
            //query.AddCondition("view_processed", true);
            QueryCondition qc1 = query.AddCondition("view_ip", view.viewIp);
            QueryCondition qc2 = qc1.AddCondition("view_time_ut", ConditionEquality.GreaterThan, view.viewTimeRaw - 60 * 60 * 24); // last 24 hours
            qc2.AddCondition("view_time_ut", ConditionEquality.LessThan, view.viewTimeRaw + 60 * 5); // any in the next 5 minutes discounts the whole set
            qc1.AddCondition(ConditionRelations.Or, "view_session_id", view.viewSessionId);
            if (view.userId > 0)
            {
                qc1.AddCondition(ConditionRelations.Or, "user_id", view.userId);
            }

            if ((long)core.Db.Query(query).Rows[0]["real_views"] > 1)
            {
                returnValue = returnValue | ItemViewDiscountedReason.RateLimited;
            }

            if ((!view.viewHttpUserAgent.ToLower().Contains("mozilla/") && !view.viewHttpUserAgent.ToLower().Contains("gecko")) || view.viewHttpUserAgent.Length < 32)
            {
                returnValue = returnValue | ItemViewDiscountedReason.BadUserAgent;
            }

            //
            query = new SelectQuery(typeof(ItemView));
            query.AddField(new QueryFunction("view_id", QueryFunctions.Count, "real_views"));
            query.AddCondition("view_ip", view.viewIp);
            query.AddCondition("view_time_ut", ConditionEquality.GreaterThan, view.viewTimeRaw - 10);
            query.AddCondition("view_time_ut", ConditionEquality.LessThan, view.viewTimeRaw + 10);
            if ((long)core.Db.Query(query).Rows[0]["real_views"] > 8)
            {
                returnValue = returnValue | ItemViewDiscountedReason.RateLimited;
            }

            // ensure that the session is only used by ONE browser, no session hijacking
            query = new SelectQuery(typeof(ItemView));
            query.AddField(new DataField(typeof(ItemView), "view_http_user_agent"));
            query.AddCondition("view_session_id", view.viewSessionId);
            query.AddCondition("view_time_ut", ConditionEquality.GreaterThan, view.viewTimeRaw - 3600);
            query.AddCondition("view_time_ut", ConditionEquality.LessThan, view.viewTimeRaw + 3600);
            query.Distinct = true;
            if ((long)core.Db.Query(query).Rows.Count > 1)
            {
                returnValue = returnValue | ItemViewDiscountedReason.BotDetected;
            }

            long viewQuality = 0;

            if (view.viewTimespan > 60)
            {
                viewQuality += 3;
            }
            else if (view.viewTimespan > 30)
            {
                viewQuality += 2;
            }
            else if (view.viewTimespan > 5)
            {
                viewQuality++;
            }

            if (view.viewJavascript)
            {
                viewQuality++;
            }

            if (view.viewCookies)
            {
                viewQuality++;
            }
            else
            {
                // cookies can't be detected on the landing page, but a legit IP with a cookie is unlikely to go bad even if shared
                query = new SelectQuery(typeof(ItemView));
                query.AddField(new QueryFunction("view_id", QueryFunctions.Count, "real_views"));
                query.AddCondition("view_ip", view.viewIp);
                query.AddCondition("view_cookies", true);
                if ((long)core.Db.Query(query).Rows[0]["real_views"] > 0)
                {
                    viewQuality++;
                }
            }

            if (IsRecentBrowser(view.viewHttpUserAgent))
            {
                viewQuality += 2;
            }
            else
            {
                returnValue = returnValue | ItemViewDiscountedReason.OldUserAgent;
            }

            if (!string.IsNullOrEmpty(view.viewHttpReferer))
            {
                viewQuality++;
            }

            if (viewQuality < 3)
            {
                returnValue = returnValue | ItemViewDiscountedReason.LowQuality;
            }

            return returnValue;
        }
示例#16
0
        public bool CheckSubGroupNameUnique(string groupName)
        {
            SelectQuery query = new SelectQuery(typeof(SubUserGroup));
            query.AddField(new DataField(typeof(SubUserGroup), "sub_group_name"));
            query.AddCondition(new QueryFunction("sub_group_name", QueryFunctions.ToLowerCase), groupName);
            query.AddCondition("sub_group_parent_id", Id);

            if (Query(query).Rows.Count > 0)
            {
                return false;
            }
            return true;
        }
示例#17
0
        // TODO: use user
        public static void Show(Core core, UPage page, string user)
        {
            core.Template.SetTemplate("GuestBook", "viewguestbook");

            page.User.LoadProfileInfo();

            if (!page.User.Access.Can("VIEW"))
            {
                core.Functions.Generate403();
                return;
            }

            /* pages */
            core.Display.ParsePageList(page.Owner, true);

            core.Template.Parse("PAGE_TITLE", string.Format(core.Prose.GetString("USERS_GUEST_BOOK"), page.Owner.DisplayNameOwnership));

            if (core.Session.IsLoggedIn)
            {
                if (page.User.Access.Can("COMMENT"))
                {
                    core.Template.Parse("CAN_COMMENT", "TRUE");
                }
            }

            core.Template.Parse("IS_USER_GUESTBOOK", "TRUE");

            long userId = core.LoadUserProfile(user);

            List<User> commenters = new List<User>();
            commenters.Add(page.User);
            commenters.Add(core.PrimitiveCache[userId]);

            List<string[]> breadCrumbParts = new List<string[]>();
            breadCrumbParts.Add(new string[] { "profile", core.Prose.GetString("PROFILE") });
            breadCrumbParts.Add(new string[] { "comments", core.Prose.GetString("COMMENTS") });
            breadCrumbParts.Add(new string[] {core.PrimitiveCache[userId].Key, core.PrimitiveCache[userId].DisplayName});

            // Load the comment count
            long comments = 0;

            SelectQuery query = new SelectQuery("guestbook_comment_counts");
            query.AddField(new QueryFunction("comment_comments", QueryFunctions.Sum, "comments"));

            QueryCondition qc1 = query.AddCondition("owner_id", commenters[0].Id);
            qc1.AddCondition("user_id", commenters[1].Id);

            QueryCondition qc2 = query.AddCondition(ConditionRelations.Or, "owner_id", commenters[1].Id);
            qc2.AddCondition("user_id", commenters[0].Id);

            DataTable commentCountDataTable = core.Db.Query(query);

            if (commentCountDataTable.Rows.Count > 0)
            {
                if (!(commentCountDataTable.Rows[0]["comments"] is DBNull))
                {
                    comments = (long)(Decimal)commentCountDataTable.Rows[0]["comments"];
                }
            }

            core.Display.DisplayComments(core.Template, page.User, page.User, commenters, comments, UserGuestBookHook);

            core.Display.ParsePagination("COMMENT_PAGINATION", core.Hyperlink.BuildGuestBookUri(page.User, core.PrimitiveCache[userId]), 10, comments);
            page.User.ParseBreadCrumbs(breadCrumbParts);
        }
示例#18
0
        public void PublishToFeed(Core core, User owner, IActionableItem item, List<NumberedItem> subItems, string description)
        {
            core.Console.AppendLine("0x0000");
            ItemKey itemKey = item.ItemKey;
            List<ItemKey> subItemKeys = new List<Internals.ItemKey>();

            foreach (NumberedItem i in subItems)
            {
                subItemKeys.Add(i.ItemKey);
            }

            core.Console.AppendLine("0x0001");
            SelectQuery query = new SelectQuery(typeof(Action));
            query.AddField(new QueryFunction("action_id", QueryFunctions.Count, "twentyfour"));
            query.AddCondition("action_primitive_id", owner.ItemKey.Id);
            query.AddCondition("action_primitive_type_id", owner.ItemKey.TypeId);
            query.AddCondition("action_application", applicationId);
            query.AddCondition("action_time_ut", ConditionEquality.GreaterThan, UnixTime.UnixTimeStamp() - 60 * 60 * 24);

            core.Console.AppendLine("0x0002");
            // maximum 48 per application per day
            if ((long)core.Db.Query(query).Rows[0]["twentyfour"] < 48)
            {
                core.Console.AppendLine("0x0003");
                /* Post to Twitter, Facebook, individual */
                string sharePrefix = (core.Http != null ? core.Http.Form["share"] : null);
                // Either the share prefix has been set XOR fallback to the default share settings
                if ((!string.IsNullOrEmpty(sharePrefix)) || ((owner.UserInfo.TwitterSyndicate && owner.UserInfo.TwitterAuthenticated) || (owner.UserInfo.FacebookSyndicate && owner.UserInfo.FacebookAuthenticated) || (owner.UserInfo.TumblrSyndicate && owner.UserInfo.TumblrAuthenticated)))
                {
                    core.Console.AppendLine("0x0004");
                    ItemInfo info = item.Info;
                    IActionableItem sharedItem = item;
                    ItemKey sharedItemKey = item.ItemKey;

                    core.Console.AppendLine("0x0005");
                    if (subItems.Count == 1)
                    {
                        sharedItemKey = subItems[0].ItemKey;
                        try
                        {
                            info = new ItemInfo(core, subItems[0]);
                        }
                        catch (InvalidIteminfoException)
                        {
                            info = ItemInfo.Create(core, subItems[0]);
                        }

                        if (subItems[0] is IActionableItem)
                        {
                            sharedItem = (IActionableItem)subItems[0];
                        }
                    }

                    core.Console.AppendLine("0x0006");
                    if (sharedItemKey.GetType(core).Shareable)
                    {
                        bool publicItem = true;

                        string debug = string.Empty;

                        IPermissibleItem pitem = item as IPermissibleItem;
                        if (pitem != null)
                        {
                            publicItem = pitem.Access.IsPublic();
                            //debug += ":p+" + item.ItemKey.ToString();
                        }

                        IPermissibleSubItem psitem = item as IPermissibleSubItem;
                        if (psitem != null)
                        {
                            publicItem = psitem.PermissiveParent.Access.IsPublic();
                            //debug += ":ps+" + publicItem.ToString();
                        }

                        core.Console.AppendLine("0x0007");
                        if (publicItem)
                        {
                            core.Console.AppendLine("0x0008");
                            if (owner.UserInfo.TwitterAuthenticated)
                            {
                                core.Console.AppendLine("0x0009");
                                int maxLength = 140;
                                if (!string.IsNullOrEmpty(sharedItem.DataContentType))
                                {
                                    maxLength -= 24; // twitter now considers the image link as part of the tweet
                                }
                                string twitterDescription = Functions.TrimStringToWord(description, maxLength - 7 - Hyperlink.Domain.Length - 3 - 11 - 1, true);

                                core.Console.AppendLine("0x0010");
                                string twitterShare = (core.Http != null ? core.Http.Form[sharePrefix + "-share-twitter"] : string.Empty);
                                core.Console.AppendLine("0x0011");
                                if ((sharePrefix == null && owner.UserInfo.TwitterSyndicate) || ((!string.IsNullOrEmpty(sharePrefix)) && (!string.IsNullOrEmpty(twitterShare))))
                                {
                                    core.Console.AppendLine("0x0012");
                                    core.Queue.PushJob(new Job(core.Settings.QueueDefaultPriority, 0, core.LoggedInMemberId, sharedItemKey.TypeId, sharedItemKey.Id, "publishTweet", twitterDescription + debug));
                                }
                            }

                            if (owner.UserInfo.TumblrAuthenticated)
                            {
                                Uri shareUri = new Uri(info.ShareUri);

                                string tumblrShare = (core.Http != null ? core.Http.Form[sharePrefix + "-share-tumblr"] : string.Empty);
                                if ((sharePrefix == null && owner.UserInfo.TumblrSyndicate) || ((!string.IsNullOrEmpty(sharePrefix)) && (!string.IsNullOrEmpty(tumblrShare))))
                                {
                                    core.Queue.PushJob(new Job(core.Settings.QueueDefaultPriority, 0, core.LoggedInMemberId, sharedItemKey.TypeId, sharedItemKey.Id, "publishTumblr", core.Bbcode.Parse(HttpUtility.HtmlEncode(sharedItem.PostType == ActionableItemType.Photo ? sharedItem.Caption : sharedItem.GetActionBody(subItemKeys)), owner, true, string.Empty, string.Empty) + "<p><a href=\"" + info.ShareUri + "\">" + shareUri.Authority + shareUri.PathAndQuery + "</a></p>"));
                                }
                            }

                            if (owner.UserInfo.FacebookAuthenticated)
                            {
                                string facebookShare = (core.Http != null ? core.Http.Form[sharePrefix + "-share-facebook"] : string.Empty);
                                if ((sharePrefix == null && owner.UserInfo.FacebookSyndicate) || ((!string.IsNullOrEmpty(sharePrefix)) && (!string.IsNullOrEmpty(facebookShare))))
                                {
                                    core.Queue.PushJob(new Job(core.Settings.QueueDefaultPriority, 0, core.LoggedInMemberId, sharedItemKey.TypeId, sharedItemKey.Id, "publishFacebook", description));
                                }
                            }
                        }
                    }
                }

                core.Console.AppendLine("0x0013");
                /* Post to Box Social feed, coalesce */
                SelectQuery query2 = Action.GetSelectQueryStub(core, typeof(Action));
                query2.AddCondition("action_primitive_id", owner.ItemKey.Id);
                query2.AddCondition("action_primitive_type_id", owner.ItemKey.TypeId);
                query2.AddCondition("action_item_id", itemKey.Id);
                query2.AddCondition("action_item_type_id", itemKey.TypeId);
                query2.AddCondition("action_application", applicationId);
                query2.AddCondition("action_time_ut", ConditionEquality.GreaterThan, UnixTime.UnixTimeStamp() - 60 * 60 * 24);
                query2.AddSort(SortOrder.Descending, "action_time_ut");

                DataTable actionDataTable = core.Db.Query(query2);

                if (actionDataTable.Rows.Count > 0)
                {
                    List<ItemKey> subItemsShortList = new List<ItemKey>();

                    Action action = new Action(core, owner, actionDataTable.Rows[0]);

                    SelectQuery query3 = ActionItem.GetSelectQueryStub(core, typeof(ActionItem));
                    query3.AddCondition("action_id", action.Id);
                    query3.LimitCount = 3;

                    DataTable actionItemDataTable = core.Db.Query(query3);

                    if (actionItemDataTable.Rows.Count < 3)
                    {
                        for (int i = 0; i < actionItemDataTable.Rows.Count; i++)
                        {
                            subItemsShortList.Add(new ItemKey((long)actionItemDataTable.Rows[i]["item_id"], (long)actionItemDataTable.Rows[i]["item_type_id"]));
                        }

                        for (int i = 0; i < subItems.Count; i++)
                        {
                            if (subItemsShortList.Count == 3) break;
                            subItemsShortList.Add(subItemKeys[i]);
                        }

                        string body = item.GetActionBody(subItemsShortList);
                        string bodyCache = string.Empty;

                        if (!body.Contains("[user") && !body.Contains("sid=true]"))
                        {
                            bodyCache = Bbcode.Parse(HttpUtility.HtmlEncode(body), null, owner, true, string.Empty, string.Empty);
                        }

                        UpdateQuery uquery = new UpdateQuery(typeof(Action));
                        uquery.AddField("action_time_ut", UnixTime.UnixTimeStamp());
                        uquery.AddField("action_title", item.Action);
                        uquery.AddField("action_body", body);
                        uquery.AddField("action_body_cache", bodyCache);

                        if (subItemsShortList != null && subItemsShortList.Count == 1)
                        {
                            uquery.AddField("interact_item_id", subItemsShortList[0].Id);
                            uquery.AddField("interact_item_type_id", subItemsShortList[0].TypeId);
                        }
                        else
                        {
                            uquery.AddField("interact_item_id", itemKey.Id);
                            uquery.AddField("interact_item_type_id", itemKey.TypeId);
                        }

                        uquery.AddCondition("action_id", action.Id);

                        core.Db.Query(uquery);

                        if (subItems != null)
                        {
                            foreach (ItemKey subItem in subItemKeys)
                            {
                                InsertQuery iquery = new InsertQuery(typeof(ActionItem));
                                iquery.AddField("action_id", action.Id);
                                iquery.AddField("item_id", subItem.Id);
                                iquery.AddField("item_type_id", subItem.TypeId);

                                core.Db.Query(iquery);
                            }
                        }
                    }
                }
                else
                {
                    string body = item.GetActionBody(subItemKeys);
                    string bodyCache = string.Empty;

                    if (!body.Contains("[user") && !body.Contains("sid=true]"))
                    {
                        bodyCache = Bbcode.Parse(HttpUtility.HtmlEncode(body), null, owner, true, string.Empty, string.Empty);
                    }

                    InsertQuery iquery = new InsertQuery(typeof(Action));
                    iquery.AddField("action_primitive_id", owner.ItemKey.Id);
                    iquery.AddField("action_primitive_type_id", owner.ItemKey.TypeId);
                    iquery.AddField("action_item_id", itemKey.Id);
                    iquery.AddField("action_item_type_id", itemKey.TypeId);
                    iquery.AddField("action_title", item.Action);
                    iquery.AddField("action_body", body);
                    iquery.AddField("action_body_cache", bodyCache);
                    iquery.AddField("action_application", applicationId);
                    iquery.AddField("action_time_ut", UnixTime.UnixTimeStamp());

                    if (subItems != null && subItems.Count == 1)
                    {
                        iquery.AddField("interact_item_id", subItemKeys[0].Id);
                        iquery.AddField("interact_item_type_id", subItemKeys[0].TypeId);
                    }
                    else
                    {
                        iquery.AddField("interact_item_id", itemKey.Id);
                        iquery.AddField("interact_item_type_id", itemKey.TypeId);
                    }

                    long actionId = core.Db.Query(iquery);

                    if (subItems != null)
                    {
                        foreach (ItemKey subItem in subItemKeys)
                        {
                            iquery = new InsertQuery(typeof(ActionItem));
                            iquery.AddField("action_id", actionId);
                            iquery.AddField("item_id", subItem.Id);
                            iquery.AddField("item_type_id", subItem.TypeId);

                            core.Db.Query(iquery);
                        }
                    }
                }
            }
        }