Exemple #1
0
        protected void OnButtonDeleteClicked(object sender, EventArgs e)
        {
            TreeIter iter;

            treeviewUsers.Selection.GetSelected(out iter);
            int    itemid    = (int)UsersListStore.GetValue(iter, 0);
            string loginname = UsersListStore.GetValue(iter, 1).ToString();
            bool   result;

            if (QSMain.IsOrmDeletionConfigered)
            {
                result = QSMain.OnOrmDeletion("users", itemid);
            }
            else
            {
                Delete winDel = new Delete();
                result = winDel.RunDeletion("users", itemid);
                winDel.Destroy();
            }

            if (result)
            {
                if (QSSaaS.Session.IsSaasConnection)
                {
                    logger.Info("Удаляем пользователя в облаке...");
                    QSSaaS.ISaaSService svc = QSSaaS.Session.GetSaaSService();

                    if (!svc.changeBaseAccessFromProgram(QSSaaS.Session.SessionId, loginname, QSSaaS.Session.SaasBaseName, false))
                    {
                        logger.Error("Ошибка удаления доступа к базе на сервере SaaS.");
                    }

                    if (svc.UserAccessBaseCount(QSSaaS.Session.SessionId, QSSaaS.Session.Account, loginname) == 0)
                    {
                        if (MessageDialogWorks.RunQuestionDialog($"У пользователя '{loginname}' на сервисе QS:Облако больше не осталось баз данных, к которым он имеет доступ. Удалить пользователя с QS:Облако тоже?"))
                        {
                            if (!svc.DeleteCloudUser(QSSaaS.Session.SessionId, QSSaaS.Session.Account, loginname))
                            {
                                var text = "Удаления пользователя с QS:Облако не произошло.";
                                logger.Error(text);
                                MessageDialogWorks.RunErrorDialog(text);
                            }
                        }
                    }
                }
                else
                {
                    logger.Info("Удаляем пользователя MySQL...");
                    string sql;
                    sql = "DROP USER @login, @login @'localhost'";
                    try {
                        QSMain.CheckConnectionAlive();
                        MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB);
                        cmd.Parameters.AddWithValue("@login", loginname);
                        cmd.ExecuteNonQuery();
                        logger.Info("Пользователь удалён. Ok");

                        if (QSMain.User.Id == itemid)
                        {
                            MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent,
                                                                 MessageType.Warning, ButtonsType.Close,
                                                                 "Был удален пользователь, под которым Вы подключились к базе данных, чтобы недопустить некорректных операций программа закроется. Зайдите в программу от имени другого пользователя.");
                            md.Run();
                            md.Destroy();
                            Environment.Exit(0);
                        }
                    } catch (Exception ex) {
                        logger.Error(ex, "Ошибка удаления пользователя!");
                        QSMain.ErrorMessage(this, ex);
                    }
                }
            }

            UpdateUsers();
        }
Exemple #2
0
 void UpdatePrivileges()
 {
     logger.Info("Устанавливаем права...");
     try {
         string privileges;
         if (checkAdmin.Active)
         {
             privileges = "ALL";
         }
         else
         {
             privileges = "SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW";
         }
         string sql = $"GRANT {privileges} ON `{QSMain.connectionDB.Database}`.* TO @login, @login @'localhost'";
         QSMain.CheckConnectionAlive();
         MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB);
         cmd.Parameters.AddWithValue("@login", entryLogin.Text);
         cmd.ExecuteNonQuery();
         if (checkAdmin.Active)
         {
             cmd.CommandText = "GRANT CREATE USER, GRANT OPTION ON *.* TO @login, @login @'localhost'";
         }
         else
         {
             cmd.CommandText = "REVOKE CREATE USER, GRANT OPTION ON *.* FROM @login, @login @'localhost'";
         }
         cmd.ExecuteNonQuery();
         bool GrantMake = false;
         if (checkAdmin.Active)
         {
             sql       = "GRANT SELECT, UPDATE ON mysql.* TO @login, @login @'localhost'";
             GrantMake = true;
         }
         else
         {
             sql = "SHOW GRANTS FOR @login";
             cmd = new MySqlCommand(sql, QSMain.connectionDB);
             cmd.Parameters.AddWithValue("@login", entryLogin.Text);
             using (MySqlDataReader rdr = cmd.ExecuteReader()) {
                 while (rdr.Read())
                 {
                     if (rdr[0].ToString().IndexOf("mysql") > 0)
                     {
                         GrantMake = true;
                     }
                 }
             }
             sql = "REVOKE SELECT, UPDATE ON mysql.* FROM @login, @login @'localhost'";
         }
         if (GrantMake)
         {
             cmd = new MySqlCommand(sql, QSMain.connectionDB);
             cmd.Parameters.AddWithValue("@login", entryLogin.Text);
             cmd.ExecuteNonQuery();
         }
         logger.Info("Права установлены. Ok");
     } catch (MySqlException ex) when(ex.Number == 1044)
     {
         logger.Error(ex, "Ошибка установки прав!");
         MessageDialogWorks.RunErrorDialog("У вас не достаточно прав на сервере MySQL для установки полномочий другим пользователям. Возможно некоторые права не были установлены.");
     } catch (Exception ex) {
         logger.Error(ex, "Ошибка установки прав!");
         QSMain.ErrorMessage(this, ex);
     }
 }
Exemple #3
0
        public static void RunCreation(CreationScript script, string server, string dbname, string login, string password)
        {
            if (script == null)
            {
                script = Scripts.First();
            }

            string connStr, host;
            uint   port = 3306;

            string[] uriSplit = server.Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries);

            host = uriSplit [0];
            if (uriSplit.Length > 1)
            {
                uint.TryParse(uriSplit [1], out port);
            }

            var conStrBuilder = new MySqlConnectionStringBuilder();

            conStrBuilder.Server   = host;
            conStrBuilder.Port     = port;
            conStrBuilder.UserID   = login;
            conStrBuilder.Password = password;

            connStr = conStrBuilder.GetConnectionString(true);

            var connectionDB = new MySqlConnection(connStr);

            try {
                logger.Info("Connecting to MySQL...");

                connectionDB.Open();
            } catch (MySqlException ex) {
                logger.Info("Строка соединения: {0}", connStr);
                logger.Error(ex, "Ошибка подключения к серверу.");
                if (ex.Number == 1045 || ex.Number == 0)
                {
                    MessageDialogWorks.RunErrorDialog("Доступ запрещен.\nПроверьте логин и пароль.");
                }
                else if (ex.Number == 1042)
                {
                    MessageDialogWorks.RunErrorDialog("Не удалось подключиться к серверу БД.");
                }
                else
                {
                    MessageDialogWorks.RunErrorDialog("Ошибка соединения с базой данных.");
                }

                connectionDB.Close();
                return;
            }

            logger.Info("Проверяем существует ли уже база.");

            var  sql          = "SHOW DATABASES;";
            var  cmd          = new MySqlCommand(sql, connectionDB);
            bool needDropBase = false;

            using (var rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    if (rdr [0].ToString() == dbname)
                    {
                        if (MessageDialogWorks.RunQuestionDialog("База с именем `{0}` уже существует на сервере. Удалить существующую базу перед соданием новой?", dbname))
                        {
                            needDropBase = true;
                            break;
                        }
                        else
                        {
                            return;
                        }
                    }
                }
            }

            logger.Info("Создаем новую базу.");
            progressDlg = new CreatorProgress();
            progressDlg.OperationText = "Получаем скрипт создания базы";
            progressDlg.Show();

            string sqlScript;

            using (Stream stream = System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream(script.Resource))
            {
                if (stream == null)
                {
                    throw new InvalidOperationException(String.Format("Ресурс {0} со скриптом не найден.", script.Resource));
                }
                StreamReader reader = new StreamReader(stream);
                sqlScript = reader.ReadToEnd();
            }

            int predictedCount = Regex.Matches(sqlScript, ";").Count;

            logger.Debug("Предполагаем наличие {0} команд в скрипте.", predictedCount);
            progressDlg.OperationText      = String.Format("Создаем базу <{0}>", dbname);
            progressDlg.OperationPartCount = predictedCount + (needDropBase ? 2 : 1);
            progressDlg.OperationCurPart   = 0;

            if (needDropBase)
            {
                logger.Info("Удаляем существующую базу {0}.", dbname);
                progressDlg.OperationText = String.Format("Удаляем существующую базу {0}", dbname);
                cmd.CommandText           = String.Format("DROP DATABASE `{0}`", dbname);
                cmd.ExecuteNonQuery();
                progressDlg.OperationCurPart++;
            }

            cmd.CommandText = String.Format("CREATE SCHEMA `{0}` DEFAULT CHARACTER SET utf8 ;", dbname);
            cmd.ExecuteNonQuery();
            cmd.CommandText = String.Format("USE `{0}` ;", dbname);
            cmd.ExecuteNonQuery();

            progressDlg.OperationText = String.Format("Создаем таблицы в <{0}>", dbname);
            progressDlg.OperationCurPart++;

            var myscript = new MySqlScript(connectionDB, sqlScript);

            myscript.StatementExecuted += Myscript_StatementExecuted;;
            var commands = myscript.Execute();

            logger.Debug("Выполнено {0} SQL-команд.", commands);

            progressDlg.Destroy();
            progressDlg = null;

            MessageDialogWorks.RunInfoDialog("Создание базы успешно завершено.\nЗайдите в программу под администратором для добавления пользователей.");
        }