Exemplo n.º 1
0
        public static void UpdateCourses(RmContext context)
        {
            var courses = GetCourses();

            foreach (var pair in courses)
            {
                var course = context.Courses.FirstOrDefault(c => c.Code == pair.Item1);
                if (course == null)
                {
                    context.Courses.Add(new Course
                    {
                        Code = pair.Item1,
                        Name = pair.Item2
                    });
                }
                else if (course.Name != pair.Item2)
                {
                    course.Name = pair.Item2;
                }
            }
            context.SaveChanges();
        }
Exemplo n.º 2
0
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            try
            {
                // Framework
                app.UseSession();
                app.UseMvc();
                app.UseStaticFiles();

                // Migrate DB
                var optionsBuilder = new DbContextOptionsBuilder <RmContext>();
                optionsBuilder.UseSqlServer(Configuration["ConnectionString"]);
                var context = new RmContext(optionsBuilder.Options);
                context.Database.Migrate();
            }
            catch (Exception ex)
            {
                Logger.Exception?.WriteLine(ex.GetExceptionString("StartUp", "Configure"));
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Create login for user. Throws exceptions if invalid, username exists or fails
        /// </summary>
        public static void CreateLoginForUser(User user, string name, string pwdhash, RmLoginSettings settings, RmContext context)
        {
            if (user == null || String.IsNullOrWhiteSpace(name) || String.IsNullOrWhiteSpace(pwdhash))
            {
                throw new ArgumentNullException();
            }

            var existing = context.UserLogins.FirstOrDefault(u => u.Name == name);

            if (existing != null)
            {
                throw new Exception("username exists");
            }

            var hash  = HashFromPwdHash(pwdhash, settings);
            var login = new UserLogin
            {
                Name   = name,
                Hash   = hash,
                UserId = user.UserId
            };

            try
            {
                context.UserLogins.Add(login);
                context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("operation failed", ex);
            }
        }
Exemplo n.º 4
0
        public static string RedeemToken(ISession session, string token, RmContext context)
        {
            Tuple <DateTime, string, string> entry;

            lock (_loginEntryLock)
            {
                entry = _thirdPartyLogins.FirstOrDefault(t => t.Item3 == token);
                if (entry == null)
                {
                    return("invalid token");
                }

                _thirdPartyLogins.Remove(entry);
            }

            var diff = (DateTime.UtcNow - entry.Item1).TotalSeconds;

            if (diff > 120)
            {
                return("token expired");
            }

            var itsc = entry.Item2;
            var user = context.Users.FirstOrDefault(u => u.Itsc == itsc);

            // create user with itsc if not exist
            // this complicated logic is to prevent someone from logging in from two places at the same time and get two Users created
            // this code will not be tested :P
            if (user == null)
            {
                var             shallCreate = true;
                EventWaitHandle handle      = null;
                lock (_userCreationLock)
                {
                    if (_creatingUser.ContainsKey(itsc))
                    {
                        // Some thread is creating the user. Wait until that thread completes creation and set the handle.
                        shallCreate = false;
                        handle      = _creatingUser[itsc];
                    }
                    else
                    {
                        // This is the first thread in the area. Create the handle.
                        handle = new EventWaitHandle(false, EventResetMode.ManualReset);
                        _creatingUser[itsc] = handle;
                    }
                }

                if (shallCreate)
                {
                    try
                    {
                        user = new User
                        {
                            Itsc         = itsc,
                            Nickname     = itsc,
                            IsAdmin      = false,
                            IsFullMember = true
                        };
                        context.Users.Add(user);
                        context.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        Logger.Exception?.WriteLine(ex.GetExceptionString("UserManager", "RedeemToken CreateUser"));
                        return("server error");
                    }
                    finally
                    {
                        handle.Set();
                    }
                }
                else
                {
                    handle.WaitOne();
                    user = context.Users.FirstOrDefault(u => u.Itsc == itsc);
                    if (user == null)
                    {
                        return("server error");
                    }
                }
            }

            AssignUser(session, user);
            return("success");
        }
Exemplo n.º 5
0
        public static string ThirdPartyLogin(string itsc, string timestr, string hash, RmLoginSettings settings, RmContext context)
        {
            // verify third party identity
            DateTime time;

            if (!DateTime.TryParseExact(timestr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture,
                                        DateTimeStyles.None, out time))
            {
                return("R_INVALID_TIME");
            }

            var diff = (DateTime.UtcNow - time).TotalSeconds;

            if (diff < 0)
            {
                return("R_FUTURE_TIME");
            }
            else if (diff > 10)
            {
                return("R_TIME_EXPIRED");
            }

            var target = CryptoHelper.GetMd5String(itsc + timestr + settings.ThirdPartyPsk);

            if (hash != target)
            {
                return("R_HASH_REJECTED");
            }

            lock (_loginHashLock)
            {
                if (_acceptedHashes.Contains(hash))
                {
                    return("R_REPLAY");
                }

                _acceptedHashes.Add(hash);
            }

            var token = GenerateToken();

            lock (_loginEntryLock)
            {
                var tuple = _thirdPartyLogins.FirstOrDefault(t => t.Item2 == itsc);
                if (tuple != null)
                {
                    _thirdPartyLogins.Remove(tuple);
                }

                tuple = new Tuple <DateTime, string, string>(time, itsc, token);
                _thirdPartyLogins.Add(tuple);
            }

            return(token);
        }
Exemplo n.º 6
0
        public static bool LoginWithCredentials(ISession session, string name, string pwdhash, RmLoginSettings settings, RmContext context)
        {
            var hash  = HashFromPwdHash(pwdhash, settings);
            var login = context.UserLogins.Include(u => u.User).FirstOrDefault(u => u.Name == name && u.Hash == hash);

            if (login?.User != null)
            {
                AssignUser(session, login.User);
                return(true);
            }
            return(false);
        }
Exemplo n.º 7
0
 public ApiUserController(RmContext context, IOptions <RmSettings> options, IOptions <RmLoginSettings> loginOptions) : base(context, options)
 {
     _loginSettings = loginOptions.Value;
 }
Exemplo n.º 8
0
 public ApiCwikiController(RmContext context, IOptions <RmSettings> options) : base(context, options)
 {
 }
Exemplo n.º 9
0
 public RmApiControllerBase(RmContext context, IOptions <RmSettings> options)
 {
     _context  = context;
     _settings = options.Value;
 }