Monthly Archive for Oktober, 2007

Ruby on Rails with Leopard (localhost, sites, mysql, rmagick)

Ich habe soeben 2 Minuten gebraucht, um intuitiv Rails in Leopard zum Laufen zu kriegen…

Das möchte ich euch natürlich nicht vorenthalten.

Du wechselst in das Verzeichnis deines Projektes.

bild-5.png

Und gibst den Befehl ruby script/server ein.

bild-6.png

Ergebnis:

bild-7.png

Fertig!

“Mongrel available at 0.0.0.0:3000″ verrät dir, wo du deine Webseite findest. Da “0.0.0.0″ das gleiche ist wie “localhost”, findest du sie z. B. hier:

bild-8.png

Mist war das einfach :/

MySQL

HIER könnt ihr mysql runterladen. Kleiner Tip: Intel-Rechner brauchen “x86″. Mein PowerBook G4 hat Mac OS X 10.4 (PowerPC, 32-bit) gebraucht.

Package installieren, fertig. Vorsicht, momentan funktioniert das prefpane von mysql in den Systemeinstellungen für Leopard nicht. Das kann man beheben, indem man dem Verzeichnis /usr/local/mysql/data UND UNTERVERZEICHNISSEN Lese- und Schreibrechte für Administratoren (oder halt direkt dir selbst) hinzufügt. Wie geht das? Einen invisibility toggler runterladen und alle Dateien im Finder sichtbar machen. Auf das Verzeichnis ein “Apfel + i” machen und ganz unten die Reche entsprechend hinzufügen.

Nachdem ich jetzt zwei Tage versucht habe einen “sudo gem install mysql” durchzuführen, kam ich endlich auf die Lösung. (Danke an rubyonrails.org die schnell genug waren. Hier auch nochmal ausführlich.

Kurzum, folgenden langen Befehl im Terminal eingeben:

sudo env ARCHFLAGS="-arch ppc" gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config

Dort wo “ppc” steht muss nicht ppc sondern i386 heißen, wenn ihr einen Intel-Prozessor habt (MacBook usw.)

mysqlok.png

Wenn ihr nur sudo gem install mysql oder sudo gem install mysql — –with-mysql-dir=/usr/local/mysql macht, dann kommt ein “can’t find ruby header” Fehler. Danach habe ich gegoogled ohne Ende und nichts gefunden.

Übrigens kann nun ein sudo gem update rails nicht schaden, das updated ein paar gem versionen.

Wie man mit MacPort RMagick installiert, ist hier schön beschrieben.

Fertig!

Ähnliche Posts:
» (Snow) Leopard + Rails + Passenger + VirtualBox + Windows 7 and localhost
» BasicAuth + ProxyPath (Apache + Mongrel)
» Apache2 auf dem Mac macht nur 401 wegen FileVault
» Tiger -> Leopard = smoooth!

Tiger -> Leopard = smoooth!

45 Minuten bis zum Glück bei Gravis. In der Reihe habe ich dann noch Weissgerberchen getroffen und ihm gleich ein Leopard mitgekauft, weil er noch ganz hinten in der Schlange stand :)


dsc08422_300.jpg

dsc08423_300.jpg


Vor der Installation von Leopard habe ich von Tiger nur den User- Library-Ordner gesichert. So war es mir möglich alle Programm- und Systemeinstellungen mit einem einfachen Drag-and-Drop des Programm-Verzeichnisses in ApplicationSupport zu übernehmen.

Die Umstellung hat nur etwa 2-3 Stunden gedauert. Verlief ohne Probleme.

BIS AUF meine PGP-Keys :)

Update: Auch meine lokale mysql Datenbank war futsch :) Hätt ich ja mal dran denken können!!! Liegt ja auch nicht in der Library.

Die liegen nämlich in .gnupg in der (User?) Library und wurden nicht mit kopiert. Also macht nicht den gleichen Fehler ;) Zum Glück hatte ich ein Backup auf einer CD davon.

So, jetzt muss ich nur noch rausfinden, wie ich mein Rails-Projekt zum starten kriege :) Wenn ich es geschafft habe, verrate ich es euch!

Vielleicht als Anmerkung: Ich bin auf Safari umgestiegen, weil es nunmal einfach schneller ist. Nur: Adblocking gibt es nicht und Cookies kann ich auch nicht für nur bestimmte Seiten erlauben. Und da die sogenannte “InputManagers”-Plugin-Funktion nicht mehr geht, gibt es auch keine Plugins dafür… Mal abwarten was da passiert.

PS: Da alle Menschen auf der Welt (bis auf Steve Jobs) Leopard zur gleichen Zeit erhalten haben – nämlich gestern Abend – gibt es auch so gut wie keine Blog-Einträge über Features und Probleme. Das heißt für mich: Ran an die Bouletten und unter den Ersten sein :)

Ähnliche Posts:
» HowTo: ImageMagick + RMagick via Macports für Tiger
» IE5, IE6, IE7 unter Mac OS X installieren (Tiger und Leopard)
» Etwas mehr Privacy bitte (pgp, gpgmail, snow leopard, google suggest)
» AirPortClown: Simple MAC address spoof for Snow Leopard

WordPress Plugin Shopping Cart (alias wp-commerce) e-downloads knackbar?

Das Plugin WP-Commerce scheint mir echt gefähtlich für Datei-Downloads zum im eigenen Webshop zu sein.

Das gefährliche Problem
Bis zur aktuellen Version WP e-Commerce 3.5.2 RC4 (UND der teuren “gold” edition!) ist der Download gekaufter digitaler Dateien mit einer URL á la http://meinshop.de/?downloadid=3 verbunden. Immerhin geht der Link dann auch genau nur einmal – und zwar so lange, bis wieder einer was “downloadbares” kauft – dann ist es eben /?downloadid=4 und wer zuerst kommt mahlt zuerst.

Mindestens genau so schlimm ist, dass die geheimen Dateien in einem öffentlichen Verzeichnis liegen (/wp-content/plugins/wp-shopping-cart/files/) und zwar als SHA1 Hash. Nur ist der SHA1 Hash IMMER gleich der ID der Datei!!! Also 1, 2, 3 usw. encrypted!

D. h. in JEDEM WP-Commerce gibt es in dem Verzeichnis eine Datei namens
356a192b7913b04c54574d18c28d46e6395428ab (nämlich sha1(“1″)) und
da4b9237bacccdf19c0760cab7aec4a8359010b0 (sha1(“2″))

und so weiter. Natürlich hat das Verzeichnis dann auch noch 755 CHMOD Rechte (also für jeden lesbar). Was ist denn das für ein Scheiss? Wer auch immer dieses Plugin benutzt – ich muss ja nur die URL oben eingeben und kann eine geheime Datei nach der anderen runterladen. Im Forum des Betreibers hat sich auch noch keiner drüber beschwert (nur ein Einziger hat erwähnt, dass er das im live-system umprogrammieren musste, weil er die sicherheitslücke bemerkte – wer rechnet denn auch damit?)

Lösung
Das “files”-Verzeichnis natürlich erstmal auf CHMOD 700 setzen.

Im Folgenden nur mein Lösungsansatz (der bei mir wunderbar klappt!!!) und nicht jeder Schritt im Detail:

  • Man fügt in seine wp_download_status Tabelle ein VARCHAR(45) Feld mit Namen “hash” ein.
  • In der submit_checkout_function.php Zeile 165 erweitert man den INSERT INTO um dieses Feld und füllt es mit z. B. sha1(‘xyz’.$product_data['file'].$log_id.’blabla’). Also etwas was in jeder Zeile der Tabelle anders aussehen dürfte. Oder sha1(time()) ist auch sicher gut.
  • In der transaction_result_functions.php wird der Download-Link für die Bestätigungs-Email erstellt. Zeile 101 muss dann um den hash z. B. so “erweitert” werden:

    $link = $siteurl.”?downloadid=”.$download_data['id'].”&code=”.$download_data['hash'];

  • Als letztes muss in der wp-shopping-cart.php Zeile 1189 geprüft werden, ob der code ebenfalls übergeben wurde:

    if(is_numeric($_GET['downloadid']) && $_GET['code'] != null)

    Nur vier Zeilen tiefer wird dass dann mit der Datenbank abgeglichen:

    $code = $_GET['code']; # < Diese Zeile wird hinzugefügt die nächste abgeändert
    if($download_data != null && $code == $download_data['datehash'])

Jetzt ist es doch etwas detailierter gewesen…
So! Jetzt kann man sein Shop-Plugin natürlich nicht mehr updaten :(

Egal, funktioniert jetzt erstmal! Noch ein Hinweis: downloadid habe ich so gelassen wie es ist und nicht NUR nach dem code in der Tabelle gesucht, weil es dann nicht mehr Injection-Safe wäre. downloadid muss ja numerisch sein und wenn die ID stimmt, wird der Code erst abgeglichen.

Ähnliche Posts:
» XML Sitemap Generator for Rails
» Funkenrailsdav: Webdav with Rails e.g. for ical
» Downloads
» Presenting: The Funkengallery Demo App

Ruby on Rails: String manipulation

Es gibt einige Sachen, die ich gerne mit Strings machen möchte. Aber natürlich ist nicht ALLES in Rails schon drin. Also habe ich mir mit einem Plugin wie folgt geholfen.

z. B.: “2″.numstring? gibt mir an, ob der string nur Ziffern enthält.

/vendor/plugins/future/init.rb

require 'string_manipulation'

/vendor/plugins/future/lib/string_manipulation.rb

require 'digest/sha1'
module StringManipulation
 
  # Remove ALL unneccessary whitespaces from string
  #    "   hello   world   " #=> "hello world"
  def strip_all
    self.gsub(/ +/, ' ').strip.chomp
  end
 
  # Remove everything that is not a-z or 0-9 or space
  def strip_illegal
    self.gsub(/[^a-zA-Z0-9 ]/, '')
  end
 
  # Returns the basename of a file
  def strip_extention
    self.gsub(/(\.(.*))$/,'')
  end
 
  # Strips RAILS_ROOT/public from string
  def url_from_path
    self.gsub("#{RAILS_ROOT}/public", '')
  end
 
  # Strips RAILS_ROOT from string
  def root_from_path
    self.gsub("#{RAILS_ROOT}", '')
  end
 
  # Hashes a string with SHA1
  def hashed
    Digest::SHA1.hexdigest(self)
  end
 
  # Make a nice downcase keyword list as string, seperated by single spaces
  #    keyword_list("   My §$% KEY   wordlist   ") #=> "my key wordlist"
  def keywordlist
    self.strip_illegal.downcase.strip_all
  end
 
  # Checks if a string contains only numerical characters
  def numstring?
    self =~ /^\d+(\.\d+|\d*)$/
  end
 
end
 
class String
  include StringManipulation
end

Als Unterfunktion von Object sind die Funktionen überall verfügbar. Sehr praktisch.

Ähnliche Posts:
» Mysql on Leopard: Startupitem, Prefpane, LaunchDemon
» MCV Ruby on Rails – was gehört wohin?
» Passenger für Ruby on Rails aus TextMate “automatisch” neu starten
» Railscasts.com – die beste Ruby on Rails Resource