2016-05-06 10 views
0

Ich benutze JRuby 9.0.5.0, um Ruby-Skripte von Java aufrufen zu können. Ich würde gerne ein Char-Array mit einem Passwort an ein Ruby-Skript übergeben, aber anscheinend mache ich etwas falsch, da mein Skript nur funktioniert, wenn ich eine normale Zeichenfolge verwende.Wie kann ich ein Java-Char-Array als Parameter an ein Ruby-Skript über JRuby übergeben?

script.rb enthält die folgende Funktion:

def action(user, password) 

Von Java, ich kann in der Regel diese Funktion aufrufen, aber ich habe nur das das erwartete Ergebnis (dh keine Ausnahme), wenn password ist ein String:

ScriptEngineManager m = new ScriptEngineManager(); 
ScriptEngine jruby = m.getEngineByName("jruby"); 

... 

jruby.put("user", "TestUser"); 
jruby.put("password", "xyz!"); // I'd like to pass "xyz!" as a char array. 

// Call the script. Works as expected because password is a String. 
String result = (String)jruby.eval("action($user, $password)"); 

Mein erster Versuch war zu versuchen, das Passwort wie folgt weitergeben müssen:

char[] password = { 'x', 'y', 'z', '!' }; 
jruby.put("password", password); 
... 

aber dies führte zur Ausnahme

NoMethodError: undefined method `encoding' for char[x, y, z, !]@30abf79c:# encode_utf16le at .../jruby-9.0.5.0/lib/ruby/gems/shared/gems/rubyntlm-0.6.0/lib/net/ntlm/encode_util.rb:42

ich den gleichen Fehler, wenn ich versuche, das Passwort zu setzen explizit in den script.rb selbst wie diese, nur zum Testen:

pwd = ['x', 'y', 'z', '!'].to_s 
# use pwd inside the script ... 

Als nächstes I versucht UTF-8-Kodierung so zu erzwingen:

pwd = ['x', 'y', 'z', '!'].to_s 
pwd = pwd.force_encoding("UTF-8") 
# use pwd inside the script ... 

, die aus dem Edelstein im Inneren der scri verwendet Ursprung in einem anderen Fehler resultierte pt, d.h. ein Autorisierungsfehler. Das Gleiche passiert, wenn ich "UTF-16" verwende.

Könnte es sein, dass das Ruby-Juwel, das vom Skript selbst verwendet wird, d. H. Der interne Funktionsaufruf unter Verwendung des Passworts, nur mit Strings einer bestimmten Kodierung funktioniert? Oder mache ich etwas anderes falsch? Ich weiß kaum etwas über Ruby und versuche es einfach zusammen zu kleben.

Antwort

1

Die Lösung password.to_a.pack('U*') innerhalb der Ruby-Skript zu verwenden ist.

Java:

char[] password = { 'x', 'y', 'z', '!' }; 
jruby.put("password", password); // jruby is of type ScriptEngine 

Rubin script.rb:

password_to_use = password.to_a.pack('U*') 
0

~~ ['x','y','z','!'].to_java(:char) wandelt den Ruby-Array in eine Java char[] ~~

char[] password = { 'x', 'y', 'z', '!' }; 
jruby.put("password", new String(password)); // jruby is of type ScriptEngine 
+0

Danke, aber ich versuche, das Gegenteil zu erreichen, das heißt konvertieren Java char [] in einen Ruby-String. – w128

+0

... und was ist falsch mit der Standard Java String API dafür? – kares

+0

Wenn Sie sich auf den String-Typ von Java beziehen, liegt es daran, dass es wegen seiner Unveränderbarkeit und anderen Gründen schlecht ist, ihn für Passwörter und ähnliche sensible Daten zu verwenden. Siehe http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java – w128

Verwandte Themen