CifsServer.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package de.tudarmstadt.informatik.hostage.protocol.cifs;
  2. import android.content.Context;
  3. import android.net.DhcpInfo;
  4. import android.net.wifi.WifiManager;
  5. import org.alfresco.jlan.app.JLANCifsServer;
  6. import org.alfresco.jlan.app.XMLServerConfiguration;
  7. import org.alfresco.jlan.netbios.NetworkSettings;
  8. import org.alfresco.jlan.server.NetworkServer;
  9. import org.alfresco.jlan.server.ServerListener;
  10. import org.alfresco.jlan.server.SessionListener;
  11. import org.alfresco.jlan.server.SrvSession;
  12. import org.alfresco.jlan.server.core.SharedDevice;
  13. import org.alfresco.jlan.server.filesys.DiskDeviceContext;
  14. import org.alfresco.jlan.server.filesys.DiskInterface;
  15. import org.alfresco.jlan.server.filesys.DiskSharedDevice;
  16. import org.alfresco.jlan.server.filesys.FileListener;
  17. import org.alfresco.jlan.server.filesys.FilesystemsConfigSection;
  18. import org.alfresco.jlan.server.filesys.NetworkFile;
  19. import org.alfresco.jlan.server.filesys.NetworkFileServer;
  20. import org.alfresco.jlan.server.filesys.SrvDiskInfo;
  21. import org.alfresco.jlan.smb.server.CIFSConfigSection;
  22. import org.springframework.extensions.config.element.GenericConfigElement;
  23. import java.io.File;
  24. import java.io.IOException;
  25. import java.net.InetAddress;
  26. import java.net.UnknownHostException;
  27. import java.util.Enumeration;
  28. import de.tudarmstadt.informatik.hostage.Handler;
  29. import de.tudarmstadt.informatik.hostage.R;
  30. import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
  31. import de.tudarmstadt.informatik.hostage.protocol.CIFS;
  32. import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
  33. /**
  34. * HostageV3
  35. * ================
  36. * Created by abrakowski on 19.03.15.
  37. */
  38. public class CifsServer extends JLANCifsServer {
  39. private final XMLServerConfiguration serverConfiguration;
  40. protected final CIFS cifs;
  41. public CifsServer(XMLServerConfiguration serverConfiguration, CIFS cifs){
  42. super();
  43. this.cifs = cifs;
  44. this.serverConfiguration = serverConfiguration;
  45. }
  46. public void run() throws Exception {
  47. CIFSConfigSection cifsConfigSection = (CIFSConfigSection) serverConfiguration.getConfigSection(CIFSConfigSection.SectionName);
  48. cifsConfigSection.setBroadcastMask(getBroadcastAddress());
  49. cifsConfigSection.setHostAnnouncer(true);
  50. cifsConfigSection.setDisableNIOCode(true);
  51. int ip = cifs.getLocalIp();
  52. cifsConfigSection.setSMBBindAddress(intToInetAddress(ip));
  53. cifsConfigSection.setNetBIOSBindAddress(intToInetAddress(ip));
  54. NetworkSettings.setBroadcastMask(getBroadcastAddress());
  55. if(cifsConfigSection.hasNetBIOSSMB()){
  56. serverConfiguration.addServer(createNetBIOSServer(serverConfiguration));
  57. }
  58. serverConfiguration.addServer(createSMBServer(serverConfiguration));
  59. FilesystemsConfigSection filesysConfig = (FilesystemsConfigSection) serverConfiguration.getConfigSection(FilesystemsConfigSection.SectionName);
  60. File cacheFolder = MainActivity.context.getExternalCacheDir();
  61. File jlanFolder = new File(cacheFolder.getAbsolutePath() + "/jlan");
  62. jlanFolder.delete();
  63. File anotherFolder = new File(jlanFolder.getAbsolutePath() + "/System32");
  64. jlanFolder.mkdir();
  65. anotherFolder.mkdir();
  66. // SHARES
  67. DiskInterface diskInterface = new PseudoJavaFileDiskDriver(cifs);
  68. final GenericConfigElement driverConfig = new GenericConfigElement("driver");
  69. final GenericConfigElement localPathConfig = new GenericConfigElement("LocalPath");
  70. localPathConfig.setValue(jlanFolder.getAbsolutePath());
  71. driverConfig.addChild(localPathConfig);
  72. DiskDeviceContext diskDeviceContext = (DiskDeviceContext) diskInterface.createContext("JLANSHARE", driverConfig);
  73. diskDeviceContext.setShareName("JLANSHARE");
  74. diskDeviceContext.setConfigurationParameters(driverConfig);
  75. diskDeviceContext.enableChangeHandler(false);
  76. diskDeviceContext.setDiskInformation(new SrvDiskInfo(2560000, 64, 512, 2304000));// Default to a 80Gb sized disk with 90% free space
  77. DiskSharedDevice diskDev = new DiskSharedDevice("JLANSHARE", diskInterface, diskDeviceContext);
  78. diskDev.setConfiguration(serverConfiguration);
  79. diskDeviceContext.startFilesystem(diskDev);
  80. filesysConfig.addShare(diskDev);
  81. for(int i=0; i<serverConfiguration.numberOfServers(); i++){
  82. NetworkServer server = serverConfiguration.getServer(i);
  83. if(server instanceof NetworkFileServer){
  84. NetworkFileServer fileServer = (NetworkFileServer) server;
  85. fileServer.addFileListener(new FileListener() {
  86. @Override
  87. public void fileClosed(SrvSession sess, NetworkFile file) {
  88. System.out.println("-----------> FILE CLOSED :(");
  89. }
  90. @Override
  91. public void fileOpened(SrvSession sess, NetworkFile file) {
  92. System.out.println("-----------> FILE OPEND xD");
  93. }
  94. });
  95. }
  96. server.addServerListener(new ServerListener() {
  97. @Override
  98. public void serverStatusEvent(NetworkServer server, int event) {
  99. System.out.println("----------------> EVETN!!!!!: " + server + ", event: " + event);
  100. }
  101. });
  102. server.addSessionListener(new SessionListener() {
  103. @Override
  104. public void sessionClosed(SrvSession sess) {
  105. cifs.log(MessageRecord.TYPE.RECEIVE, "SESSION CLOSED", 139, sess.getRemoteAddress(), 139);
  106. System.out.println("-----------> SESSION CLOSED :(");
  107. }
  108. @Override
  109. public void sessionCreated(SrvSession sess) {
  110. cifs.getListener().getService().notifyUI(Handler.class.getName(),
  111. new String[] {
  112. cifs.getListener().getService().getString(R.string.broadcast_started),
  113. cifs.getListener().getProtocol().toString(),
  114. Integer.toString(cifs.getListener().getPort())
  115. }
  116. );
  117. cifs.log(MessageRecord.TYPE.RECEIVE, "SESSION CREATED", 139, sess.getRemoteAddress(), 139);
  118. System.out.println("-----------> SESSION CREATED :)");
  119. }
  120. @Override
  121. public void sessionLoggedOn(SrvSession sess) {
  122. cifs.log(MessageRecord.TYPE.RECEIVE, "SESSION LOGGED ON", 139, sess.getRemoteAddress(), 139);
  123. System.out.println("-----------> SESSION LOGGED ON :D");
  124. }
  125. });
  126. server.getShareMapper();
  127. server.startServer();
  128. }
  129. }
  130. public void stop(){
  131. for(int i=0; i<serverConfiguration.numberOfServers(); i++){
  132. NetworkServer server = serverConfiguration.getServer(i);
  133. server.shutdownServer(true);
  134. }
  135. }
  136. private String getBroadcastAddress() throws IOException {
  137. WifiManager wifi = (WifiManager) MainActivity.context.getSystemService(Context.WIFI_SERVICE);
  138. DhcpInfo dhcp = wifi.getDhcpInfo();
  139. // handle null somehow
  140. System.out.println("DEBUG:::::IP::::"+dhcp.ipAddress);
  141. int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
  142. byte[] quads = new byte[4];
  143. for (int k = 0; k < 4; k++)
  144. quads[k] = (byte) (broadcast >> (k * 8));
  145. return InetAddress.getByAddress(quads).toString().substring(1);
  146. }
  147. public static InetAddress intToInetAddress(int hostAddress) {
  148. byte[] addressBytes = { (byte)(0xff & hostAddress),
  149. (byte)(0xff & (hostAddress >> 8)),
  150. (byte)(0xff & (hostAddress >> 16)),
  151. (byte)(0xff & (hostAddress >> 24)) };
  152. try {
  153. return InetAddress.getByAddress(addressBytes);
  154. } catch (UnknownHostException e) {
  155. throw new AssertionError();
  156. }
  157. }
  158. }