Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
simplesamlphp
Manage
Activity
Members
Labels
Plan
Jira
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
Perun
Perun ProxyIdP
v1
simplesamlphp
Commits
e0668c5c
Commit
e0668c5c
authored
7 years ago
by
Thijs Kinkhorst
Browse files
Options
Downloads
Patches
Plain Diff
Fix formatting
parent
8baa8970
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
modules/sqlauth/lib/Auth/Source/SQL.php
+180
-180
180 additions, 180 deletions
modules/sqlauth/lib/Auth/Source/SQL.php
with
180 additions
and
180 deletions
modules/sqlauth/lib/Auth/Source/SQL.php
+
180
−
180
View file @
e0668c5c
...
...
@@ -11,188 +11,188 @@
class
sspmod_sqlauth_Auth_Source_SQL
extends
sspmod_core_Auth_UserPassBase
{
/**
* The DSN we should connect to.
*/
private
$dsn
;
/**
* The username we should connect to the database with.
*/
private
$username
;
/**
* The password we should connect to the database with.
*/
private
$password
;
/**
* The options that we should connect to the database with.
*/
private
$options
;
/**
* The query we should use to retrieve the attributes for the user.
*
* The username and password will be available as :username and :password.
*/
private
$query
;
/**
* Constructor for this authentication source.
*
* @param array $info Information about this authentication source.
* @param array $config Configuration.
*/
public
function
__construct
(
$info
,
$config
)
/**
* The DSN we should connect to.
*/
private
$dsn
;
/**
* The username we should connect to the database with.
*/
private
$username
;
/**
* The password we should connect to the database with.
*/
private
$password
;
/**
* The options that we should connect to the database with.
*/
private
$options
;
/**
* The query we should use to retrieve the attributes for the user.
*
* The username and password will be available as :username and :password.
*/
private
$query
;
/**
* Constructor for this authentication source.
*
* @param array $info Information about this authentication source.
* @param array $config Configuration.
*/
public
function
__construct
(
$info
,
$config
)
{
assert
(
is_array
(
$info
));
assert
(
is_array
(
$config
));
// Call the parent constructor first, as required by the interface
parent
::
__construct
(
$info
,
$config
);
// Make sure that all required parameters are present.
foreach
(
array
(
'dsn'
,
'username'
,
'password'
,
'query'
)
as
$param
)
{
if
(
!
array_key_exists
(
$param
,
$config
))
{
throw
new
Exception
(
'Missing required attribute \''
.
$param
.
'\' for authentication source '
.
$this
->
authId
);
}
if
(
!
is_string
(
$config
[
$param
]))
{
throw
new
Exception
(
'Expected parameter \''
.
$param
.
'\' for authentication source '
.
$this
->
authId
.
' to be a string. Instead it was: '
.
var_export
(
$config
[
$param
],
TRUE
));
}
}
$this
->
dsn
=
$config
[
'dsn'
];
$this
->
username
=
$config
[
'username'
];
$this
->
password
=
$config
[
'password'
];
$this
->
query
=
$config
[
'query'
];
if
(
isset
(
$config
[
'options'
]))
{
$this
->
options
=
$config
[
'options'
];
assert
(
is_array
(
$info
));
assert
(
is_array
(
$config
));
// Call the parent constructor first, as required by the interface
parent
::
__construct
(
$info
,
$config
);
// Make sure that all required parameters are present.
foreach
(
array
(
'dsn'
,
'username'
,
'password'
,
'query'
)
as
$param
)
{
if
(
!
array_key_exists
(
$param
,
$config
))
{
throw
new
Exception
(
'Missing required attribute \''
.
$param
.
'\' for authentication source '
.
$this
->
authId
);
}
if
(
!
is_string
(
$config
[
$param
]))
{
throw
new
Exception
(
'Expected parameter \''
.
$param
.
'\' for authentication source '
.
$this
->
authId
.
' to be a string. Instead it was: '
.
var_export
(
$config
[
$param
],
true
));
}
}
$this
->
dsn
=
$config
[
'dsn'
];
$this
->
username
=
$config
[
'username'
];
$this
->
password
=
$config
[
'password'
];
$this
->
query
=
$config
[
'query'
];
if
(
isset
(
$config
[
'options'
]))
{
$this
->
options
=
$config
[
'options'
];
}
}
/**
* Create a database connection.
*
* @return PDO The database connection.
*/
private
function
connect
()
{
try
{
$db
=
new
PDO
(
$this
->
dsn
,
$this
->
username
,
$this
->
password
,
$this
->
options
);
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to connect to \''
.
$this
->
dsn
.
'\': '
.
$e
->
getMessage
());
}
$db
->
setAttribute
(
PDO
::
ATTR_ERRMODE
,
PDO
::
ERRMODE_EXCEPTION
);
$driver
=
explode
(
':'
,
$this
->
dsn
,
2
);
$driver
=
strtolower
(
$driver
[
0
]);
/* Driver specific initialization. */
switch
(
$driver
)
{
case
'mysql'
:
/* Use UTF-8. */
$db
->
exec
(
"SET NAMES 'utf8mb4'"
);
break
;
case
'pgsql'
:
/* Use UTF-8. */
$db
->
exec
(
"SET NAMES 'UTF8'"
);
break
;
}
return
$db
;
}
/**
* Attempt to log in using the given username and password.
*
* On a successful login, this function should return the users attributes. On failure,
* it should throw an exception. If the error was caused by the user entering the wrong
* username or password, a SimpleSAML_Error_Error('WRONGUSERPASS') should be thrown.
*
* Note that both the username and the password are UTF-8 encoded.
*
* @param string $username The username the user wrote.
* @param string $password The password the user wrote.
* @return array Associative array with the users attributes.
*/
protected
function
login
(
$username
,
$password
)
{
assert
(
is_string
(
$username
));
assert
(
is_string
(
$password
));
$db
=
$this
->
connect
();
try
{
$sth
=
$db
->
prepare
(
$this
->
query
);
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to prepare query: '
.
$e
->
getMessage
());
}
try
{
$sth
->
execute
(
array
(
'username'
=>
$username
,
'password'
=>
$password
));
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to execute query: '
.
$e
->
getMessage
());
}
try
{
$data
=
$sth
->
fetchAll
(
PDO
::
FETCH_ASSOC
);
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to fetch result set: '
.
$e
->
getMessage
());
}
SimpleSAML\Logger
::
info
(
'sqlauth:'
.
$this
->
authId
.
': Got '
.
count
(
$data
)
.
' rows from database'
);
if
(
count
(
$data
)
===
0
)
{
/* No rows returned - invalid username/password. */
SimpleSAML\Logger
::
error
(
'sqlauth:'
.
$this
->
authId
.
': No rows in result set. Probably wrong username/password.'
);
throw
new
SimpleSAML_Error_Error
(
'WRONGUSERPASS'
);
}
/* Extract attributes. We allow the resultset to consist of multiple rows. Attributes
* which are present in more than one row will become multivalued. null values and
* duplicate values will be skipped. All values will be converted to strings.
*/
$attributes
=
array
();
foreach
(
$data
as
$row
)
{
foreach
(
$row
as
$name
=>
$value
)
{
if
(
$value
===
null
)
{
continue
;
}
}
$value
=
(
string
)
$value
;
/**
* Create a database connection.
*
* @return PDO The database connection.
*/
private
function
connect
()
{
try
{
$db
=
new
PDO
(
$this
->
dsn
,
$this
->
username
,
$this
->
password
,
$this
->
options
);
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to connect to \''
.
$this
->
dsn
.
'\': '
.
$e
->
getMessage
());
}
$db
->
setAttribute
(
PDO
::
ATTR_ERRMODE
,
PDO
::
ERRMODE_EXCEPTION
);
$driver
=
explode
(
':'
,
$this
->
dsn
,
2
);
$driver
=
strtolower
(
$driver
[
0
]);
/* Driver specific initialization. */
switch
(
$driver
)
{
case
'mysql'
:
/* Use UTF-8. */
$db
->
exec
(
"SET NAMES 'utf8mb4'"
);
break
;
case
'pgsql'
:
/* Use UTF-8. */
$db
->
exec
(
"SET NAMES 'UTF8'"
);
break
;
}
return
$db
;
}
/**
* Attempt to log in using the given username and password.
*
* On a successful login, this function should return the users attributes. On failure,
* it should throw an exception. If the error was caused by the user entering the wrong
* username or password, a SimpleSAML_Error_Error('WRONGUSERPASS') should be thrown.
*
* Note that both the username and the password are UTF-8 encoded.
*
* @param string $username The username the user wrote.
* @param string $password The password the user wrote.
* @return array Associative array with the users attributes.
*/
protected
function
login
(
$username
,
$password
)
{
assert
(
is_string
(
$username
));
assert
(
is_string
(
$password
));
$db
=
$this
->
connect
();
try
{
$sth
=
$db
->
prepare
(
$this
->
query
);
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to prepare query: '
.
$e
->
getMessage
());
}
try
{
$sth
->
execute
(
array
(
'username'
=>
$username
,
'password'
=>
$password
));
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to execute query: '
.
$e
->
getMessage
());
}
try
{
$data
=
$sth
->
fetchAll
(
PDO
::
FETCH_ASSOC
);
}
catch
(
PDOException
$e
)
{
throw
new
Exception
(
'sqlauth:'
.
$this
->
authId
.
': - Failed to fetch result set: '
.
$e
->
getMessage
());
}
SimpleSAML\Logger
::
info
(
'sqlauth:'
.
$this
->
authId
.
': Got '
.
count
(
$data
)
.
' rows from database'
);
if
(
count
(
$data
)
===
0
)
{
/* No rows returned - invalid username/password. */
SimpleSAML\Logger
::
error
(
'sqlauth:'
.
$this
->
authId
.
': No rows in result set. Probably wrong username/password.'
);
throw
new
SimpleSAML_Error_Error
(
'WRONGUSERPASS'
);
}
/* Extract attributes. We allow the resultset to consist of multiple rows. Attributes
* which are present in more than one row will become multivalued. NULL values and
* duplicate values will be skipped. All values will be converted to strings.
*/
$attributes
=
array
();
foreach
(
$data
as
$row
)
{
foreach
(
$row
as
$name
=>
$value
)
{
if
(
$value
===
null
)
{
continue
;
}
$value
=
(
string
)
$value
;
if
(
!
array_key_exists
(
$name
,
$attributes
))
{
$attributes
[
$name
]
=
array
();
}
if
(
in_array
(
$value
,
$attributes
[
$name
],
TRUE
))
{
/* Value already exists in attribute. */
continue
;
}
$attributes
[
$name
][]
=
$value
;
}
}
SimpleSAML\Logger
::
info
(
'sqlauth:'
.
$this
->
authId
.
': Attributes: '
.
implode
(
','
,
array_keys
(
$attributes
)));
return
$attributes
;
}
if
(
!
array_key_exists
(
$name
,
$attributes
))
{
$attributes
[
$name
]
=
array
();
}
if
(
in_array
(
$value
,
$attributes
[
$name
],
true
))
{
/* Value already exists in attribute. */
continue
;
}
$attributes
[
$name
][]
=
$value
;
}
}
SimpleSAML\Logger
::
info
(
'sqlauth:'
.
$this
->
authId
.
': Attributes: '
.
implode
(
','
,
array_keys
(
$attributes
)));
return
$attributes
;
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment