123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- /* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
- *
- * You can redistribute this program and/or modify it under the terms of
- * the GNU Lesser Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- */
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.IO;
- using System.Net;
- using System.Net.NetworkInformation;
- using System.Net.Sockets;
- using System.Text;
- using System.Windows.Forms;
- using System.Xml;
- using SMBLibrary;
- using SMBLibrary.Server;
- using SMBLibrary.Server.Win32;
- using Utilities;
- namespace SMBServer
- {
- public partial class ServerUI : Form
- {
- public const string SettingsFileName = "Settings.xml";
- private SMBLibrary.Server.SMBServer m_server;
- private SMBLibrary.Server.NameServer m_nameServer;
- public ServerUI()
- {
- InitializeComponent();
- }
- private void ServerUI_Load(object sender, EventArgs e)
- {
- List<IPAddress> localIPs = NetworkInterfaceHelper.GetHostIPAddresses();
- KeyValuePairList<string, IPAddress> list = new KeyValuePairList<string, IPAddress>();
- list.Add("Any", IPAddress.Any);
- foreach (IPAddress address in localIPs)
- {
- list.Add(address.ToString(), address);
- }
- comboIPAddress.DataSource = list;
- comboIPAddress.DisplayMember = "Key";
- comboIPAddress.ValueMember = "Value";
- }
- private void btnStart_Click(object sender, EventArgs e)
- {
- IPAddress serverAddress = (IPAddress)comboIPAddress.SelectedValue;
- SMBTransportType transportType;
- if (rbtNetBiosOverTCP.Checked)
- {
- transportType = SMBTransportType.NetBiosOverTCP;
- }
- else
- {
- transportType = SMBTransportType.DirectTCPTransport;
- }
- INTLMAuthenticationProvider provider;
- if (chkIntegratedWindowsAuthentication.Checked)
- {
- provider = new Win32UserCollection();
-
- }
- else
- {
- UserCollection users;
- try
- {
- users = ReadUserSettings();
- }
- catch
- {
- MessageBox.Show("Cannot read " + SettingsFileName, "Error");
- return;
- }
-
- provider = new IndependentUserCollection(users);
- }
- List<string> allUsers = provider.ListUsers();
- ShareCollection shares;
- try
- {
- shares = ReadShareSettings(allUsers);
- }
- catch (Exception)
- {
- MessageBox.Show("Cannot read " + SettingsFileName, "Error");
- return;
- }
- m_server = new SMBLibrary.Server.SMBServer(shares, provider, serverAddress, transportType, chkSMB1.Checked, chkSMB2.Checked);
- m_server.OnLogEntry += new EventHandler<LogEntry>(Server_OnLogEntry);
- try
- {
- m_server.Start();
- if (transportType == SMBTransportType.NetBiosOverTCP)
- {
- if (serverAddress.AddressFamily == AddressFamily.InterNetwork && !IPAddress.Equals(serverAddress, IPAddress.Any))
- {
- IPAddress subnetMask = NetworkInterfaceHelper.GetSubnetMask(serverAddress);
- m_nameServer = new NameServer(serverAddress, subnetMask);
- m_nameServer.Start();
- }
- }
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message, "Error");
- return;
- }
- btnStart.Enabled = false;
- btnStop.Enabled = true;
- comboIPAddress.Enabled = false;
- rbtDirectTCPTransport.Enabled = false;
- rbtNetBiosOverTCP.Enabled = false;
- chkSMB1.Enabled = false;
- chkSMB2.Enabled = false;
- chkIntegratedWindowsAuthentication.Enabled = false;
- }
- private XmlDocument GetSettingsXML()
- {
- string executableDirectory = Path.GetDirectoryName(Application.ExecutablePath) + "\\";
- XmlDocument document = GetXmlDocument(executableDirectory + SettingsFileName);
- return document;
- }
- private UserCollection ReadUserSettings()
- {
- UserCollection users = new UserCollection();
- XmlDocument document = GetSettingsXML();
- XmlNode usersNode = document.SelectSingleNode("Settings/Users");
- foreach (XmlNode userNode in usersNode.ChildNodes)
- {
- string accountName = userNode.Attributes["AccountName"].Value;
- string password = userNode.Attributes["Password"].Value;
- users.Add(accountName, password);
- }
- return users;
- }
- private ShareCollection ReadShareSettings(List<string> allUsers)
- {
- ShareCollection shares = new ShareCollection();
- XmlDocument document = GetSettingsXML();
- XmlNode sharesNode = document.SelectSingleNode("Settings/Shares");
- foreach (XmlNode shareNode in sharesNode.ChildNodes)
- {
- string shareName = shareNode.Attributes["Name"].Value;
- string sharePath = shareNode.Attributes["Path"].Value;
- XmlNode readAccessNode = shareNode.SelectSingleNode("ReadAccess");
- List<string> readAccess = ReadAccessList(readAccessNode, allUsers);
- XmlNode writeAccessNode = shareNode.SelectSingleNode("WriteAccess");
- List<string> writeAccess = ReadAccessList(writeAccessNode, allUsers);
- shares.Add(shareName, readAccess, writeAccess, new DirectoryFileSystem(sharePath));
- }
- return shares;
- }
- private List<string> ReadAccessList(XmlNode node, List<string> allUsers)
- {
- List<string> result = new List<string>();
- if (node != null)
- {
- string accounts = node.Attributes["Accounts"].Value;
- if (accounts == "*")
- {
- result.AddRange(allUsers);
- }
- else
- {
- string[] splitted = accounts.Split(',');
- result.AddRange(splitted);
- }
- }
- return result;
- }
- private void btnStop_Click(object sender, EventArgs e)
- {
- m_server.Stop();
- btnStart.Enabled = true;
- btnStop.Enabled = false;
- comboIPAddress.Enabled = true;
- rbtDirectTCPTransport.Enabled = true;
- rbtNetBiosOverTCP.Enabled = true;
- chkSMB1.Enabled = true;
- chkSMB2.Enabled = true;
- chkIntegratedWindowsAuthentication.Enabled = true;
- if (m_nameServer != null)
- {
- m_nameServer.Stop();
- }
- }
- private static XmlDocument GetXmlDocument(string path)
- {
- XmlDocument doc = new XmlDocument();
- doc.Load(path);
- return doc;
- }
- private void Server_OnLogEntry(object sender, LogEntry entry)
- {
- string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ");
- string message = String.Format("{0} {1} {2}", entry.Severity.ToString().PadRight(12), timestamp, entry.Message);
- System.Diagnostics.Debug.Print(message);
- }
- private void chkSMB1_CheckedChanged(object sender, EventArgs e)
- {
- if (!chkSMB1.Checked)
- {
- chkSMB2.Checked = true;
- }
- }
- private void chkSMB2_CheckedChanged(object sender, EventArgs e)
- {
- if (!chkSMB2.Checked)
- {
- chkSMB1.Checked = true;
- }
- }
- }
- }
|