pgSQL - aktualizacja has

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2344
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

pgSQL - aktualizacja hasła w tabeli

Post autor: LordRuthwen »

Witam.
Mam polecenie MySQL:

Kod: Zaznacz cały

SELECT update_passwd(%c, %u)
które aktualizuje hasło %c użytkownikowi %u
Jak je przerobić, aby następowała aktualizacja następujących kolumn tabeli mailbox w PostGreSQL:

Kod: Zaznacz cały

SELECT "username" FROM "public"."mailbox"
SELECT "password" FROM "public"."mailbox"
Kwestia jest dostosowania wtyczki "password" do RoundCubeMail, domyślnie jest to na MySQL a u mnie poczta chodzi na postgresie
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

update_passwd to raczej jakaś funkcja zdefiniowana przez tą wtyczkę, więc nie pozostaje nic innego jak sprawdzić ciało tej funkcji (show create update_passwd czy jakoś tak) i odpowiednio zmodyfikować pod postgresa.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Mniejwięcej coś takiego:

Kod: Zaznacz cały

CREATE FUNCTION update_passwd(varchar40, varchar40) RETURNS integer AS '

DECLARE 
 myuser ALIAS FOR $1;
nowypass ALIAS FOR $2;
update_re integer;
tenuser varchar;

BEGIN 
SELECT username INTO tenuser FROM public.mailbox WHERE username= myuser;
IF NOT FOUND THEN
update_re:=0;
RETURN update_re
END IF;
UPDATE public.mailbox SET password=nowypass WHERE user=tenuser;
update_re:=1;
RETURN update_re;
END; language 'plpgsql';

Pisze z pamięci więc trzeba zweryfikować ale mniejwiecej chyba o taka procedure przechowywaną Tobie chodziło
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2344
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Dziękuję za odzew, sprawdzę to dam znać, z baz danych to ja cienki jestem :)

Dodane:

No cóż, nie do końca działa, nie stworzy funkcji.
Strukturę tabeli public.vmail.mailbox mam taką:

Kod: Zaznacz cały

username(varchar)[username jest pełnym mailem], password(varchar), name, maildir, itd
interesuje mnie stworzenie funkcji, która aktualizuje hash MD5 pola password.
Znalazłem coś takiego:

Kod: Zaznacz cały

 CREATE OR REPLACE FUNCTION update_passwd(hash text, account text) RETURNS integer AS $$
        DECLARE
            res integer;
        BEGIN
            UPDATE passwd SET password = hash
            WHERE login = split_part(account, '@', 1)
                AND domainid = (SELECT id FROM domains WHERE name = split_part(account, '@', 2))
            RETURNING id INTO res;
            RETURN res;
        END;
        $$ LANGUAGE plpgsql SECURITY DEFINER;

Kod: Zaznacz cały

        CREATE FUNCTION update_password (oldpass text, cryptpass text, user text) RETURNS text
            MODIFIES SQL DATA
        BEGIN
            DECLARE currentsalt varchar(20);
            DECLARE error text;
            SET error = 'incorrect current password';
            SELECT substring_index(substr(user.password,4),_latin1'$',1) INTO currentsalt FROM users WHERE username=user;
            SELECT '' INTO error FROM users WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
            UPDATE users SET password=cryptpass WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
            RETURN error;
        END
ale też nie bardzo chcą działać.
Log postgresa po wykonaniu zapytania dla pierwszej funkcji:

Kod: Zaznacz cały

2011-10-19 14:01:08 CEST ERROR:  relation "passwd" does not exist at character 8
2011-10-19 14:01:08 CEST QUERY:  UPDATE passwd SET password =  $1  WHERE login = split_part( $2 , '@', 1) AND domainid = (SELECT id FROM domains WHERE name = split_part( $2 , '@', 2)) RETURNING id
2011-10-19 14:01:08 CEST CONTEXT:  PL/pgSQL function "update_passwd" line 4 at SQL statement
2011-10-19 14:01:08 CEST STATEMENT:  SELECT update_passwd('$HASH.', 'mail@domena.pl')
Próba stworzenia drugiej z tych funkcji, którą znalazłem:

Kod: Zaznacz cały

2011-10-19 13:57:32 CEST ERROR:  syntax error at or near "user" at character 64
2011-10-19 13:57:32 CEST STATEMENT:  CREATE FUNCTION update_password (oldpass text, cryptpass text, user text) RETURNS text
                    MODIFIES SQL DATA
                BEGIN
                    DECLARE currentsalt varchar(20);
                    DECLARE error text;
                    SET error = 'incorrect current password';
                    SELECT substring_index(substr(user.password,4),_latin1'$',1) INTO currentsalt FROM users WHERE username=user;
                    SELECT '' INTO error FROM users WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
                    UPDATE users SET password=cryptpass WHERE username=user AND password=ENCRYPT(oldpass,currentsalt);
                    RETURN error;
                END
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Doprecyzujmy, czy używasz w ogóle soli w hasłach? Bo te przykłady, które przedstawiasz nie robią zawsze tego samego.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2344
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Domyślam się, że nie robią tego samego, szczerze mówiąc nie wiem jak przechowuje zapisane hasła postfixadmin, bo do jego bazy się Roundcube i postfix odnosi.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Jeśli to po prostu szyfrowanie MD5 to może tak:

Kod: Zaznacz cały

CREATE FUNCTION update_passwd(varchar40, varchar40) RETURNS integer AS '

DECLARE 
 myuser ALIAS FOR $1;
nowypass ALIAS FOR $2;
update_re integer;
tenuser varchar;

BEGIN 
SELECT username INTO tenuser FROM public.mailbox WHERE username= myuser;
IF NOT FOUND THEN
update_re:=0;
RETURN update_re
END IF;
UPDATE public.mailbox SET password=md5(nowypass) WHERE user=tenuser;
update_re:=1;
RETURN update_re;
END; language 'plpgsql';
Tu nie ma specjalnie co analizować.

Wywołanie:

Kod: Zaznacz cały


SELECT update_passwd("janek", "mojenowehaslo")

Powinno zwrócić 1 jako poprawnie wykonana operacje zmiany hasła.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2344
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Kod: Zaznacz cały

[B]Błąd SQL:[/B]


ERROR:  syntax error at or near "plpgsql" LINE 18: END; language 'plpgsql';                         ^ 		      [B]W poleceniu:[/B]


CREATE FUNCTION update_passwd(varchar40, varchar40) RETURNS integer AS '  DECLARE   myuser ALIAS FOR $1; nowypass ALIAS FOR $2; update_re integer; tenuser varchar;  BEGIN  SELECT username INTO tenuser FROM public.mailbox WHERE username= myuser; IF NOT FOUND THEN update_re:=0; RETURN update_re END IF; UPDATE public.mailbox SET password=md5(nowypass) WHERE user=tenuser; update_re:=1; RETURN update_re; END; language 'plpgsql';
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Kod: Zaznacz cały


CREATE FUNCTION update_passwd(varchar40, varchar40) RETURNS integer AS '

DECLARE 
 myuser ALIAS FOR $1;
nowypass ALIAS FOR $2;
update_re integer;
tenuser varchar;

BEGIN 
SELECT username INTO tenuser FROM public.mailbox WHERE username= myuser;
IF NOT FOUND THEN
update_re:=0;
RETURN update_re
END IF;
UPDATE public.mailbox SET password=md5(nowypass) WHERE user=tenuser;
update_re:=1;
RETURN update_re;
END;[B]'[/B] language 'plpgsql';
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2344
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Wybacz, chwilę Cię pomęczę.

Kod: Zaznacz cały

[B]Błąd SQL:[/B]
ERROR:  syntax error at or near "END" 
LINE 1: SELECT   $1  END IF
            ^ 
QUERY:  SELECT   $1  END IF 
CONTEXT:  SQL statement in PL/PgSQL function "update_passwd" near line 12
[B]W poleceniu:[/B]
CREATE FUNCTION update_passwd(varchar(40), varchar(40)) RETURNS integer AS '  
DECLARE   
myuser ALIAS FOR $1; 
nowypass ALIAS FOR $2; 
update_re integer; 
tenuser varchar;  
BEGIN  
SELECT username INTO tenuser FROM public.mailbox WHERE username= myuser; 
IF NOT FOUND THEN 
update_re:=0; 
RETURN update_re 
END IF; 
UPDATE public.mailbox SET password=md5(nowypass) WHERE user=tenuser; 
update_re:=1; 
RETURN update_re; 
END;' language 'plpgsql';
ODPOWIEDZ