void SyntaxHighlighter::highlightBlock(const QString& text) { for (auto r : rules) { auto iter = r.first.globalMatch(text); while (iter.hasNext()) { auto match = iter.next(); auto index = match.lastCapturedIndex(); setFormat(match.capturedStart(index), match.capturedLength(index), r.second); } } }
void LoginHandler::handleIdentMessage(const QString &message) { const QRegularExpression re("\\IDENT \"([^\"]+)\"\\s*(?:;(.+))?\\z"); auto m = re.match(message); if(!m.hasMatch()) { send("ERROR SYNTAX"); _client->disconnectError("login error"); return; } QString username = m.captured(1); QString password; if(m.lastCapturedIndex() == 2) password = m.captured(2); if(!validateUsername(username)) { send("ERROR BADNAME"); _client->disconnectError("login error"); return; } if(_server->identityManager()) { _state = WAIT_FOR_IDENTITYMANAGER_REPLY; IdentityResult *result = _server->identityManager()->checkLogin(username, password); connect(result, &IdentityResult::resultAvailable, [this, username, password](IdentityResult *result) { QString error; Q_ASSERT(result->status() != IdentityResult::INPROGRESS); switch(result->status()) { case IdentityResult::INPROGRESS: /* can't happen */ break; case IdentityResult::NOTFOUND: if(!_server->identityManager()->isAuthorizedOnly()) { guestLogin(username); break; } // fall through to badpass if guest logins are disabled case IdentityResult::BADPASS: if(password.isEmpty()) { // No password: tell client that guest login is not possible (for this username) _state = WAIT_FOR_IDENT; send("NEEDPASS"); return; } error = "BADPASS"; break; case IdentityResult::BANNED: error = "BANNED"; break; case IdentityResult::OK: { // Yay, username and password were valid! QString okstr = "IDENTIFIED USER "; if(result->flags().isEmpty()) okstr += "-"; else okstr += result->flags().join(","); if(validateUsername(result->canonicalName())) { _client->setUsername(result->canonicalName()); } else { logger::warning() << "Identity manager gave us an invalid username:"******"MOD")); _hostPrivilege = result->flags().contains("HOST"); _state = WAIT_FOR_LOGIN; send(okstr); announceServerInfo(); } break; } if(!error.isEmpty()) { send("ERROR " + error); _client->disconnectError("login error"); } }); } else { if(!password.isNull()) { // if we have no identity manager, we can't accept passwords send("ERROR NOIDENT"); _client->disconnectError("login error"); return; } guestLogin(username); } }