diff --git a/Dockerfile b/Dockerfile index e5cb9d3e5e2bb2fe9ab9d15c0b4f4d992b0de164..919c5605b2a968ee82738dc4c11072046837c136 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,9 +9,10 @@ RUN echo $FAAS_REGISTRY_NAME > /faas-docker-name RUN echo $FAAS_REGISTRY_VERSION > /faas-docker-version RUN apt-get -q update && \ - apt-get install -y memcached apache2 python3-pip composer git mc wget gearman-tools gearman && \ + apt-get install -y apache2 python3-pip composer gearman-tools gearman && \ + apt-get install -y composer gearman gearman-tools python3-pip && \ apt-get install -y php php-common php7.4-opcache php-gd php-curl php-intl php-mbstring php-xmlrpc php-mysql php-soap php-bcmath php-zip php-memcached php-apcu php-cli php-xml php-gearman libapache2-mod-php && \ - apt-get install -y mariadb-client && \ + apt-get install -y mariadb-client git mc memcached wget && \ apt-get -y autoremove && \ apt-get -y clean @@ -54,4 +55,6 @@ COPY ./conf/etc/apache2/sites-available/000-default.conf /etc/apache2/sites-avai COPY ./conf/etc/supervisord.conf /etc/supervisord.conf COPY ./conf/etc/entrypoint /etc/entrypoint +COPY ./conf/etc/registry/application/controllers/CLISetup.php /opt/rr3/application/controllers/CLISetup.php + ENTRYPOINT ["/etc/entrypoint"] \ No newline at end of file diff --git a/conf/credentials/faas-registry-default.cnf b/conf/credentials/faas-registry-default.cnf index 5bd62493f5ce3c94c5f38cdf858dc71797ab5c22..28aff77d320beae8f9e6c081c5b27ea4f6ef5a26 100644 --- a/conf/credentials/faas-registry-default.cnf +++ b/conf/credentials/faas-registry-default.cnf @@ -1,4 +1,5 @@ MYSQL_ROOT_PASSWORD=changeme FAAS_REGISTRY_DB_PASSWORD=changeme FAAS_REGISTRY_RR_SYNCPASS=changeme -FAAS_REGISTRY_RR_MAIL_PASS= \ No newline at end of file +FAAS_REGISTRY_RR_MAIL_PASS= +FAAS_REGISTRY_RR_FIRSTUSER_PASSWORD=changeme diff --git a/conf/etc/registry/application/config/config.php b/conf/etc/registry/application/config/config.php index 821e76add024b8f018d225c37caf04adaaec8956..60f765f411c89386b72650a6ac01f641aa1fae2a 100644 --- a/conf/etc/registry/application/config/config.php +++ b/conf/etc/registry/application/config/config.php @@ -126,7 +126,7 @@ $config['subclass_prefix'] = 'MY_'; | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! | */ -$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; +$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-@'; /* diff --git a/conf/etc/registry/application/controllers/CLISetup.php b/conf/etc/registry/application/controllers/CLISetup.php new file mode 100644 index 0000000000000000000000000000000000000000..aec34b79a6618d36b2aef9c001eacc83c52d0daf --- /dev/null +++ b/conf/etc/registry/application/controllers/CLISetup.php @@ -0,0 +1,196 @@ +<?php +if (!defined('BASEPATH')) { + exit('No direct script access allowed'); +} +/** + * ResourceRegistry3 + * + * @package RR3 + * @author Middleware Team HEAnet + * @copyright Copyright (c) 2012, HEAnet Limited (http://www.heanet.ie) + * @license MIT http://www.opensource.org/licenses/mit-license.php + * + */ + +/** + * Setup CLI Class + * + * @package RR3 + * @author Dariusz Janny <janny@man.poznan.pl> + */ + + +class CLISetup extends MY_Controller { + + protected $em; + protected $member_role; + + public function __construct() { + parent::__construct(); + $this->em = $this->doctrine->em; + + + $setup_allowed = $this->config->item('rr_setup_allowed'); + if (!$setup_allowed === TRUE) { + //show_error('Setup is disabled', 404); + } + $this->member_role = null; + } + + public function submit($username, $email, $password, $fname, $sname) { + if (is_cli()) { + /** + * add user, system roles, and add user to Administrator role + */ + $this->_populateFirstUser($username, $email, $password,$fname,$sname); + + /** + * populate attributes + */ + $this->_populateAttributes(); + $this->_populateResources(); + $this->em->flush(); + } + } + + private function _populateResources() { + $resources = array( + array('name' => 'default', 'parent' => '', 'default' => 'none'), + array('name' => 'importer', 'parent' => 'default', 'default' => 'none'), + array('name' => 'sp_list', 'parent' => 'default', 'default' => 'read'), + array('name' => 'idp_list', 'parent' => 'default', 'default' => 'read'), + array('name' => 'dashboard', 'parent' => 'default', 'default' => 'read'), + array('name' => 'federation', 'parent' => 'default', 'default' => 'read'), + array('name' => 'entity', 'parent' => 'default', 'default' => 'read'), + array('name' => 'idp', 'parent' => 'entity', 'default' => 'read'), + array('name' => 'sp', 'parent' => 'entity', 'default' => 'read'), + array('name' => 'user', 'parent' => 'default', 'default' => 'read'), + array('name' => 'password', 'parent' => 'user', 'default' => 'none'), + ); + $parents = array(); + foreach ($resources as $r) { + $r_name = $r['name']; + $parent_name = $r['parent']; + if (empty($parent_name)) { + $res = new models\AclResource; + $res->setResource($r['name']); + $res->setDefaultValue($r['default']); + $parents[$r['name']] = $res; + } else { + + $res = new models\AclResource; + $res->setResource($r['name']); + $res->setDefaultValue($r['default']); + $res->setParent($parents[$r['parent']]); + $parents[$r['name']] = $res; + } + $this->em->persist($res); + if($r_name == 'dashboard' || $r_name == 'sp_list' || $r_name == 'idp_list' || $r_name == 'entity') + { + $acl = new models\Acl; + $acl->setResource($res); + $acl->setRole($this->member_role); + $acl->setAction('read'); + $acl->setAccess(true); + $this->em->persist($acl); + } + + } + } + + private function _populateFirstUser($username, $email, $password, $fname, $sname) { + + $guest_role = new models\AclRole; + $guest_role->setName('Guest'); + $guest_role->setDescription('role with lowest permissions'); + $guest_role->setType('system'); + $this->em->persist($guest_role); + + $user_role = new models\AclRole; + $user_role->setName('Member'); + $user_role->setDescription('role with middle permissions'); + $user_role->setParent($guest_role); + $user_role->setType('system'); + $this->em->persist($user_role); + $this->member_role = $user_role; + + $admin_role = new models\AclRole; + $admin_role->setName('Administrator'); + $admin_role->setDescription('role with highest permissions, only resource registry admins may be members of this group'); + $admin_role->setParent($user_role); + $admin_role->setType('system'); + $this->em->persist($admin_role); + + $user = $this->em->getRepository("models\User")->findOneBy(array('username' => $username)); + if (empty($user)) { + $user = new models\User; + } + $user->setSalt(); + $user->setUsername($username); + $user->setPassword($password); + $user->setEmail($email); + $user->setGivenname($fname); + $user->setSurname($sname); + $user->setLocalEnabled(); + $user->setFederatedDisabled(); + $user->setAccepted(); + $user->setEnabled(); + $user->setValid(); + $admin_role->setMember($user); + $this->em->persist($user); + return true; + } + + private function _populateAttributes() { + $attributes = array( + array('name' => 'preferredLanguage', 'fullname' => 'Preferred Language', 'oid' => 'urn:oid:2.16.840.1.113730.3.1.39', 'urn' => 'urn:mace:dir:attribute-def:preferredLanguage', 'description' => 'Preferred language: Users preferred language (see RFC1766)'), + array('name' => 'email', 'fullname' => 'Email', 'oid' => 'urn:oid:0.9.2342.19200300.100.1.3', 'urn' => 'urn:mace:dir:attribute-def:mail', 'description' => 'E-Mail: Preferred address for e-mail to be sent to this person'), + array('name' => 'homePostalAddress', 'fullname' => 'Home postal address', 'oid' => 'urn:oid:0.9.2342.19200300.100.1.39', 'urn' => 'urn:mace:dir:attribute-def:homePostalAddress', 'description' => 'Home postal address: Home address of the user'), + array('name' => 'postalAddress', 'fullname' => 'Business postal address', 'oid' => 'urn:oid:2.5.4.16', 'urn' => 'urn:mace:dir:attribute-def:postalAddress', 'description' => 'Business postal address: Campus or office address'), + array('name' => 'homePhone', 'fullname' => 'Private phone number', 'oid' => 'urn:oid:0.9.2342.19200300.100.1.20', 'urn' => 'urn:mace:dir:attribute-def:homePhone', 'description' => 'Private phone number'), + array('name' => 'telephoneNumber', 'fullname' => 'Business phone number', 'oid' => 'urn:oid:2.5.4.20', 'urn' => 'urn:mace:dir:attribute-def:telephoneNumber', 'description' => 'Business phone number: Office or campus phone number'), + array('name' => 'mobile', 'fullname' => 'Mobile phone number', 'oid' => 'urn:oid:0.9.2342.19200300.100.1.41', 'urn' => 'urn:mace:dir:attribute-def:mobile', 'description' => 'Mobile phone number'), + array('name' => 'eduPersonAffiliation', 'fullname' => 'Affiliation', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.1', 'urn' => 'urn:mace:dir:attribute-def:eduPersonAffiliation', 'description' => 'Affiliation: Type of affiliation with Home Organization'), + array('name' => 'eduPersonOrgDN', 'fullname' => 'Organization path', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.3', 'urn' => 'urn:mace:dir:attribute-def:eduPersonOrgDN', 'description' => 'Organization path: The distinguished name (DN) of the directory entry representing the organization with which the person is associated'), + array('name' => 'eduPersonOrgUnitDN', 'fullname' => 'Organizational unit path', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.4', 'urn' => 'urn:mace:dir:attribute-def:eduPersonOrgUnitDN', 'description' => 'Organization unit path: The distinguished name (DN) of the directory entries representing the person\'s Organizational Unit(s)'), + array('name' => 'eduPersonEntitlement', 'fullname' => 'Entitlement', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.7', 'urn' => 'urn:mace:dir:attribute-def:eduPersonEntitlement', 'description' => 'Member of: URI (either URL or URN) that indicates a set of rights to specific resources based on an agreement ac'), + array('name' => 'surname', 'fullname' => 'Surname', 'oid' => 'urn:oid:2.5.4.4', 'urn' => 'urn:mace:dir:attribute-def:sn', 'description' => 'Surname or family name'), + array('name' => 'givenName', 'fullname' => 'Given name', 'oid' => 'urn:oid:2.5.4.42', 'urn' => 'urn:mace:dir:attribute-def:givenName', 'description' => 'Given name of a person'), + array('name' => 'uid', 'fullname' => 'User ID', 'oid' => 'urn:oid:0.9.2342.19200300.100.1.1', 'urn' => 'urn:mace:dir:attribute-def:uid', 'description' => 'A unique identifier for a person, mainly used for user identification within the user\'s home organization.'), + array('name' => 'employeeNumber', 'fullname' => 'Employee number', 'oid' => 'urn:oid:2.16.840.1.113730.3.1.3', 'urn' => 'urn:mace:dir:attribute-def:employeeNumber', 'description' => 'Identifies an employee within an organization'), + array('name' => 'ou', 'fullname' => 'Organizational Unit', 'oid' => 'urn:oid:2.5.4.11', 'urn' => 'urn:mace:dir:attribute-def:ou', 'description' => 'OrganizationalUnit currently used for faculty membership of staff at UZH.'), + array('name' => 'eduPersonPrincipalName', 'fullname' => 'Principal Name', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6', 'urn' => 'urn:mace:dir:attribute-def:eduPersonPrincipalName', 'description' => 'eduPerson per Internet2 and EDUCAUSE see http://www.nmi-edit.org/eduPerson/draft-internet2-mace'), + array('name' => 'eduPersonAssurance', 'fullname' => 'Assurance Level', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.11', 'urn' => 'urn:mace:dir:attribute-def:assurance', 'description' => 'Level that describes the confidences that one can have into the asserted identity of the user.'), + array('name' => 'transientId', 'fullname' => 'transient nameid for backward compatibility', 'oid' => 'urn:oid:1.2.3.4.5.6.7.8.9.10', 'urn' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient', 'description' => 'The Shibboleth transient ID is a name format that was used to encode eduPersonTargetedID in the past. A limited number of resources outside the Edugate federation still require this format', 'immeta'=>false), + array('name' => 'organizationName', 'fullname' => 'Organization Name', 'oid' => 'urn:oid:2.5.4.10', 'urn' => 'urn:mace:dir:attribute-def:o', 'description' => NULL), + array('name' => 'eduPersonTargetedID', 'fullname' => 'eduPerson Targeted ID', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10', 'urn' => 'urn:mace:dir:attribute-def:eduPersonTargetedID', 'description' => 'A pseudonomynous ID generated by the IdP that is unique to each SP'), + array('name' => 'persistentUID', 'fullname' => 'persistentUID', 'oid' => 'urn:oid:3.6.1.4.1.5923.1.1.1.10', 'urn' => 'urn:mace:eduserv.org.uk:athens:attribute-def:person:1.0:persistentUID', 'description' => 'This is the Athens persistentUID, it has no OID so we re-use the EduPerson PersistenID OID as it is closest'), + array('name' => 'eduPersonScopedAffiliation', 'fullname' => 'Affiliation (Scoped)', 'oid' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.9', 'urn' => 'urn:mace:dir:attribute-def:eduPersonScopedAffiliation ', 'description' => 'the affiliation of the user to the organisation concatendated with the domain name of the org (e.g. staff@dcu.ie)'), + array('name' => 'persistentId', 'fullname' => 'persistent nameid', 'oid' => 'urn:oid:1.2.3.4.5.6.7.8.9.11', 'urn' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', 'description' => 'This attribute will appear in the subject section of AuthnRespones, only to be used if the service cannot handle a persistent ID within the attribute section of the AuthnResponse', 'inmeta'=>false), + array('name' => 'freebusyurl', 'fullname' => 'freebusyurl', 'oid' => 'urn:oid:1.3.6.1.4.1.250.1.57', 'urn' => 'urn:mace:heanet.ie:attributedef:freebusyurl', 'description' => 'freebusyurl is a url to a user calendar in caldav format'), + array('name' => 'sAMAccountName', 'fullname' => 'sAMAccountName', 'oid' => 'urn:oid:1.2.840.113556.1.4.221', 'urn' => 'urn:oid:1.2.840.113556.1.4.221', 'description' => 'sAMAccountName from Active Directory') + ); + + $i = 0; + foreach ($attributes as $attr) { + $at[$i] = new models\Attribute; + $at[$i]->setName($attr['name']); + $at[$i]->setFullname($attr['fullname']); + $at[$i]->setOid($attr['oid']); + $at[$i]->setUrn($attr['urn']); + $at[$i]->setDescription($attr['description']); + if(array_key_exists('inmeta',$attr)){ + $at[$i]->setShowInmetadata($attr['inmeta']); + } + else { + $at[$i]->setShowInmetadata(true); + } + $i++; + } + foreach ($at as $key) { + $this->em->persist($key); + } + return true; + } + +} diff --git a/conf/faas-registry.cnf b/conf/faas-registry.cnf index b14cd145cdc67025ab66f81561d127620d8e2473..0f3c7a115df82babd033b2e91dca39d691d8b935 100644 --- a/conf/faas-registry.cnf +++ b/conf/faas-registry.cnf @@ -9,7 +9,7 @@ FAAS_REGISTRY_BASE_URL=http://localhost:9080 FAAS_REGISTRY_COOKIE_SECURE=FALSE FAAS_REGISTRY_TIMEZONE=Europe/Warsaw -FAAS_REGISTRY_RR_SETUP_ALLOWED=TRUE +FAAS_REGISTRY_RR_SETUP_ALLOWED=FALSE FAAS_REGISTRY_RR_SUPPORT_MAILTO=janny@man.poznan.pl FAAS_REGISTRY_DB_HOSTNAME=faas_db @@ -17,4 +17,9 @@ FAAS_REGISTRY_DB_USERNAME=rr3_user FAAS_REGISTRY_DB_NAME=rr3_db FAAS_REGISTRY_RR_MAIL_USER=postfix -FAAS_REGISTRY_RR_MAIL_FROM=janny@man.poznan.pl \ No newline at end of file +FAAS_REGISTRY_RR_MAIL_FROM=janny@man.poznan.pl + +FAAS_REGISTRY_RR_FIRSTUSER_USERNAME=admin +FAAS_REGISTRY_RR_FIRSTUSER_EMAIL=janny@man.poznan.pl +FAAS_REGISTRY_RR_FIRSTUSER_FNAME=John +FAAS_REGISTRY_RR_FIRSTUSER_SNAME=Doe