Пример #1
0
        public async Task <bool> CreateUser(string userEmail, bool isAdmin, string organizationID)
        {
            try
            {
                var user = new RemotelyUser()
                {
                    UserName        = userEmail.Trim().ToLower(),
                    Email           = userEmail.Trim().ToLower(),
                    IsAdministrator = isAdmin,
                    OrganizationID  = organizationID,
                    UserOptions     = new RemotelyUserOptions()
                };
                var org = RemotelyContext.Organizations
                          .Include(x => x.RemotelyUsers)
                          .FirstOrDefault(x => x.ID == organizationID);
                org.RemotelyUsers.Add(user);
                await RemotelyContext.SaveChangesAsync();

                return(true);
            }
            catch (Exception ex)
            {
                WriteEvent(ex, organizationID);
                return(false);
            }
        }
Пример #2
0
 public string CreateRemotelyFirstUser(string remotelyUrl, RemotelyUser user)
 {
     _request.Method = Method.POST;
     _request.AddJsonBody(user);
     _request.Resource = "api/Theopenem/CreateFirstUser";
     return(new ApiRequest(new Uri(remotelyUrl)).ExecuteRemotely(_request, ""));
 }
Пример #3
0
 public void OnGet()
 {
     if (User.Identity.IsAuthenticated)
     {
         RemotelyUser = _dataService.GetUserByNameWithOrg(base.User.Identity.Name);
     }
 }
Пример #4
0
        public bool DoesUserHaveAccessToDevice(string deviceID, RemotelyUser remotelyUser)
        {
            var targetDevice = RemotelyContext.Devices
                               .FirstOrDefault(x => x.ID == deviceID && x.OrganizationID == remotelyUser.OrganizationID);

            return(RemotelyContext.Devices.Any(x => x.ID == deviceID && x.OrganizationID == remotelyUser.OrganizationID));
        }
Пример #5
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            var organizationCount = _dataService.GetOrganizationCount();

            if (_appConfig.MaxOrganizationCount > 0 && organizationCount >= _appConfig.MaxOrganizationCount)
            {
                return(NotFound());
            }
            returnUrl ??= Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
            if (ModelState.IsValid)
            {
                var user = new RemotelyUser
                {
                    UserName        = Input.Email,
                    Email           = Input.Email,
                    IsServerAdmin   = organizationCount == 0,
                    Organization    = new Organization(),
                    UserOptions     = new RemotelyUserOptions(),
                    IsAdministrator = true
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { area = "Identity", userId = user.Id, code },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                                                      $"<img src='{Request.Scheme}://{Request.Host}/images/Fastwire_Logo.png'/><br><br>Please confirm your Fastwire account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    if (_userManager.Options.SignIn.RequireConfirmedAccount)
                    {
                        return(RedirectToPage("RegisterConfirmation", new { email = Input.Email }));
                    }
                    else
                    {
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }
Пример #6
0
 public string[] FilterDeviceIDsByUserPermission(string[] deviceIDs, RemotelyUser remotelyUser)
 {
     return(RemotelyContext.Devices.Where(x =>
                                          deviceIDs.Contains(x.ID) &&
                                          x.OrganizationID == remotelyUser.OrganizationID
                                          )
            .Select(x => x.ID)
            .ToArray());
 }
Пример #7
0
        public bool DoesUserHaveAccessToDevice(string deviceID, RemotelyUser remotelyUser)
        {
            var targetDevice = RemotelyContext.Devices
                               .Include(x => x.DevicePermissionLinks)
                               .FirstOrDefault(x => x.ID == deviceID && x.OrganizationID == remotelyUser.OrganizationID);

            return(remotelyUser.IsAdministrator ||
                   targetDevice.DevicePermissionLinks.Count == 0 ||
                   targetDevice.DevicePermissionLinks.Any(x => x.PermissionGroup.UserPermissionLinks.Any(y => y.RemotelyUserID == remotelyUser.Id)));
        }
Пример #8
0
        public async Task <IActionResult> SendInvite([FromBody] Invite invite)
        {
            if (!DataService.GetUserByName(User.Identity.Name).IsAdministrator)
            {
                return(Unauthorized());
            }
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var newUserMessage = "";

            if (!DataService.DoesUserExist(invite.InvitedUser))
            {
                var user = new RemotelyUser {
                    UserName = invite.InvitedUser, Email = invite.InvitedUser
                };
                var result = await UserManager.CreateAsync(user);

                if (result.Succeeded)
                {
                    user = await UserManager.FindByEmailAsync(invite.InvitedUser);

                    await UserManager.ConfirmEmailAsync(user, await UserManager.GenerateEmailConfirmationTokenAsync(user));

                    var resetCode = UrlEncoder.Default.Encode(await UserManager.GeneratePasswordResetTokenAsync(user));
                    var resetUrl  = $"{Request.Scheme}://{Request.Host}/Identity/Account/ResetPassword?code={resetCode}";
                    invite.ResetUrl = resetUrl;
                    newUserMessage  = $@"<br><br>Since you don't have an account yet, one has been created for you.
                                    You will need to set a password first before attempting to join the organization.<br><br>
                                    Set your password by <a href='{resetUrl}'>clicking here</a>.  Your username/email
                                    is <strong>{invite.InvitedUser}</strong>.";
                }
                else
                {
                    return(BadRequest("There was an issue creating the new account."));
                }
            }

            var newInvite = DataService.AddInvite(User.Identity.Name, invite, Request.Scheme + "://" + Request.Host);

            var inviteURL = $"{Request.Scheme}://{Request.Host}/Invite?id={newInvite.ID}";
            await EmailSender.SendEmailAsync(invite.InvitedUser, "Invitation to Organization in Remotely",
                                             $@"<img src='https://remotely.lucency.co/images/Remotely_Logo.png'/>
                            <br><br>
                            Hello!
                            <br><br>
                            You've been invited by {User.Identity.Name} to join an organization in Remotely.
                            {newUserMessage}
                            <br><br>
                            You can join the organization by <a href='{HtmlEncoder.Default.Encode(inviteURL)}'>clicking here</a>.");

            return(Ok(newInvite));
        }
Пример #9
0
        public async Task <IActionResult> SendInvite(RemotelyUser currentUser)
        {
            if (!currentUser.IsAdministrator)
            {
                return(RedirectToPage("Index"));
            }

            if (ModelState.IsValid)
            {
                if (!DataService.DoesUserExist(Input.UserEmail))
                {
                    var result = await DataService.CreateUser(Input.UserEmail, Input.IsAdmin, currentUser.OrganizationID);

                    if (result)
                    {
                        var user = DataService.GetUserByName(Input.UserEmail);

                        await UserManager.ConfirmEmailAsync(user, await UserManager.GenerateEmailConfirmationTokenAsync(user));

                        StatusMessage = "User account created.";
                        return(RedirectToPage());
                    }
                    else
                    {
                        ModelState.AddModelError("CreateUser", "Failed to create user account.");
                        return(Page());
                    }
                }
                else
                {
                    var invite = new Invite()
                    {
                        InvitedUser = Input.UserEmail,
                        IsAdmin     = Input.IsAdmin
                    };
                    var newInvite = DataService.AddInvite(currentUser.OrganizationID, invite);

                    var inviteURL = $"{Request.Scheme}://{Request.Host}/Invite?id={newInvite.ID}";
                    await EmailSender.SendEmailAsync(invite.InvitedUser, "Invitation to Organization in Remotely",
                                                     $@"<img src='https://remotely.one/media/Remotely_Logo.png'/>
                            <br><br>
                            Hello!
                            <br><br>
                            You've been invited to join an organization in Remotely.
                            <br><br>
                            You can join the organization by <a href='{HtmlEncoder.Default.Encode(inviteURL)}'>clicking here</a>.");

                    StatusMessage = "Invitation sent.";

                    return(RedirectToPage());
                }
            }
            return(Page());
        }
Пример #10
0
 public bool DoesUserHaveAccessToDevice(string deviceID, RemotelyUser remotelyUser)
 {
     return(RemotelyContext.Devices
            .Include(x => x.DeviceGroup)
            .ThenInclude(x => x.PermissionLinks)
            .Any(x => x.OrganizationID == remotelyUser.OrganizationID &&
                 x.ID == deviceID &&
                 (
                     remotelyUser.IsAdministrator ||
                     x.DeviceGroup.PermissionLinks.Count == 0 ||
                     x.DeviceGroup.PermissionLinks.Any(x => x.UserID == remotelyUser.Id
                                                       ))));
 }
Пример #11
0
 public string[] FilterDeviceIDsByUserPermission(string[] deviceIDs, RemotelyUser remotelyUser)
 {
     return(RemotelyContext.Devices.Where(x =>
                                          deviceIDs.Contains(x.ID) &&
                                          x.OrganizationID == remotelyUser.OrganizationID &&
                                          (
                                              remotelyUser.IsAdministrator ||
                                              x.DevicePermissionLinks.Count == 0 ||
                                              x.DevicePermissionLinks.Any(y => y.PermissionGroup.UserPermissionLinks.Any(z => z.RemotelyUserID == remotelyUser.Id))
                                          ))
            .Select(x => x.ID)
            .ToArray());
 }
Пример #12
0
        private async Task LoadAsync(RemotelyUser user)
        {
            var userName = await _userManager.GetUserNameAsync(user);

            var phoneNumber = await _userManager.GetPhoneNumberAsync(user);

            Username = userName;

            Input = new InputModel
            {
                PhoneNumber = phoneNumber
            };
        }
Пример #13
0
 public bool DoesUserHaveAccessToDevice(string deviceID, RemotelyUser remotelyUser)
 {
     return(RemotelyContext.Devices
            .Include(x => x.DeviceGroup)
            .ThenInclude(x => x.Users)
            .Any(device => device.OrganizationID == remotelyUser.OrganizationID &&
                 device.ID == deviceID &&
                 (
                     remotelyUser.IsAdministrator ||
                     string.IsNullOrWhiteSpace(device.DeviceGroupID) ||
                     !device.DeviceGroup.Users.Any() ||
                     device.DeviceGroup.Users.Any(user => user.Id == remotelyUser.Id
                                                  ))));
 }
Пример #14
0
 public string[] FilterDeviceIDsByUserPermission(string[] deviceIDs, RemotelyUser remotelyUser)
 {
     return(RemotelyContext.Devices
            .Include(x => x.DeviceGroup)
            .ThenInclude(x => x.Users)
            .Where(device =>
                   device.OrganizationID == remotelyUser.OrganizationID &&
                   deviceIDs.Contains(device.ID) &&
                   (
                       remotelyUser.IsAdministrator ||
                       device.DeviceGroup.Users.Count == 0 ||
                       device.DeviceGroup.Users.Any(user => user.Id == remotelyUser.Id
                                                    )))
            .Select(x => x.ID)
            .ToArray());
 }
Пример #15
0
        public async Task <IActionResult> CreateFirstUser([FromBody] RegUser regUser)
        {
            var organizationCount = DataService.GetOrganizationCount();

            if (AppConfig.MaxOrganizationCount > 0 && organizationCount >= AppConfig.MaxOrganizationCount)
            {
                return(NotFound());
            }

            var user = new RemotelyUser
            {
                UserName        = $"{regUser.Username}@localhost",
                Email           = $"{regUser.Username}@localhost",
                IsServerAdmin   = organizationCount == 0,
                Organization    = new Organization(),
                UserOptions     = new RemotelyUserOptions(),
                IsAdministrator = true
            };
            var result = await UserManager.CreateAsync(user, regUser.Password);

            if (!result.Succeeded)
            {
                return(BadRequest(result.Errors));
            }
            else
            {
                //confirm email, not really needed
                var code = await UserManager.GenerateEmailConfirmationTokenAsync(user);

                await UserManager.ConfirmEmailAsync(user, code);

                //create api token

                var secret     = PasswordGenerator.GeneratePassword(24);
                var secretHash = new PasswordHasher <RemotelyUser>().HashPassword(null, secret);

                var newToken = await DataService.CreateApiToken(user.UserName, "Theopenem", secretHash);

                var NewTokenKey    = Guid.Parse(newToken.Token);
                var NewTokenSecret = secret;
                var toemsInfo      = new RemotelyInfo();
                toemsInfo.AuthHeader     = $"{NewTokenKey}:{NewTokenSecret}";
                toemsInfo.OrganizationID = user.Organization.ID;
                return(Ok(toemsInfo));
            }
        }
Пример #16
0
        private async Task LoadSharedKeyAndQrCodeUriAsync(RemotelyUser user)
        {
            // Load the authenticator key & QR code URI to display on the form
            var unformattedKey = await _userManager.GetAuthenticatorKeyAsync(user);

            if (string.IsNullOrEmpty(unformattedKey))
            {
                await _userManager.ResetAuthenticatorKeyAsync(user);

                unformattedKey = await _userManager.GetAuthenticatorKeyAsync(user);
            }

            SharedKey = FormatKey(unformattedKey);

            var email = await _userManager.GetEmailAsync(user);

            AuthenticatorUri = GenerateQrCodeUri(email, unformattedKey);
        }
Пример #17
0
        public IActionResult OnGet(int?id)
        {
            if (User.Identity.IsAuthenticated)
            {
                CurrentUser = _dataService.GetUserByName(User.Identity.Name);
            }

            if (id.HasValue)
            {
                PostDetail = _dataService.GetBlogPost(id.Value);
            }
            else
            {
                PostDetail = null;
                PostList   = _dataService.GetAllBlogPosts().OrderByDescending(b => b.DatePublished);
            }

            return(Page());
        }
Пример #18
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (ModelState.IsValid)
            {
                var user = new RemotelyUser {
                    UserName = Input.Email, Email = Input.Email
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { userId = user.Id, code = code },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                                                      $"<img src='https://remotely.lucency.co/images/Remotely_Logo.png'/><br><br>Please confirm your Remotely account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    await _signInManager.SignInAsync(user, isPersistent : false);

                    return(LocalRedirect(returnUrl));
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }
Пример #19
0
        private async Task Init()
        {
            ClearData();

            var dataService = IoCActivator.ServiceProvider.GetRequiredService <IDataService>();
            var userManager = IoCActivator.ServiceProvider.GetRequiredService <UserManager <RemotelyUser> >();
            var emailSender = IoCActivator.ServiceProvider.GetRequiredService <IEmailSenderEx>();

            await userManager.CreateAsync(Admin1);

            await dataService.CreateUser("*****@*****.**", true, Admin1.OrganizationID);

            Admin2 = dataService.GetUserByNameWithOrg("*****@*****.**");

            await dataService.CreateUser("*****@*****.**", false, Admin1.OrganizationID);

            User1 = dataService.GetUserByNameWithOrg("*****@*****.**");

            await dataService.CreateUser("*****@*****.**", false, Admin1.OrganizationID);

            User2 = dataService.GetUserByNameWithOrg("*****@*****.**");

            Device1.OrganizationID = Admin1.OrganizationID;
            dataService.AddOrUpdateDevice(Device1, out _);
            Device2.OrganizationID = Admin1.OrganizationID;
            dataService.AddOrUpdateDevice(Device2, out _);

            dataService.AddDeviceGroup(Admin1.OrganizationID, Group1, out _, out _);
            dataService.AddDeviceGroup(Admin1.OrganizationID, Group2, out _, out _);
            var deviceGroups = dataService.GetDeviceGroups(Admin1.UserName);

            Group1 = deviceGroups.First(x => x.Name == Group1.Name);
            Group2 = deviceGroups.First(x => x.Name == Group2.Name);

            OrganizationID = Admin1.OrganizationID;
        }
Пример #20
0
 public async Task SetDisplayName(RemotelyUser user, string displayName)
 {
     RemotelyContext.Attach(user);
     user.DisplayName = displayName;
     await RemotelyContext.SaveChangesAsync();
 }
Пример #21
0
 public bool DoesUserHaveAccessToDevice(string deviceID, RemotelyUser remotelyUser)
 {
     return(RemotelyContext.Devices.Any(x => x.ID == deviceID && x.OrganizationID == remotelyUser.OrganizationID));
 }
        public async Task <IActionResult> SendInvite([FromBody] Invite invite)
        {
            if (User.Identity.IsAuthenticated &&
                !DataService.GetUserByName(User.Identity.Name).IsAdministrator)
            {
                return(Unauthorized());
            }
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            Request.Headers.TryGetValue("OrganizationID", out var orgID);


            if (!DataService.DoesUserExist(invite.InvitedUser))
            {
                var user = new RemotelyUser
                {
                    UserName        = invite.InvitedUser,
                    Email           = invite.InvitedUser,
                    OrganizationID  = orgID,
                    IsAdministrator = invite.IsAdmin
                };
                var result = await UserManager.CreateAsync(user);

                if (result.Succeeded)
                {
                    //if (!DataService.SetNewUserProperties(user.UserName, orgID, invite.IsAdmin))
                    //{
                    //    return BadRequest();
                    //}


                    user = await UserManager.FindByEmailAsync(invite.InvitedUser);

                    await UserManager.ConfirmEmailAsync(user, await UserManager.GenerateEmailConfirmationTokenAsync(user));

                    return(Ok());
                }
                else
                {
                    return(BadRequest("There was an issue creating the new account."));
                }
            }
            else
            {
                var newInvite = DataService.AddInvite(orgID, invite);

                var inviteURL = $"{Request.Scheme}://{Request.Host}/Invite?id={newInvite.ID}";
                await EmailSender.SendEmailAsync(invite.InvitedUser, "Invitation to Organization in Remotely",
                                                 $@"<img src='https://remotely.one/media/Remotely_Logo.png'/>
                            <br><br>
                            Hello!
                            <br><br>
                            You've been invited to join an organization in Remotely.
                            <br><br>
                            You can join the organization by <a href='{HtmlEncoder.Default.Encode(inviteURL)}'>clicking here</a>.");

                return(Ok());
            }
        }
Пример #23
0
        public DtoActionResult InitializeRemotelyServer(int comServerId)
        {
            var comServer = _uow.ClientComServerRepository.GetById(comServerId);

            if (comServer == null)
            {
                return(new DtoActionResult()
                {
                    Success = false, ErrorMessage = "Com Server Not Found"
                });
            }

            if (string.IsNullOrEmpty(comServer.RemoteAccessUrl))
            {
                return(new DtoActionResult {
                    Success = false, ErrorMessage = "Could Not Initialize Remote Access.  The Url Was Empty"
                });
            }

            var servicePassGen = new PasswordGenerator();
            var remotelyUser   = new RemotelyUser();

            remotelyUser.Username = servicePassGen.GeneratePassword(true, true, true, false, 10);

            for (int i = 0; i < 1000; i++)
            {
                remotelyUser.Password = servicePassGen.GeneratePassword(true, true, true, true, 16);
                if (servicePassGen.ValidatePassword(remotelyUser.Password, true))
                {
                    break;
                }
            }

            var response = new APICall().RemoteAccessApi.CreateRemotelyFirstUser(comServer.RemoteAccessUrl, remotelyUser);

            if (response == null)
            {
                return(new DtoActionResult {
                    Success = false, ErrorMessage = "Unknown Error While Initializing The Remote Access Server.  Check The Logs."
                });
            }

            var checkError = response;

            checkError = checkError.Replace("\"", "");
            checkError = checkError.Replace("\\", "");

            if (checkError.Equals("The Remote Access Server Has Already Been Initialized"))
            {
                return new DtoActionResult()
                       {
                           Success = false, ErrorMessage = "The Remote Access Server Has Already Been Initialized"
                       }
            }
            ;

            try
            {
                var remotelyInfo = JsonConvert.DeserializeObject <RemotelyInfo>(response);

                comServer.RaUsername            = remotelyUser.Username;
                comServer.RaPasswordEncrypted   = new EncryptionServices().EncryptText(remotelyUser.Password);
                comServer.RaAuthHeaderEncrypted = new EncryptionServices().EncryptText(remotelyInfo.AuthHeader);
                comServer.RaOrganizationId      = remotelyInfo.OrganizationID;
            }
            catch
            {
                return(new DtoActionResult {
                    Success = false, ErrorMessage = "Error: Could Not Deserialize Response."
                });
            }



            var result = new ServiceClientComServer().Update(comServer);

            if (result != null)
            {
                if (result.Success)
                {
                    CopyAgentInstallerToStorage();
                    return(new DtoActionResult {
                        Success = true
                    });
                }
                else
                {
                    return new DtoActionResult {
                               Success = false, ErrorMessage = result.ErrorMessage
                    }
                };
            }
            return(new DtoActionResult {
                Success = false, ErrorMessage = "Unknown Error"
            });
        }