CSDNCurrent de:Dateitransfer

Aus Cryptshare Documentation
Wechseln zu:Navigation, Suche

Allgemeines

Transfers können synchron sowie asynchron über die API durchgeführt werden. Ein Transfer kann mehrere Dateien enthalten und wird anschließend auf den Cryptshare Server hochgeladen, verschlüsselt und den Empfängern zu Verfügung gestellt. Abhängig von den verwendeten Transfereinstellungen werden die Empfänger und der Absender nach der Bereitstellung des Transfers benachrichtigt. Bevor ein Transfer durchgeführt werden kann muss dieser, wie im Kapitel 'Transfer vorbereiten' beschrieben, vorbereitet werden. Anschließend kann der Transfer entweder synchron oder asynchron durchgeführt werden.

Transfer vorbereiten

Bevor ein Transfer abgesendet werden kann muss dieser mit den folgenden Parametern vorbereitet werden:

  • Kontaktdaten des Absenders
    • Name
    • Telefonnummer
    • E-Mail Adresse
  • Das zu verwendende Passwortverfahren (Optional)
  • Der Nachrichtentext für die Absenderbenachrichtung (Optional)
  • Die Empfänger-E-Mail Adressen
  • Die Sprache der Benachrichtigung (Optional)
  • Die gewünschte Liegezeit für den Transfer (Optional)
  • Die zu übertragenden Dateien

Wird der Transfer nicht gestattet da einige Empfänger dafür nicht zugelassen werden so wird eine Exception geworfen. Um dies zu vermeiden kann vor dem Transfer eine Policyüberprüfung durchgeführt werden.

Das Passwortverfahren

Manuelles Passwort - 'manual'

Ein Passwort muss explizit vom Absender eingegeben werden. Das Passwort kann mit den Funktionen aus dem Kapitel 'Passwortfunktionen' auf die aktuellen Sicherheitsanforderungen überprüft werden. Der Empfänger muss bei diesem Verfahren Kontakt mit dem Absender aufnehmen um das Passwort zu erfahren.

Generiertes Passwort - 'generated'

Der Client fordert bei diesem Verfahren ein automatisch generiertes Passwort vom Server an welches die geforderten Sicherheitsanforderungen erfüllt. Der Empfänger muss bei diesem Verfahren Kontakt mit dem Absender aufnehmen um das Passwort zu erfahren.

Kein Passwort - 'none'

Bei diesem Verfahren muss keiner der Beteiligten ein Passwort für den Transfer angeben. Dies wird vom Server für den Anwender 'unsichtbar' gehandhabt.

Beachten Sie bitte, dass dieser Modus als der unsicherste Modus gilt und daher nur in ausgewählten Fällen verwendet werden sollte.

Die Benachrichtigungssprache

Die Beanchrichtigungsprache kann für den Absender und die Empfänger separat über den entsprechenden ISO-639-1 Code angegeben werden. Sie können nur Sprachen angeben welche auf dem Server auch als Sprachpaket installiert sind (siehe Kapitel 'Sprach-Ressourcen').

Der Benachrichtigungtext

Soll für die Empfängerbenachrichtigung ein eigener Text verwendet werden so kann dieser über die message-Property im Transfer-Objekt als Zeichenkette übergeben werden. Der Text muss im UTF-8 Format angegeben werden und kann HTML-Markup enthalten. Desweiteren kann auch ein eigener Betreff für die Benachrichtigung  im Plaintext-Format übergeben werden.

Vertrauliche Nachrichten

Auf dieselbe Weise wie ein Benachrichtigungstext angegeben werden kann, kann auch eine vertrauliche Nachricht zu dem Transfer hinzugefügt werden. Diese wird zusammen mit den Transferdateien verschlüsselt und kann von den Empfängern beim Abruf des Transfers eingesehen werden. Ein optionaler Betreff für die vertrauliche Nachricht kann ebenfalls festgelegt werden.


Cryptshare Transfer vorbereiten

// URL zum Cryptshare Server
WebServiceUri uri = new WebServiceUri("https://cryptshare.yourdomain.com");

// Verbindungsinstanz zum Cryptshare Server
CryptshareConnection connection = new CryptshareConnection(uri);

// Client für das Absenden der Requests
Client client = new Client("john.adams@yourdomain.com", connection, @"C:\temp\client.store");


// Erzeugen einer Transfer-Instanz
Transfer transfer = new Transfer();
 
// Festlegen des Absendernamens
transfer.senderName = "John Adams";
 
// Festlegen der Absender-Telefonnummer
transfer.senderPhone = "234 5467";
 
/**
 * Festlegen des Benachrichtigungstextes für die Empfängerbenachrichtigung.
 * Der Text kann der message Property als Zeichenkette übergeben werden.
 **/
try
{
    // In diesem Beispiel werden wir die Nachricht von einer Datei auslesen.
    string message = File.ReadAllText(@"C:\temp\message.txt", System.Text.Encoding.UTF8);
    transfer.message = message;
}
catch (Exception e)
{
    // Anzeigen einer Fehlernachricht bei Auftreten eines Fehlers
    Console.Error.WriteLine("Der Nachrichteninhalt konnte nicht gelesen werden!", e);
}
 
// Festlegen des Betreffs für die Empfängerbenachrichtigung
transfer.subject = "Betreff für diesen Transfer";
 
// Festlegen der Empfänger
string[] recipients = new string[]
{
    "jane.doe@abc.com",
    "jack.smith@xyz.com"
};
 
// Abrufen der Policy für diese Absender/Empfänger-Kombination um Sicher
// zu stellen, dass diese auch zugelassen sind.        
Policy policy = client.RequestPolicy(recipients);
 
// Nur zulässige Empfänger zum Transfer hinzufügen     
if (policy.FailedAddresses != null && policy.FailedAddresses.Count() > 0)
{
    List<string> validRecipients = new List<string>();
    foreach (string recipient in recipients)
    {
        if (!policy.FailedAddresses.Contains(recipient))
        {
            validRecipients.Add(recipient);
        }
        else
        {
            Console.WriteLine("Der Empfänger ist unzulässig: " + recipient);
        }
    }
    transfer.recipients(validRecipients.ToArray());
}
else
{
    // Alle Empfänger sind zugelassen.
    transfer.recipients(recipients);
}
 
// Sofern durch die Policy erlaubt sender wir außerdem eine Vertrauliche
// Nachricht
if (policy.AllowConfidentialMessage)
{
    transfer.confidentialSubject = "Subject of the confidential message";
    transfer.confidentialMessage = "This is the text of the confidential message.";
}
 
// Fahre nur dann fort wenn mindestens ein gültiger Empfänger vorhanden ist
if (transfer.getRecipientList() == null || transfer.getRecipientList().Count == 0)
{
    throw new Exception("No valid recipients defined, aborting transfer.");
}
 
/// Festlegen des Passwortverfahrens. In diesem Falle wird der als am
// sichersten geltende Modus verwendet.
passwordMode pm;
if (policy.PasswordMode.Any(x => x == passwordMode.generated))
{
    pm = passwordMode.generated;
}
else if (policy.PasswordMode.Any(x => x == passwordMode.manual))
{
    pm = passwordMode.manual;
}
else
{
    pm = passwordMode.none;
}
transfer.passwordMode = pm;
 
// Für den manuellen Passwortmodus muss ein Passwort angegeben werden.
if (pm.Equals(passwordMode.manual)) {
    // Angeben eines manuellen Passwortes
    transfer.password = "p4$$w0rd";
}
 
/// Dateinamen sollen in E-Mail Benachrichtigungen erwähnt werden
transfer.showFilenames = true;
 
// Der Empfänger soll benachrichtigt werden wenn Dateien heruntergeladen
// werden.
transfer.InformAboutDownload = true;
 
// Die Empfängerbenachrichtigung soll auf Englisch versendet werden.
transfer.recipientLanguage = "en";
 
// Festlegen des Datums an dem der Transfer abläuft.
// In diesem Falle wird das erlaubte maximum verwendet.
int storageDuration = policy.StorageDuration;
DateTime expiration = DateTime.Now.AddDays(storageDuration);
transfer.expirationDate = expiration.ToString("yyyy-MM-dd");
 
// Hinzufügen der Dateien aus dem Dateisystem, angegeben als vollständige Dateipfade:
transfer.Files = new List<string>()
{
    @"C:\temp\transfer_file_01.txt"
};
 
/**
 * Nun ist das Transfer-Objekt für den synchronen oder asynchronen Versand
 * vorbereitet.
 **/

Transfer durchführen

Synchron

Ist der Transfer, wie im vorigen Kapitel beschrieben, vorbereitet so kann dieser nun mittels der Methode PerformTransfer(Transfer, ... diverse Callbacks) synchron bereitgestellt werden. Folgende Parameter müssen dabei angegeben werden:

  • Der vorbereitete Transfer
  • Diverse Callbacks zur Anzeige des Transferfortschritts

Da dies eine synchrone Operation ist, wird die Methode so lange 'blockieren' bis alle Dateien hochgeladen und der Transfer abgeschlossen ist.

Durchführen eines synchronen Transfers

private static void PerformTransferSynchronous()
{
    // Schritt 1: Erzeugen einer Client-Instanz
	// Anlegen der URL zu Ihrem Cryptshare Server
    WebServiceUri serviceUri = new WebServiceUri("https://cryptshare.server.com");

    // Erzeugen der Verbindung zum Cryptshare Server
    CryptshareConnection connection = new CryptshareConnection(serviceUri);
 
	// Erzeugen der Client-Instanz unter Verwendung der Absenderadresse,
	// der Verbindung zum Server und des Pfades für denn lokalen Verifizierungsspeicher.
    Client client = new Client("sender-email@server.co", connection, @"C:\temp");
 
    // Vorbereiten des Transferobjektes wie in vorigem Kapitel beschrieben.
    Transfer transfer = ...
 
    // Durchführen eines synchronen Transfers mit vier Event Handlern.
	// Die Methode blockiert so lange bis der Transfer abgeschlossen ist.
    client.PerformTransfer(transfer, UploadProgressChangedHandler , UploadCompleteCallback, UploadInterruptedCallback, UploadCanceledCallback);
}
 
private static void UploadProgressChangedHandler(string currentFileNo, string currentFileName, double bytesUploaded, double bytesTotal, long bytesPerSecond)
{
    // Diese Methode wird während des Uploads wiederholt aufgerufen und gibt
    // den Transferfortschritt auf der Kommandozeile aus.
    double percent = (((double) bytesUploaded / bytesTotal) * 100.0);
    Console.WriteLine("Transfer progress ... " + ((int)percent) + "%");
}
 
private static void UploadCompleteCallback(Dictionary<string, string> urlMappings, Dictionary<string, string> smtpMappings, string serverGenPassword, TransferError transferError, string trackingID)
{
    // Diese Methode wird aufgerufen wenn alle Dateien auf den Server hochgeladen wurden.
    Console.WriteLine("Upload completed!");
}
 
private static void UploadInterruptedCallback(CryptshareException exception)
{
    // Diese Methode wird aufgerufen wenn ein Fehler während des Uploads auftritt
    Console.Error.WriteLine("An exception occurred during the upload: " + exception);
}
 
private static void UploadCanceledCallback()
{
    // Diese Methode wird aufgerufen wenn der Transfer
    // mittels CancelTransfer() abgebrochen wurde.
    Console.WriteLine("The transfer has been canceled!");
}

Asynchron

Ist der Transfer, wie im vorigen Kapitel beschrieben, vorbereitet so kann dieser nun mittels der Methode BeginTransfer(Transfer, ... diverse Callbacks) asynchron bereitgestellt werden. Folgende Parameter müssen dabei angegeben werden:

  • Der vorbereitete Transfer
  • Diverse Callbacks zur Anzeige des Transferfortschritts

Entgegen dem synchronen Upload wird diese Methode unmittelbar abgeschlossen nachdem der Transfer in einem eigenen Thread gestartet wurde. Ist der Transfer abgeschlossen so wird die Methode handleUploadCompleted(UploadCompletedEvent) aufgerufen.

Durchführen eines asynchronen Transfers

private static void PerformTransferSynchronous()
{
    // Schritt 1: Erzeugen einer Client-Instanz
	// Anlegen der URL zu Ihrem Cryptshare Server
    WebServiceUri serviceUri = new WebServiceUri("https://cryptshare.server.com");

    // Erzeugen der Verbindung zum Cryptshare Server
    CryptshareConnection connection = new CryptshareConnection(serviceUri);
 
	// Erzeugen der Client-Instanz unter Verwendung der Absenderadresse,
	// der Verbindung zum Server und des Pfades für denn lokalen Verifizierungsspeicher.
    Client client = new Client("sender-email@server.co", connection, @"C:\temp");
 
    // Vorbereiten des Transferobjektes wie in vorigem Kapitel beschrieben.
    Transfer transfer = ...
 
    // Durchführen eines synchronen Transfers mit vier Event Handlern.
	// Die Methode blockiert so lange bis der Transfer abgeschlossen ist.
    client.BeginTransfer(transfer, UploadProgressChangedHandler , UploadCompleteCallback, UploadInterruptedCallback, UploadCanceledCallback);
}
 
private static void UploadProgressChangedHandler(string currentFileNo, string currentFileName, double bytesUploaded, double bytesTotal, long bytesPerSecond)
{
    // Diese Methode wird während des Uploads wiederholt aufgerufen und gibt
    // den Transferfortschritt auf der Kommandozeile aus.
    double percent = (((double) bytesUploaded / bytesTotal) * 100.0);
    Console.WriteLine("Transfer progress ... " + ((int)percent) + "%");
}
 
private static void UploadCompleteCallback(Dictionary<string, string> urlMappings, Dictionary<string, string> smtpMappings, string serverGenPassword, TransferError transferError, string trackingID)
{
    // Diese Methode wird aufgerufen wenn alle Dateien auf den Server hochgeladen wurden.
    Console.WriteLine("Upload completed!");
}
 
private static void UploadInterruptedCallback(CryptshareException exception)
{
    // Diese Methode wird aufgerufen wenn ein Fehler während des Uploads auftritt
    Console.Error.WriteLine("An exception occurred during the upload: " + exception);
}
 
private static void UploadCanceledCallback()
{
    // Diese Methode wird aufgerufen wenn der Transfer
    // mittels CancelTransfer() abgebrochen wurde.
    Console.WriteLine("The transfer has been canceled!");
}