Improve logging in with the app
This commit is contained in:
parent
aca666cdf1
commit
5cccd03e2f
|
@ -7,8 +7,8 @@ android {
|
||||||
applicationId "eu.stuifzand.micropub"
|
applicationId "eu.stuifzand.micropub"
|
||||||
minSdkVersion 15
|
minSdkVersion 15
|
||||||
targetSdkVersion 26
|
targetSdkVersion 26
|
||||||
versionCode 14
|
versionCode 15
|
||||||
versionName '0.0.14-alpha'
|
versionName '0.1.0-alpha'
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
@ -39,7 +39,7 @@ android {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||||
implementation 'com.android.support:appcompat-v7:26.1.0'
|
implementation 'com.android.support:appcompat-v7:26.1.0'
|
||||||
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
|
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
|
||||||
implementation 'com.android.support:design:26.1.0'
|
implementation 'com.android.support:design:26.1.0'
|
||||||
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
|
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
|
||||||
testImplementation 'com.squareup.okhttp3:mockwebserver:3.9.1';
|
testImplementation 'com.squareup.okhttp3:mockwebserver:3.9.1';
|
||||||
|
@ -48,21 +48,32 @@ dependencies {
|
||||||
// Logging
|
// Logging
|
||||||
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
|
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
|
||||||
// ViewModel and LiveData
|
// ViewModel and LiveData
|
||||||
implementation 'android.arch.lifecycle:extensions:1.1.0'
|
implementation 'android.arch.lifecycle:extensions:1.1.1'
|
||||||
annotationProcessor "android.arch.lifecycle:compiler:1.1.0"
|
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
|
||||||
// Java8 support for Lifecycles
|
// Java8 support for Lifecycles
|
||||||
implementation 'android.arch.lifecycle:common-java8:1.1.0'
|
implementation 'android.arch.lifecycle:common-java8:1.1.1'
|
||||||
|
// jsoup
|
||||||
implementation 'org.jsoup:jsoup:1.11.2'
|
implementation 'org.jsoup:jsoup:1.11.2'
|
||||||
implementation 'com.google.code.gson:gson:2.8.2'
|
implementation 'com.google.code.gson:gson:2.8.2'
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
|
|
||||||
androidTestImplementation 'com.android.support.test:runner:1.0.1'
|
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
|
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
||||||
|
|
||||||
implementation 'com.android.support:support-annotations:27.0.0'
|
implementation 'com.parse.bolts:bolts-tasks:1.4.0'
|
||||||
|
|
||||||
|
implementation 'com.android.support:support-annotations:27.1.1'
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
||||||
|
|
||||||
implementation "io.reactivex.rxjava2:rxjava:2.1.12"
|
implementation "io.reactivex.rxjava2:rxjava:2.1.12"
|
||||||
|
|
||||||
|
def room_version = "1.1.0"
|
||||||
|
|
||||||
|
implementation "android.arch.persistence.room:runtime:$room_version"
|
||||||
|
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
|
||||||
|
|
||||||
|
// Test helpers
|
||||||
|
testImplementation "android.arch.persistence.room:testing:$room_version"
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package eu.stuifzand.micropub.auth;
|
||||||
|
|
||||||
|
import android.arch.persistence.room.Database;
|
||||||
|
import android.arch.persistence.room.RoomDatabase;
|
||||||
|
|
||||||
|
@Database(entities = {Auth.class}, version = 2)
|
||||||
|
public abstract class AppDatabase extends RoomDatabase {
|
||||||
|
public abstract AuthDao authDao();
|
||||||
|
}
|
47
app/src/main/java/eu/stuifzand/micropub/auth/Auth.java
Normal file
47
app/src/main/java/eu/stuifzand/micropub/auth/Auth.java
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package eu.stuifzand.micropub.auth;
|
||||||
|
|
||||||
|
import android.arch.persistence.room.ColumnInfo;
|
||||||
|
import android.arch.persistence.room.Entity;
|
||||||
|
import android.arch.persistence.room.PrimaryKey;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class Auth {
|
||||||
|
@PrimaryKey(autoGenerate = true)
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
@ColumnInfo(name = "state")
|
||||||
|
private String state;
|
||||||
|
|
||||||
|
@ColumnInfo(name = "me")
|
||||||
|
private String me;
|
||||||
|
|
||||||
|
//private String authorization_endpoint;
|
||||||
|
public Auth(String state, String me) {
|
||||||
|
this.state = state;
|
||||||
|
this.me = me;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(String state) {
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMe() {
|
||||||
|
return me;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMe(String me) {
|
||||||
|
this.me = me;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
}
|
18
app/src/main/java/eu/stuifzand/micropub/auth/AuthDao.java
Normal file
18
app/src/main/java/eu/stuifzand/micropub/auth/AuthDao.java
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package eu.stuifzand.micropub.auth;
|
||||||
|
|
||||||
|
import android.arch.persistence.room.Dao;
|
||||||
|
import android.arch.persistence.room.Delete;
|
||||||
|
import android.arch.persistence.room.Insert;
|
||||||
|
import android.arch.persistence.room.Query;
|
||||||
|
|
||||||
|
@Dao
|
||||||
|
public interface AuthDao {
|
||||||
|
@Query("SELECT * FROM auth WHERE state = :state")
|
||||||
|
Auth load(String state);
|
||||||
|
|
||||||
|
@Insert
|
||||||
|
void save(Auth auth);
|
||||||
|
|
||||||
|
@Delete
|
||||||
|
void delete(Auth auth);
|
||||||
|
}
|
|
@ -4,8 +4,10 @@ import android.accounts.Account;
|
||||||
import android.accounts.AccountAuthenticatorActivity;
|
import android.accounts.AccountAuthenticatorActivity;
|
||||||
import android.accounts.AccountAuthenticatorResponse;
|
import android.accounts.AccountAuthenticatorResponse;
|
||||||
import android.accounts.AccountManager;
|
import android.accounts.AccountManager;
|
||||||
|
import android.arch.persistence.room.Room;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.AsyncTask;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.RequiresApi;
|
import android.support.annotation.RequiresApi;
|
||||||
|
@ -19,6 +21,7 @@ import android.webkit.WebViewClient;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
|
||||||
import eu.stuifzand.micropub.R;
|
import eu.stuifzand.micropub.R;
|
||||||
|
import eu.stuifzand.micropub.utils.RandomStringUtils;
|
||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
|
|
||||||
public class AuthenticationActivity extends AccountAuthenticatorActivity {
|
public class AuthenticationActivity extends AccountAuthenticatorActivity {
|
||||||
|
@ -46,18 +49,70 @@ public class AuthenticationActivity extends AccountAuthenticatorActivity {
|
||||||
Intent intent = getIntent();
|
Intent intent = getIntent();
|
||||||
bundle = intent.getExtras();
|
bundle = intent.getExtras();
|
||||||
|
|
||||||
|
if ("android.intent.action.VIEW".equals(intent.getAction())) {
|
||||||
|
Log.i("micropub", intent.toString());
|
||||||
|
Uri uri = intent.getData();
|
||||||
|
String code = uri.getQueryParameter("code");
|
||||||
|
String state = uri.getQueryParameter("state"); // @TODO: check/use state
|
||||||
|
|
||||||
|
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "auth").build();
|
||||||
|
new AsyncTask<String, Void, Auth>() {
|
||||||
|
@Override
|
||||||
|
protected Auth doInBackground(String... strings) {
|
||||||
|
String state = strings[0];
|
||||||
|
Auth auth = db.authDao().load(state);
|
||||||
|
db.close();
|
||||||
|
return auth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Auth auth) {
|
||||||
|
if (auth != null) {
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, "Indieauth");
|
||||||
|
bundle.putString(AccountManager.KEY_ACCOUNT_NAME, auth.getMe());
|
||||||
|
bundle.putString(AuthenticationActivity.PARAM_USER_PASS, code);
|
||||||
|
|
||||||
|
Intent loginIntent = new Intent();
|
||||||
|
loginIntent.putExtras(bundle);
|
||||||
|
finishLogin(loginIntent);
|
||||||
|
}
|
||||||
|
}.execute(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String endpoint = bundle.getString("authorization_endpoint");
|
String endpoint = bundle.getString("authorization_endpoint");
|
||||||
String me = bundle.getString(WebsigninTask.ME);
|
String me = bundle.getString(WebsigninTask.ME);
|
||||||
AccountAuthenticatorResponse response = bundle.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
|
AccountAuthenticatorResponse response = bundle.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
|
||||||
|
|
||||||
|
String state = RandomStringUtils.randomString(16);
|
||||||
|
|
||||||
HttpUrl.Builder builder = HttpUrl.parse(endpoint).newBuilder();
|
HttpUrl.Builder builder = HttpUrl.parse(endpoint).newBuilder();
|
||||||
builder.setQueryParameter("me", me)
|
builder.setQueryParameter("me", me)
|
||||||
.setQueryParameter("client_id", "https://wrimini.net")
|
.setQueryParameter("client_id", "https://wrimini.net")
|
||||||
.setQueryParameter("redirect_uri", "https://wrimini.net/oauth/callback")
|
.setQueryParameter("redirect_uri", "https://wrimini.net/oauth/callback")
|
||||||
.setQueryParameter("response_type", "code")
|
.setQueryParameter("response_type", "code")
|
||||||
.setQueryParameter("state", "1234") // @TODO use random states, check the state later
|
.setQueryParameter("state", state)
|
||||||
.setQueryParameter("scope", "create"); // @TODO use different scope
|
.setQueryParameter("scope", "create"); // @TODO use different scope
|
||||||
|
|
||||||
|
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "auth")
|
||||||
|
.fallbackToDestructiveMigration()
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Auth auth = new Auth(state, me);
|
||||||
|
|
||||||
|
new AsyncTask<Auth, Void, Void>() {
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Auth... auths) {
|
||||||
|
db.authDao().save(auths[0]);
|
||||||
|
db.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}.execute(auth);
|
||||||
|
|
||||||
String url = builder.toString();
|
String url = builder.toString();
|
||||||
Log.i("micropub", "LoadUrl: " + url);
|
Log.i("micropub", "LoadUrl: " + url);
|
||||||
Intent webIntent = new Intent(Intent.ACTION_VIEW);
|
Intent webIntent = new Intent(Intent.ACTION_VIEW);
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package eu.stuifzand.micropub.utils;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class RandomStringUtils {
|
||||||
|
public static String randomString(int n) {
|
||||||
|
Random r = new Random();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
sb.append((char)('a'+r.nextInt(('z'-'a')+1)));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user