package de.tudarmstadt.informatik.hostage.protocol.smbutils; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import de.tudarmstadt.informatik.hostage.net.MyDatagramSocketFactory; public class NMB extends Thread { private DatagramSocket nbnsSocket; private DatagramSocket nbdsSocket; private DatagramPacket packet; private String ip; private String[] ipParts; private InetAddress dst; private int nbnsPort = 137; private int nbdsPort = 138; private String username; private String workgroup; private NBNS nbns; private NBDS nbds; private volatile boolean smbRunning; private Receiver receiver; public NMB(String ip, String username, String workgroup) { try { smbRunning = true; this.username = username; this.workgroup = workgroup; this.ip = ip; ipParts = ip.split("\\."); String newHostAddr = ipParts[0] + "." + ipParts[1] + "." + ipParts[2] + ".255"; dst = InetAddress.getByName(newHostAddr); } catch (UnknownHostException e) { e.printStackTrace(); } } private void sendPacket(NBNS nbns) { try { byte[] packetBytes = nbns.getNextPacket(); packet = new DatagramPacket(packetBytes, packetBytes.length, dst, nbnsPort); nbnsSocket.send(packet); } catch (IOException e) { e.printStackTrace(); } } private void sendPacket(NBDS nbds) { try { byte[] packetBytes = nbds.getBytes(); packet = new DatagramPacket(packetBytes, packetBytes.length, dst, nbdsPort); nbdsSocket.send(packet); } catch (IOException e) { e.printStackTrace(); } } private void registrate() { registrateUser(); registrateGroup(); } private void registrateUser() { nbns = new NBNS(new byte[]{0x50, 0x00}, NBNSType.REGISTRATION_UNIQUE, NBNSService.SERVER, username, ip); sendPacket(nbns); nbns.setService(NBNSService.MESSENGER); sendPacket(nbns); nbns.setService(NBNSService.WORKSTATION); sendPacket(nbns); } private void registrateGroup() { nbns.setName(workgroup); nbns.setType(NBNSType.REGISTRATION_GROUP); sendPacket(nbns); nbns.setService(NBNSService.BROWSER_ELECTION); sendPacket(nbns); } private void browserElection() { nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.BROWSER); sendPacket(nbds); } private void registrateMsBrowse() { nbns.setName("__MSBROWSE__"); nbns.setType(NBNSType.REGISTRATION_MSBROWSE); nbns.setService(NBNSService.BROWSER); sendPacket(nbns); } private void registrateLocalMaster() { nbns.setName(workgroup); nbns.setType(NBNSType.REGISTRATION_UNIQUE); nbns.setService(NBNSService.LOCAL_MASTER_BROWSER); sendPacket(nbns); } private void announceHost() { nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.HOST_ANNOUNCEMENT_WITH_SERVICES); sendPacket(nbds); } private void queryName() { nbns.setType(NBNSType.NAME_QUERY); nbns.setService(NBNSService.LOCAL_MASTER_BROWSER); sendPacket(nbns); } private void requestAnnouncement() { nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.REQUEST_ANNOUNCEMENT); sendPacket(nbds); } private void localMasterAnnouncementAll() { nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.LOCAL_MASTER_ANNOUNCEMENT_ALL); sendPacket(nbds); } private void domainAnnouncement() { nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.DOMAIN_ANNOUNCEMENT); sendPacket(nbds); } private void localMasterAnnouncement() { nbds = new NBDS(nbns.getAndIncTransactID(), nbns.getAddr(), username, workgroup, NBDSType.LOCAL_MASTER_ANNOUNCEMENT); sendPacket(nbds); } @Override public void run() { try { nbnsSocket = new MyDatagramSocketFactory().createDatagramSocket(nbnsPort); nbnsSocket.connect(dst, nbnsPort); nbdsSocket = new MyDatagramSocketFactory().createDatagramSocket(nbdsPort); nbdsSocket.connect(dst, nbdsPort); } catch (IOException e) { e.printStackTrace(); } registrate(); receiver = new Receiver(); receiver.start(); announceHost(); queryName(); registrate(); queryName(); registrate(); queryName(); registrate(); queryName(); browserElection(); browserElection(); browserElection(); browserElection(); registrateMsBrowse(); registrateMsBrowse(); registrateMsBrowse(); registrateMsBrowse(); registrateLocalMaster(); registrateLocalMaster(); registrateLocalMaster(); registrateLocalMaster(); requestAnnouncement(); localMasterAnnouncementAll(); domainAnnouncement(); // // domain/workgroup announcement // // local master announcmen announceHost(); nbnsSocket.close(); nbdsSocket.close(); } public synchronized void setSmbRunning(boolean smbRunning) { this.smbRunning = smbRunning; } private class Receiver extends Thread { private DatagramPacket packet; private byte[] buffer; private boolean masterAnswered = false; public Receiver() { buffer = new byte[2048]; packet = new DatagramPacket(buffer, buffer.length); } @Override public void run() { try { nbnsSocket.setSoTimeout(1000); try { while (!masterAnswered) { nbnsSocket.receive(packet); if (!(packet.getAddress().toString().equals("/"+ip))) { masterAnswered = true; setSmbRunning(false); } } } catch (SocketTimeoutException e) { setSmbRunning(false); e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } } }