#New Serial number
-#Tue Sep 27 16:11:46 EEST 2016
+#Mon Nov 21 18:04:12 KST 2016
keyGeneratorAlgorithm=ECDSA
notAfterInterval=20
securityProvider=BC
nextUpdateInterval=1
signatureAlgorithm=SHA256withECDSA
rootOU=OCF Sub CA
-serialNumber=0
+serialNumber=10
rootO=Samsung
subjectName=uuid\:31313131-3131-3131-3131-313131313131
caAlias=uuid\:31313131-3131-3131-3131-313131313131
public static final String REQ_SEARCH_USER_ID = "sid";
- public static final String REQ_SEARCH_CRITERIA = "search";
-
public static final String REQ_GROUP_ID = "gid";
public static final String REQ_GROUP_MASTER_ID = "gmid";
public static final String REQ_INVITE_ACCEPT = "accept";
+ public static final String SEARCH_USER_LIST = "ulist";
+
// Response key
public static final String RESP_ACCESS_TOKEN = "accesstoken";
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
import java.util.UUID;
import org.iotivity.cloud.accountserver.Constants;
return tokenInfo;
}
- public HashMap<String, Object> searchUserAboutUuid(String uuid) {
- // search user info about uuid
- HashMap<String, Object> condition = new HashMap<>();
- condition.put(Constants.KEYFIELD_UUID, uuid);
-
- ArrayList<HashMap<String, Object>> recordList = AccountDBManager
- .getInstance().selectRecord(Constants.USER_TABLE, condition);
- HashMap<String, Object> response = makeSearchUserResponse(recordList);
-
- return response;
- }
-
private HashMap<String, Object> makeSearchUserResponse(
ArrayList<HashMap<String, Object>> recordList) {
HashMap<String, Object> response = new HashMap<>();
String uid = record.get(Constants.KEYFIELD_UUID).toString();
uInfo.put(Constants.RESP_UUID, uid);
record.remove(Constants.KEYFIELD_UUID);
- uInfo.put(Constants.RESP_USER_INFO, record);
+ uInfo.putAll(record);
ulist.add(uInfo);
}
return response;
}
- // TODO: It will be changed
- public HashMap<String, Object> searchUserAboutCriteria(String criteria) {
- // parse criteria
- String[] searchType = getSearchType(criteria);
+ public HashMap<String, List<String>> getQueryMap(String queryString,
+ String splitOption) {
+ HashMap<String, List<String>> result = new HashMap<>();
- // search user info about criteria
- HashMap<String, Object> condition = new HashMap<>();
- condition.put(searchType[0], searchType[1]);
+ ArrayList<String> parsedQuery = new ArrayList<String>(
+ Arrays.asList(queryString.split(splitOption)));
- ArrayList<HashMap<String, Object>> recordList = AccountDBManager
- .getInstance().selectRecord(Constants.USER_TABLE, condition);
- HashMap<String, Object> response = makeSearchUserResponse(recordList);
- return response;
+ for (String query : parsedQuery) {
+ ArrayList<String> searchType = getSearchType(query);
+
+ ArrayList<String> values = (ArrayList<String>) result
+ .get(searchType.get(0));
+
+ if (values == null) {
+ result.put(searchType.get(0), new ArrayList<String>(
+ Arrays.asList(searchType.get(1))));
+ } else {
+ values.removeAll(Arrays.asList(searchType.get(1)));
+ values.addAll(Arrays.asList(searchType.get(1)));
+
+ result.put(searchType.get(0), values);
+ }
+ }
+ return result;
}
- // TODO: It will be changed
- private String[] getSearchType(String criteria) {
- String[] searchType = criteria.split(":");
- String searchKey = searchType[0];
- String searchValue = searchType[1];
+ private ArrayList<String> getSearchType(String criteria) {
+ ArrayList<String> searchType = new ArrayList<String>(
+ Arrays.asList(criteria.split("=")));
+
+ String searchKey = searchType.get(0);
+ String searchValue = searchType.get(1);
if (searchKey == null || searchValue == null) {
throw new BadRequestException("search key or value is null");
return searchType;
}
+ public enum SearchOperation {
+ AND, OR
+ }
+
+ public HashMap<String, Object> searchUserUsingCriteria(
+ HashMap<String, List<String>> criteria, SearchOperation operation) {
+ ArrayList<HashMap<String, Object>> recordList = new ArrayList<>();
+ Iterator<String> keys = criteria.keySet().iterator();
+ HashMap<String, Object> condition = new HashMap<>();
+ switch (operation) {
+ case AND:
+ while (keys.hasNext()) {
+ String key = keys.next();
+ List<String> searchValues = criteria.get(key);
+ for (String searchValue : searchValues) {
+ if (key.equals(Constants.KEYFIELD_UID)) {
+ condition.put(Constants.KEYFIELD_UUID, searchValue);
+ } else {
+ condition.put(key, searchValue);
+ }
+ }
+ }
+ recordList = AccountDBManager.getInstance()
+ .selectRecord(Constants.USER_TABLE, condition);
+ break;
+ case OR:
+ while (keys.hasNext()) {
+ String key = keys.next();
+ List<String> searchValues = criteria.get(key);
+ for (String searchValue : searchValues) {
+ condition = new HashMap<>();
+ // TODO arrange "uid" and "uuid" in the DB
+ if (key.equals(Constants.KEYFIELD_UID)) {
+ condition.put(Constants.KEYFIELD_UUID, searchValue);
+ } else {
+ condition.put(key, searchValue);
+ }
+ ArrayList<HashMap<String, Object>> record = AccountDBManager
+ .getInstance()
+ .selectRecord(Constants.USER_TABLE, condition);
+ recordList.removeAll(record);
+ recordList.addAll(record);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ HashMap<String, Object> response = makeSearchUserResponse(recordList);
+ return response;
+ }
+
public boolean deleteDevice(String uid, String di, String accetoken) {
HashSet<String> diSet = new HashSet<String>();
import java.util.List;
import org.iotivity.cloud.accountserver.Constants;
+import org.iotivity.cloud.accountserver.resources.account.AccountManager.SearchOperation;
import org.iotivity.cloud.base.device.Device;
import org.iotivity.cloud.base.exception.ServerException;
import org.iotivity.cloud.base.exception.ServerException.BadRequestException;
}
private IResponse handleGetSearch(IRequest request) {
- HashMap<String, Object> responsePayload = null;
+
+ if (!request.getUriPath().equals(Constants.ACCOUNT_SEARCH_FULL_URI)) {
+ throw new BadRequestException("invalid request uri");
+ }
HashMap<String, List<String>> queryData = request.getUriQueryMap();
if (queryData == null) {
throw new BadRequestException("query is null");
}
- List<String> suid = queryData.get(Constants.REQ_UUID_ID);
- List<String> criteria = queryData.get(Constants.REQ_SEARCH_CRITERIA);
- if (suid != null) {
- responsePayload = mAsManager.searchUserAboutUuid(suid.get(0));
- } else if (criteria != null) {
- responsePayload = mAsManager
- .searchUserAboutCriteria(criteria.get(0));
+ HashMap<String, Object> responsePayload = null;
+ // AND or OR operation to find users
+ if (request.getUriQuery().contains(",")) {
+ queryData = mAsManager.getQueryMap(request.getUriQuery(), ",");
+ responsePayload = (mAsManager.searchUserUsingCriteria(queryData,
+ SearchOperation.AND));
} else {
- throw new BadRequestException(
- "uid and search query param are null");
+ responsePayload = (mAsManager.searchUserUsingCriteria(queryData,
+ SearchOperation.OR));
}
+ Log.d("Search criteria query : " + queryData);
+
return MessageBuilder.createResponse(request, ResponseStatus.CONTENT,
ContentFormat.APPLICATION_CBOR,
mCbor.encodingPayloadToCbor(responsePayload));
HashMap<String, Object> payloadData = mCbor
.parsePayloadFromCbor(resp.getPayload(),
HashMap.class);
+ System.out.println("\t----payload : " + payloadData);
if (payloadData.containsKey("gid")) {
mGroupId = (String) payloadData.get("gid");
}
}
- System.out
- .println("\t----payload : " + resp.getPayloadString());
+
System.out
.println("\t----responsestatus : " + resp.getStatus());
mResponse = resp;
throws Exception {
getTestMethodName();
String uuid = "u0001Search";
+ String userId = "userId";
// register TokenInfo and UserInfo to the DB
- registerTokenUserInfo(uuid, DEVICE_ID);
+ registerTokenUserInfo(uuid, DEVICE_ID, userId, mAuthProvider);
// request uuid using search criteria
- getUserInfoSearch("search=userid:userId");
+ getUserInfoSearch("uid=" + uuid);
Cbor<HashMap<String, ArrayList<HashMap<String, Object>>>> cbor = new Cbor<>();
HashMap<String, ArrayList<HashMap<String, Object>>> payloadData = cbor
.parsePayloadFromCbor(mResponse.getPayload(), HashMap.class);
}
@Test
+ public void testGetMultipleUserInfoSearchOnDefaultRequestReceived()
+ throws Exception {
+ getTestMethodName();
+ String uuid = "u0001Search";
+ String userId = "user";
+ // register TokenInfo and UserInfo to the DB
+ registerTokenUserInfo(uuid, DEVICE_ID + "1", userId + "1",
+ mAuthProvider);
+ uuid = "u0002Search";
+ registerTokenUserInfo(uuid, DEVICE_ID + "2", userId + "2",
+ mAuthProvider);
+ uuid = "u0003Search";
+ registerTokenUserInfo(uuid, DEVICE_ID + "3", userId + "3",
+ mAuthProvider);
+ // request uuid using search criteria
+ getUserInfoSearch("uid=u0001Search;userid=user2;userid=user3");
+ Cbor<HashMap<String, ArrayList<HashMap<String, Object>>>> cbor = new Cbor<>();
+ HashMap<String, ArrayList<HashMap<String, Object>>> payloadData = cbor
+ .parsePayloadFromCbor(mResponse.getPayload(), HashMap.class);
+
+ assertTrue(payloadData.get("ulist").size() == 3);
+ }
+
+ @Test
+ public void testGetMultipleConditionSearchOnDefaultRequestReceived()
+ throws Exception {
+ getTestMethodName();
+ String uuid = "u0001Search";
+ String userId = "user";
+ // register TokenInfo and UserInfo to the DB
+ registerTokenUserInfo(uuid, DEVICE_ID + "1", userId, "Samsung");
+ uuid = "u0002Search";
+ registerTokenUserInfo(uuid, DEVICE_ID + "2", userId, "Github");
+ uuid = "u0003Search";
+ registerTokenUserInfo(uuid, DEVICE_ID + "3", userId, "Google");
+ // request uuid using search criteria
+ getUserInfoSearch("userid=user,provider=Github");
+ Cbor<HashMap<String, ArrayList<HashMap<String, Object>>>> cbor = new Cbor<>();
+ HashMap<String, ArrayList<HashMap<String, Object>>> payloadData = cbor
+ .parsePayloadFromCbor(mResponse.getPayload(), HashMap.class);
+ assertTrue(payloadData.get("ulist").size() == 1);
+ }
+
+ @Test
public void testDeleteDeviceInEveryGroupOnDefaultRequestReceived()
throws Exception {
getTestMethodName();
// register the token table and user table for three resource servers to
// the DB
String uuid = "u0001DeleteEveryGroup";
- registerTokenUserInfo(uuid, DEVICE_ID);
+ String userId = "userId";
+ registerTokenUserInfo(uuid, DEVICE_ID, userId, mAuthProvider);
registerTokenInfo(uuid, DEVICE_ID + "2");
registerTokenInfo(uuid, DEVICE_ID + "3");
registerTokenInfo(uuid, DEVICE_ID + "4");
getTestMethodName();
// register the token table and user table to the DB
String uuid = "u0001Get";
+ String userId = "user1";
+ String authProvider = "Github";
HashMap<String, Object> tokenInfo = mTokenTableCastingManager
.convertObjectToMap(makeTokenTable(uuid, DEVICE_ID));
HashMap<String, Object> userInfo = mUserTableCastingManager
- .convertObjectToMap(makeUserTable(uuid));
+ .convertObjectToMap(makeUserTable(uuid, userId, authProvider));
AccountDBManager.getInstance()
.insertAndReplaceRecord(Constants.TOKEN_TABLE, tokenInfo);
AccountDBManager.getInstance().insertRecord(Constants.USER_TABLE,
assertTrue(methodCheck(mResponse, ResponseStatus.CONTENT));
}
- private void registerTokenUserInfo(String uuid, String deviceId) {
+ private void registerTokenUserInfo(String uuid, String deviceId,
+ String userId, String authProvider) {
registerTokenInfo(uuid, deviceId);
- registerUserInfo(uuid);
+ registerUserInfo(uuid, userId, authProvider);
}
private void registerTokenInfo(String uuid, String deviceId) {
.insertAndReplaceRecord(Constants.TOKEN_TABLE, tokenInfo);
}
- private void registerUserInfo(String uuid) {
+ private void registerUserInfo(String uuid, String userId,
+ String authProvider) {
HashMap<String, Object> userInfo = mUserTableCastingManager
- .convertObjectToMap(makeUserTable(uuid));
+ .convertObjectToMap(makeUserTable(uuid, userId, authProvider));
AccountDBManager.getInstance().insertRecord(Constants.USER_TABLE,
userInfo);
}
private IRequest getUserInfoUsingUuidRequest(String uuid) {
IRequest request = MessageBuilder.createRequest(RequestMethod.GET,
- REGISTER_URI, "uid=" + uuid);
+ Constants.ACCOUNT_SEARCH_FULL_URI, "uid=" + uuid);
return request;
}
private void getUserInfoSearch(String query) {
System.out.println("-----get User Info Search using query: " + query);
IRequest request = MessageBuilder.createRequest(RequestMethod.GET,
- REGISTER_URI, query);
+ Constants.ACCOUNT_SEARCH_FULL_URI, query);
mAccountResource.onDefaultRequestReceived(mMockDevice, request);
}
return tokenInfo;
}
- private UserTable makeUserTable(String uuid) {
+ private UserTable makeUserTable(String uuid, String userId,
+ String authProvider) {
UserTable userInfo = new UserTable();
userInfo.setUuid(uuid);
- userInfo.setProvider(mAuthProvider);
- userInfo.setUserid("userId");
+ userInfo.setProvider(authProvider);
+ userInfo.setUserid(userId);
return userInfo;
}
@Override
public void onDefaultRequestReceived(Device srcDevice, IRequest request)
throws ServerException {
- if (request.getMethod().equals(RequestMethod.DELETE)) {
- StringBuffer additionalQuery = new StringBuffer();
- additionalQuery
- .append(Constants.USER_ID + "=" + srcDevice.getUserId());
- String uriQuery = additionalQuery.toString()
- + (request.getUriQuery() != null
- ? (";" + request.getUriQuery()) : "");
- request = MessageBuilder.modifyRequest(request, null, uriQuery,
- null, null);
+ switch (request.getMethod()) {
+ case GET:
+ if (request.getUriQuery() == null) {
+ StringBuffer additionalQuery = new StringBuffer();
+ additionalQuery.append(
+ Constants.USER_ID + "=" + srcDevice.getUserId());
+ String uriQuery = additionalQuery.toString()
+ + (request.getUriQuery() != null
+ ? (";" + request.getUriQuery()) : "");
+ request = MessageBuilder.modifyRequest(request, null,
+ uriQuery, null, null);
+ }
+ break;
+ case DELETE:
+ StringBuffer additionalQuery = new StringBuffer();
+ additionalQuery.append(
+ Constants.USER_ID + "=" + srcDevice.getUserId());
+ String uriQuery = additionalQuery.toString()
+ + (request.getUriQuery() != null
+ ? (";" + request.getUriQuery()) : "");
+ request = MessageBuilder.modifyRequest(request, null, uriQuery,
+ null, null);
+ break;
+ default:
+ break;
}
mASServer.sendRequest(request,
new AccountReceiveHandler(request, srcDevice));
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
mReqRDServer = request;
mLatch.countDown();
System.out.println(
+ "\t----------requestMethod : " + request.getMethod());
+ System.out.println(
"\t----------payload : " + request.getPayloadString());
System.out.println(
"\t----------uripath : " + request.getUriPath());
mReqASServer = request;
mLatch.countDown();
System.out.println(
+ "\t----------requestMethod : " + request.getMethod());
+ System.out.println(
"\t----------payload : " + request.getPayloadString());
System.out.println(
"\t----------uripath : " + request.getUriPath());
@Test
public void testAccountDeviceDeleteOnRequestReceived() throws Exception {
- System.out.println(
- "\t--------------OnRequestReceived Device Delete Test------------");
+ getTestMethodName();
IRequest request = null;
request = MessageBuilder.createRequest(RequestMethod.DELETE,
ACCOUNT_URI, "di=device1");
@Test
public void testAccountDeviceDeleteOnResponseReceived() throws Exception {
- System.out.println(
- "\t--------------OnResponseReceived Device Delete Test------------");
+ getTestMethodName();
IRequest request = MessageBuilder.createRequest(RequestMethod.DELETE,
ACCOUNT_URI, "di=device1");
}
@Test
+ public void testAccountSearchSingleUserOnResponseReceived()
+ throws Exception {
+ getTestMethodName();
+ IRequest request = MessageBuilder.createRequest(RequestMethod.GET,
+ Constants.ACCOUNT_SEARCH_FULL_URI,
+ "search=userid:user1,userid:user2,userid:user3");
+
+ mDeviceServerSystem.onRequestReceived(mMockDevice, request);
+ assertTrue(mReqASServer.getUriPath()
+ .equals(Constants.ACCOUNT_SEARCH_FULL_URI));
+ assertFalse(
+ mReqASServer.getUriQueryMap().containsKey(Constants.USER_ID));
+ }
+
+ @Test
+ public void testAccountSearchNoQueryOnResponseReceived() throws Exception {
+ getTestMethodName();
+ IRequest request = MessageBuilder.createRequest(RequestMethod.GET,
+ Constants.ACCOUNT_SEARCH_FULL_URI, null);
+
+ mDeviceServerSystem.onRequestReceived(mMockDevice, request);
+ assertTrue(mReqASServer.getUriPath()
+ .equals(Constants.ACCOUNT_SEARCH_FULL_URI));
+ assertTrue(
+ mReqASServer.getUriQueryMap().containsKey(Constants.USER_ID));
+ }
+
+ @Test
public void testAccountResourceOnRequestReceived() throws Exception {
- System.out.println(
- "\t--------------OnRequestReceived Sign Up Test------------");
+ getTestMethodName();
// sign up request from the client
IRequest request = null;
HashMap<String, String> payloadData = new HashMap<String, String>();
assertTrue(mLatch.await(1L, SECONDS));
assertEquals(request, mReqASServer);
}
+
+ private void getTestMethodName() {
+ StackTraceElement[] stacks = new Throwable().getStackTrace();
+ StackTraceElement currentStack = stacks[1];
+ System.out.println("\t---Test Name : " + currentStack.getMethodName());
+ }
}
public static final String INVITE_URI = "invite";
+ public static final String SEARCH_URI = "search";
+
/* resource uri to publish, update, delete resource info */
public static final String RD_URI = "rd";
public static final String ACCOUNT_FULL_URI = "/"
+ OICConstants.PREFIX_OIC + "/" + OICConstants.ACCOUNT_URI;
+ public static final String ACCOUNT_SEARCH_FULL_URI = "/"
+ + OICConstants.PREFIX_OIC + "/" + OICConstants.ACCOUNT_URI + "/"
+ + OICConstants.SEARCH_URI;
+
public static final String ACCOUNT_SESSION_FULL_URI = "/"
+ OICConstants.PREFIX_OIC + "/" + OICConstants.ACCOUNT_URI + "/"
+ OICConstants.SESSION_URI;
+ OICConstants.PREFIX_OIC + "/" + OICConstants.ACCOUNT_URI + "/"
+ OICConstants.TOKEN_REFRESH_URI;
- public static final String ACL_ID_FULL_URI = "/"
+ public static final String ACL_ID_FULL_URI = "/"
+ OICConstants.PREFIX_OIC + "/" + OICConstants.ACL_URI + "/"
+ OICConstants.ID_URI;
- public static final String ACL_VERIFY_FULL_URI = "/"
+ public static final String ACL_VERIFY_FULL_URI = "/"
+ OICConstants.PREFIX_OIC + "/" + OICConstants.ACL_URI + "/"
+ OICConstants.VERIFY_URI;
+ OICConstants.PREFIX_OIC + "/" + OICConstants.ACL_URI + "/"
+ OICConstants.INVITE_URI;
- public static final String ACL_VERIFY_FULL_URI = "/"
- + OICConstants.PREFIX_OIC + "/" + OICConstants.ACL_URI + "/"
- + OICConstants.VERIFY_URI;
-
public static final String KEEP_ALIVE_FULL_URI = "/" + PREFIX_OIC
+ "/" + OICConstants.KEEP_ALIVE_URI;