AccountManagerService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package com.owncloud.android.services;
  2. import android.accounts.Account;
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.os.IBinder;
  8. import android.os.Message;
  9. import android.os.RemoteException;
  10. import android.util.Log;
  11. import android.widget.Toast;
  12. import com.owncloud.android.authentication.AccountUtils;
  13. import com.owncloud.android.lib.common.OwnCloudAccount;
  14. import com.owncloud.android.lib.common.OwnCloudClient;
  15. import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
  16. import com.owncloud.android.ui.activity.FileDisplayActivity;
  17. import com.owncloud.android.ui.asynctasks.AsyncTaskHelper;
  18. import org.apache.commons.httpclient.NameValuePair;
  19. import org.apache.commons.httpclient.methods.DeleteMethod;
  20. import org.apache.commons.httpclient.methods.GetMethod;
  21. import org.apache.commons.httpclient.methods.PostMethod;
  22. import org.apache.commons.httpclient.methods.PutMethod;
  23. import org.apache.commons.httpclient.methods.StringRequestEntity;
  24. import org.apache.commons.io.IOUtils;
  25. import java.io.IOException;
  26. import java.io.InputStream;
  27. import java.io.OutputStream;
  28. import java.net.InetSocketAddress;
  29. import java.net.Socket;
  30. import java.net.SocketAddress;
  31. import java.util.Map;
  32. import de.luhmer.owncloud.accountimporter.helper.InputStreamBinder;
  33. import de.luhmer.owncloud.accountimporter.helper.NextcloudRequest;
  34. public class AccountManagerService extends Service {
  35. private static final String TAG = AccountManagerService.class.getCanonicalName();
  36. /** Command to the service to display a message */
  37. private static final int MSG_CREATE_NEW_ACCOUNT = 3;
  38. private static final int MSG_REQUEST_NETWORK_REQUEST = 4;
  39. private static final int MSG_RESPONSE_NETWORK_REQUEST = 5;
  40. @Override
  41. public IBinder onBind(Intent intent) {
  42. return (new InputStreamBinder(this));
  43. }
  44. /**
  45. * Handler of incoming messages from clients.
  46. */
  47. class IncomingHandler extends Handler {
  48. @Override
  49. public void handleMessage(final Message msg) {
  50. switch (msg.what) {
  51. case MSG_CREATE_NEW_ACCOUNT:
  52. addNewAccount();
  53. break;
  54. case MSG_REQUEST_NETWORK_REQUEST:
  55. // TODO token check here!
  56. // Validate a Token here! - Make sure, that the other app has the permission to use this functionality
  57. String expectedToken = "test"; // Use the android account manager to get/verify token
  58. final String accountName = msg.getData().getString("account"); // e.g. david@nextcloud.test.de
  59. String token = msg.getData().getString("token"); // token that the other app received by calling the AccountManager
  60. final boolean stream = msg.getData().getBoolean("stream"); // Do you want to stream the result?
  61. final Integer port = msg.getData().getInt("port");
  62. final NextcloudRequest request = (NextcloudRequest) msg.getData().getSerializable("request");
  63. if(token.equals(expectedToken)) {
  64. Object result = null;
  65. Exception exception = null;
  66. try {
  67. result = AsyncTaskHelper.executeBlockingRequest(() -> {
  68. Account account = AccountUtils.getOwnCloudAccountByName(AccountManagerService.this, accountName); // TODO handle case that account is not found!
  69. OwnCloudAccount ocAccount = new OwnCloudAccount(account, AccountManagerService.this);
  70. OwnCloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, AccountManagerService.this);
  71. //OwnCloudVersion version = AccountUtils.getServerVersion(account);
  72. //client.setOwnCloudVersion(version);
  73. // TODO do some checks if url is correct!! (prevent ../ in url etc..
  74. request.url = client.getBaseUri() + request.url;
  75. INetworkInterface network = (stream) ? new StreamingRequest(port) : new PlainRequest();
  76. switch(request.method) {
  77. case "GET":
  78. GetMethod get = new GetMethod(request.url);
  79. get.setQueryString(convertMapToNVP(request.parameter));
  80. get.addRequestHeader("OCS-APIREQUEST", "true");
  81. int status = client.executeMethod(get);
  82. if(status == 200) {
  83. return network.handleGetRequest(get);
  84. } else {
  85. throw new Exception("Network error!!");
  86. }
  87. case "POST":
  88. PostMethod post = new PostMethod(request.url);
  89. post.setQueryString(convertMapToNVP(request.parameter));
  90. post.addRequestHeader("OCS-APIREQUEST", "true");
  91. if(request.requestBody != null) {
  92. StringRequestEntity requestEntity = new StringRequestEntity(
  93. request.requestBody,
  94. "application/json",
  95. "UTF-8");
  96. post.setRequestEntity(requestEntity);
  97. }
  98. int status2 = client.executeMethod(post);
  99. if(status2 == 200) {
  100. return network.handlePostRequest(post);
  101. } else {
  102. throw new Exception("Network error!!");
  103. }
  104. case "PUT":
  105. PutMethod put = new PutMethod(request.url);
  106. put.setQueryString(convertMapToNVP(request.parameter));
  107. put.addRequestHeader("OCS-APIREQUEST", "true");
  108. if(request.requestBody != null) {
  109. StringRequestEntity requestEntity = new StringRequestEntity(
  110. request.requestBody,
  111. "application/json",
  112. "UTF-8");
  113. put.setRequestEntity(requestEntity);
  114. }
  115. int status4 = client.executeMethod(put);
  116. if(status4 == 200) {
  117. return network.handlePutRequest(put);
  118. } else {
  119. throw new Exception("Network error!!");
  120. }
  121. case "DELETE":
  122. DeleteMethod delete = new DeleteMethod(request.url);
  123. delete.setQueryString(convertMapToNVP(request.parameter));
  124. delete.addRequestHeader("OCS-APIREQUEST", "true");
  125. int status3 = client.executeMethod(delete);
  126. if(status3 == 200) {
  127. return true;
  128. } else {
  129. throw new Exception("Network error!!");
  130. }
  131. default:
  132. throw new Exception("Unexpected type!!");
  133. }
  134. });
  135. } catch (Exception e) {
  136. e.printStackTrace();
  137. exception = e;
  138. }
  139. try {
  140. Message resp = Message.obtain(null, MSG_RESPONSE_NETWORK_REQUEST);
  141. Bundle bResp = new Bundle();
  142. if(!stream) {
  143. bResp.putByteArray("result", (byte[]) result);
  144. } else {
  145. // TODO return streaming server port
  146. }
  147. bResp.putSerializable("exception", exception);
  148. resp.setData(bResp);
  149. msg.replyTo.send(resp);
  150. } catch (RemoteException e) {
  151. Toast.makeText(AccountManagerService.this, e.getMessage(), Toast.LENGTH_SHORT).show();
  152. e.printStackTrace();
  153. }
  154. }
  155. break;
  156. default:
  157. super.handleMessage(msg);
  158. }
  159. }
  160. }
  161. interface INetworkInterface {
  162. Object handleGetRequest(GetMethod get) throws IOException;
  163. Object handlePostRequest(PostMethod post) throws IOException;
  164. Object handlePutRequest(PutMethod put) throws IOException;
  165. }
  166. private NameValuePair[] convertMapToNVP(Map<String, String> map) {
  167. NameValuePair[] nvp = new NameValuePair[map.size()];
  168. int i = 0;
  169. for (String key : map.keySet()) {
  170. nvp[i] = new NameValuePair(key, map.get(key));
  171. i++;
  172. }
  173. return nvp;
  174. }
  175. public class PlainRequest implements INetworkInterface {
  176. @Override
  177. public Object handleGetRequest(GetMethod get) throws IOException {
  178. return get.getResponseBody();
  179. }
  180. @Override
  181. public Object handlePostRequest(PostMethod post) throws IOException {
  182. return true;
  183. }
  184. @Override
  185. public Object handlePutRequest(PutMethod put) throws IOException {
  186. return true;
  187. }
  188. }
  189. public class StreamingRequest implements INetworkInterface {
  190. private int port;
  191. public StreamingRequest(int port) {
  192. this.port = port;
  193. }
  194. @Override
  195. public Object handleGetRequest(GetMethod get) throws IOException {
  196. Log.d(TAG, "handleGetRequest() called with: get = [" + get + "]");
  197. Socket m_activity_socket = new Socket();
  198. SocketAddress sockaddr = new InetSocketAddress("127.0.0.1", port);
  199. m_activity_socket.connect(sockaddr, 5000);
  200. if (m_activity_socket.isConnected()) {
  201. InputStream in = get.getResponseBodyAsStream();
  202. OutputStream out = m_activity_socket.getOutputStream();
  203. // the header describes the frame data (type, width, height, length)
  204. // frame width and height have been previously decoded
  205. //byte[] header = new byte[16];
  206. //build_header( 1, width, height, frameData.length, header, 1 );
  207. //m_nos.write( header ); // message header
  208. IOUtils.copy(in, out);
  209. in.close();
  210. out.close();
  211. }
  212. return null;
  213. }
  214. @Override
  215. public Object handlePostRequest(PostMethod post) throws IOException {
  216. return true;
  217. }
  218. @Override
  219. public Object handlePutRequest(PutMethod put) throws IOException {
  220. return true;
  221. }
  222. }
  223. private void addNewAccount() {
  224. Intent dialogIntent = new Intent(AccountManagerService.this, FileDisplayActivity.class);
  225. dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  226. // TODO make the activity start the "add new account" dialog automatically...
  227. startActivity(dialogIntent);
  228. }
  229. }