import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
+import java.util.Set;
+import org.iotivity.cloud.accountserver.Constants;
import org.iotivity.cloud.accountserver.db.TokenTable;
import org.iotivity.cloud.accountserver.db.UserTable;
import org.iotivity.cloud.base.exception.ServerException.InternalServerErrorException;
import org.iotivity.cloud.util.Log;
+import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.util.ClasspathHelper;
+import org.reflections.util.ConfigurationBuilder;
/**
*
/**
* API for creating OAuth server object
- *
- * @param authServer
- * authorization server
+ *
+ * @param authProviderName
+ * Valid name of auth server.
* @return OAuthServer - object to handle authorization
* @throws Exception
*/
- public boolean load(String authProvider) {
+ public boolean load(String authProviderName) {
- String fileName = authProvider + ".jar";
- File jarFile = new File(fileName);
+ File jarFile = new File(Constants.OAUTH_LIBRARIES_PATH + authProviderName + ".jar");
URLClassLoader classLoader = null;
try {
- URL urls = new URL("jar:" + jarFile.toURI() + "!/");
+ URL jarUrl = new URL("jar:" + jarFile.toURI() + "!/");
+ URL[] urls = new URL[] { jarUrl, ClasspathHelper.forClass(this.getClass()) };
+ classLoader = new URLClassLoader(urls);
- Log.d("urls: " + urls.toString());
+ String authProvider = this.getClass().getPackage().getName() + "." + authProviderName;
+ Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(urls)
+ .setScanners(new SubTypesScanner(false)));
+ for (String type : reflections.getAllTypes())
+ if (type.equalsIgnoreCase(authProvider))
+ authProvider = type;
- classLoader = new URLClassLoader(new URL[] { urls });
Class<?> authProviderClass = classLoader
- .loadClass(this.getClass().getPackage().getName() + "."
- + authProvider);
+ .loadClass(authProvider);
this.authProviderClass = authProviderClass;
Object object = authProviderClass.newInstance();
*/
package org.iotivity.cloud.accountserver.resources.account;
+import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
* @param authCode
* Unique identifier of the resource which is obtained from an
* auth provider or a single sign-on (SSO) client
- * @param authProvider
+ * @param authProviderName
* Provider name user for authentication (e.g., "Github")
* @param options
* Optional field (e.g., region authserver url, apiserver url)
*/
public HashMap<String, Object> signUp(String did, String authCode,
- String authProvider, Object options) {
- boolean res = false;
+ String authProviderName, Object options) {
- // check auth provider name not to be case-sensitive
- authProvider = checkAuthProviderName(authProvider);
- res = loadAuthProviderLibrary(authProvider);
+ authProviderName = checkAuthProviderName(authProviderName);
+ boolean res = loadAuthProviderLibrary(authProviderName);
if (!res) {
throw new InternalServerErrorException(
- authProvider + " library is not loaded");
+ authProviderName + " library is not loaded");
}
String userUuid = null;
// set token data
TokenTable tokenInfo = requestAccessToken(authCode, options);
tokenInfo.setDid(did);
- tokenInfo.setProvider(authProvider);
+ tokenInfo.setProvider(authProviderName);
Date currentTime = new Date();
DateFormat transFormat = new SimpleDateFormat("yyyyMMddkkmm");
tokenInfo.setIssuedtime(transFormat.format(currentTime));
// set user data
UserTable userInfo = requestUserInfo(tokenInfo.getAccesstoken(),
options);
- userInfo.setProvider(authProvider);
+ userInfo.setProvider(authProviderName);
// check uuid
- userUuid = findUuid(userInfo.getUserid(), authProvider);
+ userUuid = findUuid(userInfo.getUserid(), authProviderName);
// store token information and user information to the DB
// private group creation and store group information to the DB
return userUuid;
}
- private String checkAuthProviderName(String authProvider) {
+ private String checkAuthProviderName(String authProviderName) {
+ String libraryFileName = getValidFileName(Constants.OAUTH_LIBRARIES_PATH, authProviderName + ".jar");
+ if (libraryFileName == null) {
+ Log.w("OAuth 3rd party library " + authProviderName + " does not exist.");
+ return authProviderName;
+ }
+ return libraryFileName.substring(0, libraryFileName.length() - 4);
+ }
- String authProviderName = null;
+ private String getValidFileName(String path, String filename) {
+ File file = new File(path + filename);
+ if(file.exists())
+ return filename;
- if (authProvider.equalsIgnoreCase(Constants.GITHUB)) {
- authProviderName = Constants.GITHUB;
- } else if (authProvider.equalsIgnoreCase(Constants.SAMSUNG)) {
- authProviderName = Constants.SAMSUNG;
- } else if (authProvider.equalsIgnoreCase(Constants.GOOGLE))
- authProviderName = Constants.GOOGLE;
- else {
- Log.w("Unsupported oauth provider : " + authProvider);
- }
+ File parentFile = file.getAbsoluteFile().getParentFile();
+ if (parentFile.exists())
+ for (String directoryFile : parentFile.list())
+ if (directoryFile.equalsIgnoreCase(file.getName()))
+ return directoryFile;
- return authProviderName;
+ return null;
}
private String findUuid(String userId, String authProvider) {
return byteRootCert;
}
- private Boolean loadAuthProviderLibrary(String authProvider) {
+ private Boolean loadAuthProviderLibrary(String authProviderName) {
mFactory = new OAuthProviderFactory();
- return mFactory.load(authProvider);
+ return mFactory.load(authProviderName);
}
private TokenTable requestAccessToken(String authCode, Object options) {
}
private TokenTable requestRefreshToken(String refreshToken,
- String provider) {
+ String authProviderName) {
if (mFactory == null) {
-
- boolean res = false;
- String authProvider = checkAuthProviderName(provider);
- res = loadAuthProviderLibrary(authProvider);
+ authProviderName = checkAuthProviderName(authProviderName);
+ boolean res = loadAuthProviderLibrary(authProviderName);
if (!res) {
throw new InternalServerErrorException(
- authProvider + " library is not loaded");
+ authProviderName + " library is not loaded");
}
}