package jdrivesync.gdrive; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import jdrivesync.cli.Options; import jdrivesync.exception.JDriveSyncException; import jdrivesync.gdrive.oauth.OAuth2ClientCredentials; import jdrivesync.logging.LoggerFactory; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; public class CredentialStore { public static final String FILE_NAME = ".jdrivesync"; public static final String PROP_ACCESS_TOKEN = "accessToken"; public static final String PROP_REFRESH_TOKEN = "refreshToken"; private static final Logger LOGGER = LoggerFactory.getLogger(); private final Options options; private Optional<Credential> credential = Optional.empty(); public CredentialStore(Options options) { this.options = options; } public void store(Credential credential) { this.credential = Optional.of(credential); Properties properties = new Properties(); properties.setProperty(PROP_ACCESS_TOKEN, credential.getAccessToken()); properties.setProperty(PROP_REFRESH_TOKEN, credential.getRefreshToken()); try { File file = getAuthenticationFile(options); properties.store(new FileWriter(file), "Properties of jdrivesync."); } catch (IOException e) { throw new JDriveSyncException(JDriveSyncException.Reason.IOException, "Failed to store properties file: " + e.getMessage(), e); } } public Optional<Credential> getCredential() { if(!credential.isPresent()) { credential = load(); } return credential; } public Optional<Credential> load() { Properties properties = new Properties(); try { File file = getAuthenticationFile(options); if(!file.exists() || !file.canRead()) { LOGGER.log(Level.FINE, "Cannot find or read properties file. Returning empty credentials."); return Optional.empty(); } properties.load(new FileReader(file)); HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); GoogleCredential credential = new GoogleCredential.Builder().setJsonFactory(jsonFactory) .setTransport(httpTransport).setClientSecrets(OAuth2ClientCredentials.CLIENT_ID, OAuth2ClientCredentials.CLIENT_SECRET).build(); credential.setAccessToken(properties.getProperty(PROP_ACCESS_TOKEN)); credential.setRefreshToken(properties.getProperty(PROP_REFRESH_TOKEN)); return Optional.of(credential); } catch (IOException e) { throw new JDriveSyncException(JDriveSyncException.Reason.IOException, "Failed to load properties file: " + e.getMessage(), e); } } private File getAuthenticationFile(Options options) { Path path = Paths.get(System.getProperty("user.home"), FILE_NAME); if (options.getAuthenticationFile().isPresent()) { path = Paths.get(options.getAuthenticationFile().get()); } return path.toFile(); } }