1919 * value:
2020 * sporočilo: Uporabnika ne najdem v bazi
2121 */
22-
23-
24-
25-
2622/**
2723 * @swagger
2824 * components:
280276 * example:
281277 * sporočilo: cd
282278 */
283- const mongoose = require ( 'mongoose' ) ;
284- const crypto = require ( 'crypto' ) ;
285- const jwt = require ( 'jsonwebtoken' ) ;
286-
287- /**
288- * @swagger
289- * components:
290- * schemas:
291- * Uporabnik:
292- * type: object
293- * properties:
294- * uporabniskoIme:
295- * type: string
296- * ePosta:
297- * type: string
298- * zgoscenaVrednost:
299- * type: string
300- * zetonZaObnavljanjeGesla:
301- * type: string
302- * default: obnovljeno
303- * jeAdmin:
304- * type: boolean
305- * default: false
306- * kraj:
307- * type: string
308- * default: Ljubljana
309- * posta:
310- * type: string
311- * default: 1000
312- * required:
313- * - uporabniskoIme
314- * - ePosta
315- * - zgoscenaVrednost
316- * - kraj
317- * - posta
318- */
319-
320- const uporabnikiSchema = new mongoose . Schema ( {
321- uporabniskoIme : { type :String , required : true /*, unique: true*/ } ,
322- ePosta : { type :String , required : true , unique : true } ,
323- nakljucnaVrednost : String ,
324- zgoscenaVrednost : { type :String , required :true } ,
325- zetonZaObnavljanjeGesla : { type : String , "default" :"obnovljeno" } ,
326- jeAdmin : { type : Boolean , "default" :false } ,
327- naslov : String ,
328- kraj : { type : String , "default" : "Ljubljana" , required : true } ,
329- posta : { type : Number , min :1000 , max :9999 , "default" :1000 , required : true }
330- } ) ;
331-
332- uporabnikiSchema . methods . nastaviGeslo = function ( geslo ) {
333- this . nakljucnaVrednost = crypto . randomBytes ( 16 ) . toString ( 'hex' ) ;
334- this . zgoscenaVrednost = crypto . pbkdf2Sync ( geslo , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
335- } ;
336- uporabnikiSchema . methods . nastaviZeton = function ( zeton ) {
337- this . zetonZaObnavljanjeGesla = crypto . pbkdf2Sync ( zeton , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
338- }
339- uporabnikiSchema . methods . preveriZeton = function ( zeton ) {
340- let zetonZaObnavljanjeGesla = crypto . pbkdf2Sync ( zeton , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
341- return this . zetonZaObnavljanjeGesla == zetonZaObnavljanjeGesla ;
342- }
343-
344- uporabnikiSchema . methods . preveriGeslo = function ( geslo ) {
345- let zgoscenaVrednost = crypto . pbkdf2Sync ( geslo , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
346- return this . zgoscenaVrednost == zgoscenaVrednost ;
347- } ;
348-
349- uporabnikiSchema . methods . posodobiGeslo = function ( staroGeslo , novoGeslo , ponoviNovoGeslo ) {
350-
351- if ( ! ( new RegExp ( "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@€#\$%\^&\*])(?=.{8,})" ) . test ( novoGeslo ) ) || novoGeslo != ponoviNovoGeslo || ! this . preveriGeslo ( staroGeslo ) ) {
352- return false ; //uporabnika obvesti, da je nekaj šlo narobe pa mu daj hinte naj preveri kaj je crknilo
353- }
354- this . nastaviGeslo ( novoGeslo ) ; //geslo uspešno spremenjeno
355- return true ;
356- }
279+ const mongoose = require ( 'mongoose' ) ; //lažje delo z MongoDB bazo
280+ const crypto = require ( 'crypto' ) ; //uporaba za enosmerno zgoščevanje podatkov (geslo, žeton za obnavljanje gesla,..)
281+ const jwt = require ( 'jsonwebtoken' ) ; //generiranje JWT žetona za avtentikacijo uporabnika
282+ /**
283+ * @swagger
284+ * components:
285+ * schemas:
286+ * Uporabnik:
287+ * type: object
288+ * properties:
289+ * uporabniskoIme:
290+ * type: string
291+ * ePosta:
292+ * type: string
293+ * zgoscenaVrednost:
294+ * type: string
295+ * zetonZaObnavljanjeGesla:
296+ * type: string
297+ * default: obnovljeno
298+ * jeAdmin:
299+ * type: boolean
300+ * default: false
301+ * kraj:
302+ * type: string
303+ * default: Ljubljana
304+ * posta:
305+ * type: string
306+ * default: 1000
307+ * required:
308+ * - uporabniskoIme
309+ * - ePosta
310+ * - zgoscenaVrednost
311+ * - kraj
312+ * - posta
313+ */
314+ //UPORABNIK
315+ //Shema uporabnika
316+
317+ const uporabnikiSchema = new mongoose . Schema ( {
318+ uporabniskoIme : { type :String , required : true , unique : true } , // uporabniško ime
319+ ePosta : { type :String , required : true , unique : true } , // e-pošta
320+ nakljucnaVrednost : String , // naključna vrednost, ki se generira za potrebe enosmernega zgoščevanja gesla in žetona za obnavljanje (unikatno)
321+ zgoscenaVrednost : { type :String , required :true } , // zgoščena vrednost gesla in naključne vrednosti, ki se dejansko preverja
322+ zetonZaObnavljanjeGesla : String , // žeton za obnavljanje gesla (zgoščena vrednost žetona in naključne vrednosti)
323+ jeAdmin : { type : Boolean , "default" :false } , //informacija ali uporabnik je administrator
324+ jePotrjen : { type : Boolean , "default" :false } //potrdimo, da je uporabnik legit
325+ } ) ;
357326
358- uporabnikiSchema . methods . generirajJwt = function ( ) {
359- const datumPoteka = new Date ( ) ;
360- datumPoteka . setDate ( datumPoteka . getDate ( ) + 7 ) ;
361- return jwt . sign ( {
362- _id : this . _id ,
363- uporabniskoIme : this . uporabniskoIme ,
364- ePosta : this . ePosta ,
365- jeAdmin : this . jeAdmin ,
366- potek : parseInt ( datumPoteka . getTime ( ) / 1000 , 10 )
367- } , process . env . JWT_GESLO ) ;
368- } ;
369- uporabnikiSchema . methods . preveriAdmin = function ( ) { return this . jeAdmin } ; //securanje na strani apija za vsak slučaj
370- mongoose . model ( 'Uporabnik' , uporabnikiSchema , 'Uporabniki' ) ;
327+ //Uporabnik si nastavi novo geslo, dobi tudi naključno vrednost
328+ //Vhod: novo geslo, ki ga določi uporabnik
329+ uporabnikiSchema . methods . nastaviGeslo = function ( geslo ) {
330+ this . nakljucnaVrednost = crypto . randomBytes ( 16 ) . toString ( 'hex' ) ;
331+ this . zgoscenaVrednost = crypto . pbkdf2Sync ( geslo , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
332+ } ;
333+ //Uporabnik si avtomatsko ob registraciji (in prošnji nas) nastavi novo geslo, dobi tudi naključno vrednos
334+ //Vhod: zeton, ki se samodejno generira ob registraciji / prošnji za zahtevo za obnovo
335+ uporabnikiSchema . methods . nastaviZeton = function ( zeton ) {
336+ this . zetonZaObnavljanjeGesla = crypto . pbkdf2Sync ( zeton , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
337+ }
338+ //Preverba veljavnosti žetona ob obnovi gesla in ga takoj nastavimo na novo vrednost
339+ //Vhod: zeton, ki se samodejno generira ob registraciji / prošnji za zahtevo za obnovo
340+ //Izhod: informacija ali je zgoščena vrednost žetona identična z našim žetonom (žeton + naključna vrednost)
341+ uporabnikiSchema . methods . preveriZeton = function ( zeton ) {
342+ let jeUjemanje = this . zetonZaObnavljanjeGesla == crypto . pbkdf2Sync ( zeton , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
343+ this . nastaviZeton ( ) ;
344+ return jeUjemanje ;
345+
346+ }
347+ //Preverba veljavnosti gesla ob prijavi
348+ //Vhod: geslo, ki ga vnesemo ob prijavi
349+ //Izhod: informacija ali je zgoščena vrednost gesla identična z našim geslo (geslo + naključna vrednost)
350+ uporabnikiSchema . methods . preveriGeslo = function ( geslo ) {
351+ return this . zgoscenaVrednost == crypto . pbkdf2Sync ( geslo , this . nakljucnaVrednost , 1000 , 64 , 'sha512' ) . toString ( 'hex' ) ;
352+ } ;
353+
354+ //TODO:
355+ //PREVERI in NASTAVI daj v skupno (VSAKA svoja kategorija), bolj skalabilno metodo, razširi obstoječe
356+ /*uporabnikiSchema.methods.preveri = function(tipPodatka, vsebinaPodatka){
357+
358+ switch(tipPodatka){
359+ case "geslo" :
360+
361+ break;
362+ case "zeton" :
363+
364+ break;
365+ default:
366+ return false;
367+ }
368+
369+ }*/
370+
371+ //Potrdimo uporabnika (ali je mail veljaven), pokličemo ob potrditvi maila
372+ uporabnikiSchema . methods . potrdiUporabnika = function ( )
373+ {
374+ if ( ! this . jePotrjen ) {
375+ this . jePotrjen = true ;
376+ }
377+ }
378+
379+ //Posodabljanje gesla na zahtevo uporabnika (preko računa), če novo geslo ustreza vzorcu & sta novo in ponovitev novega gesla enaki & in je staro geslo še veljavno
380+ //VHOD: staro geslo, ter 2x novo geslo
381+ //IZHOD: informacija, ali je bilo geslo uspešno spremenjeno
382+ uporabnikiSchema . methods . posodobiGeslo = function ( staroGeslo , novoGeslo , ponoviNovoGeslo ) {
383+
384+ if ( ! ( new RegExp ( "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@€#\$%\^&\*])(?=.{8,})" ) . test ( novoGeslo ) ) || novoGeslo != ponoviNovoGeslo || ! this . preveriGeslo ( staroGeslo ) ) {
385+ return false ; //uporabnika obvesti, da je nekaj šlo narobe pa mu daj hinte naj preveri kaj je crknilo
386+ }
387+ this . nastaviGeslo ( novoGeslo ) ; //geslo uspešno spremenjeno
388+ return true ;
389+ }
390+
391+ //Generiramo novi JWT, vsebovani so _id, uporabniško ime, e pošta, ali je administrator ter datum poteka
392+ //podpišemo z geslom v .env datoteki
393+ uporabnikiSchema . methods . generirajJwt = function ( ) {
394+ const datumPoteka = new Date ( ) ;
395+ datumPoteka . setDate ( datumPoteka . getDate ( ) + 7 ) ;
396+ return jwt . sign ( {
397+ _id : this . _id ,
398+ uporabniskoIme : this . uporabniskoIme ,
399+ ePosta : this . ePosta ,
400+ jeAdmin : this . jeAdmin ,
401+ potek : parseInt ( datumPoteka . getTime ( ) / 1000 , 10 )
402+ } , process . env . JWT_GESLO ) ;
403+ } ;
404+
405+ //Preverimo ali je dotični uporabnik admninistrator
406+ //IZHOD: Informacija, ali je uporabnik administrator ali ne.....
407+ uporabnikiSchema . methods . preveriAdmin = function ( ) { return this . jeAdmin } ; //securanje na strani apija za vsak slučaj
408+ mongoose . model ( 'Uporabnik' , uporabnikiSchema , 'Uporabniki' ) ;
0 commit comments