Implemented MS config POST request

This commit is contained in:
M66B 2024-05-28 18:53:10 +02:00
parent e5ee0b2023
commit 2fa388d109
1 changed files with 47 additions and 3 deletions

View File

@ -32,10 +32,13 @@ import android.util.Xml;
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@ -73,6 +76,14 @@ import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class EmailProvider implements Parcelable {
public String id;
@ -879,7 +890,7 @@ public class EmailProvider implements Parcelable {
for (String link : Misc.getMSUrls(context, domain, email))
try {
URL url = new URL(link);
return getMSAutodiscovery(context, domain, url, true, intf);
return getMSAutodiscovery(context, domain, email, url, true, intf);
} catch (Throwable ex) {
Log.i(ex);
}
@ -887,18 +898,47 @@ public class EmailProvider implements Parcelable {
throw new UnknownHostException(domain);
}
private static EmailProvider getMSAutodiscovery(Context context, String domain, URL url, boolean unsafe, IDiscovery intf) throws IOException, XmlPullParserException {
private static EmailProvider getMSAutodiscovery(Context context, String domain, String email, URL url, boolean unsafe, IDiscovery intf)
throws IOException, XmlPullParserException, ParserConfigurationException, TransformerException {
EmailProvider provider = new EmailProvider(domain);
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// root elements
Document doc = docBuilder.newDocument();
Element xAutodiscover = doc.createElement("Autodiscover");
xAutodiscover.setAttribute("xmlns", "http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006");
doc.appendChild(xAutodiscover);
Element xRequest = doc.createElement("Request");
xAutodiscover.appendChild(xRequest);
Element xEMailAddress = doc.createElement("EMailAddress");
xEMailAddress.setTextContent(email);
xRequest.appendChild(xEMailAddress);
Element xAcceptableResponseSchema = doc.createElement("AcceptableResponseSchema");
xAcceptableResponseSchema.setTextContent("http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a");
xRequest.appendChild(xAcceptableResponseSchema);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
StreamResult result = new StreamResult(bos);
transformer.transform(source, result);
HttpURLConnection request = null;
try {
Log.i("Fetching " + url);
intf.onStatus("MS " + url);
request = (HttpURLConnection) url.openConnection();
request.setRequestMethod("GET");
request.setRequestMethod("POST");
request.setReadTimeout(MS_TIMEOUT);
request.setConnectTimeout(MS_TIMEOUT);
request.setDoOutput(true);
request.setDoInput(true);
ConnectionHelper.setUserAgent(context, request);
@ -913,6 +953,8 @@ public class EmailProvider implements Parcelable {
request.connect();
request.getOutputStream().write(bos.toByteArray());
int status = request.getResponseCode();
if (status != HttpURLConnection.HTTP_OK)
throw new FileNotFoundException("Error " + status + ": " + request.getResponseMessage());
@ -1014,6 +1056,8 @@ public class EmailProvider implements Parcelable {
provider.validate();
Log.e("MS=" + url);
Log.i("MS imap=" + provider.imap);
Log.i("MS smtp=" + provider.smtp);
return provider;
} finally {