public void JoinGroup(
            ManagedSecurityContext sec,
            string message)
        {
            ManagedAccountGroup group = new ManagedAccountGroup(Session, mInstance.AccountGroup);

            if (group.Instance.IsPrivate && !group.HasAdministratorAccount(mInstance.Requester.Id))
            {
                TransitAccountGroupAccountRequest t_request = new TransitAccountGroupAccountRequest();
                t_request.AccountGroupId = mInstance.AccountGroup.Id;
                t_request.AccountId      = mInstance.Account.Id;
                t_request.Message        = string.Format("{0} invited {1} to \"{2}\". " +
                                                         "The invitation was accepted and needs to be approved by the group administrator.\n{3}",
                                                         mInstance.Requester.Name, mInstance.Account.Name, mInstance.AccountGroup.Name, message);
                t_request.Submitted = DateTime.UtcNow;

                ManagedAccountGroupAccountRequest m_request = new ManagedAccountGroupAccountRequest(Session);
                m_request.CreateOrUpdate(t_request, sec);
            }
            else
            {
                TransitAccountGroupAccount t_account = new TransitAccountGroupAccount();
                t_account.AccountId      = mInstance.Account.Id;
                t_account.AccountGroupId = mInstance.AccountGroup.Id;
                t_account.Created        = t_account.Modified = DateTime.UtcNow;
                ManagedAccountGroupAccount m_accountgroupaccount = new ManagedAccountGroupAccount(Session);
                m_accountgroupaccount.CreateOrUpdate(t_account, sec);
            }
        }
Ejemplo n.º 2
0
        public override int CreateOrUpdate(TransitAccountGroupAccount t_instance, ManagedSecurityContext sec)
        {
            ManagedAccountGroup m_group = new ManagedAccountGroup(Session, t_instance.AccountGroupId);

            // check whether the user is already a member
            if (t_instance.Id == 0 && m_group.HasAccount(t_instance.AccountId))
            {
                throw new Exception(string.Format(
                                        "You are already a member of \"{0}\".", m_group.Instance.Name));
            }

            // ensure that user isn't trying to self promote
            if (t_instance.Id > 0 && t_instance.IsAdministrator)
            {
                // the caller isn't a group admin
                if (!m_group.HasAdministratorAccount(sec.Account.Id))
                {
                    throw new ManagedAccount.AccessDeniedException();
                }
            }

            // ensure that not removing last admin
            if (t_instance.Id > 0 && !t_instance.IsAdministrator)
            {
                AccountGroupAccount existing_instance = Session.Load <AccountGroupAccount>(t_instance.Id);
                if (existing_instance.IsAdministrator)
                {
                    bool fHasAnotherAdmin = false;
                    foreach (AccountGroupAccount instance in existing_instance.AccountGroup.AccountGroupAccounts)
                    {
                        if (instance.IsAdministrator && instance != existing_instance)
                        {
                            fHasAnotherAdmin = true;
                            break;
                        }
                    }

                    if (!fHasAnotherAdmin)
                    {
                        throw new Exception("Cannot demote the last group administrator.");
                    }
                }
            }

            int id = base.CreateOrUpdate(t_instance, sec);

            if (t_instance.Id == 0)
            {
                if (mInstance.AccountGroup.AccountGroupAccounts == null)
                {
                    mInstance.AccountGroup.AccountGroupAccounts = new List <AccountGroupAccount>();
                }
                mInstance.AccountGroup.AccountGroupAccounts.Add(mInstance);

                // subscribe the user to a group feed
                TransitAccountRssWatch t_watch = new TransitAccountRssWatch();
                t_watch.UpdateFrequency = 24;
                t_watch.Name            = mInstance.AccountGroup.Name;
                t_watch.Url             = string.Format("AccountGroupRss.aspx?id={0}", mInstance.AccountGroup.Id);
                t_watch.Enabled         = true;
                t_watch.AccountId       = mInstance.Account.Id;
                ManagedAccountRssWatch m_watch = new ManagedAccountRssWatch(Session);
                m_watch.CreateOrUpdate(t_watch, ManagedAccount.GetUserSecurityContext(Session, mInstance.Account.Id));
                Session.Flush();

                // e-mail the user a welcome message
                ManagedAccount recepient = new ManagedAccount(Session, mInstance.Account);
                ManagedSiteConnector.TrySendAccountEmailMessageUriAsAdmin(Session, recepient,
                                                                          string.Format("EmailAccountGroupAccount.aspx?id={0}",
                                                                                        id));
            }

            return(id);
        }