diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index cf9149f6..25db81a3 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -7,6 +7,14 @@ diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index 87864ab3..dbab9566 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -19,6 +19,7 @@ import it.integry.integrywmsnative.core.data_store.db.AppDatabase; import it.integry.integrywmsnative.core.ean128.Ean128Service; import it.integry.integrywmsnative.core.menu.MenuRESTConsumer; import it.integry.integrywmsnative.core.menu.MenuService; +import it.integry.integrywmsnative.core.rest.AuthInterceptor; import it.integry.integrywmsnative.core.rest.RESTBuilder; import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.AziendaRESTConsumer; @@ -50,7 +51,7 @@ import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.sound.SoundAlertService; import it.integry.integrywmsnative.core.update.UpdatesManager; import it.integry.integrywmsnative.gest.contab_doc_interni.rest.DocInterniRESTConsumer; -import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer; +import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.rest.ProdFabbisognoLineeProdRESTConsumer; import it.integry.integrywmsnative.view.dialogs.DialogProgressView; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; @@ -96,8 +97,8 @@ public class MainApplicationModule { @Provides @Singleton - MainContext providesMainContextNew(MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) { - return new MainContext(mApplication.getApplicationContext(), menuService, appDatabase, systemRESTConsumer, authRESTConsumer); + MainContext providesMainContextNew(MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) { + return new MainContext(mApplication.getApplicationContext(), menuService, appDatabase, systemRESTConsumer, authenticationRESTConsumer); } @Provides @@ -117,8 +118,8 @@ public class MainApplicationModule { @Provides @Singleton - RESTBuilder providesRESTBuilder() { - return new RESTBuilder(); + RESTBuilder providesRESTBuilder(AuthInterceptor authInterceptor) { + return new RESTBuilder(authInterceptor); } @Provides diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java index 4d35d1d7..12b98b0b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java @@ -19,7 +19,7 @@ import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityThread; -import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer; +import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer; @Singleton public class MainContext { @@ -28,16 +28,16 @@ public class MainContext { private final MenuService menuService; private final AppDatabase appDatabase; private final SystemRESTConsumer systemRESTConsumer; - private final AuthRESTConsumer authRESTConsumer; + private final AuthenticationRESTConsumer authenticationRESTConsumer; private Listener mListener; - public MainContext(Context applicationContext, MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) { + public MainContext(Context applicationContext, MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) { this.applicationContext = applicationContext; this.menuService = menuService; this.appDatabase = appDatabase; this.systemRESTConsumer = systemRESTConsumer; - this.authRESTConsumer = authRESTConsumer; + this.authenticationRESTConsumer = authenticationRESTConsumer; } public void init() { @@ -67,7 +67,7 @@ public class MainContext { private void initAuthSession(Runnable onComplete) { - this.authRESTConsumer.me(obj -> { + this.authenticationRESTConsumer.me(obj -> { onComplete.run(); }, ex -> { if (mListener != null) mListener.onError(new SpannedString(ex.getMessage())); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java index c4ca240a..b4bc2593 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/AuthInterceptor.java @@ -2,23 +2,58 @@ package it.integry.integrywmsnative.core.rest; import androidx.annotation.NonNull; +import com.auth0.android.jwt.JWT; + import java.io.IOException; -import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer; +import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.gest.login.rest.RefreshRESTConsumer; import okhttp3.Interceptor; import okhttp3.Response; public class AuthInterceptor implements Interceptor { - private final AuthRESTConsumer authRESTConsumer; + private final RefreshRESTConsumer refreshRESTConsumer; - public AuthInterceptor(AuthRESTConsumer authRESTConsumer) { - this.authRESTConsumer = authRESTConsumer; + public AuthInterceptor(RefreshRESTConsumer refreshRESTConsumer) { + this.refreshRESTConsumer = refreshRESTConsumer; } @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { - return null; + var originalRequest = chain.request(); + var accessToken = SettingsManager.i().getUserSession().getAccessToken(); + var accessTokenExpiryDate = SettingsManager.i().getUserSession().getAccessTokenExpiryDate(); + + if(accessToken != null && (accessTokenExpiryDate == null || UtilityDate.getNowTime().isAfter(accessTokenExpiryDate))) { + + // Make the token refresh request + try { + var response = refreshRESTConsumer.makeSynchronousRefreshTokenRequest(); + + JWT jwt = new JWT(response.getAccessToken()); + + SettingsManager.i().getUserSession() + .setAccessToken(response.getAccessToken()) + .setAccessTokenExpiryDate(UtilityDate.toLocalDateTime(jwt.getExpiresAt())) + .setRefreshToken(response.getRefreshToken()) + .setRefreshTokenExpiryDate(response.getExpiryDate()); + + SettingsManager.update(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + + // Add the access token to the request header + var authorizedRequest = originalRequest.newBuilder() + .header("Authorization", "Bearer " + SettingsManager.i().getUserSession().getAccessToken()) + .build(); + + return chain.proceed(authorizedRequest); + } else + return chain.proceed(originalRequest); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java index 2aa26fdf..0bc1bef5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/HttpInterceptor.java @@ -3,6 +3,7 @@ package it.integry.integrywmsnative.core.rest; import java.io.IOException; import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityDate; import okhttp3.HttpUrl; import okhttp3.Interceptor; import okhttp3.Request; @@ -18,19 +19,30 @@ public class HttpInterceptor implements Interceptor { public Response intercept(Chain chain) throws IOException { final String PROFILE_DB = SettingsManager.i().getUserSession() == null ? null : SettingsManager.i().getUserSession().getProfileDB(); - final String ACCESS_TOKEN = SettingsManager.i().getUserSession().getAccessToken(); final String APP_TOKEN = "fa3a21af-606b-4129-a22b-aedc2a52c7b6"; + String accessToken = null; + + if(SettingsManager.i().getUserSession().getAccessTokenExpiryDate() != null && + UtilityDate.getNowTime().isBefore(SettingsManager.i().getUserSession().getAccessTokenExpiryDate())) { + accessToken = SettingsManager.i().getUserSession().getAccessToken(); + } + final Request request = chain.request(); final HttpUrl url = request.url().newBuilder() .addQueryParameter("profileDb", PROFILE_DB) .build(); - final Request newRequest = chain.request().newBuilder() - .addHeader("Authorization", "Bearer " + ACCESS_TOKEN) + Request.Builder builder = chain.request().newBuilder() .addHeader("Content-Type", "application/json") .addHeader("Accept", "*/*") - .addHeader("x-app-token", APP_TOKEN) + .addHeader("x-app-token", APP_TOKEN); + + if(accessToken != null) + builder + .addHeader("Authorization", "Bearer " + accessToken); + + var newRequest = builder .url(url) .build(); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java index 7630d1f2..24f4e4c4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java @@ -24,7 +24,12 @@ import retrofit2.converter.gson.GsonConverterFactory; @Singleton public class RESTBuilder { - private static final boolean ADD_LOGGER_INTERCEPTOR = false; + private final boolean ADD_LOGGER_INTERCEPTOR = false; + private final AuthInterceptor authInterceptor; + + public RESTBuilder(AuthInterceptor authInterceptor) { + this.authInterceptor = authInterceptor; + } public T getService(final Class service) { return getService(service, SettingsManager.i().getServer().getProtocol(), SettingsManager.i().getServer().getHost(), SettingsManager.i().getServer().getPort(), true); @@ -53,6 +58,7 @@ public class RESTBuilder { clientBuilder.retryOnConnectionFailure(true); + clientBuilder.addInterceptor(authInterceptor); if (addInterceptors) clientBuilder.addInterceptor(new HttpInterceptor()); if (ADD_LOGGER_INTERCEPTOR) clientBuilder.addInterceptor(new HttpLoggerInterceptor()); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java index a8cb448b..dc66ed20 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsModel.java @@ -80,6 +80,7 @@ public class SettingsModel { public static class UserSession { private String accessToken; + private LocalDateTime accessTokenExpiryDate; private String refreshToken; private LocalDateTime refreshTokenExpiryDate; private String deviceId; @@ -159,6 +160,15 @@ public class SettingsModel { this.defaultOrdinamentoPickingAccettazioneBolle = defaultOrdinamentoPickingAccettazioneBolle; return this; } + + public LocalDateTime getAccessTokenExpiryDate() { + return accessTokenExpiryDate; + } + + public UserSession setAccessTokenExpiryDate(LocalDateTime accessTokenExpiryDate) { + this.accessTokenExpiryDate = accessTokenExpiryDate; + return this; + } } public Server getServer() { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java index a846c388..649a3533 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginModule.java @@ -1,12 +1,16 @@ package it.integry.integrywmsnative.gest.login; +import java.util.concurrent.ExecutorService; + import javax.inject.Singleton; import dagger.Module; import dagger.Provides; +import it.integry.integrywmsnative.core.rest.AuthInterceptor; import it.integry.integrywmsnative.core.rest.RESTBuilder; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; -import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer; +import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer; +import it.integry.integrywmsnative.gest.login.rest.RefreshRESTConsumer; import it.integry.integrywmsnative.gest.login.viewmodel.LoginViewModel; @Module(subcomponents = LoginComponent.class) @@ -14,13 +18,25 @@ public class LoginModule { @Provides @Singleton - AuthRESTConsumer provideLoginRESTConsumer(RESTBuilder restBuilder) { - return new AuthRESTConsumer(restBuilder); + AuthenticationRESTConsumer provideAuthenticationRESTConsumer(RESTBuilder restBuilder) { + return new AuthenticationRESTConsumer(restBuilder); } @Provides - LoginViewModel providesSpedizioneViewModel(SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) { - return new LoginViewModel(systemRESTConsumer, authRESTConsumer); + @Singleton + AuthInterceptor provideAuthInterceptor(RefreshRESTConsumer refreshRESTConsumer) { + return new AuthInterceptor(refreshRESTConsumer); + } + + @Provides + @Singleton + RefreshRESTConsumer provideRefreshRESTConsumer(ExecutorService executorService) { + return new RefreshRESTConsumer(executorService); + } + + @Provides + LoginViewModel providesLoginViewModel(SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) { + return new LoginViewModel(systemRESTConsumer, authenticationRESTConsumer); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/LoginJwtResponseDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/AuthenticationJwtResponseDTO.java similarity index 68% rename from app/src/main/java/it/integry/integrywmsnative/gest/login/dto/LoginJwtResponseDTO.java rename to app/src/main/java/it/integry/integrywmsnative/gest/login/dto/AuthenticationJwtResponseDTO.java index 1440c75e..f51af87e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/LoginJwtResponseDTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/dto/AuthenticationJwtResponseDTO.java @@ -2,7 +2,7 @@ package it.integry.integrywmsnative.gest.login.dto; import java.time.LocalDateTime; -public class LoginJwtResponseDTO { +public class AuthenticationJwtResponseDTO { private String accessToken; private String refreshToken; @@ -14,7 +14,7 @@ public class LoginJwtResponseDTO { return accessToken; } - public LoginJwtResponseDTO setAccessToken(String accessToken) { + public AuthenticationJwtResponseDTO setAccessToken(String accessToken) { this.accessToken = accessToken; return this; } @@ -23,7 +23,7 @@ public class LoginJwtResponseDTO { return refreshToken; } - public LoginJwtResponseDTO setRefreshToken(String refreshToken) { + public AuthenticationJwtResponseDTO setRefreshToken(String refreshToken) { this.refreshToken = refreshToken; return this; } @@ -32,7 +32,7 @@ public class LoginJwtResponseDTO { return expiryDate; } - public LoginJwtResponseDTO setExpiryDate(LocalDateTime expiryDate) { + public AuthenticationJwtResponseDTO setExpiryDate(LocalDateTime expiryDate) { this.expiryDate = expiryDate; return this; } @@ -41,7 +41,7 @@ public class LoginJwtResponseDTO { return expireIn; } - public LoginJwtResponseDTO setExpireIn(long expireIn) { + public AuthenticationJwtResponseDTO setExpireIn(long expireIn) { this.expireIn = expireIn; return this; } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumer.java similarity index 74% rename from app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthRESTConsumer.java rename to app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumer.java index bb1fad19..73230b25 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumer.java @@ -13,21 +13,20 @@ import it.integry.integrywmsnative.core.rest.RESTBuilder; import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; import it.integry.integrywmsnative.gest.login.dto.LoginAziendaDTO; -import it.integry.integrywmsnative.gest.login.dto.LoginJwtResponseDTO; +import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO; import it.integry.integrywmsnative.gest.login.dto.LoginRequestDTO; -import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @Singleton -public class AuthRESTConsumer extends _BaseRESTConsumer { +public class AuthenticationRESTConsumer extends _BaseRESTConsumer { private final RESTBuilder restBuilder; @Inject - public AuthRESTConsumer(RESTBuilder restBuilder) { + public AuthenticationRESTConsumer(RESTBuilder restBuilder) { this.restBuilder = restBuilder; } @@ -71,7 +70,7 @@ public class AuthRESTConsumer extends _BaseRESTConsumer { } - public void authenticate(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete, RunnableArgs onFailed) { + public void authenticate(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete, RunnableArgs onFailed) { AuthenticationRESTConsumerService service = restBuilder.getService(AuthenticationRESTConsumerService.class, protocol, host, port, false); LoginRequestDTO loginRequestDTO = new LoginRequestDTO() @@ -85,12 +84,12 @@ public class AuthRESTConsumer extends _BaseRESTConsumer { .enqueue(new Callback<>() { @Override - public void onResponse(Call> call, Response> response) { + public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "login", onComplete, onFailed); } @Override - public void onFailure(Call> call, final Throwable t) { + public void onFailure(Call> call, final Throwable t) { Log.e("login", t.toString()); onFailed.run(new Exception(t)); } @@ -98,28 +97,6 @@ public class AuthRESTConsumer extends _BaseRESTConsumer { } - public void refreshToken(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete, RunnableArgs onFailed) { - AuthenticationRESTConsumerService service = restBuilder.getService(AuthenticationRESTConsumerService.class); - - RefreshRequestDTO refreshRequest = new RefreshRequestDTO() - .setRefreshToken(username); - - service - .refresh(refreshRequest) - .enqueue(new Callback<>() { - - @Override - public void onResponse(Call> call, Response> response) { - analyzeAnswer(response, "refresh", onComplete, onFailed); - } - - @Override - public void onFailure(Call> call, final Throwable t) { - Log.e("refresh", t.toString()); - onFailed.run(new Exception(t)); - } - }); - } public void retrieveAvailableProfiles(String protocol, String host, int port, String username, RunnableArgs> onComplete, RunnableArgs onFailed) { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java index 2c7aed5f..af7b6827 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/AuthenticationRESTConsumerService.java @@ -5,10 +5,9 @@ import java.util.List; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; import it.integry.integrywmsnative.gest.login.dto.LoginAziendaDTO; -import it.integry.integrywmsnative.gest.login.dto.LoginJwtResponseDTO; +import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO; import it.integry.integrywmsnative.gest.login.dto.LoginRequestDTO; import it.integry.integrywmsnative.gest.login.dto.LoginResponseDTO; -import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO; import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.GET; @@ -25,10 +24,7 @@ public interface AuthenticationRESTConsumerService { Call> login(@Body LoginRequestDTO loginRequestDTO); @POST("auth/login") - Call> loginNew(@Body LoginRequestDTO loginRequestDTO); - - @POST("auth/refresh") - Call> refresh(@Body RefreshRequestDTO refreshRequestDTO); + Call> loginNew(@Body LoginRequestDTO loginRequestDTO); @GET("auth/me") Call> me(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumer.java new file mode 100644 index 00000000..56c1be3d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumer.java @@ -0,0 +1,95 @@ +package it.integry.integrywmsnative.gest.login.rest; + +import com.google.gson.Gson; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.inject.Singleton; + +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.rest.HttpInterceptor; +import it.integry.integrywmsnative.core.rest.RESTBuilder; +import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer; +import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityGson; +import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO; +import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO; +import okhttp3.OkHttpClient; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +@Singleton +public class RefreshRESTConsumer extends _BaseRESTConsumer { + + private final ExecutorService executorService; + + public RefreshRESTConsumer(ExecutorService executorService) { + this.executorService = executorService; + } + + public AuthenticationJwtResponseDTO makeSynchronousRefreshTokenRequest() throws Exception { + RefreshRESTConsumerService service = getService( + RefreshRESTConsumerService.class, + SettingsManager.i().getServer().getProtocol(), + SettingsManager.i().getServer().getHost(), + SettingsManager.i().getServer().getPort(), + true, + true, + 30); + + RefreshRequestDTO refreshRequest = new RefreshRequestDTO() + .setRefreshToken(SettingsManager.i().getUserSession().getRefreshToken()); + + Response> response = service + .refresh(refreshRequest) + .execute(); + + return analyzeAnswer(response, "refreshToken"); + } + + public void makeRefreshTokenRequest(final Runnable onComplete, final RunnableArgs onError) { + executorService.execute(() -> { + try { + makeSynchronousRefreshTokenRequest(); + + if (onComplete != null) + onComplete.run(); + + } catch (Exception ex) { + if (onError != null) onError.run(ex); + } + }); + } + + + private T getService(final Class service, String protocol, String host, int port, boolean addInterceptors, boolean addEmsApi, int timeout) { + OkHttpClient.Builder clientBuilder = RESTBuilder.getDefaultHttpClient(); + + clientBuilder.connectTimeout(timeout, TimeUnit.SECONDS); + clientBuilder.readTimeout(timeout, TimeUnit.SECONDS); + clientBuilder.writeTimeout(timeout, TimeUnit.SECONDS); + + clientBuilder.retryOnConnectionFailure(true); + + if (addInterceptors) clientBuilder.addInterceptor(new HttpInterceptor()); + + OkHttpClient client = clientBuilder.build(); + + String endpoint = protocol + "://" + host + (port > 0 ? ":" + port : "") + "/" + (addEmsApi ? "ems-api/" : ""); + + + Gson gson = UtilityGson.createObject(); + + Retrofit retrofit = new Retrofit.Builder() + .addConverterFactory(GsonConverterFactory.create(gson)) + .baseUrl(endpoint) + .client(client) + .build(); + + return retrofit.create(service); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumerService.java new file mode 100644 index 00000000..257024a6 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/rest/RefreshRESTConsumerService.java @@ -0,0 +1,17 @@ +package it.integry.integrywmsnative.gest.login.rest; + +import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.gest.login.dto.AuthenticationJwtResponseDTO; +import it.integry.integrywmsnative.gest.login.dto.RefreshRequestDTO; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.POST; + +public interface RefreshRESTConsumerService { + + + + @POST("auth/refresh") + Call> refresh(@Body RefreshRequestDTO refreshRequestDTO); + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java index 7f0b2a80..5113e149 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java @@ -15,25 +15,26 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgsss; import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityServer; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.gest.login.dto.AuthTokenClaimsDTO; import it.integry.integrywmsnative.gest.login.exception.InvalidServerCodAziendaException; import it.integry.integrywmsnative.gest.login.exception.InvalidUserDepositException; -import it.integry.integrywmsnative.gest.login.rest.AuthRESTConsumer; +import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer; public class LoginViewModel { private final SystemRESTConsumer mSystemRESTConsumer; - private final AuthRESTConsumer mAuthRESTConsumer; + private final AuthenticationRESTConsumer mAuthenticationRESTConsumer; private Listener mListener; @Inject - public LoginViewModel(SystemRESTConsumer systemRESTConsumer, AuthRESTConsumer authRESTConsumer) { + public LoginViewModel(SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) { this.mSystemRESTConsumer = systemRESTConsumer; - this.mAuthRESTConsumer = authRESTConsumer; + this.mAuthenticationRESTConsumer = authenticationRESTConsumer; } @@ -77,7 +78,7 @@ public class LoginViewModel { private void retrieveServerData(String codAzienda, RunnableArgsss onComplete) { - mAuthRESTConsumer.retrieveServerData(codAzienda, value -> { + mAuthenticationRESTConsumer.retrieveServerData(codAzienda, value -> { final String serverEndpoint = value.getEndpointRestApi(); @@ -102,7 +103,7 @@ public class LoginViewModel { } private void retrieveAvailableProfiles(String protocol, String host, int port, String username, RunnableArgs onComplete) { - mAuthRESTConsumer.retrieveAvailableProfiles(protocol, host, port, username, availableProfiles -> { + mAuthenticationRESTConsumer.retrieveAvailableProfiles(protocol, host, port, username, availableProfiles -> { if (availableProfiles == null || availableProfiles.isEmpty()) { this.sendError(new Exception("Non รจ stato trovato alcun profilo per l'utente: " + username)); @@ -123,7 +124,7 @@ public class LoginViewModel { } private void authenticate(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs onComplete) { - mAuthRESTConsumer.authenticate(protocol, host, port, username, password, profileDb, deviceSalt, sessionData -> { + mAuthenticationRESTConsumer.authenticate(protocol, host, port, username, password, profileDb, deviceSalt, sessionData -> { JWT jwt = new JWT(sessionData.getAccessToken()); var claims = jwt.getClaims(); @@ -134,6 +135,7 @@ public class LoginViewModel { .setProfileDB(profileDb) .setDeviceId(deviceSalt) .setAccessToken(sessionData.getAccessToken()) + .setAccessTokenExpiryDate(UtilityDate.toLocalDateTime(jwt.getExpiresAt())) .setRefreshToken(sessionData.getRefreshToken()) .setRefreshTokenExpiryDate(sessionData.getExpiryDate());