CifsServer.java 7.7 KB

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