Example #1
0
 /**
  * Set stuff that needs to be initialised once before a user record is created.
  */
 public function create()
 {
     $this->set('ctime', time());
     if (get_config('cleanurls') && is_null($this->urlid)) {
         $desiredurlid = generate_urlid($this->username, get_config('cleanurluserdefault'), 3, 30);
         $this->set('urlid', get_new_profile_urlid($desiredurlid));
     }
 }
function regenerateurls_submit(Pieform $form, $values)
{
    global $SESSION, $USER;
    require_once 'upgrade.php';
    log_debug("Regenerating clean urls...");
    db_begin();
    // Checking duplicates one by one is too slow, so drop the index,
    // generate the urlids in big chunks, remove duplicates in one hit,
    // recreate the index.
    // Users: set urlid based on username.
    $table = new XMLDBTable('usr');
    $index = new XMLDBIndex('urliduk');
    $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid'));
    drop_index($table, $index);
    execute_sql('UPDATE {usr} SET urlid = NULL WHERE NOT urlid IS NULL');
    $usrcount = count_records_select('usr', 'deleted = 0 AND id > 0');
    $sql = 'SELECT id, username FROM {usr} WHERE id > ? AND deleted = 0 ORDER BY id';
    $done = 0;
    $lastid = 0;
    $limit = 1000;
    while ($records = get_records_sql_array($sql, array($lastid), 0, $limit)) {
        $firstid = $lastid;
        $values = array();
        foreach ($records as $r) {
            $r->urlid = generate_urlid($r->username, get_config('cleanurluserdefault'), 3, 30);
            array_push($values, $r->id, $r->urlid);
            $lastid = $r->id;
        }
        $updatesql = "UPDATE {usr} SET urlid = CASE id\n ";
        $updatesql .= join("\n ", array_fill(0, count($records), 'WHEN ? THEN ?'));
        $updatesql .= "\n ELSE NULL\n END WHERE id > ? AND id <= ? AND deleted = 0";
        array_push($values, $firstid, $lastid);
        execute_sql($updatesql, $values);
        $done += count($records);
        log_debug("Generating user urls: {$done}/{$usrcount}");
    }
    // Fix any duplicates created above
    $dupurls = get_records_sql_array('
        SELECT id, urlid
        FROM {usr}
        WHERE urlid IN (
            SELECT urlid FROM {usr} WHERE id > 0 AND deleted = 0 GROUP BY urlid HAVING COUNT(id) > 1
        )
        ORDER BY urlid, id', array());
    $last = null;
    if ($dupurls) {
        log_debug('Fixing ' . count($dupurls) . ' duplicate user urls');
        $ids = array();
        $values = array();
        for ($i = 0; $i < count($dupurls); $i++) {
            if ($dupurls[$i]->urlid != $last) {
                // The first user with this name can keep it, but get all the taken urlids that are similar
                // so we can check against them when appending digits below.
                $taken = get_column_sql("SELECT urlid FROM {usr} WHERE urlid LIKE ?", array(substr($dupurls[$i]->urlid, 0, 24) . '%'));
            } else {
                // Subsequent users need digits appended, while keeping the max length at 30
                $suffix = 1;
                $try = substr($dupurls[$i]->urlid, 0, 28) . '-1';
                while (in_array($try, $taken)) {
                    $suffix++;
                    $try = substr($dupurls[$i]->urlid, 0, 29 - strlen($suffix)) . '-' . $suffix;
                }
                $taken[] = $try;
                $ids[] = $dupurls[$i]->id;
                array_push($values, $dupurls[$i]->id, $try);
            }
            $last = $dupurls[$i]->urlid;
        }
        $updatesql = "UPDATE {usr} SET urlid = CASE id\n ";
        $updatesql .= join("\n ", array_fill(0, count($values) / 2, 'WHEN ? THEN ?'));
        $updatesql .= "\n ELSE urlid\n END\n WHERE id IN (";
        $updatesql .= join(',', array_fill(0, count($ids), '?'));
        $updatesql .= ')';
        $values = array_merge($values, $ids);
        execute_sql($updatesql, $values);
    }
    $table = new XMLDBTable('usr');
    $index = new XMLDBIndex('urliduk');
    $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid'));
    add_index($table, $index);
    // Groups: set urlid based on group name
    execute_sql('UPDATE {group} SET urlid = NULL');
    $table = new XMLDBTable('group');
    $index = new XMLDBIndex('urliduk');
    $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid'));
    drop_index($table, $index);
    // Transliteration using iconv is bad if locale is set to C, so set it based on
    // the site language.
    $lang = $sitelang = get_config('lang');
    set_locale_for_language($lang);
    $groupcount = count_records('group', 'deleted', 0);
    $sql = 'SELECT id, name FROM {group} WHERE deleted = 0 AND id > ? ORDER BY id';
    $done = 0;
    $lastid = 0;
    $limit = 1000;
    while ($records = get_records_sql_array($sql, array($lastid), 0, $limit)) {
        $firstid = $lastid;
        $values = array();
        foreach ($records as $r) {
            $r->urlid = generate_urlid($r->name, get_config('cleanurlgroupdefault'), 3, 30);
            array_push($values, $r->id, $r->urlid);
            $lastid = $r->id;
        }
        $updatesql = "UPDATE {group} SET urlid = CASE id\n ";
        $updatesql .= join("\n ", array_fill(0, count($records), 'WHEN ? THEN ?'));
        $updatesql .= "\n ELSE NULL\n END WHERE id > ? AND id <= ? AND deleted = 0";
        array_push($values, $firstid, $lastid);
        execute_sql($updatesql, $values);
        $done += count($records);
        log_debug("Generating group urls: {$done}/{$groupcount}");
    }
    // Fix duplicates...
    $dupurls = get_records_sql_array('
        SELECT id, urlid
        FROM {group}
        WHERE urlid IN (
            SELECT urlid FROM {group} WHERE id > 0 AND deleted = 0 GROUP BY urlid HAVING COUNT(id) > 1
        )
        ORDER BY urlid, id', array());
    $last = null;
    if ($dupurls) {
        log_debug('Fixing ' . count($dupurls) . ' duplicate group urls');
        $ids = array();
        $values = array();
        for ($i = 0; $i < count($dupurls); $i++) {
            if ($dupurls[$i]->urlid != $last) {
                // The first group with this name can keep it, get similar group urls
                $taken = get_column_sql("SELECT urlid FROM {group} WHERE urlid LIKE ?", array(substr($dupurls[$i]->urlid, 0, 24) . '%'));
            } else {
                // Append digits while keeping the max length at 30
                $suffix = 1;
                $try = substr($dupurls[$i]->urlid, 0, 28) . '-1';
                while (in_array($try, $taken)) {
                    $suffix++;
                    $try = substr($dupurls[$i]->urlid, 0, 29 - strlen($suffix)) . '-' . $suffix;
                }
                $taken[] = $try;
                $ids[] = $dupurls[$i]->id;
                array_push($values, $dupurls[$i]->id, $try);
            }
            $last = $dupurls[$i]->urlid;
        }
        $updatesql = "UPDATE {group} SET urlid = CASE id\n ";
        $updatesql .= join("\n ", array_fill(0, count($values) / 2, 'WHEN ? THEN ?'));
        $updatesql .= "\n ELSE urlid\n END\n WHERE id IN (";
        $updatesql .= join(',', array_fill(0, count($ids), '?'));
        $updatesql .= ')';
        $values = array_merge($values, $ids);
        execute_sql($updatesql, $values);
    }
    $table = new XMLDBTable('group');
    $index = new XMLDBIndex('urliduk');
    $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid'));
    add_index($table, $index);
    // Views: set urlid based on view title.  Only portfolio views need urlids, and they
    // only need to be unique when they're owned by the same entity.
    // The iconv utf8 conversion gives better results if we set the locale based on the
    // user's language preference, so these are pulled from the db when appropriate.
    execute_sql('UPDATE {view} SET urlid = NULL');
    $table = new XMLDBTable('view');
    $index = new XMLDBIndex('urliduk');
    $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid', 'owner', 'group', 'institution'));
    drop_index($table, $index);
    $viewcount = count_records('view', 'type', 'portfolio');
    $sql = "\n        SELECT v.id, v.title, ap.value AS lang\n        FROM {view} v LEFT JOIN {usr_account_preference} ap ON ap.usr = v.owner AND ap.field = 'lang'\n        WHERE v.id > ? AND v.type = 'portfolio'\n        ORDER BY v.id";
    $done = 0;
    $lastid = 0;
    $limit = 1000;
    while ($records = get_records_sql_array($sql, array($lastid), 0, $limit)) {
        $firstid = $lastid;
        $values = array();
        foreach ($records as $r) {
            if (empty($r->lang) || $r->lang == 'default') {
                $r->lang = $sitelang;
            }
            if ($lang != $r->lang) {
                set_locale_for_language($r->lang);
                $lang = $r->lang;
            }
            $r->urlid = generate_urlid($r->title, get_config('cleanurlviewdefault'), 3, 100);
            array_push($values, $r->id, $r->urlid);
            $lastid = $r->id;
        }
        $updatesql = "UPDATE {view} SET urlid = CASE id\n ";
        $updatesql .= join("\n ", array_fill(0, count($records), 'WHEN ? THEN ?'));
        $updatesql .= "\n ELSE NULL\n END WHERE id > ? AND id <= ?";
        array_push($values, $firstid, $lastid);
        execute_sql($updatesql, $values);
        $done += count($records);
        log_debug("Generating page urls: {$done}/{$viewcount}");
    }
    // Reset locale
    set_locale_for_language($sitelang);
    // Fix duplicates with the same owner, group, or institution
    $dupurls = get_records_sql_array("\n        SELECT\n            v.id, dv.urlid, dv.owner, dv.group, dv.institution\n        FROM\n            {view} v,\n            (SELECT d.urlid, d.owner, d.group, d.institution\n             FROM {view} d\n             WHERE d.type = 'portfolio'\n             GROUP BY d.urlid, d.owner, d.group, d.institution\n             HAVING COUNT(d.id) > 1) dv\n        WHERE\n            v.type = 'portfolio'\n            AND v.urlid = dv.urlid\n            AND (v.owner = dv.owner OR (v.owner IS NULL AND dv.owner IS NULL))\n            AND (v.group = dv.group OR (v.group IS NULL AND dv.group IS NULL))\n            AND (v.institution = dv.institution OR (v.institution IS NULL AND dv.institution IS NULL))\n        ORDER BY\n            dv.urlid, dv.owner, dv.group, dv.institution, v.id", array());
    $last = array('urlid' => null, 'owner' => null, 'group' => null, 'institution' => null);
    if ($dupurls) {
        log_debug('Fixing ' . count($dupurls) . ' duplicate page urls');
        $ids = array();
        $values = array();
        for ($i = 0; $i < count($dupurls); $i++) {
            $hasdupes = clone $dupurls[$i];
            unset($hasdupes->id);
            if ($hasdupes != $last) {
                // The first view with this name can keep it
                // Get similar view names to check uniqueness when appending digits
                if (!is_null($hasdupes->owner)) {
                    $ownersql = 'owner = ?';
                    $ownervalue = $hasdupes->owner;
                } else {
                    if (!is_null($hasdupes->group)) {
                        $ownersql = 'group = ?';
                        $ownervalue = $hasdupes->group;
                    } else {
                        if (!is_null($hasdupes->institution)) {
                            $ownersql = 'institution = ?';
                            $ownervalue = $hasdupes->institution;
                        }
                    }
                }
                $taken = get_column_sql('SELECT urlid FROM {view} v WHERE urlid LIKE ? AND v.' . $ownersql, array(substr($dupurls[$i]->urlid, 0, 94), $ownervalue));
            } else {
                // Subsequent views with this name need digits appended, keeping max length at 100
                $suffix = 1;
                $try = substr($dupurls[$i]->urlid, 0, 98) . '-1';
                while (in_array($try, $taken)) {
                    $suffix++;
                    $try = substr($dupurls[$i]->urlid, 0, 99 - strlen($suffix)) . '-' . $suffix;
                }
                $taken[] = $try;
                $ids[] = $dupurls[$i]->id;
                array_push($values, $dupurls[$i]->id, $try);
            }
            $last = $hasdupes;
        }
        $updatesql = "UPDATE {view} SET urlid = CASE id\n ";
        $updatesql .= join("\n ", array_fill(0, count($values) / 2, 'WHEN ? THEN ?'));
        $updatesql .= "\n ELSE urlid\n END\n WHERE id IN (";
        $updatesql .= join(',', array_fill(0, count($ids), '?'));
        $updatesql .= ')';
        $values = array_merge($values, $ids);
        execute_sql($updatesql, $values);
    }
    $table = new XMLDBTable('view');
    $index = new XMLDBIndex('urliduk');
    $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid', 'owner', 'group', 'institution'));
    add_index($table, $index);
    // Reset in the session for this user - currently logged-in users may end up wiping theirs
    $USER->urlid = get_field('usr', 'urlid', 'id', $USER->get('id'));
    $USER->commit();
    db_commit();
    $SESSION->add_ok_msg(get_string('generateduserurls', 'admin', $usrcount));
    $SESSION->add_ok_msg(get_string('generatedgroupurls', 'admin', $groupcount));
    $SESSION->add_ok_msg(get_string('generatedviewurls', 'admin', $viewcount));
    redirect('/admin/extensions/cleanurls.php');
}
Example #3
0
 /**
  * Creates a new View for the given user, based on the given information
  * about the view.
  *
  * Validation of the view data is performed, then the View is created. If
  * the View is to be owned by a group, that group is given access to it.
  *
  * @param array $viewdata Data about the view. You can pass in most fields
  *                        that appear in the view table.
  *
  *                        Note that you set who owns the View by setting
  *                        either the owner, group or institution field as
  *                        approriate.
  *
  *                        Currently, you cannot pass in access data. Use
  *                        $view->set_access() after retrieving the $view
  *                        object.
  *
  * @param int $userid The user who has issued the command to create the
  *                    View (note: this is different from the "owner" of the
  *                    View - a group or institution could be the "owner",
  *                    but it's a _user_ who requests a View is created for it)
  * @return View The created View
  * @throws SystemException if the View data is invalid - mostly this is due
  *                         to owner information being specified incorrectly.
  */
 private static function _create(&$viewdata, $userid)
 {
     // If no owner information is provided, assume that the view is being
     // created by the user for themself
     if (!isset($viewdata['owner']) && !isset($viewdata['group']) && !isset($viewdata['institution'])) {
         $viewdata['owner'] = $userid;
     }
     if (isset($viewdata['owner'])) {
         if ($viewdata['owner'] != $userid) {
             $userobj = new User();
             $userobj->find_by_id($userid);
             if (!$userobj->is_admin_for_user($viewdata['owner'])) {
                 throw new SystemException("View::_create: User {$userid} is not allowed to create a view for owner {$viewdata['owner']}");
             }
         }
         // Users can only have one view of each non-portfolio type
         if (isset($viewdata['type']) && $viewdata['type'] != 'portfolio' && get_record('view', 'owner', $viewdata['owner'], 'type', $viewdata['type'])) {
             $viewdata['type'] = 'portfolio';
         }
         // Try to create the view with the owner's default theme if that theme is set by an
         // institution (i.e. if it's different from the site theme)
         //
         // This needs to be modified if users are ever allowed to change their own theme
         // preference.  Currently it's okay because users' themes are forced on them by
         // the site or institution default, but if some users are allowed to change their
         // own theme pref, we should create those users' views without a theme.
         if (!get_config('userscanchooseviewthemes') && !isset($viewdata['theme']) && (!isset($viewdata['type']) || $viewdata['type'] != 'dashboard')) {
             global $USER;
             if ($viewdata['owner'] == $USER->get('id')) {
                 $owner = $USER;
             } else {
                 $owner = new User();
                 $owner->find_by_id($viewdata['owner']);
             }
             $ownerthemedata = $owner->get('institutiontheme');
             $ownertheme = isset($ownerthemedata->basename) ? $ownerthemedata->basename : null;
             if ($ownertheme && $ownertheme != get_config('theme') && $ownertheme != 'custom') {
                 $viewdata['theme'] = $ownertheme;
             }
         }
     }
     if (isset($viewdata['group'])) {
         require_once 'group.php';
         if (!group_user_can_edit_views($viewdata['group'], $userid)) {
             throw new SystemException("View::_create: User {$userid} is not permitted to create a view for group {$viewdata['group']}");
         }
     }
     if (isset($viewdata['institution'])) {
         $user = new User();
         $user->find_by_id($userid);
         if (!$user->can_edit_institution($viewdata['institution'])) {
             throw new SystemException("View::_create: User {$userid} is not permitted to create a view for institution {$viewdata['institution']}");
         }
     }
     // Create the view
     $defaultdata = array('numcolumns' => 2, 'numrows' => 1, 'columnsperrow' => self::default_columnsperrow(), 'template' => 0, 'type' => 'portfolio', 'title' => array_key_exists('title', $viewdata) ? $viewdata['title'] : self::new_title(get_string('Untitled', 'view'), (object) $viewdata), 'anonymise' => 0);
     $data = (object) array_merge($defaultdata, $viewdata);
     if ($data->type == 'portfolio' && (!isset($data->url) || is_null($data->url) || !strlen($data->url))) {
         $data->urlid = generate_urlid($data->title, get_config('cleanurlviewdefault'), 3, 100);
         $data->urlid = self::new_urlid($data->urlid, $data);
     }
     $view = new View(0, $data);
     $view->commit();
     if (isset($viewdata['group']) && (empty($viewdata['type']) || !empty($viewdata['type']) && $viewdata['type'] != 'grouphomepage')) {
         require_once 'activity.php';
         // Although group views are owned by the group, the view creator is treated as owner here.
         // So we need to ignore them from the activity_occured email.
         $beforeusers[$userid] = get_record('usr', 'id', $userid);
         // By default, group views should be visible to the group
         insert_record('view_access', (object) array('view' => $view->get('id'), 'group' => $viewdata['group'], 'ctime' => db_format_timestamp(time())));
         // Notify group members
         $accessdata = new StdClass();
         $accessdata->view = $view->get('id');
         $accessdata->oldusers = $beforeusers;
         activity_occurred('viewaccess', $accessdata);
     }
     if (isset($viewdata['layout'])) {
         // e.g. importing via LEAP2A
         $layoutsrowscols = get_records_select_array('view_layout_rows_columns', 'viewlayout = ?', array($viewdata['layout']));
         if ($layoutsrowscols) {
             delete_records('view_rows_columns', 'view', $view->get('id'));
             foreach ($layoutsrowscols as $layoutrow) {
                 insert_record('view_rows_columns', (object) array('view' => $view->get('id'), 'row' => $layoutrow->row, 'columns' => self::$layoutcolumns[$layoutrow->columns]->columns));
             }
         }
     }
     return new View($view->get('id'));
     // Reread to ensure defaults are set
 }
Example #4
0
/**
 * Creates a group.
 *
 * All group creation should be done through this function, as the
 * implementation of group creation may change over time.
 *
 * @param array $data Data required to create the group. The following
 * key/value pairs can be specified:
 *
 * - name: The group name [required, must be unique]
 * - description: The group description [optional, defaults to empty string]
 * - grouptype: The grouptype for the new group. Must be an installed grouptype.
 * - open (jointype): anyone can join the group
 * - controlled (jointype): admin adds members; members cannot leave the group
 * - request: allows membership requests
 * - ctime: The unix timestamp of the time the group will be recorded as having
 *          been created. Defaults to the current time.
 * - members: Array of users who should be in the group, structured like this:
 *            array(
 *                userid => role,
 *                userid => role,
 *                ...
 *            )
 * @return int The ID of the created group
 */
function group_create($data)
{
    if (!is_array($data)) {
        throw new InvalidArgumentException("group_create: data must be an array, see the doc comment for this " . "function for details on its format");
    }
    if (!isset($data['name'])) {
        throw new InvalidArgumentException("group_create: must specify a name for the group");
    }
    if (get_records_sql_array('SELECT id FROM {group} WHERE LOWER(TRIM(name)) = ?', array(strtolower(trim($data['name']))))) {
        throw new UserException(get_string('groupalreadyexists', 'group') . ': ' . $data['name']);
    }
    if (!isset($data['grouptype']) || !in_array($data['grouptype'], group_get_grouptypes())) {
        throw new InvalidArgumentException("group_create: grouptype specified must be an installed grouptype");
    }
    safe_require('grouptype', $data['grouptype']);
    if (!empty($data['open'])) {
        if (!empty($data['controlled'])) {
            throw new InvalidArgumentException("group_create: a group cannot have both open and controlled membership");
        }
        if (!empty($data['request'])) {
            throw new InvalidArgumentException("group_create: open-membership groups don't accept membership requests");
        }
        $jointype = 'open';
    } else {
        if (!empty($data['controlled'])) {
            $jointype = 'controlled';
        } else {
            $jointype = 'approve';
        }
    }
    if (isset($data['jointype'])) {
        log_warn("group_create: ignoring supplied jointype");
    }
    if (!isset($data['ctime'])) {
        $data['ctime'] = time();
    }
    $data['ctime'] = db_format_timestamp($data['ctime']);
    $data['public'] = isset($data['public']) ? intval($data['public']) : 0;
    $data['hidden'] = isset($data['hidden']) ? intval($data['hidden']) : 0;
    $data['hidemembers'] = isset($data['hidemembers']) ? intval($data['hidemembers']) : 0;
    $data['hidemembersfrommembers'] = isset($data['hidemembersfrommembers']) ? intval($data['hidemembersfrommembers']) : 0;
    $data['groupparticipationreports'] = isset($data['groupparticipationreports']) ? intval($data['groupparticipationreports']) : 0;
    $data['usersautoadded'] = isset($data['usersautoadded']) ? intval($data['usersautoadded']) : 0;
    $data['quota'] = get_config_plugin('artefact', 'file', 'defaultgroupquota');
    if (!empty($data['invitefriends']) && !empty($data['suggestfriends'])) {
        throw new InvalidArgumentException("group_create: a group cannot enable both invitefriends and suggestfriends");
    }
    $data['invitefriends'] = isset($data['invitefriends']) ? intval($data['invitefriends']) : 0;
    $data['suggestfriends'] = isset($data['suggestfriends']) ? intval($data['suggestfriends']) : 0;
    if (isset($data['shortname']) && strlen($data['shortname'])) {
        // This is a group whose details and membership can be updated automatically, using a
        // webservice api or possibly csv upload.
        // On updates to this group, it will be identified using the institution and shortname
        // which must be unique.
        // The $USER object will be set to someone with at least institutional admin permission.
        global $USER;
        if (empty($data['institution'])) {
            throw new SystemException("group_create: a group with a shortname must have an institution; shortname: " . $data['shortname']);
        }
        if (!$USER->can_edit_institution($data['institution'])) {
            throw new AccessDeniedException("group_create: cannot create a group in this institution");
        }
        if (!preg_match('/^[a-zA-Z0-9_.-]{2,255}$/', $data['shortname'])) {
            $message = get_string('invalidshortname', 'group') . ': ' . $data['shortname'];
            $message .= "\n" . get_string('shortnameformat', 'group');
            throw new UserException($message);
        }
        if (record_exists('group', 'shortname', $data['shortname'], 'institution', $data['institution'])) {
            throw new UserException('group_create: group with shortname ' . $data['shortname'] . ' and institution ' . $data['institution'] . ' already exists');
        }
        if (empty($data['members'])) {
            $data['members'] = array($USER->get('id') => 'admin');
        }
    } else {
        if (!empty($data['institution'])) {
            throw new SystemException("group_create: group institution only available for api-controlled groups");
        }
        $data['shortname'] = null;
    }
    if (get_config('cleanurls') && (!isset($data['urlid']) || strlen($data['urlid']) == 0)) {
        $data['urlid'] = generate_urlid($data['name'], get_config('cleanurlgroupdefault'), 3, 30);
        $data['urlid'] = group_get_new_homepage_urlid($data['urlid']);
    }
    if (!is_array($data['members']) || count($data['members']) == 0) {
        throw new InvalidArgumentException("group_create: at least one member must be specified for adding to the group");
    }
    if (!isset($data['submittableto'])) {
        $data['submittableto'] = $data['grouptype'] != 'standard';
    }
    if (!isset($data['editroles'])) {
        $data['editroles'] = $data['grouptype'] == 'standard' ? 'all' : 'notmember';
    } else {
        if (!in_array($data['editroles'], array_keys(group_get_editroles_options()))) {
            throw new InvalidArgumentException("group_create: invalid option for page editroles setting");
        }
    }
    if (!isset($data['editwindowstart'])) {
        $data['editwindowstart'] = null;
    }
    if (!isset($data['editwindowend'])) {
        $data['editwindowend'] = null;
    }
    if (!isset($data['sendnow'])) {
        $data['sendnow'] = null;
    }
    db_begin();
    $id = insert_record('group', (object) array('name' => $data['name'], 'description' => isset($data['description']) ? $data['description'] : null, 'urlid' => isset($data['urlid']) ? $data['urlid'] : null, 'grouptype' => $data['grouptype'], 'category' => isset($data['category']) ? intval($data['category']) : null, 'jointype' => $jointype, 'ctime' => $data['ctime'], 'mtime' => $data['ctime'], 'public' => $data['public'], 'usersautoadded' => $data['usersautoadded'], 'quota' => $data['quota'], 'institution' => !empty($data['institution']) ? $data['institution'] : null, 'shortname' => $data['shortname'], 'request' => isset($data['request']) ? intval($data['request']) : 0, 'submittableto' => intval($data['submittableto']), 'allowarchives' => !empty($data['submittableto']) && !empty($data['allowarchives']) ? intval($data['allowarchives']) : 0, 'editroles' => $data['editroles'], 'hidden' => $data['hidden'], 'hidemembers' => $data['hidemembers'], 'hidemembersfrommembers' => $data['hidemembersfrommembers'], 'groupparticipationreports' => $data['groupparticipationreports'], 'invitefriends' => $data['invitefriends'], 'suggestfriends' => $data['suggestfriends'], 'editwindowstart' => $data['editwindowstart'], 'editwindowend' => $data['editwindowend'], 'sendnow' => isset($data['sendnow']) ? $data['sendnow'] : null, 'viewnotify' => isset($data['viewnotify']) ? $data['viewnotify'] : null, 'feedbacknotify' => isset($data['feedbacknotify']) ? $data['feedbacknotify'] : null), 'id', true);
    foreach ($data['members'] as $userid => $role) {
        insert_record('group_member', (object) array('group' => $id, 'member' => $userid, 'role' => $role, 'ctime' => $data['ctime']));
    }
    // Copy views for the new group
    $templates = get_column('view_autocreate_grouptype', 'view', 'grouptype', $data['grouptype']);
    $templates = get_records_sql_array("\n        SELECT v.id, v.title, v.description\n        FROM {view} v\n        INNER JOIN {view_autocreate_grouptype} vag ON vag.view = v.id\n        LEFT JOIN {collection_view} cv ON v.id = cv.view\n        WHERE vag.grouptype = 'standard'\n            AND cv.view IS NULL", array());
    if ($templates) {
        require_once get_config('libroot') . 'view.php';
        foreach ($templates as $template) {
            list($view) = View::create_from_template(array('group' => $id, 'title' => $template->title, 'description' => $template->description), $template->id, null, false);
            $view->set_access(array(array('type' => 'group', 'id' => $id, 'startdate' => null, 'stopdate' => null, 'role' => null)));
        }
    }
    // Copy collections for the new group
    $templates = get_records_sql_array("\n        SELECT DISTINCT c.id, c.name\n        FROM {view} v\n        INNER JOIN {view_autocreate_grouptype} vag ON vag.view = v.id\n        INNER JOIN {collection_view} cv ON v.id = cv.view\n        INNER JOIN {collection} c ON cv.collection = c.id\n        WHERE vag.grouptype = ?", array($data['grouptype']));
    if ($templates) {
        require_once 'collection.php';
        foreach ($templates as $template) {
            Collection::create_from_template(array('group' => $id), $template->id, null, false, true);
        }
    }
    $data['id'] = $id;
    // install the homepage
    if ($t = get_record('view', 'type', 'grouphomepage', 'template', 1, 'owner', 0)) {
        require_once 'view.php';
        $template = new View($t->id, (array) $t);
        list($homepage) = View::create_from_template(array('group' => $id, 'title' => $template->get('title'), 'description' => $template->get('description'), 'type' => 'grouphomepage'), $t->id, 0, false);
    }
    insert_record('view_access', (object) array('view' => $homepage->get('id'), 'accesstype' => $data['public'] ? 'public' : 'loggedin', 'ctime' => db_format_timestamp(time())));
    handle_event('creategroup', $data);
    db_commit();
    return $id;
}
Example #5
0
/**
 * Create user
 *
 * @param object $user stdclass or User object for the usr table
 * @param array  $profile profile field/values to set
 * @param string|object $institution Institution the user should joined to (name or Institution object)
 * @param bool $remoteauth authinstance record for a remote authinstance
 * @param string $remotename username on the remote site
 * @param array $accountprefs user account preferences to set
 * @return integer id of the new user
 */
function create_user($user, $profile = array(), $institution = null, $remoteauth = null, $remotename = null, $accountprefs = array(), $quickhash = false)
{
    db_begin();
    if ($user instanceof User) {
        $user->create();
        $user->quota_init();
        $user->commit();
        $user = $user->to_stdclass();
    } else {
        $user->ctime = db_format_timestamp(time());
        // Ensure this user has a profile urlid
        if (get_config('cleanurls') && (!isset($user->urlid) || is_null($user->urlid))) {
            $user->urlid = generate_urlid($user->username, get_config('cleanurluserdefault'), 3, 30);
            $user->urlid = get_new_profile_urlid($user->urlid);
        }
        if (empty($user->quota)) {
            $user->quota = get_config_plugin('artefact', 'file', 'defaultquota');
        }
        if (get_config('defaultaccountlifetime')) {
            // we need to set the user expiry to the site default one
            $user->expiry = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d'), date('Y')) + (int) get_config('defaultaccountlifetime'));
        }
        $user->id = insert_record('usr', $user, 'id', true);
    }
    if (isset($user->email) && $user->email != '') {
        set_profile_field($user->id, 'email', $user->email, TRUE);
    }
    if (isset($user->firstname) && $user->firstname != '') {
        set_profile_field($user->id, 'firstname', $user->firstname, TRUE);
    }
    if (isset($user->lastname) && $user->lastname != '') {
        set_profile_field($user->id, 'lastname', $user->lastname, TRUE);
    }
    foreach ($profile as $k => $v) {
        if (in_array($k, array('firstname', 'lastname', 'email'))) {
            continue;
        }
        set_profile_field($user->id, $k, $v, TRUE);
    }
    if (!empty($institution)) {
        if (is_string($institution)) {
            $institution = new Institution($institution);
        }
        if ($institution->name != 'mahara') {
            $institution->addUserAsMember($user);
            // uses $user->newuser
            if (empty($accountprefs['licensedefault'])) {
                $accountprefs['licensedefault'] = LICENSE_INSTITUTION_DEFAULT;
            }
        }
    }
    $authobj = get_record('auth_instance', 'id', $user->authinstance);
    $authinstance = AuthFactory::create($authobj->id);
    // For legacy compatibility purposes, we'll also put the remote auth on there if it has been
    // specifically requested.
    if ($authinstance->needs_remote_username() || !empty($remoteauth)) {
        if (isset($remotename) && strlen($remotename) > 0) {
            $un = $remotename;
        } else {
            $un = $user->username;
        }
        // remote username must not already exist
        if (record_exists('auth_remote_user', 'remoteusername', $un, 'authinstance', $user->authinstance)) {
            throw new InvalidArgumentException("user_create: remoteusername already exists: ({$un}, {$user->authinstance})");
        }
        insert_record('auth_remote_user', (object) array('authinstance' => $user->authinstance, 'remoteusername' => $un, 'localusr' => $user->id));
    }
    // Set account preferences
    if (!empty($accountprefs)) {
        $expectedprefs = expected_account_preferences();
        foreach ($expectedprefs as $eprefkey => $epref) {
            if (isset($accountprefs[$eprefkey]) && $accountprefs[$eprefkey] != $epref) {
                set_account_preference($user->id, $eprefkey, $accountprefs[$eprefkey]);
            }
        }
    }
    // Copy site views and collections to the new user's profile
    $userobj = new User();
    $userobj->find_by_id($user->id);
    $userobj->copy_site_views_collections_to_new_user();
    reset_password($user, false, $quickhash);
    handle_event('createuser', $user);
    db_commit();
    return $user->id;
}
Example #6
0
function editview_submit(Pieform $form, $values)
{
    global $new, $view, $SESSION, $urlallowed;
    $view->set('title', $values['title']);
    if (trim($values['description']) !== '') {
        // Add or update embedded images in the view description
        require_once 'embeddedimage.php';
        $view->set('description', EmbeddedImage::prepare_embedded_images($values['description'], 'description', $view->get('id')));
    } else {
        // deleting description
        $view->set('description', '');
    }
    $view->set('tags', $values['tags']);
    if (isset($values['locked'])) {
        $view->set('locked', (int) $values['locked']);
    }
    if (isset($values['ownerformat']) && $view->get('owner')) {
        $view->set('ownerformat', $values['ownerformat']);
    }
    if (isset($values['anonymise'])) {
        $view->set('anonymise', (int) $values['anonymise']);
    }
    if (isset($values['urlid'])) {
        $view->set('urlid', strlen($values['urlid']) == 0 ? null : $values['urlid']);
    } else {
        if ($new && $urlallowed) {
            // Generate one automatically based on the title
            $desired = generate_urlid($values['title'], get_config('cleanurlviewdefault'), 3, 100);
            $ownerinfo = (object) array('owner' => $view->get('owner'), 'group' => $view->get('group'));
            $view->set('urlid', View::new_urlid($desired, $ownerinfo));
        }
    }
    $SESSION->add_ok_msg(get_string('viewsavedsuccessfully', 'view'));
    $view->commit();
    redirect('/view/blocks.php?id=' . $view->get('id'));
}