add support for http basic authorization

This commit is contained in:
Andrew Dolgov 2011-11-27 16:57:05 +03:00
parent 0dbf6d75ca
commit 37f4010e8f
4 changed files with 52 additions and 170 deletions

View File

@ -13,15 +13,16 @@
<string name="password">Password</string>
<string name="default_url">http://example.domain/tt-rss/</string>
<string name="authentication">Authentication</string>
<string name="look_and_feel">Look and feel</string>
<string name="look_and_feel">Interface</string>
<string name="pref_theme">Theme</string>
<string name="pref_theme_long">Changes color theme of the application.</string>
<string name="pref_theme_long">Changes color theme of the application</string>
<string name="ttrss_url">Tiny Tiny RSS URL</string>
<string name="auto_login">Login automatically</string>
<string name="theme_dark">Dark</string>
<string name="preferences">Preferences</string>
<string name="theme_light">Light</string>
<string name="connection">Connection</string>
<string name="http_authentication">HTTP Authentication</string>
<string name="login_api_disabled">Login failed: API disabled.</string>
<string name="login_no_data">Login failed: no data received.</string>
<string name="login_wrong_password">Login failed: username or password incorrect.</string>
@ -48,4 +49,9 @@
<string name="toggle_marked">Toggle starred</string>
<string name="toggle_published">Toggle published</string>
<string name="set_unread">Mark unread</string>
<string name="http_login_summary">Optional. Fill this if your tt-rss installation is protected by HTTP Basic authorization</string>
<string name="login_summary">Your tt-rss login. Not needed for single user mode</string>
<string name="password_summary">Your tt-rss password</string>
<string name="ttrss_url_summary">URL of your tt-rss installation directory, e.g. http://site.com/tt-rss/</string>
</resources>

View File

@ -5,12 +5,17 @@
<PreferenceCategory android:title="@string/connection">
<EditTextPreference android:title="@string/login" android:key="login" android:singleLine="true"></EditTextPreference>
<EditTextPreference android:title="@string/password" android:key="password" android:singleLine="true" android:password="true"></EditTextPreference>
<EditTextPreference android:key="ttrss_url" android:title="@string/ttrss_url" android:singleLine="true" textUri="true" android:hint="@string/default_url"></EditTextPreference>
<EditTextPreference android:summary="@string/login_summary" android:title="@string/login" android:key="login" android:singleLine="true"></EditTextPreference>
<EditTextPreference android:summary="@string/password_summary" android:title="@string/password" android:key="password" android:singleLine="true" android:password="true"></EditTextPreference>
<EditTextPreference android:summary="@string/ttrss_url_summary" android:key="ttrss_url" android:title="@string/ttrss_url" android:singleLine="true" textUri="true" android:hint="@string/default_url"></EditTextPreference>
<CheckBoxPreference android:defaultValue="false" android:title="@string/ssl_trust_any" android:key="ssl_trust_any" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/http_authentication">
<EditTextPreference android:title="@string/login" android:summary="@string/http_login_summary" android:key="http_login" android:singleLine="true"></EditTextPreference>
<EditTextPreference android:title="@string/password" android:key="http_password" android:singleLine="true" android:password="true"></EditTextPreference>
</PreferenceCategory>
<PreferenceCategory android:title="@string/look_and_feel">
<ListPreference
android:title="@string/pref_theme"
@ -21,7 +26,8 @@
<CheckBoxPreference android:title="@string/sort_feeds_by_unread" android:key="sort_feeds_by_unread"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/debugging">
<CheckBoxPreference android:defaultValue="false" android:title="@string/transport_debugging" android:key="transport_debugging" />
</PreferenceCategory>

View File

@ -3,9 +3,14 @@ package org.fox.ttrss;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
@ -38,15 +43,16 @@ public class ApiRequest extends AsyncTask<HashMap<String,String>, Integer, JsonE
private boolean m_trustAny = false;
private boolean m_transportDebugging = false;
private Context m_context;
private SharedPreferences m_prefs;
public ApiRequest(Context context) {
m_context = context;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(m_context);
m_prefs = PreferenceManager.getDefaultSharedPreferences(m_context);
m_api = prefs.getString("ttrss_url", null);
m_trustAny = prefs.getBoolean("ssl_trust_any", false);
m_transportDebugging = prefs.getBoolean("transport_debugging", false);
m_api = m_prefs.getString("ttrss_url", null);
m_trustAny = m_prefs.getBoolean("ssl_trust_any", false);
m_transportDebugging = m_prefs.getBoolean("transport_debugging", false);
}
@Override
@ -73,7 +79,29 @@ public class ApiRequest extends AsyncTask<HashMap<String,String>, Integer, JsonE
}
HttpPost httpPost = new HttpPost(m_api + "/api/");
String httpLogin = m_prefs.getString("http_login", "");
String httpPassword = m_prefs.getString("http_password", "");
if (httpLogin.length() > 0) {
if (m_transportDebugging) Log.d(TAG, "Using HTTP Basic authentication.");
URL targetUrl;
try {
targetUrl = new URL(m_api);
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
HttpHost targetHost = new HttpHost(targetUrl.getHost(), targetUrl.getPort(), targetUrl.getProtocol());
client.getCredentialsProvider().setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials(httpLogin, httpPassword));
}
try {
httpPost.setEntity(new StringEntity(requestStr, "utf-8"));
HttpResponse execute = client.execute(httpPost);
@ -102,160 +130,4 @@ public class ApiRequest extends AsyncTask<HashMap<String,String>, Integer, JsonE
return null;
}
/* protected String m_sessionId;
protected String m_apiEndpoint;
protected String m_login;
protected String m_password;
protected int m_authStatus;
protected Gson m_gson = new Gson();
protected static final int STATUS_LOGIN_FAILED = 0;
protected static final int STATUS_OK = 1;
protected static final int STATUS_API_DISABLED = 2;
protected static final int STATUS_OTHER_ERROR = 3;
protected ApiRequest(String sessionId, String apiEndpoint, String login, String password) {
super();
m_sessionId = sessionId;
m_apiEndpoint = apiEndpoint;
m_authStatus = STATUS_OK;
m_login = login;
m_password = password;
//Log.d(TAG, "initial SID=" + sessionId);
}
protected int tryAuthenticate() {
JsonElement result = _sendRequest(new HashMap<String,String>() {
{
put("op", "login");
put("user", m_login);
put("password", m_password);
}
});
if (result != null) {
try {
JsonObject rv = result.getAsJsonObject();
int status = rv.get("status").getAsInt();
if (status == 0) {
JsonObject content = rv.get("content").getAsJsonObject();
if (content != null) {
m_sessionId = content.get("session_id").getAsString();
Log.d(TAG, "<<< Authentified, sessionId=" + m_sessionId);
return STATUS_OK;
}
} else {
JsonObject content = rv.get("content").getAsJsonObject();
if (content != null) {
String error = content.get("error").getAsString();
if (error.equals("LOGIN_ERROR")) {
m_sessionId = null;
return STATUS_LOGIN_FAILED;
} else if (error.equals("API_DISABLED")) {
m_sessionId = null;
return STATUS_API_DISABLED;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
m_sessionId = null;
return STATUS_OTHER_ERROR;
}
protected String getSessionId() {
return m_sessionId;
}
protected int getAuthStatus() {
return m_authStatus;
}
protected JsonElement _sendRequest(HashMap<String,String> param) {
HashMap<String,String> tmp = new HashMap<String,String>(param);
if (m_sessionId != null)
tmp.put("sid", m_sessionId);
String requestStr = m_gson.toJson(tmp);
Log.d(TAG, ">>> (" + requestStr + ") " + m_apiEndpoint);
DefaultHttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(m_apiEndpoint + "/api/");
try {
httpPost.setEntity(new StringEntity(requestStr, "utf-8"));
HttpResponse execute = client.execute(httpPost);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
String response = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
Log.d(TAG, "<<< " + response);
JsonParser parser = new JsonParser();
return parser.parse(response);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public JsonElement sendRequest(HashMap<String, String> params) {
JsonElement result = _sendRequest(params);
try {
JsonElement content = result.getAsJsonObject().get("content");
int status = result.getAsJsonObject().get("status").getAsInt();
if (status == 1) {
String error = content.getAsJsonObject().get("error").getAsString();
if (error.equals("NOT_LOGGED_IN")) {
Log.d(TAG, "<<< Session invalid, trying to authenticate...");
m_sessionId = null;
m_authStatus = tryAuthenticate();
if (m_authStatus == STATUS_OK) {
result = _sendRequest(params);
return result.getAsJsonObject().get("content");
}
}
} else {
return content;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
} */
}

View File

@ -692,10 +692,8 @@ public class MainActivity extends FragmentActivity implements FeedsFragment.OnFe
logout();
if (m_prefs.getString("ttrss_url", null) == null ||
m_prefs.getString("login", null) == null ||
m_prefs.getString("password", null) == null) {
if (m_prefs.getString("ttrss_url", "").length() == 0) {
setLoadingStatus(R.string.login_need_configure, false);
} else {