Rules und crypt Problem

Lists: pgsql-de-allgemein
From: Oliver Kamzol <itsok(at)okamzol(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Rules und crypt Problem
Date: 2008-10-25 09:59:08
Message-ID: 4902EDEC.1030300@okamzol.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Hallo zusammen,

ich hab ein kleines Problem (oder ich seh den Wald vor lauter Bäumen nicht mehr...) mit der crypt Funktion, bzw. ihrem Gebrauch in Rules.

Wenn ich eine Tabelle tt habe und einen regulären Insert mache, funktioniert auch der Gebrauch von crypt:

= create table tt (un varchar(10), pw varchar(128));

CREATE TABLE

= insert into tt values ('me', crypt('pass',gen_salt('bf')));

INSERT 0 1

mitarbeiterideen= select * from tt;

un | pw

----+--------------------------------------------------------------

me | $2a$06$RHCI.brrz/UedPhDokDgTumljCvbG1QBofLWNaQfkaii6KzLFAO0y

(1 Zeile)

Funktioniert. Aber ich möchte jetzt gerne, daß das pw Feld per crypt verschlüsselt wird, auch wenn die Applikation nur plain übergibt, also

nur 'me' und 'pass'. Also dachte ich, ich kann das mit einer Regel lösen:

= CREATE RULE pw_tt AS ON INSERT TO tt

- DO INSTEAD

- INSERT INTO tt VALUES (NEW.un, crypt(NEW.pw, gen_salt('bf')));

CREATE RULE

= insert into tt values ('me', 'pass');

FEHLER: unendliche Rekursion entdeckt in Regeln für Relation »tt«

Kann mir bitte jemand erklären, wo hier der Fehler liegt? Ich schein betriebsblind zu sein, aber ich weiß nicht, woher er die Rekursionen holt...

Vielen Dank und Gruß

Oliver

Attachment Content-Type Size
unknown_filename text/html 1.7 KB
itsok.vcf text/x-vcard 256 bytes

From: Andreas Kretschmer <akretschmer(at)spamfence(dot)net>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Rules und crypt Problem
Date: 2008-10-26 15:54:22
Message-ID: 20081026155422.GA7344@tux
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Oliver Kamzol <itsok(at)okamzol(dot)de> schrieb:
> Funktioniert. Aber ich möchte jetzt gerne, daß das pw Feld per crypt
> verschlüsselt wird, auch wenn die Applikation nur plain übergibt, also
> nur 'me' und 'pass'. Also dachte ich, ich kann das mit einer Regel lösen:
>
> => CREATE RULE pw_tt AS ON INSERT TO tt
> -> DO INSTEAD
> -> INSERT INTO tt VALUES (NEW.un, crypt(NEW.pw, gen_salt('bf')));
> CREATE RULE
>
> => insert into tt values ('me', 'pass');
> FEHLER:  unendliche Rekursion entdeckt in Regeln für Relation »tt«
>
>
> Kann mir bitte jemand erklären, wo hier der Fehler liegt? Ich schein
> betriebsblind zu sein, aber ich weiß nicht, woher er die Rekursionen holt...

Die RULE macht bei insert ein instead insert. Die Rule für das Insert
ist wieder ein... richtig, insert.

Ich würde das eher als TRIGGER machen.

Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect. (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly." (unknown)
Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°


From: Oliver Kamzol <itsok(at)okamzol(dot)de>
To: Andreas Kretschmer <akretschmer(at)spamfence(dot)net>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Rules und crypt Problem
Date: 2008-10-26 22:02:20
Message-ID: 4904E8EC.9030002@okamzol.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Andreas Kretschmer schrieb:

Oliver Kamzol itsok(at)okamzol(dot)de schrieb:


Funktioniert. Aber ich möchte jetzt gerne, daß das pw Feld per crypt
verschlüsselt wird, auch wenn die Applikation nur plain übergibt, also
nur 'me' und 'pass'. Also dachte ich, ich kann das mit einer Regel lösen:

= CREATE RULE pw_tt AS ON INSERT TO tt
- DO INSTEAD
- INSERT INTO tt VALUES (NEW.un, crypt(NEW.pw, gen_salt('bf')));
CREATE RULE

= insert into tt values ('me', 'pass');
FEHLER: unendliche Rekursion entdeckt in Regeln für Relation »tt«

Kann mir bitte jemand erklären, wo hier der Fehler liegt? Ich schein
betriebsblind zu sein, aber ich weiß nicht, woher er die Rekursionen holt...


Die RULE macht bei insert ein instead insert. Die Rule für das Insert
ist wieder ein... richtig, insert.

Ich würde das eher als TRIGGER machen.

Das hab ich auch schon versucht, leider bekomme ich hierbei auch einen Fehler...

Etwas anders gestaltet, aber doch ähnlich.

=CREATE OR REPLACE FUNCTION makePwd() returns trigger AS

$ $$

$ BEGIN

$ IF TG_OP = 'INSERT' THEN

$ INSERT INTO tt VALUES (NEW.un, crypt(NEW.pw, gen_salt('bf')));

$ RETURN NEW;

$ END IF;

$ END;

$ $$ LANGUAGE 'plpgsql';

CREATE FUNCTION

= create trigger pwdtest before insert on tt for each row execute procedure makePwd();

CREATE TRIGGER

= insert into tt values ('me', 'pass');

-- hier passiert erstmal einige Sekunden nichts und dann:

FEHLER: Grenze für Stacktiefe überschritten

TIP: Erhöhen Sie den Konfigurationsparameter »max_stack_depth«, nachdem Sie sichergestellt haben, dass die Stacktiefenbegrenzung Ihrer Plattform ausreichend ist.

KONTEXT: SQL-Anweisung »INSERT INTO tt VALUES ( $1 , crypt( $2 , gen_salt('bf')))«

PL/pgSQL function "makepwd" line 3 at SQL statement

SQL-Anweisung »INSERT INTO tt VALUES ( $1 , crypt( $2 , gen_salt('bf')))«

PL/pgSQL function "makepwd" line 3 at SQL statement

SQL-Anweisung »INSERT INTO tt VALUES ( $1 , crypt( $2 , gen_salt('bf')))«

[...]

das ganze dann zig Mal.

Ich verstehe nicht, warum das mit der Stacktiefe zu tun hat - die übrigens auf dem Default steht.

Gruß Danke

Oliver

Andreas

--

its ok :: it service oliver kamzol

Oliver Kamzol

Heiligenbaumstr. 15

47249 Duisburg

email: itsok(at)okamzol(dot)de

mobile: +49 151 226 324 84

Attachment Content-Type Size
unknown_filename text/html 3.5 KB
itsok.vcf text/x-vcard 245 bytes

From: "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Rules und crypt Problem
Date: 2008-10-27 06:15:00
Message-ID: 20081027061500.GB28041@a-kretschmer.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

am Sat, dem 25.10.2008, um 11:59:08 +0200 mailte Oliver Kamzol folgendes:
> Hallo zusammen,
>
> ich hab ein kleines Problem (oder ich seh den Wald vor lauter BÀumen nicht
> mehr...) mit der crypt Funktion, bzw. ihrem Gebrauch in Rules.

Die Liste hat mal wieder ein Zeitloch, ich weiß, daß Du noch mal
geantwortet hast und es mit einem TRIGGER versucht hast, und wieder eine
Rekursion. (die Liste wird diese Mail sicher auch noch sehen...)

In Deiner Triggerfuntion rufst Du INSERT auf. Nun rate mal, was
passiert, wenn ein INSERT einen TRIGGER auslöst, der wieder ein INSERT
macht? Nein, so geht das nicht.

Was ich meinte:

In Deiner Triggerfunktion prüfen, ob NEW.pw ein bereits gecryptetes
Passwort enthält (Stringlänge prüfen oder so.). Falls nein, die Variable
NEW.pw passend behandeln. Das ganze als ein before insert - Trigger.

Andreas
--
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net


From: Mailings <mailings(at)vainsworld(dot)de>
To: "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Rules und crypt Problem
Date: 2008-10-27 13:35:17
Message-ID: 4905C395.9080203@vainsworld.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-15"
http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Hi Andreas,<br>
<br>
Danke! Ich hab den Wald vor lauter Bäumen tatsächlich nicht mehr
gesehen ;-)<br>
Hab den Trigger jetzt umgebaut und bin mit dem Ergebnis sehr zufrieden.<br>
<br>
Danke und Gruß<br>
 Oliver<br>
<br>
<br>
A. Kretschmer schrieb:
<blockquote cite="mid:20081027061500(dot)GB28041(at)a-kretschmer(dot)de"
type="cite">
<pre wrap="">am Sat, dem 25.10.2008, um 11:59:08 +0200 mailte Oliver Kamzol folgendes:
</pre>
<blockquote type="cite">
<pre wrap="">Hallo zusammen,

ich hab ein kleines Problem (oder ich seh den Wald vor lauter BÀumen nicht
mehr...) mit der crypt Funktion, bzw. ihrem Gebrauch in Rules.
</pre>
</blockquote>
<pre wrap=""><!---->
Die Liste hat mal wieder ein Zeitloch, ich weiß, daß Du noch mal
geantwortet hast und es mit einem TRIGGER versucht hast, und wieder eine
Rekursion. (die Liste wird diese Mail sicher auch noch sehen...)

In Deiner Triggerfuntion rufst Du INSERT auf. Nun rate mal, was
passiert, wenn ein INSERT einen TRIGGER auslöst, der wieder ein INSERT
macht? Nein, so geht das nicht.

Was ich meinte:

In Deiner Triggerfunktion prüfen, ob NEW.pw ein bereits gecryptetes
Passwort enthält (Stringlänge prüfen oder so.). Falls nein, die Variable
NEW.pw passend behandeln. Das ganze als ein before insert - Trigger.

Andreas
</pre>
</blockquote>
<br>
</body>
</html>

Attachment Content-Type Size
unknown_filename text/html 1.5 KB