Example #1
0
        private async Task <bool> CreateIdentityUser(string userName)
        {
            var user = new IdentityUserDefaultPwd {
                UserName = userName
            };
            var result = await _userManager.CreateAsync(user, IdentityUserDefaultPwd.DefaultPassword);

            if (result.Succeeded)
            {
                await _userManager.AddToRoleAsync(user,
                                                  "PG");

                return(true);
            }

            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
            return(false);
        }
        public async Task <string> Post(List <IFormFile> xml_file, bool append_to_db)
        {
            var errorMessage = "";
            var result       = string.Empty;

            try {
                using (var reader = new StreamReader(xml_file[0].OpenReadStream())) {
                    result = reader.ReadToEnd();
                }
            }
            catch (Exception e) {
                return("Echec de l'upload du fichier\n" + e);
            }

            XDocument xml;

            try {
                xml = XDocument.Parse(result);
            }
            catch (Exception e) {
                return("Fichier XML invalide\n" + e);
            }

            // Activation du mode maintenance
            SetMaintainanceOn();

            if (!append_to_db)
            {
                try {
                    _context.Database.ExecuteSqlCommand("delete from UserData");
                }
                catch (Exception e) {
                    errorMessage += "Impossible de vider la DB UserData actuelle\n" + e;
                }

                foreach (var user in _userManager.Users.ToList())
                {
                    // On ne wipe pas le compte zifoys
                    if (user.UserName == "admin")
                    {
                        continue;
                    }

                    var identityResult = await _userManager.DeleteAsync(user);

                    if (!identityResult.Succeeded)
                    {
                        errorMessage += "Impossible de supprimer l'utilisateur "
                                        + user.UserName + "\n-->" + string.Join(",",
                                                                                identityResult.Errors.Select(o => o.ToString()));
                    }
                }

                var eraseContextError = await SaveContext();

                if (!string.IsNullOrEmpty(eraseContextError))
                {
                    SetMaintainanceOff();
                    return(eraseContextError);
                }
            }

            if (!string.IsNullOrEmpty(errorMessage))
            {
                SetMaintainanceOff();
                return("\n\n" + errorMessage);
            }

            var failedList    = "";
            var duplicateList = "";
            var ud            = new List <UserData>();

            foreach (var elem in xml.Root.Elements("tbUser"))
            {
                var parsed = TryParseUserFromXElement(elem, ref failedList);
                if (parsed != null)
                {
                    if (!ud.Select(o => o.UserName).Contains(parsed.UserName))
                    {
                        ud.Add(parsed);
                    }
                    else
                    {
                        duplicateList += " " + parsed.UserName;
                    }
                }
            }

            if (!string.IsNullOrEmpty(failedList))
            {
                errorMessage = "TryParseUserFromXElement: Impossible d'ajouter les utilisateurs " + failedList;
            }
            if (!string.IsNullOrEmpty(duplicateList))
            {
                errorMessage = "/!\\ Il existe des utilisateurs en double.<br/> Les doublons ont été ignorés : " +
                               duplicateList;
            }

            failedList = "";
            // Pas de AddRange pour avoir des erreurs détaillées
            foreach (var user in ud)
            {
                try {
                    if (_context.UserData.Any(o => o.UserName == user.UserName))
                    {
                        continue;
                    }
                    await _context.UserData.AddAsync(user);
                }
                catch {
                    failedList += " \"" + user.UserName + " \"";
                }
            }

            var saveContextError = await SaveContext();

            if (!string.IsNullOrEmpty(saveContextError))
            {
                SetMaintainanceOff();
                return(saveContextError);
            }

            if (!string.IsNullOrEmpty(failedList))
            {
                errorMessage += "<br/><br/>_context.UserData.AddAsync: Impossible d'ajouter les utilisateurs " +
                                failedList;
            }

            failedList = "";
            var userDataEvaluated = _context.UserData.ToList();

            foreach (var userData in userDataEvaluated)
            {
                if (await _userManager.FindByNameAsync(userData.UserName) != null)
                {
                    continue;
                }

                var user = new IdentityUserDefaultPwd {
                    UserName = userData.UserName
                };

                try {
                    var ir = await _userManager.CreateAsync(user, IdentityUserDefaultPwd.DefaultPassword);

                    if (!ir.Succeeded)
                    {
                        failedList += " \"" + user.UserName + " \"";
                        _context.UserData.Remove(ud.First(o => o.UserName == user.UserName));
                    }
                    else
                    {
                        await _userManager.AddToRoleAsync(user,
                                                          "PG");
                    }
                }
                catch (Exception e) {
                    errorMessage += "Erreur interne à Identity : " + e;
                }
            }

            saveContextError = await SaveContext();

            if (!string.IsNullOrEmpty(saveContextError))
            {
                SetMaintainanceOff();
                return(saveContextError);
            }

            if (!string.IsNullOrEmpty(failedList))
            {
                errorMessage += "<br/><br/>Identity: Impossible de créer les comptes pour les utilisateurs " +
                                failedList;
            }

            SetMaintainanceOff();
            return("0" + errorMessage);
        }