mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 08:26:37 +02:00
Added a new authentication module to connect to a First Class server!
Contributed by Tortsten Anderson <torsten.anderson at skeria.skelleftea.se>
This commit is contained in:
parent
f29667f638
commit
1e9e22e8e9
4 changed files with 527 additions and 0 deletions
71
auth/fc/Readme.txt
Normal file
71
auth/fc/Readme.txt
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
Moodle - FirstClass authentication module
|
||||||
|
-----------------------------------------
|
||||||
|
This module uses the FirstClass Flexible Provisining Protocol (FPP) to communicate between the FirstClass server
|
||||||
|
and the Moodle host.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
1. Enable FPP on the FirstClass server
|
||||||
|
FPP is not doumented in the FirstClass documentation and is not enable by default.
|
||||||
|
To enable the protocol you need to edit the file \FCPO\Server\Netinfo. Open the file and insert the
|
||||||
|
following lines.
|
||||||
|
|
||||||
|
// TCP port for Flexible Provisioning Protocol (FPP).
|
||||||
|
TCPFPPPORT = 3333
|
||||||
|
|
||||||
|
|
||||||
|
2. Create an account on the FirstClass server with privilege "Subadministrator".
|
||||||
|
Using the FPP protocoll this module logs in to the FirstClass server and issuess batch admin commands.
|
||||||
|
Batch admin command can only be issued in the context of a user with subadministrative privileges.
|
||||||
|
|
||||||
|
Default account name is "fcMoodle".
|
||||||
|
|
||||||
|
|
||||||
|
3. Check that the FPP protocoll is working by running a Telnet session. If everyting is working you
|
||||||
|
should get a "+0" answer from the server.
|
||||||
|
|
||||||
|
> telnet yourhost.domain.com 3333
|
||||||
|
+0
|
||||||
|
|
||||||
|
Check that the "fcMoodle" is working by entering the following sequens of commands:
|
||||||
|
|
||||||
|
> telnet yourhost.domain.com 3333
|
||||||
|
+0
|
||||||
|
fcMoodle
|
||||||
|
+0
|
||||||
|
|
||||||
|
the_password_you_gave_fcmoodle
|
||||||
|
+0
|
||||||
|
|
||||||
|
Get user some_user_id 1201
|
||||||
|
|
||||||
|
1201 0 some_user_id
|
||||||
|
+0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4. On the Moodle host go to the directory where you have installed Moodle.
|
||||||
|
Open the folder "auth", where all other authentication modules are installed,
|
||||||
|
and create a new directory with the name "fc".
|
||||||
|
|
||||||
|
Copy the files "config.html", "fcFPP.php" and "lib.php" to the "auth" directory.
|
||||||
|
|
||||||
|
Now you need to add som strings to the language file. This distribution contains
|
||||||
|
string for the English (en) and Swedish (sv) translation.
|
||||||
|
|
||||||
|
Open the file "auth.php" in the folder "lang/sv" and paste the text from the file
|
||||||
|
"auth.php - sv.txt" at the end of the file above the line "?>"
|
||||||
|
|
||||||
|
Open the file "auth.php" in the folder "lang/en" and paste the text from the file
|
||||||
|
"auth.php - en.txt" at the end of the file above the line "?>"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
84
auth/fc/config.html
Normal file
84
auth/fc/config.html
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
<?PHP
|
||||||
|
if (!isset($config->auth_fchost)) {
|
||||||
|
$config->auth_fchost = "127.0.0.1";
|
||||||
|
}
|
||||||
|
if (!isset($config->auth_fcfppport)) {
|
||||||
|
$config->auth_fcfppport = "3333";
|
||||||
|
}
|
||||||
|
if (!isset($config->auth_fcuserid)) {
|
||||||
|
$config->auth_fcuserid = "fcMoodle";
|
||||||
|
}
|
||||||
|
if (!isset($config->auth_fcpasswd)) {
|
||||||
|
$config->auth_fcpasswd = "";
|
||||||
|
}
|
||||||
|
if (!isset($config->auth_fccreators)) {
|
||||||
|
$config->auth_fccreators = "";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<TR valign="top" BGCOLOR="<?php echo $THEME->cellheading2 ?>">
|
||||||
|
<TD ALIGN=RIGHT><P>auth_fchost:</TD>
|
||||||
|
<TD>
|
||||||
|
<INPUT name=auth_fchost TYPE=text SIZE=30 VALUE="<?php echo $config->auth_fchost?>">
|
||||||
|
<?php if (isset($err["auth_fchost"])) formerr($err["auth_fchost"]); ?>
|
||||||
|
</TD>
|
||||||
|
<TD>
|
||||||
|
<?php print_string("auth_fchost","auth") ?>
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
|
||||||
|
<TR valign="top" BGCOLOR="<?php echo $THEME->cellheading2 ?>">
|
||||||
|
<TD ALIGN=RIGHT><P>auth_fcfppport:</TD>
|
||||||
|
<TD>
|
||||||
|
<INPUT name=auth_fcfppport TYPE=text SIZE=30 VALUE="<?php echo $config->auth_fcfppport?>">
|
||||||
|
<?php if (isset($err["auth_fcfppport"])) formerr($err["auth_fchost"]); ?>
|
||||||
|
</TD>
|
||||||
|
<TD>
|
||||||
|
<?php print_string("auth_fcfppport","auth") ?>
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
|
||||||
|
<TR valign="top" BGCOLOR="<?php echo $THEME->cellheading2 ?>">
|
||||||
|
<TD ALIGN=RIGHT><P>auth_fcuserid:</TD>
|
||||||
|
<TD>
|
||||||
|
<INPUT name=auth_fcuserid TYPE=text SIZE=30 MAXLENGTH=15 VALUE="<?php echo $config->auth_fcuserid?>">
|
||||||
|
<?php if (isset($err["auth_fcuserid"])) formerr($err["auth_fcuserid"]); ?>
|
||||||
|
</TD>
|
||||||
|
<TD>
|
||||||
|
<?php print_string("auth_fcuserid","auth") ?>
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
|
||||||
|
<TR valign="top" BGCOLOR="<?php echo $THEME->cellheading2 ?>">
|
||||||
|
<TD ALIGN=RIGHT><P>auth_fcpasswd:</TD>
|
||||||
|
<TD>
|
||||||
|
<INPUT name=auth_fcpasswd TYPE=password SIZE=30 MAXLENGTH=12 VALUE="<?php echo $config->auth_fcpasswd?>">
|
||||||
|
<?php if (isset($err["auth_fcpasswd"])) formerr($err["auth_fcpasswd"]); ?>
|
||||||
|
</TD>
|
||||||
|
<TD>
|
||||||
|
<?php print_string("auth_fcpasswd","auth") ?>
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
|
||||||
|
<TR valign="top" BGCOLOR="<?php echo $THEME->cellheading2 ?>">
|
||||||
|
<TD ALIGN=RIGHT><P>auth_fccreators:</TD>
|
||||||
|
<TD>
|
||||||
|
<INPUT name=auth_fccreators TYPE=text SIZE=30 VALUE="<?php echo $config->auth_fccreators?>">
|
||||||
|
<?php if (isset($err["auth_fccreators"])) formerr($err["auth_fccreators"]); ?>
|
||||||
|
</TD>
|
||||||
|
<TD>
|
||||||
|
<?php print_string("auth_fccreators","auth") ?>
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
|
||||||
|
|
||||||
|
<TR VALIGN=TOP>
|
||||||
|
<TD ALIGN=RIGHT><P><?php print_string("instructions", "auth") ?>:</TD>
|
||||||
|
<TD>
|
||||||
|
<TEXTAREA NAME=auth_instructions COLS=30 ROWS=10 WRAP=virtual><?php p($config->auth_instructions) ?></TEXTAREA>
|
||||||
|
</TD>
|
||||||
|
<TD>
|
||||||
|
<?php print_string("authinstructions","auth") ?>
|
||||||
|
<?php helpbutton("text", get_string("helptext")) ?>
|
||||||
|
</TD>
|
||||||
|
</TR>
|
218
auth/fc/fcFPP.php
Normal file
218
auth/fc/fcFPP.php
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
<?php
|
||||||
|
/************************************************************************/
|
||||||
|
/* fcFPP: Php class for FirstClass Flexible Provisining Protocol */
|
||||||
|
/* ============================================================= */
|
||||||
|
/* */
|
||||||
|
/* Copyright (c) 2004 SKERIA Utveckling, Teknous */
|
||||||
|
/* http://skeria.skelleftea.se */
|
||||||
|
/* */
|
||||||
|
/* Flexible Provisioning Protocol is a real-time, IP based protocol */
|
||||||
|
/* which provides direct access to the scriptable remote administration */
|
||||||
|
/* subsystem of the core FirstClass Server. Using FPP, it is possible to*/
|
||||||
|
/* implement automated provisioning and administration systems for */
|
||||||
|
/* FirstClass, avoiding the need for a point and click GUI. FPP can also*/
|
||||||
|
/* be used to integrate FirstClass components into a larger unified */
|
||||||
|
/* system. */
|
||||||
|
/* */
|
||||||
|
/* This program is free software. You can redistribute it and/or modify */
|
||||||
|
/* it under the terms of the GNU General Public License as published by */
|
||||||
|
/* the Free Software Foundation; either version 2 of the License. */
|
||||||
|
/************************************************************************/
|
||||||
|
/* Author: Torsten Anderson, torsten.anderson@skeria.skelleftea.se
|
||||||
|
*/
|
||||||
|
|
||||||
|
class fcFPP
|
||||||
|
{
|
||||||
|
var $_hostname; // hostname of FirstClass server we are connection to
|
||||||
|
var $_port; // port on which fpp is running
|
||||||
|
var $_conn = 0; // socket we are connecting on
|
||||||
|
var $_debug = FALSE; // set to true to see some debug info
|
||||||
|
|
||||||
|
// class constructor
|
||||||
|
function fcFPP($host="localhost", $port="3333")
|
||||||
|
{
|
||||||
|
$this->_hostname = $host;
|
||||||
|
$this->_port = $port;
|
||||||
|
$this->_user = "";
|
||||||
|
$this->_pwd = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// open a connection to the FirstClass server
|
||||||
|
function open()
|
||||||
|
{
|
||||||
|
if($this->_debug) echo "Connecting to host ";
|
||||||
|
$host = $this->_hostname;
|
||||||
|
$port = $this->_port;
|
||||||
|
|
||||||
|
if($this->_debug) echo "[$host:$port]..";
|
||||||
|
|
||||||
|
// open the connection to the FirstClass server
|
||||||
|
$conn = fsockopen($host, $port, $errno, $errstr, 5);
|
||||||
|
if(!$conn)
|
||||||
|
{
|
||||||
|
echo "connection failed!".$errno. $errstr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are connected
|
||||||
|
if($this->_debug) echo "connected!";
|
||||||
|
|
||||||
|
// Read connection message.
|
||||||
|
$line = fgets ($conn); //+0
|
||||||
|
$line = fgets ($conn); //new line
|
||||||
|
|
||||||
|
// store the connection in this class, so we can use it later
|
||||||
|
$this->_conn = & $conn;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// close any open connections
|
||||||
|
function close()
|
||||||
|
{
|
||||||
|
// get the current connection
|
||||||
|
$conn = &$this->_conn;
|
||||||
|
|
||||||
|
// close it if it's open
|
||||||
|
if($conn)
|
||||||
|
{
|
||||||
|
fclose($conn);
|
||||||
|
|
||||||
|
// cleanup the variable
|
||||||
|
unset($this->_conn);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Authenticate to the FirstClass server
|
||||||
|
function login($userid, $passwd)
|
||||||
|
{
|
||||||
|
// we did have a connection right?!
|
||||||
|
if($this->_conn)
|
||||||
|
{
|
||||||
|
# Send username
|
||||||
|
fputs($this->_conn,"$userid\r\n");
|
||||||
|
|
||||||
|
$line = fgets ($this->_conn); //new line
|
||||||
|
$line = fgets ($this->_conn); //+0
|
||||||
|
$line = fgets ($this->_conn); //new line
|
||||||
|
|
||||||
|
# Send password
|
||||||
|
fputs($this->_conn,"$passwd\r\n");
|
||||||
|
$line = fgets ($this->_conn); //new line
|
||||||
|
$line = fgets ($this->_conn); //+0
|
||||||
|
$line = fgets ($this->_conn); //+0 or message
|
||||||
|
|
||||||
|
if($this->_debug) echo $line;
|
||||||
|
|
||||||
|
if (preg_match ("/^\+0/", $line)) { //+0, user with subadmin privileges
|
||||||
|
$this->_user = $userid;
|
||||||
|
$this->_pwd = $passwd;
|
||||||
|
return TRUE;
|
||||||
|
} elseif (preg_match ("/^\Sorry/",$line)){ //Denied access but a valid user and password
|
||||||
|
return TRUE;
|
||||||
|
} else { //Invalid user or password
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the list of groups the user is a member of
|
||||||
|
function getGroups($userid){
|
||||||
|
|
||||||
|
$groups = array();
|
||||||
|
|
||||||
|
// we must be logged in as a user with subadmin privileges
|
||||||
|
if($this->_conn AND $this->_user) {
|
||||||
|
# Send BA-command to get groups
|
||||||
|
fputs($this->_conn,"GET USER '" . $userid . "' 4 -1\r");
|
||||||
|
$line = "";
|
||||||
|
while (!$line) {
|
||||||
|
$line = trim(fgets ($this->_conn));
|
||||||
|
}
|
||||||
|
$n = 0;
|
||||||
|
while ($line AND !preg_match("/^\+0/", $line) AND $line != "-1003") {
|
||||||
|
list( , , $groups[$n++]) = explode(" ",$line,3);
|
||||||
|
$line = trim(fgets ($this->_conn));
|
||||||
|
}
|
||||||
|
if($this->_debug) echo "getGroups:" . implode(",",$groups);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the user is member of any of the groups.
|
||||||
|
// Return the list of groups the user is member of.
|
||||||
|
function isMemberOf($userid, $groups){
|
||||||
|
|
||||||
|
$usergroups = array_map("strtolower",$this->getGroups($userid));
|
||||||
|
$groups = array_map("strtolower",$groups);
|
||||||
|
|
||||||
|
$result = array_intersect($groups,$usergroups);
|
||||||
|
|
||||||
|
if($this->_debug) echo "isMemberOf:" . implode(",",$result);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function getUserInfo($userid, $field){
|
||||||
|
|
||||||
|
$userinfo = "";
|
||||||
|
|
||||||
|
if($this->_conn AND $this->_user) {
|
||||||
|
# Send BA-command to get data
|
||||||
|
fputs($this->_conn,"GET USER '" . $userid . "' " . $field . "\r");
|
||||||
|
$line = "";
|
||||||
|
while (!$line) {
|
||||||
|
$line = trim(fgets ($this->_conn));
|
||||||
|
}
|
||||||
|
$n = 0;
|
||||||
|
while ($line AND !preg_match("/^\+0/", $line)) {
|
||||||
|
list( , , $userinfo) = explode(" ",$line,3);
|
||||||
|
$line = trim(fgets ($this->_conn));
|
||||||
|
}
|
||||||
|
if($this->_debug) echo "getUserInfo:" . $userinfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str_replace('\r',' ',trim($userinfo,'"'));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function getResume($userid){
|
||||||
|
|
||||||
|
$resume = "";
|
||||||
|
|
||||||
|
$pattern = "/\[.+:.+\..+\]/"; // Remove references to pictures in resumes
|
||||||
|
|
||||||
|
if($this->_conn AND $this->_user) {
|
||||||
|
# Send BA-command to get data
|
||||||
|
fputs($this->_conn,"GET RESUME '" . $userid . "' 6\r");
|
||||||
|
$line = "";
|
||||||
|
while (!$line) {
|
||||||
|
$line = trim(fgets ($this->_conn));
|
||||||
|
}
|
||||||
|
$n = 0;
|
||||||
|
while ($line AND !preg_match("/^\+0/", $line)) {
|
||||||
|
$resume .= preg_replace($pattern,"",str_replace('\r',"\n",trim($line,'6 ')));
|
||||||
|
$line = trim(fgets ($this->_conn));
|
||||||
|
//print $line;
|
||||||
|
|
||||||
|
}
|
||||||
|
if($this->_debug) echo "getResume:" . $resume;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $resume;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
154
auth/fc/lib.php
Normal file
154
auth/fc/lib.php
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
<?php // $Id$
|
||||||
|
|
||||||
|
// FirstClass authentication using FirstClass Flexible Provisining Protocol
|
||||||
|
|
||||||
|
/* Author: Torsten Anderson, torsten.anderson@skeria.skelleftea.se
|
||||||
|
|
||||||
|
CHANGELOG
|
||||||
|
|
||||||
|
README
|
||||||
|
Module will authenticate user against FirstClass server and check if user belongs to any of
|
||||||
|
the defined creator groups.
|
||||||
|
User authenticates using their existing FirstClass username and password.
|
||||||
|
Where possible userdata is copied from the FirstClass directory to Moodle. You may
|
||||||
|
want to modify this.
|
||||||
|
Module requires the fcFPP class to do it's jobb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
require('fcFPP.php');
|
||||||
|
|
||||||
|
|
||||||
|
function auth_user_login ($username, $password) {
|
||||||
|
/// Returns true if the username and password work
|
||||||
|
/// and false if they don't
|
||||||
|
|
||||||
|
global $CFG;
|
||||||
|
|
||||||
|
$hostname = $CFG->auth_fchost;
|
||||||
|
$port = $CFG->auth_fcfppport;
|
||||||
|
|
||||||
|
$retval = FALSE;
|
||||||
|
|
||||||
|
if (!$username or !$password) { // Don't allow blank usernames or passwords
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$fpp = new fcFPP($hostname,$port);
|
||||||
|
if ($fpp->open()) {
|
||||||
|
if ($fpp->login($username,$password)){
|
||||||
|
$retval = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$fpp->close();
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function auth_get_userinfo($username){
|
||||||
|
// Get user information from FirstCLass server and return it in an array.
|
||||||
|
// Localize this routine to fit your needs.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Moodle FirstCLass fieldID in UserInfo form
|
||||||
|
------ -----------------------------------
|
||||||
|
firstname 1202
|
||||||
|
lastname 1204
|
||||||
|
email 1252
|
||||||
|
icq -
|
||||||
|
phone1 1206
|
||||||
|
phone2 1207 (Fax)
|
||||||
|
institution -
|
||||||
|
department -
|
||||||
|
address 1205
|
||||||
|
city -
|
||||||
|
country -
|
||||||
|
lang -
|
||||||
|
timezone 8030 (Not used yet. Need to figure out how FC codes timezones)
|
||||||
|
|
||||||
|
description Get data from users resume. Pictures will be removed.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
global $CFG;
|
||||||
|
|
||||||
|
$hostname = $CFG->auth_fchost;
|
||||||
|
$port = $CFG->auth_fcfppport;
|
||||||
|
$userid = $CFG->auth_fcuserid;
|
||||||
|
$passwd = $CFG->auth_fcpasswd;
|
||||||
|
|
||||||
|
$userinfo = array();
|
||||||
|
|
||||||
|
$fpp = new fcFPP($hostname,$port);
|
||||||
|
if ($fpp->open()) {
|
||||||
|
if ($fpp->login($userid,$passwd)){
|
||||||
|
|
||||||
|
$userinfo['firstname'] = $fpp->getUserInfo($username,"1202");
|
||||||
|
$userinfo['lastname'] = $fpp->getUserInfo($username,"1204");
|
||||||
|
$userinfo['email'] = strtok($fpp->getUserInfo($username,"1252"),',');
|
||||||
|
$userinfo['phone1'] = $fpp->getUserInfo($username,"1206");
|
||||||
|
$userinfo['phone2'] = $fpp->getUserInfo($username,"1207");
|
||||||
|
$userinfo['description'] = $fpp->getResume($username);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fpp->close();
|
||||||
|
|
||||||
|
foreach($userinfo as $key => $value) {
|
||||||
|
if (!$value) {
|
||||||
|
unset($userinfo[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $userinfo;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function auth_iscreator($username=0) {
|
||||||
|
//Get users group membership from the FirstClass server user and check if
|
||||||
|
// user is member of one of the groups of creators.
|
||||||
|
|
||||||
|
global $CFG, $USER;
|
||||||
|
|
||||||
|
if (! $CFG->auth_fccreators) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $username) {
|
||||||
|
$username=$USER->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
$fcgroups = array();
|
||||||
|
|
||||||
|
$hostname = $CFG->auth_fchost;
|
||||||
|
$port = $CFG->auth_fcfppport;
|
||||||
|
$userid = $CFG->auth_fcuserid;
|
||||||
|
$passwd = $CFG->auth_fcpasswd;
|
||||||
|
|
||||||
|
$fpp = new fcFPP($hostname,$port);
|
||||||
|
if ($fpp->open()) {
|
||||||
|
if ($fpp->login($userid,$passwd)){
|
||||||
|
$fcgroups = $fpp->getGroups($username);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$fpp->close();
|
||||||
|
|
||||||
|
|
||||||
|
if ((! $fcgroups)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$creators = explode(";",$CFG->auth_fccreators);
|
||||||
|
|
||||||
|
foreach($creators as $creator) {
|
||||||
|
If (in_array($creator, $fcgroups)) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue