113 lines
4.2 KiB
C#
113 lines
4.2 KiB
C#
// SparkleShare, a collaboration and sharing tool.
|
|
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
|
|
using SparkleLib;
|
|
|
|
namespace SparkleShare {
|
|
|
|
public static class SparkleKeys {
|
|
|
|
public static string [] GenerateKeyPair (string output_path, string key_name)
|
|
{
|
|
key_name += ".key";
|
|
string key_file_path = Path.Combine (output_path, key_name);
|
|
|
|
if (File.Exists (key_file_path)) {
|
|
SparkleLogger.LogInfo ("Auth", "A key pair exists ('" + key_name + "'), leaving it untouched");
|
|
return new string [] { key_file_path, key_file_path + ".pub" };
|
|
|
|
} else {
|
|
if (!Directory.Exists (output_path))
|
|
Directory.CreateDirectory (output_path);
|
|
}
|
|
|
|
Process process = new Process ();
|
|
|
|
process.StartInfo.FileName = "ssh-keygen";
|
|
process.StartInfo.WorkingDirectory = output_path;
|
|
process.StartInfo.UseShellExecute = false;
|
|
process.StartInfo.CreateNoWindow = true;
|
|
|
|
string computer_name = System.Net.Dns.GetHostName ();
|
|
|
|
if (computer_name.EndsWith (".local"))
|
|
computer_name = computer_name.Substring (0, computer_name.Length - 6);
|
|
|
|
process.StartInfo.Arguments = "-t rsa " + // crypto type
|
|
"-P \"\" " + // empty password
|
|
"-C \"" + computer_name + "\" " + // key comment
|
|
"-f \"" + key_name + "\""; // file name
|
|
|
|
process.Start ();
|
|
process.WaitForExit ();
|
|
|
|
if (process.ExitCode == 0)
|
|
SparkleLogger.LogInfo ("Auth", "Created keypair '" + key_file_path + "'");
|
|
else
|
|
SparkleLogger.LogInfo ("Auth", "Could not create key pair '" + key_file_path + "'");
|
|
|
|
return new string [] { key_file_path, key_file_path + ".pub" };
|
|
}
|
|
|
|
|
|
public static void ImportPrivateKey (string key_file_path)
|
|
{
|
|
Process process = new Process ();
|
|
|
|
process.StartInfo.FileName = "ssh-add";
|
|
process.StartInfo.Arguments = "\"" + key_file_path + "\"";
|
|
process.StartInfo.UseShellExecute = false;
|
|
process.StartInfo.CreateNoWindow = true;
|
|
process.StartInfo.RedirectStandardError = true;
|
|
|
|
process.Start ();
|
|
process.WaitForExit ();
|
|
|
|
if (process.ExitCode == 0)
|
|
SparkleLogger.LogInfo ("Auth", "Imported key '" + key_file_path + "'");
|
|
else
|
|
SparkleLogger.LogInfo ("Auth", "Could not import key '" + key_file_path + "'");
|
|
}
|
|
|
|
|
|
public static void ListPrivateKeys ()
|
|
{
|
|
Process process = new Process ();
|
|
|
|
process.StartInfo.FileName = "ssh-add";
|
|
process.StartInfo.Arguments = "-l";
|
|
process.StartInfo.UseShellExecute = false;
|
|
process.StartInfo.RedirectStandardOutput = true;
|
|
process.StartInfo.CreateNoWindow = true;
|
|
|
|
process.Start ();
|
|
|
|
// Reading the standard output HAS to go before
|
|
// WaitForExit, or it will hang forever on output > 4096 bytes
|
|
string keys_in_use = process.StandardOutput.ReadToEnd ();
|
|
process.WaitForExit ();
|
|
|
|
SparkleLogger.LogInfo ("Auth", "The following keys may be used: " +
|
|
Environment.NewLine + keys_in_use.Trim ());
|
|
}
|
|
}
|
|
}
|