2013-03-07 6 views
10

Ich mache ein Greymonkey-Skript, das mit dem Redmine-Ticketmanager über die REST-API kommuniziert. Da sich der Benutzer anmelden muss, um die Daten von Redmine zu erhalten, muss ich den Benutzer bitten, seine Kreditwürdigkeit bei der Installation des Skripts anzugeben und sie im Skript zu speichern.Speichern von Benutzereingaben in einem Greasemonkey-Skript bei der Installation

Kann dies erreicht werden, ohne dass der Benutzer aufgefordert wird, die Werte direkt im Skript selbst zu bearbeiten?

EDIT

Da es auf diese Frage bereits eine Antwort ist, werde ich die Antwort nur unten bestätigen, da es ein sehr guter Rahmen ist.

+1

Wenn die Anmeldeinformationen nicht im lokalen Speicher für Ihr Skript verfügbar sind, fragen Sie danach. Was den "lokalen Speicher für dein Skript" betrifft, glaube ich, dass es einen von Greasemonkey gibt, siehe zum Beispiel diesen Google-Hit auf "Local Storage": http://stackoverflow.com/questions/13889995/local-storage-across- domains-using-a-fettmonkey-script –

+0

Betreffs tampermonkey - Ich habe nichts gefunden, noch habe ich getestet, ob es 'GM_setvalue' unterstützt –

+3

Ich denke, tampermokey unterstützt' GM_setvalue', ich habe es vorher ohne Probleme verwendet. – TheBronx

Antwort

8

Hier ist ein Framework zum Abrufen und Speichern von Anmeldedaten. Das Skript fordert beim ersten Durchlauf zur Eingabe der Informationen auf und speichert sie verschlüsselt unter Verwendung von GM_setValue().

Es fügt auch zwei Einträge zum Greasemonkey-Kontextmenü hinzu, um den Benutzernamen oder das Passwort ändern zu können.

// ==UserScript== 
// @name  _Autologin, sensitive info framework 
// @include http://YOUR_SERVER.COM/YOUR_PATH/* 
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js 
// @require http://crypto.stanford.edu/sjcl/sjcl.js 
// @grant GM_getValue 
// @grant GM_setValue 
// @grant GM_registerMenuCommand 
// ==/UserScript== 

var encKey = GM_getValue ("encKey", ""); 
var usr  = GM_getValue ("lognUsr", ""); 
var pword = GM_getValue ("lognPwd", ""); 

if (! encKey) { 
    encKey = prompt (
     'Script key not set for ' + location.hostname + '. Please enter a random string:', 
     '' 
    ); 
    GM_setValue ("encKey", encKey); 

    usr  = pword = ""; // New key makes prev stored values (if any) unable to decode. 
} 
usr   = decodeOrPrompt (usr, "U-name", "lognUsr"); 
pword  = decodeOrPrompt (pword, "P-word", "lognPwd"); 


function decodeOrPrompt (targVar, userPrompt, setValVarName) { 
    if (targVar) { 
     targVar  = unStoreAndDecrypt (targVar); 
    } 
    else { 
     targVar  = prompt (
      userPrompt + ' not set for ' + location.hostname + '. Please enter it now:', 
      '' 
     ); 
     GM_setValue (setValVarName, encryptAndStore (targVar)); 
    } 
    return targVar; 
} 

function encryptAndStore (clearText) { 
    return JSON.stringify (sjcl.encrypt (encKey, clearText)); 
} 

function unStoreAndDecrypt (jsonObj) { 
    return sjcl.decrypt (encKey, JSON.parse (jsonObj)); 
} 

//-- Add menu commands that will allow U and P to be changed. 
GM_registerMenuCommand ("Change Username", changeUsername); 
GM_registerMenuCommand ("Change Password", changePassword); 

function changeUsername() { 
    promptAndChangeStoredValue (usr, "U-name", "lognUsr"); 
} 

function changePassword() { 
    promptAndChangeStoredValue (pword, "P-word", "lognPwd"); 
} 

function promptAndChangeStoredValue (targVar, userPrompt, setValVarName) { 
    targVar  = prompt (
     'Change ' + userPrompt + ' for ' + location.hostname + ':', 
     targVar 
    ); 
    GM_setValue (setValVarName, encryptAndStore (targVar)); 
} 

// ADD YOUR CODE TO SET THE USERNAME AND PASSWORD ON THE LOGIN PAGE, HERE. 
+1

Genau das möchte ich tun, danke. – MaxouMask

+0

Gern geschehen, froh zu helfen. –

+0

Warum würden Sie den Schlüssel speichern? – binki