changeset 468:ff9dbe14f033

Don't use hex encoding for user impersonation when running it from a planned statement.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 22 Aug 2018 17:56:16 +0200
parents 73c7b2d6246e
children 788c87b99bae
files pkg/auth/opendb.go schema/manage_users.sql
diffstat 2 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/auth/opendb.go	Wed Aug 22 17:43:30 2018 +0200
+++ b/pkg/auth/opendb.go	Wed Aug 22 17:56:16 2018 +0200
@@ -2,7 +2,6 @@
 
 import (
 	"database/sql"
-	"encoding/hex"
 	"errors"
 
 	"github.com/jackc/pgx"
@@ -77,9 +76,7 @@
 		return nil
 	}
 	defer db.Close()
-	if _, err = db.Exec(
-		`SELECT public.setrole($1)`, hex.EncodeToString([]byte(role)),
-	); err == nil {
+	if _, err = db.Exec(`SELECT public.setrole_plan($1)`, role); err == nil {
 		err = fn(db)
 	}
 	return err
--- a/schema/manage_users.sql	Wed Aug 22 17:43:30 2018 +0200
+++ b/schema/manage_users.sql	Wed Aug 22 17:56:16 2018 +0200
@@ -215,3 +215,14 @@
 END;
 $$
     LANGUAGE plpgsql;
+
+-- To set a role in form of a plannable statement (which is save from SQL injections).
+CREATE OR REPLACE FUNCTION public.setrole_plan(role text) RETURNS void
+AS $$
+BEGIN
+    IF role IS NOT NULL AND role <> '' THEN
+        EXECUTE format('SET ROLE %I', role);
+    END IF;
+END;
+$$
+    LANGUAGE plpgsql;