2014-11-02 24 views
11

Come pulire SSJS (Server Side Javascript) nel server Domino dopo che qualcuno ha utilizzato il prototipo javascript in un nsf?Come pulire SSJS nel server Domino dopo che qualcuno ha utilizzato il prototipo javascript in un nsf?

Mark Roden ha scoperto un huge weakness in XPages SSJS: (grazie a David Leedy per avermi parlato di questo e mostrarmi l'articolo).

Se avete il seguente codice SSJS:

var dummyObj = {} 
dummyObj.prototype.NAME = "Johann" 

XPages SSJS non si cura che si usa var (var significa che la variabile deve essere locale) e rende dummyObj.NAME visibile l'intero server con il valore Johann. Quindi, se un altro NSF nello stesso server utilizza un var con lo stesso nome che eredita l'intero prototipo:

var dummyObj = {} 
println(dummyObj.NAME) /*prints "Johann" */ 

Questo è un enorme bug (uno che fa inaffidabile XPages SSJS IMO). Anche se non si utilizza il prototipo a tutti, se qualcun altro nella sua domanda di fare qualcosa di simile:

String.prototype.split = function(){ return "I broke this method" } 

sarà rotto tutte le applicazioni nello stesso server che utilizza l'innocente split().

Quindi, la domanda è: se qualcuno "per errore", scrive quanto segue SSJS (XPages Server Side JavaScript) in un NSF:

String.prototype.split = function(){ return "I broke this method" } 

Come posso risolvere String.prototype.split() per la sua valore originale?

Come ha detto Mark Roden, il riavvio dell'attività HTTP non lo risolve.

////////////////////////////////////////////// /////////////

Edit 1: Perché credo che questo sia un enorme errore:

sono un fan Javascript ma IMHO @MarkyRoden ha scoperto un enorme bug in SSJS . Shim e polyfill non sono davvero il problema principale. Eval è noto per essere una cattiva pratica, ma l'oggetto prototipo è un elemento fondamentale del Javascript di base. È il metodo standard e preferito per aggiungere metodi alle classi Javascript, è anche necessario per l'ereditarietà e ogni tipo di OOP stuff. Quindi avrai bisogno di una sorta di spazio dei nomi a livello di server per evitare collisioni. Tutto questo è davvero pessimo, ma l'enorme problema è che solo una riga di codice in un'applicazione può rompere tutte le applicazioni in un server. Sì, puoi fidarti dei tuoi sviluppatori, ma uno di loro può scrivere una riga errata per sbaglio e anche un server Domino può avere centinaia di applicazioni da diversi fornitori di software. Impostare la responsabilità nelle revisioni del codice non è una procedura abbastanza affidabile. Forse è il momento di avere un vero motore javascript in SSJS, come V8, Spidermonkey, Chakra o Rhino. Come soluzione, sto pensando a qualcosa come Tommy Valand idea with Rhino in SSJS.

Modifica 2: è ancora peggio.Si possono fare cose come:

prototype.importPackage = null 

o

prototype.Array = null 

Come si può vedere nel @ articolo di SvenHasselbach: http://hasselba.ch/blog/?p=1371

Edit 3: IBM: mi hai detto che potevo usare SSJS. VIENI UNO! PER FAVORE FISSARE QUESTO, È FANTASTICO. Si prega di segnalare ufficialmente questo problema a IBM.

+1

Per quanto riguarda i tuoi commenti EDIT. Penso che il key take away sia che SSJS NON è "true JavaScript". Quindi è necessario gestire le vostre aspettative di SSJS di conseguenza. Soprattutto con OOP. Non puoi davvero fare oggetti in SSJS. Se inserisci il codice nelle tue funzioni, non sono serializzabili. Onestamente, credo che la vera soluzione sia usare Java piuttosto che SSJS. –

+0

È un motivo in più per utilizzare il più possibile Java ed EL nello sviluppo di XPage anziché SSJS. –

+0

Sono d'accordo con Knut e David. Prendi in considerazione anche ciò che Jesse Gallagher ha fatto alcuni anni fa per permetterti di codificare Ruby in XPages: XPages è una piattaforma basata su JSF, in esecuzione in una Java Virtual Machine, quindi per consentire alle persone di codificare Ruby, Jesse ha dovuto scrivere un motore di analisi per consentire Java per analizzare Ruby. Il parser di Rhino sta facendo la stessa cosa: sta usando una classe Java per dire a Java come analizzare Rhino. Quindi, a meno che non stia fraintendendo le cose, non puoi avere un vero motore javascript in SSJS, perché utilizzerai un parser Java per quel motore javascript. Il debug può anche essere una sfida. –

risposta

8

È possibile ripristinare l'interprete SSJS con il seguente codice Java:

FacesContextExImpl fc = (FacesContextExImpl) FacesContextExImpl.getCurrentInstance(); 
UIViewRootEx2 uiRoot = (UIViewRootEx2) fc.getViewRoot(); 
JSContext jsContext = uiRoot.getJSInterpreter().getJSContext(); 
jsContext.getRegistry().init(jsContext); 

Questo reinizializza il registro e tutte le funzioni del prototipo.

EDIT: Modificato dichiarazione di fc al tipo corretto.

EDIT 2: Ecco la versione SSJS:

var uiRoot = facesContext.getViewRoot(); 
var jsContext = uiRoot.getJSInterpreter().getJSContext(); 
var reg = jsContext.getRegistry(); 
reg.init(jsContext); 

Does ho capito bene, che si desidera pulire l'interprete SSJS per evitare una collisione con il proprio prototipo Estensione? Giusto per chiarire la risposta sopra: Questo reinizializza l'interprete SSJS una volta. E solo una volta. È necessario eseguire questa operazione più e più volte, poiché direttamente dopo la reinizializzazione, un'altra applicazione sul server può sovrascrivere nuovamente la funzionalità del prototipo. Ecco perché questa non è una soluzione reale, è una risposta alla tua domanda iniziale.

avrà conseguenze interessting se un'altra applicazione farà lo stesso, mentre il codice tenta di utilizzare l'estensione ...

+0

In effetti, interesserà ogni applicazione nello stesso modo in cui riavvia l'attività http. La revisione del codice IMO è l'unico modo sicuro per evitare il problema (non mi aspetto che IBM possa risolverlo in qualsiasi momento presto - senza SPR, senza correzione). –

+0

@FrantisekKossuth: No, questo può essere fatto durante il runtime. Quando il server viene riavviato, tutto è perduto (dati di sessione, autenticazione ecc.). Ma per essere sicuri, questo deve essere fatto più e più volte. L'unico modo che impedisce davvero i problemi è di non usare SSJS. –

+0

Hai ragione, il riavvio cancella molti più dati. Il mio punto è: l'applicazione può perdere lo "stato" memorizzato nel contesto e malfunzionamento allo stesso modo. –

3

cercare di fare un riavvio attività HTTP invece tell http restart non farà un riavvio completo del compito http

+1

Restart Task Http pulisce tutti i prototipi. Bello!. Ma cosa fare quando viene eseguita di nuovo l'applicazione non valida con il codice del prototipo danneggiato? Come posso proteggere la mia applicazione XPage contro questo? Sono molto preoccupato per questo. È un bug enorme. IBM dovrebbe davvero aggiustarlo. Se non esiste una soluzione per questo, come si può continuare a fidarsi di XPages SSJS? –

+0

Non è un bug IMHO è una sfortunata caratteristica del modo in cui è implementato SSJS. Mi fido di SSJS, non gli sviluppatori. Quindi vorrei scoraggiarti dall'usare lo shim e non incoraggiare gli altri a usare il prototipo che ho paura - sorry :( – MarkyRoden

+0

@JohannEchavarria: non puoi fidarti di SSJS, è rotto dalla progettazione quando lo si guarda per ragioni di sicurezza. non significa che non puoi usarlo in un "ambiente fidato": gli amministratori devono guardare i frammenti sbagliati e devono sparare agli sviluppatori che sovrascrivono le funzioni interne (è molto più che la cosa del "prototipo"). di "eval" è un no-go anche –