mirror of
https://github.com/xcp-ng/xenadmin.git
synced 2025-01-20 15:29:26 +01:00
Corrections as per code review.
Signed-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>
This commit is contained in:
parent
5c632a5592
commit
c4617240aa
@ -61,8 +61,8 @@ namespace ThinCLI
|
|||||||
|
|
||||||
internal static void Debug(Exception ex, Config conf)
|
internal static void Debug(Exception ex, Config conf)
|
||||||
{
|
{
|
||||||
if (conf.Debug && ex != null)
|
if (ex != null)
|
||||||
Console.WriteLine("[DEBUG] " + ex.StackTrace);
|
Debug(ex.StackTrace, conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void Error(string x)
|
internal static void Error(string x)
|
||||||
|
10
xe/Xe.cs
10
xe/Xe.cs
@ -37,7 +37,7 @@ using ThinCLI.Properties;
|
|||||||
|
|
||||||
namespace ThinCLI
|
namespace ThinCLI
|
||||||
{
|
{
|
||||||
static class MainClass
|
internal static class MainClass
|
||||||
{
|
{
|
||||||
public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version;
|
public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version;
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ namespace ThinCLI
|
|||||||
}
|
}
|
||||||
|
|
||||||
body += $"username={conf.Username}\n";
|
body += $"username={conf.Username}\n";
|
||||||
body += $"password={conf.Password}";//do not add a line break after the last string
|
body += $"password={conf.Password}"; //do not add a line break after the last string
|
||||||
|
|
||||||
var command = "POST /cli HTTP/1.0\r\n" +
|
var command = "POST /cli HTTP/1.0\r\n" +
|
||||||
$"content-length: {Encoding.UTF8.GetBytes(body).Length}\r\n\r\n" +
|
$"content-length: {Encoding.UTF8.GetBytes(body).Length}\r\n\r\n" +
|
||||||
@ -133,7 +133,7 @@ namespace ThinCLI
|
|||||||
{
|
{
|
||||||
Marshalling.PerformCommand(command, conf);
|
Marshalling.PerformCommand(command, conf);
|
||||||
}
|
}
|
||||||
catch (ThinCliProtocolError tcpEx)
|
catch (ThinCliProtocolException tcpEx)
|
||||||
{
|
{
|
||||||
Logger.Error(tcpEx.Message);
|
Logger.Error(tcpEx.Message);
|
||||||
Logger.Debug(tcpEx, conf);
|
Logger.Debug(tcpEx, conf);
|
||||||
@ -148,9 +148,9 @@ namespace ThinCLI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class ThinCliProtocolError : Exception
|
public class ThinCliProtocolException : Exception
|
||||||
{
|
{
|
||||||
public ThinCliProtocolError(string msg = null, int exitCode = 1)
|
public ThinCliProtocolException(string msg = null, int exitCode = 1)
|
||||||
: base(msg)
|
: base(msg)
|
||||||
{
|
{
|
||||||
ExitCode = exitCode;
|
ExitCode = exitCode;
|
||||||
|
@ -31,9 +31,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Specialized;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
|
||||||
using System.Net.Security;
|
using System.Net.Security;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Security.Authentication;
|
using System.Security.Authentication;
|
||||||
@ -80,8 +78,6 @@ namespace ThinCLI
|
|||||||
|
|
||||||
lock (_certificateValidationLock)
|
lock (_certificateValidationLock)
|
||||||
{
|
{
|
||||||
var req = (SslStream)sender;
|
|
||||||
|
|
||||||
string trustEvaluation = Messages.CERTIFICATE_NOT_TRUSTED;
|
string trustEvaluation = Messages.CERTIFICATE_NOT_TRUSTED;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -91,7 +87,7 @@ namespace ThinCLI
|
|||||||
}
|
}
|
||||||
catch (CryptographicException)
|
catch (CryptographicException)
|
||||||
{
|
{
|
||||||
//ignore
|
Logger.Warn("Invalid server certificate.");
|
||||||
}
|
}
|
||||||
|
|
||||||
var knownCertificates = Settings.GetKnownServers();
|
var knownCertificates = Settings.GetKnownServers();
|
||||||
@ -176,7 +172,7 @@ namespace ThinCLI
|
|||||||
}
|
}
|
||||||
catch (AuthenticationException ae)
|
catch (AuthenticationException ae)
|
||||||
{
|
{
|
||||||
throw new ThinCliProtocolError(ae.Message);
|
throw new ThinCliProtocolException(ae.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -327,7 +323,10 @@ namespace ThinCLI
|
|||||||
|
|
||||||
public static class Marshalling
|
public static class Marshalling
|
||||||
{
|
{
|
||||||
private const string MAGIC_STRING = "XenSource thin CLI protocol";
|
/// <summary>
|
||||||
|
/// Unique prefix string used to ensure we're talking to a thin CLI server
|
||||||
|
/// </summary>
|
||||||
|
private const string THIN_CLI_SERVER_PREFIX = "XenSource thin CLI protocol";
|
||||||
private const int CLI_PROTOCOL_MAJOR = 0;
|
private const int CLI_PROTOCOL_MAJOR = 0;
|
||||||
private const int CLI_PROTOCOL_MINOR = 2;
|
private const int CLI_PROTOCOL_MINOR = 2;
|
||||||
|
|
||||||
@ -441,7 +440,7 @@ namespace ThinCLI
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (File.Exists(filename))
|
if (File.Exists(filename))
|
||||||
throw new Exception($"The file '{filename}' already exists");
|
throw new ThinCliProtocolException($"The file '{filename}' already exists");
|
||||||
|
|
||||||
using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
|
using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
|
||||||
{
|
{
|
||||||
@ -475,13 +474,13 @@ namespace ThinCLI
|
|||||||
|
|
||||||
private static void VersionHandshake(Stream stream, Config conf)
|
private static void VersionHandshake(Stream stream, Config conf)
|
||||||
{
|
{
|
||||||
// Check for the initial magic string
|
// Check for the initial prefix string
|
||||||
byte[] magic = Types.unmarshal_n(stream, (uint)MAGIC_STRING.Length);
|
byte[] magic = Types.unmarshal_n(stream, (uint)THIN_CLI_SERVER_PREFIX.Length);
|
||||||
|
|
||||||
for (int i = 0; i < MAGIC_STRING.Length; i++)
|
for (int i = 0; i < THIN_CLI_SERVER_PREFIX.Length; i++)
|
||||||
{
|
{
|
||||||
if (magic[i] != MAGIC_STRING[i])
|
if (magic[i] != THIN_CLI_SERVER_PREFIX[i])
|
||||||
throw new ThinCliProtocolError($"Failed to find a server on {conf.Hostname}:{conf.Port}");
|
throw new ThinCliProtocolException($"Failed to find a server on {conf.Hostname}:{conf.Port}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the remote version numbers
|
// Read the remote version numbers
|
||||||
@ -492,10 +491,10 @@ namespace ThinCLI
|
|||||||
Logger.Debug($"Client expects version {CLI_PROTOCOL_MAJOR}.{CLI_PROTOCOL_MINOR}", conf);
|
Logger.Debug($"Client expects version {CLI_PROTOCOL_MAJOR}.{CLI_PROTOCOL_MINOR}", conf);
|
||||||
|
|
||||||
if (CLI_PROTOCOL_MAJOR != remoteMajor || CLI_PROTOCOL_MINOR != remoteMinor)
|
if (CLI_PROTOCOL_MAJOR != remoteMajor || CLI_PROTOCOL_MINOR != remoteMinor)
|
||||||
throw new ThinCliProtocolError($"Protocol version mismatch talking to server on {conf.Hostname}:{conf.Port}");
|
throw new ThinCliProtocolException($"Protocol version mismatch talking to server on {conf.Hostname}:{conf.Port}");
|
||||||
|
|
||||||
// Tell the server our version numbers
|
// Tell the server our version numbers
|
||||||
foreach (var t in MAGIC_STRING)
|
foreach (var t in THIN_CLI_SERVER_PREFIX)
|
||||||
stream.WriteByte((byte)t);
|
stream.WriteByte((byte)t);
|
||||||
|
|
||||||
Types.marshal_int(stream, CLI_PROTOCOL_MAJOR);
|
Types.marshal_int(stream, CLI_PROTOCOL_MAJOR);
|
||||||
@ -511,7 +510,7 @@ namespace ThinCLI
|
|||||||
using (var stream = transport.Connect(client, conf.Port))
|
using (var stream = transport.Connect(client, conf.Port))
|
||||||
{
|
{
|
||||||
if (stream == null)
|
if (stream == null)
|
||||||
throw new ThinCliProtocolError($"Connection to {conf.Hostname}:{conf.Port} failed.");
|
throw new ThinCliProtocolException($"Connection to {conf.Hostname}:{conf.Port} failed.");
|
||||||
|
|
||||||
byte[] message = Encoding.UTF8.GetBytes(command);
|
byte[] message = Encoding.UTF8.GetBytes(command);
|
||||||
stream.Write(message, 0, message.Length);
|
stream.Write(message, 0, message.Length);
|
||||||
@ -522,21 +521,21 @@ namespace ThinCLI
|
|||||||
}
|
}
|
||||||
catch (SocketException)
|
catch (SocketException)
|
||||||
{
|
{
|
||||||
throw new ThinCliProtocolError($"Connection to {conf.Hostname}:{conf.Port} refused.");
|
throw new ThinCliProtocolException($"Connection to {conf.Hostname}:{conf.Port} refused.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CheckPermitFiles(String filename, Config conf, bool includeCurrentDir = false)
|
private static void CheckPermitFiles(string filename, Config conf, bool includeCurrentDir = false)
|
||||||
{
|
{
|
||||||
string fullpath;
|
string fullPath;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
fullpath = Path.GetFullPath(filename);
|
fullPath = Path.GetFullPath(filename);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
throw new Exception($"Failed to retrieve full path of file '{filename}', '{ex.Message}'");
|
throw new ThinCliProtocolException($"Failed to retrieve full path of file '{filename}', '{ex.Message}'");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (includeCurrentDir)
|
if (includeCurrentDir)
|
||||||
@ -546,9 +545,9 @@ namespace ThinCLI
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
String valueFullPath = Path.GetFullPath(value);
|
var valueFullPath = Path.GetFullPath(value);
|
||||||
|
|
||||||
if (fullpath.StartsWith(valueFullPath))
|
if (fullPath.StartsWith(valueFullPath))
|
||||||
{
|
{
|
||||||
Logger.Debug("Passed permit files check", conf);
|
Logger.Debug("Passed permit files check", conf);
|
||||||
return;
|
return;
|
||||||
@ -560,7 +559,7 @@ namespace ThinCLI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception($"The file with name '{filename}' is not present at the command line.");
|
throw new ThinCliProtocolException($"The file with name '{filename}' is not present at the command line.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Interpreter(Stream stream, Config conf)
|
private static void Interpreter(Stream stream, Config conf)
|
||||||
@ -599,7 +598,7 @@ namespace ThinCLI
|
|||||||
Logger.Debug("Read: Command Exit " + code, conf);
|
Logger.Debug("Read: Command Exit " + code, conf);
|
||||||
if (code == 0)
|
if (code == 0)
|
||||||
return;//exit
|
return;//exit
|
||||||
throw new ThinCliProtocolError($"Command Exit {code}", code);
|
throw new ThinCliProtocolException($"Command Exit {code}", code);
|
||||||
case Tag.Error:
|
case Tag.Error:
|
||||||
Logger.Debug("Read: Command Error", conf);
|
Logger.Debug("Read: Command Error", conf);
|
||||||
string errCode = Types.unmarshal_string(stream);
|
string errCode = Types.unmarshal_string(stream);
|
||||||
@ -650,11 +649,11 @@ namespace ThinCLI
|
|||||||
HttpGet(stream, filename, uri, conf);
|
HttpGet(stream, filename, uri, conf);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ThinCliProtocolError("Protocol failure: Reading Command: unexpected tag: " + t);
|
throw new ThinCliProtocolException("Protocol failure: Reading Command: unexpected tag: " + t);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ThinCliProtocolError("Protocol failure: Reading Message: unexpected tag: " + t);
|
throw new ThinCliProtocolException("Protocol failure: Reading Message: unexpected tag: " + t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user