Show view for web registration if out-of-band URL is provided
parent
53135d81f9
commit
a3d2aab7f2
|
@ -42,6 +42,7 @@
|
||||||
{
|
{
|
||||||
"jid": "dismail.de",
|
"jid": "dismail.de",
|
||||||
"supportsInBandRegistration": false,
|
"supportsInBandRegistration": false,
|
||||||
|
"registrationWebPage": "https://dismail.de/register.html",
|
||||||
"hosting": "professional",
|
"hosting": "professional",
|
||||||
"passwordReset": false,
|
"passwordReset": false,
|
||||||
"mucSupport": true,
|
"mucSupport": true,
|
||||||
|
|
|
@ -217,6 +217,14 @@ signals:
|
||||||
*/
|
*/
|
||||||
void registrationFormReceived(DataFormModel *dataFormModel);
|
void registrationFormReceived(DataFormModel *dataFormModel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emitted when an out-of-band URL for registration is received from the
|
||||||
|
* server.
|
||||||
|
*
|
||||||
|
* @param outOfBandUrl URL used for out-of-band registration
|
||||||
|
*/
|
||||||
|
void registrationOutOfBandUrlReceived(const QString &outOfBandUrl);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emitted to request a registration form from the server which is set as the
|
* Emitted to request a registration form from the server which is set as the
|
||||||
* currently used JID.
|
* currently used JID.
|
||||||
|
|
|
@ -121,8 +121,27 @@ void RegistrationManager::handleRegistrationFormReceived(const QXmppRegisterIq &
|
||||||
bool isFakeForm;
|
bool isFakeForm;
|
||||||
QXmppDataForm newDataForm = extractFormFromRegisterIq(iq, isFakeForm);
|
QXmppDataForm newDataForm = extractFormFromRegisterIq(iq, isFakeForm);
|
||||||
|
|
||||||
// If the data form is not set, there is a problem with the server.
|
// If there is no registration data form, try to use an out-of-band URL.
|
||||||
if (newDataForm.fields().isEmpty()) {
|
if (newDataForm.fields().isEmpty()) {
|
||||||
|
#if QXMPP_VERSION >= QT_VERSION_CHECK(1, 5, 0)
|
||||||
|
// If there is a standardized out-of-band URL, use that.
|
||||||
|
if (!iq.outOfBandUrl().isEmpty()) {
|
||||||
|
emit Kaidan::instance()->registrationOutOfBandUrlReceived(iq.outOfBandUrl());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// Try to find an out-of-band URL within the instructions element.
|
||||||
|
// Most servers include a text with a link to the website.
|
||||||
|
const auto words = iq.instructions().split(u' ');
|
||||||
|
for (const auto &instructionPart : words) {
|
||||||
|
if (instructionPart.startsWith(u"https://")) {
|
||||||
|
emit Kaidan::instance()->registrationOutOfBandUrlReceived(instructionPart);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no URL has been found in the instructions, there is a
|
||||||
|
// problem with the server.
|
||||||
emit m_clientWorker->connectionErrorChanged(ClientWorker::RegistrationUnsupported);
|
emit m_clientWorker->connectionErrorChanged(ClientWorker::RegistrationUnsupported);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,10 @@ RegistrationPage {
|
||||||
removeLoadingView()
|
removeLoadingView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onRegistrationOutOfBandUrlReceived(outOfBandUrl) {
|
||||||
|
requestRegistrationFormFromAnotherServer(qsTr("The server does currently not support registration via this app."))
|
||||||
|
}
|
||||||
|
|
||||||
function onRegistrationFailed(error, errorMessage) {
|
function onRegistrationFailed(error, errorMessage) {
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case RegistrationManager.InBandRegistrationNotSupported:
|
case RegistrationManager.InBandRegistrationNotSupported:
|
||||||
|
|
|
@ -120,10 +120,6 @@ RegistrationPage {
|
||||||
jumpToPreviousView()
|
jumpToPreviousView()
|
||||||
removeLoadingView()
|
removeLoadingView()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: Kaidan
|
|
||||||
|
|
||||||
function onRegistrationFormReceived(dataFormModel) {
|
function onRegistrationFormReceived(dataFormModel) {
|
||||||
formModel = dataFormModel
|
formModel = dataFormModel
|
||||||
|
@ -175,6 +171,11 @@ RegistrationPage {
|
||||||
focusFieldViews()
|
focusFieldViews()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onRegistrationOutOfBandUrlReceived(outOfBandUrl) {
|
||||||
|
serverView.outOfBandUrl = outOfBandUrl
|
||||||
|
handleInBandRegistrationNotSupported()
|
||||||
|
}
|
||||||
|
|
||||||
// Depending on the error, the swipe view jumps to the view where the input should be corrected.
|
// Depending on the error, the swipe view jumps to the view where the input should be corrected.
|
||||||
// For all remaining errors, the swipe view jumps to the server view.
|
// For all remaining errors, the swipe view jumps to the server view.
|
||||||
function onRegistrationFailed(error, errorMessage) {
|
function onRegistrationFailed(error, errorMessage) {
|
||||||
|
@ -182,7 +183,7 @@ RegistrationPage {
|
||||||
|
|
||||||
switch(error) {
|
switch(error) {
|
||||||
case RegistrationManager.InBandRegistrationNotSupported:
|
case RegistrationManager.InBandRegistrationNotSupported:
|
||||||
handleInBandRegistrationNotSupportedError()
|
handleInBandRegistrationNotSupported()
|
||||||
break
|
break
|
||||||
case RegistrationManager.UsernameConflict:
|
case RegistrationManager.UsernameConflict:
|
||||||
requestRegistrationForm()
|
requestRegistrationForm()
|
||||||
|
@ -229,14 +230,14 @@ RegistrationPage {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows a passive notification if the server does not support In-Band Registration.
|
* Shows a passive notification regarding the missing support of In-Band Registration.
|
||||||
* If the server supports web registration, the corresponding view is opened.
|
* If the server supports web registration, the corresponding view is opened.
|
||||||
* If the server does not support web registration and it is not a custom server, another one is automatically selected.
|
* If the server does not support web registration and it is not a custom server, another one is automatically selected.
|
||||||
*/
|
*/
|
||||||
function handleInBandRegistrationNotSupportedError() {
|
function handleInBandRegistrationNotSupported() {
|
||||||
var notificationText = serverView.customServerSelected ? qsTr("The server does not support registration via this app.") : qsTr("The server does currently not support registration via this app.")
|
var notificationText = serverView.customServerSelected ? qsTr("The server does not support registration via this app.") : qsTr("The server does currently not support registration via this app.")
|
||||||
|
|
||||||
if (serverView.inBandRegistrationSupported) {
|
if (serverView.registrationWebPage || serverView.outOfBandUrl) {
|
||||||
addWebRegistrationView()
|
addWebRegistrationView()
|
||||||
notificationText += " " + qsTr("But you can use the server's web registration.")
|
notificationText += " " + qsTr("But you can use the server's web registration.")
|
||||||
} else {
|
} else {
|
||||||
|
@ -283,7 +284,7 @@ RegistrationPage {
|
||||||
function addWebRegistrationView() {
|
function addWebRegistrationView() {
|
||||||
removeDynamicallyLoadedInBandRegistrationViews()
|
removeDynamicallyLoadedInBandRegistrationViews()
|
||||||
|
|
||||||
webRegistrationView = webRegistrationViewComponent.createObject(webRegistrationView)
|
webRegistrationView = webRegistrationViewComponent.createObject(swipeView)
|
||||||
swipeView.insertItem(serverView.Controls.SwipeView.index + 1, webRegistrationView)
|
swipeView.insertItem(serverView.Controls.SwipeView.index + 1, webRegistrationView)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ FieldView {
|
||||||
property bool inBandRegistrationSupported: serverListModel.data(comboBox.currentIndex, ServerListModel.SupportsInBandRegistrationRole)
|
property bool inBandRegistrationSupported: serverListModel.data(comboBox.currentIndex, ServerListModel.SupportsInBandRegistrationRole)
|
||||||
property string registrationWebPage: serverListModel.data(comboBox.currentIndex, ServerListModel.RegistrationWebPageRole)
|
property string registrationWebPage: serverListModel.data(comboBox.currentIndex, ServerListModel.RegistrationWebPageRole)
|
||||||
property bool shouldWebRegistrationViewBeShown: !customServerSelected && !inBandRegistrationSupported
|
property bool shouldWebRegistrationViewBeShown: !customServerSelected && !inBandRegistrationSupported
|
||||||
|
property string outOfBandUrl
|
||||||
|
|
||||||
property alias customConnectionSettings: customConnectionSettings
|
property alias customConnectionSettings: customConnectionSettings
|
||||||
|
|
||||||
|
@ -106,6 +107,13 @@ FieldView {
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
onTextChanged: {
|
||||||
|
if (outOfBandUrl && customServerSelected) {
|
||||||
|
outOfBandUrl = ""
|
||||||
|
removeWebRegistrationView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Focus the customConnectionSettings on confirmation.
|
// Focus the customConnectionSettings on confirmation.
|
||||||
Keys.onPressed: {
|
Keys.onPressed: {
|
||||||
if (customConnectionSettings.visible) {
|
if (customConnectionSettings.visible) {
|
||||||
|
|
|
@ -47,12 +47,12 @@ View {
|
||||||
|
|
||||||
CenteredAdaptiveHighlightedButton {
|
CenteredAdaptiveHighlightedButton {
|
||||||
text: qsTr("Open registration web page")
|
text: qsTr("Open registration web page")
|
||||||
onClicked: Qt.openUrlExternally(serverView.registrationWebPage)
|
onClicked: Qt.openUrlExternally(serverView.registrationWebPage ? serverView.registrationWebPage : serverView.outOfBandUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
CenteredAdaptiveButton {
|
CenteredAdaptiveButton {
|
||||||
text: qsTr("Copy registration web page address")
|
text: qsTr("Copy registration web page address")
|
||||||
onClicked: Utils.copyToClipboard(serverView.registrationWebPage)
|
onClicked: Utils.copyToClipboard(serverView.registrationWebPage ? serverView.registrationWebPage : serverView.outOfBandUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
CenteredAdaptiveHighlightedButton {
|
CenteredAdaptiveHighlightedButton {
|
||||||
|
|
|
@ -40,7 +40,9 @@ import "../elements/fields"
|
||||||
RowLayout {
|
RowLayout {
|
||||||
property alias hostField: hostField
|
property alias hostField: hostField
|
||||||
property alias portField: portField
|
property alias portField: portField
|
||||||
property Button confirmationButton
|
|
||||||
|
// The type Item is used because the type Button does not work for buttons of type RoundButton.
|
||||||
|
property Item confirmationButton
|
||||||
|
|
||||||
Field {
|
Field {
|
||||||
id: hostField
|
id: hostField
|
||||||
|
|
Loading…
Reference in New Issue