예제 #1
0
        public async Task BecomeGodfather(IUser actor, IUserShim targetShim)
        {
            var target = await targetShim.Load();

            using (var context = await ContextProvider.Connect())
                using (var transact = context.Database.BeginTransaction(IsolationLevel.Serializable))
                {
                    var godfather = await context.Users.Include(u => u.Membership).SingleAsync(u => u.Id == actor.UserId);

                    // if godfather is not a real member, this method call was super duper obsolete
                    if (godfather.Membership == null)
                    {
                        return;
                    }

                    var guest = await context.Users.Include(u => u.Membership).Include(u => u.GuestInvite)
                                .Include(u => u.PersistentGuest.Godfathers).SingleAsync(u => u.Id == target.UserId);

                    if (guest.PersistentGuest == null)
                    {
                        // only guests can be promoted to persistentguests
                        if (guest.GuestInvite == null)
                        {
                            return;
                        }

                        guest.PersistentGuest = new PersistentGuest
                        {
                            OriginalInvite = guest.GuestInvite,
                        };
                        guest.GuestInvite = null;

                        CertificateCredentials creds;
                        if (Fancyauth.GuestCredentials.TryGetValue(target.UserId, out creds))
                        {
                            guest.CertCredentials.Add(creds);
                        }
                        else
                        {
                            await actor.SendMessage("No certificate found.");

                            return;
                        }
                    }

                    // ignore the nop case
                    if (guest.PersistentGuest.Godfathers.Contains(godfather.Membership))
                    {
                        return;
                    }

                    guest.PersistentGuest.Godfathers.Add(godfather.Membership);

                    await context.SaveChangesAsync();

                    transact.Commit();
                }

            await target.SendMessage("Irgendwann - möglicherweise aber auch nie - werde ich dich bitten, mir eine kleine Gefälligkeit zu erweisen.");
        }
예제 #2
0
        public async Task Invite(IUser usr)
        {
            var rand = new byte[42];

            InviteRng.GetBytes(rand);
            var codeBuilder = new StringBuilder(rand.Length);

            for (int i = 0; i < rand.Length; i++)
            {
                codeBuilder.Append(PwdChars[rand[i] & PwdIndexMask]);
            }

            var code = codeBuilder.ToString();

            using (var context = await ContextProvider.Connect())
            {
                context.Invites.Add(new Invite
                {
                    Code    = code,
                    Inviter = context.Users.Attach(new User {
                        Id = usr.UserId
                    }),
                    ExpirationDate = DateTimeOffset.Now.AddHours(1),
                });

                await context.SaveChangesAsync();
            }

            await usr.SendMessage("Invite code: " + code);
        }
예제 #3
0
        public async Task RevokeGodfather(IUser actor, string targetName)
        {
            using (var context = await ContextProvider.Connect())
                using (var transact = context.Database.BeginTransaction(IsolationLevel.Serializable))
                {
                    var guest = await context.Users.Include(u => u.GuestInvite).Include(u => u.PersistentGuest.Godfathers)
                                .SingleAsync(u => u.Name == targetName);

                    // if guest is not a persistent guest, why the heck did someone call this method
                    if (guest.PersistentGuest == null)
                    {
                        await actor.SendMessage("How about no.");

                        transact.Commit();
                        return;
                    }

                    var membership = guest.PersistentGuest.Godfathers.Single(m => m.UserId == actor.UserId);
                    if (membership != null)
                    {
                        guest.PersistentGuest.Godfathers.Remove(membership);

                        // no godfather anymore --> downgrade to regular guest
                        if (guest.PersistentGuest.Godfathers.Count == 0)
                        {
                            guest.GuestInvite = guest.PersistentGuest.OriginalInvite;
                            context.PersistentGuests.Remove(guest.PersistentGuest);
                            context.CertificateCredentials.RemoveRange(guest.CertCredentials);
                            guest.PersistentGuest = null;
                            guest.CertCredentials.Clear();

                            await actor.SendMessage("Removed. Downgraded to a normal guest.");
                        }
                        else
                        {
                            await actor.SendMessage("Removed. User is still a persistent guest though.");
                        }
                    }
                    else
                    {
                        await actor.SendMessage("He was never yours anyways.");
                    }


                    await context.SaveChangesAsync();

                    transact.Commit();
                }
        }
예제 #4
0
        public async Task Integrate(IUser actor, IUserShim targetShim)
        {
            var target = await targetShim.Load();

            using (var context = await ContextProvider.Connect())
                using (var transact = context.Database.BeginTransaction(IsolationLevel.Serializable))
                {
                    var targetEntity = await context.Users.Include(x => x.Membership).Include(x => x.PersistentGuest)
                                       .Include(x => x.GuestInvite).SingleAsync(x => x.Id == target.UserId);

                    var actorEntity = await context.Users.Include(x => x.Membership).Include(x => x.PersistentGuest)
                                      .Include(x => x.GuestInvite).Include(x => x.CertCredentials)
                                      .SingleAsync(x => x.Id == actor.UserId);

                    // reqiurements:
                    // * a member
                    // * targets a non-member
                    // * specifically, a non-persistent guest
                    if ((targetEntity.Membership != null) || (targetEntity.PersistentGuest != null) || (actorEntity.Membership == null))
                    {
                        await actor.SendMessage("Integration denied.");

                        return;
                    }

                    CertificateCredentials creds;
                    if (Fancyauth.GuestCredentials.TryGetValue(target.UserId, out creds))
                    {
                        actorEntity.CertCredentials.Add(creds);
                    }
                    else
                    {
                        await actor.SendMessage("No certificate found.");

                        return;
                    }

                    await context.SaveChangesAsync();

                    transact.Commit();
                }

            await targetShim.Kick("You have been integrated into " + actor.Name);
        }