none
Datei auf ftp-Server hochladen per Webrequest ? RRS feed

  • Frage

  • Hey Leute.

    Ich wollte eine Datei so hochladen, dass keiner meine PW's sieht...

    Das denke ich macht man doch auch über ein Webrequest, oder ?

    Aber wie ? Ich kann nur Strings versenden an meine Website, oder nicht ?

    Und das hier :

    http://dotnet-snippets.de/dns/datei-auf-einen-ftp-uploaden-SID494.aspx

    Ist doch unsicher, weil man da im COde sein ftp-pw und username stehen hat ^^

    hat da jemand vielleicht ein Link zu einer sicheren Methode ?

    Danke für eure Hilfe ^^

    Sonntag, 24. Juni 2012 13:28

Antworten

  • Ja naja ich muste das erst mal aus meinem Framework lösen. (viele Abhängigkeiten)

    Sind aber immer noch ~480 Codezeilen incl. Dokumentation.

    Kann ich hier nicht posten ist zuviel daher der Link auf http://pastebin.de/27537 wo Du den Code findest.

    Anwendung dann mit:

                try
                {
                    var s = new SimpleWebFormSubmitter()
                    {
                        // Der Name des Upload-Feldes ($_FILES['???'])
                        UploadFieldName = "mytextfile",
                        // Die Hochzuladnede Datei
                        UploadFile = @"x:\whatever\test.txt",
                        // Die Adresse die den Upload verarbeitet
                        Url = "http://blog.softsteps.de/test.php"
                    };
                    // Andere Formularfeldwerte die geschickt werden sollen
                    s.FormFields.Add("fieldname", "Ein Wert für Formfeld 1");
                    // Formular abschicken
                    string responseText = s.Submit();
                    // Anzeigen was als Antwort auf den Request geschickt wurde
                    // Kannst DU natürlich auch weglassen.
                    MessageBox.Show(responseText);
                }
                catch (Exception ex)
                {
                    // Fehler
                    MessageBox.Show(@"Fehler: " + ex);
                }

    Sollte auf jeden Fall mindestens in einem Backgroundworker ausgeführt werden, weil Sonst die UI hängt bis Request fertig ist!

    MfG, Ulf

    • Als Antwort markiert Basti1 Dienstag, 26. Juni 2012 17:16
    Montag, 25. Juni 2012 18:51

Alle Antworten

  • Dann speichere halt dein Passwort nicht. Allerdings hat FTP eh ein Problem, da es ein Klartextprotokoll ist. Da wäre SFTP oder ein per SSL getunneltes Protokoll, z.B. ein Post per HTTPS.
    Sonntag, 24. Juni 2012 13:50
  • "Dann speichere halt dein Passwort nicht." ?

    Ja, aber wenn man sich vom Computer aus verbindet, dann kann man ja die ftp-Daten sniffen,

    oder eben das programm decompliieren, oder wie das heist...

    Das macht man doch normal auch anders, wenn man Daten hochladen will, oder nicht ?

    Sonntag, 24. Juni 2012 14:02
  • Ich wollte eine Datei so hochladen, dass keiner meine PW's sieht...

    ;-)

    Ich kann nur Strings versenden an meine Website, oder nicht?

    Du kannst all das tun was das FTP-Protokoll Dir erlaubt!

    Und das hier :

    http://dotnet-snippets.de/dns/datei-auf-einen-ftp-uploaden-SID494.aspx

    Ist doch unsicher, weil man da im COde sein ftp-pw und username stehen hat ^^

    Tja irgendwo must Du die Logindaten ja zwangsweise übergeben. Was stellst Du Dir denn vor? Ich würde mir beim Wunsch der Nutzung von FTP keine Gedanken darüber machen. FTP ist ja schon selbst per Se unsicher da es genau diese Daten unverschlüsselt überträgt.

    Anders siehts mit z.B. SFTP aus. Aber auch da must Du die Logindaten an der nötigen Stelle in Plaintext an die genutzte API übergeben.

    Ist halt so! Bei .NET Programmen/Libs kann man, solange es managed Code ist, mit einen der erhältlichen Reflektoren wunderbar deren Code betrachten.

    Passwort und Nutzername kodiert man ohnehin niemals hart in den Programmcode. Die lagert man eigentlich eher in die user.settings aus. Da kann man sie ja auch verschlüsseln. Aber spätestens an der Stelle wo diese als Zeichenkette gebraucht werden sind sie halt wieder als Plaintext vorhanden.

    Zur Abspeichern + Nutzung der user.settings noch der folgende Link: Verwenden von Einstellungen in C#

    MfG, Ulf


    Sonntag, 24. Juni 2012 14:08
  • Du hast es erkannt. Es gibt keine 100% Sicherheit. Daher auch meine zwei Tips: Speichere das Passwort nicht, dann ist es egal, ob das Programm dekompiliert wird. Benutze ein verschlüsseltes Protokoll, dann kann dein Passwort nur abgefangen werden, wenn deine Infrastruktur kompromittiert ist.
    Sonntag, 24. Juni 2012 14:16
  • Ähhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhm, irgendwie ist das jetzt komisch...

    Weil : Wenn man das mit Webrequest macht, muss man doch keine Daten übergeben, dachte ich....

    Man sendet doch an die Website, was man übergeben will, und die Website hat die FTP Daten und macht dass dann darauf zu MySQL oder FTP...

    So war das doch immer...

    Wozu gäbe es sonst Webrequest ?

    Dann könnte ich meine MySQL und ftp Passwörter ja gleiche mit in die Beschreibung packen...

    Sonntag, 24. Juni 2012 14:36
  • Hi,

    Weil : Wenn man das mit Webrequest macht, muss man doch keine Daten übergeben, dachte ich....

    ? Wenn Du von deiner Anwendung aus einen Dateitransfer auf einen FTP Server machen will, musst Du dem Request auch die Benutzerinformation mitgeben, wie sollte der FTP Server dich sonst authentifizieren?

    Man sendet doch an die Website, was man übergeben will, und die Website hat die FTP Daten

    Du sendest ja nicht an eine Website. Oder hast Du irgendwo ein per http erreichbares Skript, welches die Datei(en) entgegennimmt und dann serverseitig per FTP weiterschickt.

    und macht dass dann darauf zu MySQL oder FTP...

    Hä?

    So war das doch immer...

    Sicher nicht. Evtl. aber doch. Wer kann das schon wissen? Deine Beschreibung ist IMHO ziemlich verworren. Es wäre evtl. sinnvoll, wenn Du dir selbst erst darüber klar wirst, was Du nun eigentlich wie machen willst und das dann hier nochmal klar strukturiert und detailliert postest.

    Wozu gäbe es sonst Webrequest ?

    Was hat das eine mit dem anderen zu tun? Wenn Du ein ungeschütztes serverseitiges Skript hast, welches per HTTP erreichbar ist und Dateiuploads entgegennimmt, ist das ein gefundenes Fressen für alle Hacker, Skriptkiddies, ...

    Aber selbst wenn Du so etwas hättest, müsstest Du dieses Skript erstmal noch erweitern, so dass die hochgeladenen Dateien auch nach deinen Anforderungen weiterverarbeitet werden können.

    Dann könnte ich meine MySQL und ftp Passwörter ja gleiche mit in die Beschreibung packen...

    Könntest Du. Musst Du aber nicht.

    Aber mal so ganz unter uns: Was willst Du da eigentlich machen? Hinz und Kunz dein Programm unterjubeln, das dann unbemerkt Dateien per FTP auf deinen Server schiebt und dabei hättest Du gerne, dass man das PW für deinen FTP Account nicht sieht?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Sonntag, 24. Juni 2012 14:48
    Moderator
  • Nein, ich mache gerade bei meinem Jump and Run game eine Funktion, mit der man Maps von anderen downloaden, und eigene Maps hochladen kann...

    Mit dem downloaden habe ich es ja per Webrequest und response gemacht.

    Ich hab die Daten an eine php-Datei auf meiner Website geschickt, und die PHP-Datei hat dann mir zurückgegeben, was sie aus der MySQ Datenbank lesen konnte...

    Nun wollte ich es beim hochladen auch mit einer PHP Datei machen, die das erst auf den Webspace packt, und naja...

    "Oder hast Du irgendwo ein per http erreichbares Skript, welches die Datei(en) entgegennimmt und dann serverseitig per FTP weiterschickt."

    Ähhhhm, ja ich denke schon ^^ Also soeins hatte ich für das man die Daten abrufen kann, für die Maps...

    "musst Du dem Request auch die Benutzerinformation mitgeben, wie sollte der FTP Server dich sonst authentifizieren?"

    Wollt ihr mich trollen ?! Hä ?! Nein ! Die Benutzerdaten sind in der php Datei. Das was ich hochladen will, geb ich an die php datei, die auf dem serverist. und die php-datei macht das dann auf meine Webspace...

    Sonntag, 24. Juni 2012 15:00
  • Hi,

    Nun wollte ich es beim hochladen auch mit einer PHP Datei machen, die das erst auf den Webspace packt, und naja...

    und wo ist dann nun die Anforderung, irgendwas mit FTP zu machen? Du kannst eine Datei per HttpWebRequest oder, was einfacher ist, per WebClient.UploadFile zu deinem Skript schicken. Das Skript muss die Dateien natürlich annehmen und dann serverseitig speichern. Fürs hochladen siehe:

      http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data

      http://msdn.microsoft.com/de-de/library/36s52zhs.aspx

    Ähhhhm, ja ich denke schon ^^ Also soeins hatte ich für das man die Daten abrufen kann, für die Maps...

    "Ich denke schon"? Du solltest Du dir schon darüber klar sein, was Du da programmierst (oder halt auch nicht).

    Wollt ihr mich trollen ?! Hä ?! Nein ! Die Benutzerdaten sind in der php Datei. Das was ich hochladen will, geb ich an die php datei, die auf dem serverist. und die php-datei macht das dann auf meine Webspace...

    Wenn ich ehrlich sein soll, glaube ich nicht, das Du überhaupt weißt, was Du da machst oder machen willst.

    Wie kommst Du überhaupt auf FTP?

    Wie man Dateien auch per http hochladen kann, siehst Du in den Beispielen, die sich hinter den beiden o.g. Links zeigen. Wenn dein PHP Skript alles ohne Authentifizierung annimmt, brauchst Du da auch keinen Benutzernamen und/oder Passwort mitzugeben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Sonntag, 24. Juni 2012 15:19
    Moderator
  • Ja, ich dachte das wäre ftp, weil wenn ich datein hochladen will, mach ich das doch auch auf den FTP-Server ^^
    Sonntag, 24. Juni 2012 15:51
  • Oke, habs jetzt probiert...

    Allerdings geht das nicht wiiiirklich...

    Meine PHP-Datei sieht so aus :

    <?php
    $zielverzeichnis = 'Maps/';
     
    if ($_FILES['beispieldatei']['error'] != UPLOAD_ERR_OK)
    	die('Ein Fehler ist aufgetreten.1');
     
    if (move_uploaded_file($_FILES['beispieldatei']['tmp_name'], 
                           $zielverzeichnis . basename($_FILES['beispieldatei']['name']))) {
    	echo "Datei wurde hochgeladen!";
    }
    else {
    	echo "Ein Fehler ist aufgetreten!2";
    }
    
    ?>

    Also Das ist so aufgebaut :

    - Ordner...

        -Request2.php

        -Maps

              - gnaz vieele Maps...

    Falls das daran liegen könnte, aber ich glaube nicht...

    Jedenfalls gibt er immer aus : 

    Ein Fehler ist aufgetreten!2

    Der c# Code :

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    UploadFile("http://bdg.pf-control.de/Request2.php", openFileDialog1.FileName);
                }
    
    
    
    // UploadFile-Methode :
    
     public String UploadFile(String remoteFile, String localFile)
            {
                WebClient myWebClient = new WebClient();
                byte[] responseArray = myWebClient.UploadFile(remoteFile, localFile);
                return (System.Text.Encoding.ASCII.GetString(responseArray));
            }

    Danke für eure Hilfe...

    MfG, Ich

    Sonntag, 24. Juni 2012 19:01
  • Hi,

    da solltest Du mal dein PHP Skript fragen. Anscheinend kommt ja eine Datei an, Du kannst die nur nicht verschieben. Das PHP Skript sollte dir auch sagen können, warum. Wir können das von hier aus nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Sonntag, 24. Juni 2012 19:48
    Moderator
  • Oke, habs jetzt probiert...

    Allerdings geht das nicht wiiiirklich...

    Meine PHP-Datei sieht so aus :

    <?php
    $zielverzeichnis = 'Maps/';
     
    if ($_FILES['beispieldatei']['error'] != UPLOAD_ERR_OK)

    Der c# Code :

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    UploadFile("http://bdg.pf-control.de/Request2.php", openFileDialog1.FileName);
                }
    
    
    
    // UploadFile-Methode :
    
     public String UploadFile(String remoteFile, String localFile)
            {
                WebClient myWebClient = new WebClient();
                byte[] responseArray = myWebClient.UploadFile(remoteFile, localFile);
                return (System.Text.Encoding.ASCII.GetString(responseArray));
            }

    Das kann so nicht gehen!

    Dein PHP-Code erwartet, das die benötigte Datei in $_FILES['beispieldatei'] steht. Das ist aber nur dann der Fall wenn DU das im C# Code auch so umsetzt.

    Du kannst natürlich $_FILES['file'] nehmen, weil 'file' der Parametername ist, der von .NET vergeben wird wenn keiner explizit (Mehraufwand) angegeben wurde.

    MfG, Ulf

    Sonntag, 24. Juni 2012 21:57
  • Aber Ulf, wie verändere ich denn den Name der gesendet wird zu 'beispieldatei' ?

    Oder soll ich die Datei, die ich verschicke einfach vorher umbenennen zu beispieldatei.txt, oder was ?

    Danke schonmal für eure tollen Antworten ^^

    Montag, 25. Juni 2012 06:36
  • ich hab das jetzt mit 'file' versucht.

    Funktioniert super, aber eine Frage habe ich noch :

    Ich will nicht nur Die Datei hochladen, sondern mit ihr auch noch einen String schicken, wer die Map hochgeladen hat ...

    Aber wie soll ich das machen ? Weil wenn ich einfach das Webrequest und das Upload gleichzeitig ausführe, erzeugen die ja beide eine einzelne Anfrage...

    So wird es wohl nicht gehen, oder ? :

    try
                {
    //Upload der Datei :
                    WebClient myWebClient = new WebClient();
                    byte[] responseArray = myWebClient.UploadFile(remoteFile, localFile);
                    name = System.Text.Encoding.ASCII.GetString(responseArray);
    
    // Webrequest
                    String username = name;
    
                    ASCIIEncoding encoding = new ASCIIEncoding();
                    String postData = "user=" + username;
                    Byte[] data = encoding.GetBytes(postData);
    
    
                    WebRequest request = WebRequest.Create(remoteFile);
                    request.Method = "POST";
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.ContentLength = data.Length;
    
    
                    Stream stream = request.GetRequestStream();
                    stream.Write(data, 0, data.Length);
                    stream.Close();
    
                    WebResponse response = request.GetResponse();
                    stream = response.GetResponseStream();
    
                    StreamReader sr = new StreamReader(stream);
    
                    String s = sr.ReadToEnd();
    
                    sr.Close();
                    stream.Close();
    
    
                }

    Weil die machen ja dann zwei eigene Anfragen und nicht eine zusammen... oder ? Was sagt ihr dazu ?

    Montag, 25. Juni 2012 07:00
  • Wenn du eh einen POST hast kannst du diese Information ja als Forminput mitschicken.
    Montag, 25. Juni 2012 11:50
  • Oke vielen Dank... Das klingt logisch...

    ;D

    Nein ehrlich, ich weiß ja, wie man Datein annimmt, die per POST gesendet wurden, aber beim Request, wie tue ich die dazu ?

    Byte[] data = encoding.GetBytes(openFIleDialog1.File + String);

    oder wie ?

    Danke schonmal trotzdem ^^

    Montag, 25. Juni 2012 12:52
  • Aber Ulf, wie verändere ich denn den Name der gesendet wird zu 'beispieldatei' ?

    Nicht den Namen sondern den Namen der Variable verändern. Das must Du dann selbst implementieren. Dazu ist die vorgefertigte Methode UploadFile nicht brauchbar.

    Gibts zahlreiche Beispiele dazu im Netz. Aber warte mal, das must Du dann auch gleich noch so aufbauen, das Deine Anforderung des versenden eines weiteren POST-Requestfeldes mit implementiert wird.

    Ich hab in 30 Minuten Feierabend, dann poste ich Dir den Code falls Du das bis dahin noch nicht selbst hinbekommen hast.

    MfG, Ulf

    Montag, 25. Juni 2012 13:35
  • Oke, dann mache ich Stefan das gesagt hat, mit POST...

    Aber da komme ich ja dann auf das Problem, welches ich in meinem letzten post beschrieben hatte ^^

    Montag, 25. Juni 2012 14:00
  • Nämlich, dass Ich :

    String postData = "user=" + username;
    Byte[] data = encoding.GetBytes(postData);

    stream.Write(data, 0, data.Length);

    Da vershicke ich das ja in Bytes... Und GetBytes verlangt ja ein String... Wie kann ich dann eine Datei versenden ?!

    EDIT: Oh.... Hab das Ende noch nicht gesehen... Ich glaub du hast dein POST danach noch editiert, oder ?

    Jedenfalls : Also mache ich dass dann nicht mit meinem Webrequest, wie ich auch mein Login, und das auselsen, der Maps gemacht habe ?


    • Bearbeitet Basti1 Montag, 25. Juni 2012 14:43
    Montag, 25. Juni 2012 14:40

  • Gibts zahlreiche Beispiele dazu im Netz. Aber warte mal, das must Du dann auch gleich noch so aufbauen, das Deine Anforderung des versenden eines weiteren POST-Requestfeldes mit implementiert wird.

    Ich hab in 30 Minuten Feierabend, dann poste ich Dir den Code falls Du das bis dahin noch nicht selbst hinbekommen hast.


    Und ? ;D 

    Montag, 25. Juni 2012 16:37
  • Ja naja ich muste das erst mal aus meinem Framework lösen. (viele Abhängigkeiten)

    Sind aber immer noch ~480 Codezeilen incl. Dokumentation.

    Kann ich hier nicht posten ist zuviel daher der Link auf http://pastebin.de/27537 wo Du den Code findest.

    Anwendung dann mit:

                try
                {
                    var s = new SimpleWebFormSubmitter()
                    {
                        // Der Name des Upload-Feldes ($_FILES['???'])
                        UploadFieldName = "mytextfile",
                        // Die Hochzuladnede Datei
                        UploadFile = @"x:\whatever\test.txt",
                        // Die Adresse die den Upload verarbeitet
                        Url = "http://blog.softsteps.de/test.php"
                    };
                    // Andere Formularfeldwerte die geschickt werden sollen
                    s.FormFields.Add("fieldname", "Ein Wert für Formfeld 1");
                    // Formular abschicken
                    string responseText = s.Submit();
                    // Anzeigen was als Antwort auf den Request geschickt wurde
                    // Kannst DU natürlich auch weglassen.
                    MessageBox.Show(responseText);
                }
                catch (Exception ex)
                {
                    // Fehler
                    MessageBox.Show(@"Fehler: " + ex);
                }

    Sollte auf jeden Fall mindestens in einem Backgroundworker ausgeführt werden, weil Sonst die UI hängt bis Request fertig ist!

    MfG, Ulf

    • Als Antwort markiert Basti1 Dienstag, 26. Juni 2012 17:16
    Montag, 25. Juni 2012 18:51
  • Oke vielen Dank schonmal. Aber ein paar Fragen hab ich noch :

    Was machen die ganzen Methoden mit GetMime? 

    Ist das nicht irgendwie überflüssig ? Ich wollte eigentlich eh nur .txt Datein hochladen...

    Und zum Code : 480 Zeilen ? Ein Webrequest braucht bei mir 10 Zeilen, i upload braucht 2 Zeilen, aber 10 + 2 != 480 !!

    Muss dass den wirklich soo viel sein ?

    Naja...

    Jedenfalls : In XNA gibt es keine Backgroundworker, oder ? Ws bringt soiner überhaupt ? ich hab noch nie einen verwendet ^^

    Dienstag, 26. Juni 2012 05:25
  • Was machen die ganzen Methoden mit GetMime? 

    Sind nur 3! Zur Ermittlung des Mimetypes der hochzuladenden Datei

    Steht aber auch in der Doku dazu

    Ist das nicht irgendwie überflüssig ? Ich wollte eigentlich eh nur .txt Datein hochladen...

    Es hindert Dich keiner daran Dir das so umzubauen wie es Dir past.

    Und zum Code : 480 Zeilen ? Ein Webrequest braucht bei mir 10 Zeilen, i upload braucht 2 Zeilen, aber 10 + 2 != 480 !!

    Wenn DU denkst. Es ist doch recht einfach. Es tut was es soll. Die Menge der Codezeilen ist dafür nicht von Relavanz wenn es um solchen Kleinkram wie paar hundert Codezeilen geht.

    Jedenfalls : In XNA gibt es keine Backgroundworker, oder ?

    Keine Ahnung.

    Ws bringt soiner überhaupt?

    Nimm den Begriff, tippe ihn bei $Suchmaschine ein und lies selbst :-)

    Dienstag, 26. Juni 2012 10:42
  • Was ist überhaupt Mime ? Also die geben irgendwie den Typ  zurück... Und was wird dann damit gemacht ?

    Und : Ist ein Backgroundworker so, als wenn man das in mehrere Threads auslagert ?


    Dienstag, 26. Juni 2012 13:31
    1. Erster Treffer bei bing.
    2. Nein. Siehe BackgroundWorker. Ein BackgroundWorker, ein Thread. Nicht mehrere.
    Dienstag, 26. Juni 2012 14:02
  • Und was wird dann damit gemacht ?

    Der muss an den Server geschickt werden, damit dieser weis um welchen Dateityp es sich bei einem Upload handelt, weil sonst der Upload nicht erfolgreich ist (bzw. ungültig sein kann, je nach Server)

    Das Du das in Deiner Ursprungsversion nicht machen must liegt lediglich daran, das das bereits im Hintergrund, transparent für Dich, erledigt wird.

    Da aber zur Erfüllung Deines Wunsches nach erweiterter Funktionalität, die Nutzung dieser Methode nicht ausreicht, sondern man Datei, Parameter, Request und Response komplett manuall selbst handlen muss ergibt sich auch logischer Weise ein wesentlich höherer Codingaufwand. Das sollte doch einleuchtend sein oder?

    MfG, Ulf

    Dienstag, 26. Juni 2012 14:32
  • Oke ... Danke schonmal. Nach einiger Zeit geht es jetzt.

    Jetzt versuche ich nurnoch das in ein anderen Thread zu bringen...

    Aber was bringt das eigentlich ? Eine Aktion in einem anderen Thread auszuführen ?

    Dienstag, 26. Juni 2012 17:17
  • Das der Main-Thread weiter läuft. Somit bleibt dein Programm bedienbar.
    Dienstag, 26. Juni 2012 17:37
  • Lohnt sich sowas für die 0,  2 Sekunden ? Und da ist ja gerade noch der opeFIleDialog offen, und in der Zeit wenn man auf OK geklickt hat, und sich der schließt, ist das doch schon fertig wieder, oder nicht ?

    Dienstag, 26. Juni 2012 18:32
  • Wenn du eh einen POST hast kannst du diese Information ja als Forminput mitschicken.
    Aber eine letzte Frage noch : Wie versende ich denn überhaupt eine Datei als formInput ?
    Mittwoch, 27. Juni 2012 06:14
  • Indem du einfach die Datei UUEncoded als Wert mit gibst, im POST als ein "Datei=UUEncodedDateiInhalt" steht.
    Mittwoch, 27. Juni 2012 07:07