void SslServer::processCommandXML(QSslSocket *socket, const QByteArray &data) { qint32 argc; QString cmd; QByteArray arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10; if (!XMLReader(data, &argc, &cmd, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9, &arg10)) { writeWarning(socket, "Invalid XML", true); return; } if (cmd == "LOGIN") { if (arg1.isEmpty() || arg2.isEmpty() || arg3.isEmpty() || arg4.isEmpty() || arg5.isEmpty()) { writeWarning(socket, "Invalid XML", true); return; } QByteArray peer_negotiation_string = arg1; QByteArray peer_id = arg2; QByteArray password = arg3; bool user_unavailable = getValue<bool>(arg4); bool new_user = getValue<bool>(arg5); QString code = QLatin1String(arg6); if (peer_negotiation_string != NEGOTIATION_STRING) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "Invalid NEGOTIATION STRING!"); writeWarning(socket, "Invalid NEGOTIATION STRING!", true); return; } if (m_id_list.contains(peer_id)) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "This user is already connected!"); writeWarning(socket, "This user is already connected!", true); return; } if (new_user) { if (m_sql.userExists("root")) { if (!m_code_list.contains(code)) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "Invalid code!"); writeWarning(socket, "Invalid code!", true); return; } else { m_code_list.removeAll(code); } } else if (cleanString(QLatin1String(peer_id)) != "root") { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "Need to create root account first!"); writeWarning(socket, "Need to create root account first!", true); return; } if (m_sql.userExists(cleanString(QLatin1String(peer_id)))) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "User already exists!"); writeWarning(socket, "User already exists!", true); return; } else if (!m_sql.createUser(cleanString(QLatin1String(peer_id)), cleanString(QLatin1String(password)))) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "Can't create new user!"); writeWarning(socket, "Can't create new user!", true); return; } } if (!m_sql.loginUser(cleanString(QLatin1String(peer_id)), cleanString(QLatin1String(password)))) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "Can't login with this user and password!"); writeWarning(socket, "Can't login with this user and password!", true); return; } DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(peer_id) << "User logged in!"); m_id_list.append(peer_id); m_id_hash.insert(socket, peer_id); if (user_unavailable) m_unavailable_list.append(peer_id); QByteArray data; data.append(getBytes<quint8>(ServerCommand::LoggedIn)); socket->write(getBytes<qint32>(data.size())); socket->write(data); } else if (cmd == "REQUEST_SETTINGS") { QString ui_path; QString js_path; QString id = QLatin1String(m_id_hash[socket]); if (id != "root") { ui_path = "../data/settings.ui"; js_path = "../data/settings.js"; } else { ui_path = "../data/settings_root.ui"; js_path = "../data/settings_root.js"; } QFile ui_file(ui_path); QFile js_file(js_path); if (!ui_file.open(QFile::ReadOnly) || !js_file.open(QFile::ReadOnly)) { DEBUG_FUNCTION("Can't send settings file"); writeWarning(socket, "Can't send settings file", true); return; } QByteArray ui_data = ui_file.readAll(); QByteArray js_data = js_file.readAll(); QByteArray xml_data = XMLWriter("SETTINGS", ui_data, js_data); writeCommandXML(socket, xml_data); } else if (cmd == "DELETE_ACCOUNT") { QString id = QLatin1String(m_id_hash[socket]); if (id == "root") { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "Invalid operation!"); writeWarning(socket, "Invalid operation!", true); return; } if (m_sql.deleteUser(id)) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User deleted sucessfully!"); writeWarning(socket, "User deleted sucessfully!", true); } else { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "Error deleting user!"); writeWarning(socket, "Error deleting user!", true); } } else if (cmd == "CHANGE_ACCOUNT_PASSWORD") { if (arg1.isEmpty()) { writeWarning(socket, "Invalid XML", true); return; } QByteArray password = arg1; if (m_sql.changePassword(m_id_hash[socket], cleanString(QLatin1String(password)))) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User password changed sucessfully!"); writeWarning(socket, "User password changed sucessfully!", true); } else { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "Error changing user password!"); writeWarning(socket, "Error changing user password!", true); } } else if (cmd == "REQUEST_CODE") { QByteArray id = m_id_hash[socket]; if (QLatin1String(id) != "root") { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "Invalid operation!"); writeWarning(socket, "Invalid operation!", true); return; } QString code; do { code = QString(OpenSslLib::RANDbytes(4).toHex()); code.prepend("#"); } while (m_code_list.contains(code)); m_code_list.append(code); QTimer::singleShot(60 * 60 * 1000, [=]{ m_code_list.removeAll(code); }); DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "Sending code!"); QByteArray xml_data = XMLWriter("CODE", "edit_code", code.toLatin1()); writeCommandXML(socket, xml_data); } else { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "Invalid operation!"); writeWarning(socket, "Invalid operation!", true); } }
int main (int argc, char **argv) { #ifdef HAVE_MPI MPI_Init(&argc, &argv); Epetra_MpiComm Comm(MPI_COMM_WORLD); #else Epetra_SerialComm Comm; #endif // define some Epetra objects int n = Comm.NumProc() * 4; Epetra_Map Map(n, 0, Comm); Epetra_MultiVector x(Map, 2); x.Random(); Epetra_MultiVector b(Map, 2); x.Random(); Epetra_CrsMatrix Matrix(Copy, Map, 0); // diagonal matrix for (int i = 0; i < Map.NumMyElements(); ++i) { int ii = Map.GID(i); double one = 1.0; Matrix.InsertGlobalValues(ii, 1, &one, &ii); } Matrix.FillComplete(); Teuchos::ParameterList List; List.set("int parameter", 10); List.set("double parameter", 10.0); List.set("std::string parameter", "std::string"); // ========================= // // Part I: generate XML file // // ========================= // EpetraExt::XMLWriter XMLWriter(Comm, "data.xml"); std::vector<std::string> Content; Content.push_back("This is an example of description"); Content.push_back("The description is as long as desired,"); Content.push_back("just put it in a std::vector of strings."); XMLWriter.Create("MyProblem"); XMLWriter.Write("Author", "myself and others"); XMLWriter.Write("Date", "May 2006"); XMLWriter.Write("MyMap", Map); XMLWriter.Write("MyMatrix", Matrix); XMLWriter.Write("MyLHS", x); XMLWriter.Write("MyRHS", b); XMLWriter.Write("MyContent", Content); XMLWriter.Write("MyParameters", List); XMLWriter.Close(); // ================== // // Part II: read data // // ================== // EpetraExt::XMLReader XMLReader(Comm, "data.xml"); Epetra_Map* MyMap; Epetra_CrsMatrix* MyMatrix; Epetra_MultiVector* MyLHS; Epetra_MultiVector* MyRHS; Teuchos::ParameterList MyParameters; std::vector<std::string> Author; std::vector<std::string> Date; std::vector<std::string> MyContent; XMLReader.Read("Author", Author); XMLReader.Read("Date", Date); XMLReader.Read("MyMap", MyMap); XMLReader.Read("MyMatrix", MyMatrix); XMLReader.Read("MyLHS", MyLHS); XMLReader.Read("MyRHS", MyRHS); XMLReader.Read("MyContent", MyContent); XMLReader.Read("MyParameters", MyParameters); std::cout << *MyMap; std::cout << *MyMatrix; std::cout << *MyLHS; std::cout << *MyRHS; if (Comm.MyPID() == 0) { int Msize = (int) MyContent.size(); for (int i = 0; i < Msize; ++i) std::cout << MyContent[i] << std::endl; std::cout << MyParameters; std::cout << "Author = " << Author[0] << std::endl; std::cout << "Date = " << Date[0] << std::endl; } delete MyMap; delete MyMatrix; delete MyLHS; delete MyRHS; #ifdef HAVE_MPI MPI_Finalize(); #endif return(EXIT_SUCCESS); }