init
This commit is contained in:
315
local/htdocs/community/create.bml
Executable file
315
local/htdocs/community/create.bml
Executable file
@@ -0,0 +1,315 @@
|
||||
<?page
|
||||
title=><?_ml .title _ml?>
|
||||
body<=
|
||||
<?_code
|
||||
{
|
||||
use strict;
|
||||
use vars qw(%GET %POST);
|
||||
|
||||
LJ::set_active_crumb('createcommunity');
|
||||
|
||||
return LJ::server_down_html() if $LJ::SERVER_DOWN;
|
||||
return "<?badinput?>" unless LJ::text_in(\%POST);
|
||||
|
||||
my $mode = $POST{mode} || 'getinfo';
|
||||
|
||||
my $remote = LJ::get_remote();
|
||||
return "<?needlogin?>" if !$remote;
|
||||
return "<?h1 $ML{'Error'} h1?><?p $ML{'.error.notperson'} p?>"
|
||||
if $remote->{journaltype} ne 'P';
|
||||
return "<?h1 $ML{'Error'} h1?><?p $ML{'.error.notactive'} p?>"
|
||||
unless $remote->{statusvis} eq 'V';
|
||||
|
||||
if ($remote->underage) {
|
||||
return BML::redirect("$LJ::SITEROOT/agecheck/?s=1");
|
||||
}
|
||||
|
||||
# fix up the incoming data (is used in getinfo mode and submit mode so it's here)
|
||||
$POST{membership} = 'open'
|
||||
unless $POST{membership} =~ m/^(?:open|moderated|closed)$/;
|
||||
$POST{postlevel} = 'members'
|
||||
unless $POST{postlevel} =~ m/^(?:members|select)$/;
|
||||
$POST{nonmember_posting} = '0'
|
||||
unless $POST{nonmember_posting} =~ m/^[01]$/;
|
||||
$POST{moderated} = '0'
|
||||
unless $POST{moderated} =~ m/^[01]$/;
|
||||
|
||||
# MODE: submit - try to create an account. might change mode
|
||||
# if there are errors, we'll populate $error and
|
||||
# return to "getinfo" mode below
|
||||
my $error;
|
||||
SUBMIT:
|
||||
while ($mode eq 'submit') # using while instead of if so we can 'last' out of it
|
||||
{
|
||||
return "<b>$ML{'Error'}</b>: $ML{'.error.postrequired'}" unless LJ::did_post();
|
||||
|
||||
my $user = LJ::canonical_username($POST{user});
|
||||
my $title = $POST{title} || $user;
|
||||
|
||||
# reject this email?
|
||||
return LJ::sysban_block(0, "Create user blocked based on email",
|
||||
{ new_user => $user, email => $remote->{email}, name => $user })
|
||||
if LJ::sysban_check('email', $remote->{email});
|
||||
|
||||
$error = "$ML{'error.usernamelong'}" if length($user) > 15;
|
||||
$error = "$ML{'error.usernameinvalid'}" if $POST{user} && !$user;
|
||||
$error = "$ML{'.error.username.mustenter'}" unless $POST{user};
|
||||
|
||||
my $u = LJ::load_user($user);
|
||||
|
||||
if(!LJ::check_priv($remote, 'create_protected_com')){
|
||||
foreach my $re ("^system\$", @LJ::PROTECTED_USERNAMES) {
|
||||
next unless $user =~ /$re/;
|
||||
|
||||
# you can give people sharedjournal priv ahead of time to create
|
||||
# reserved communities:
|
||||
next if LJ::check_priv($remote, "sharedjournal", $user);
|
||||
|
||||
$error = "$ML{'.error.username.reserved'}";
|
||||
}
|
||||
}
|
||||
|
||||
my $second_submit = 0;
|
||||
if ($u) {
|
||||
my $in_use = 1;
|
||||
|
||||
if ($u->{email} eq $remote->{email}) {
|
||||
if (LJ::login_ip_banned($u)) {
|
||||
# brute-force possible going on
|
||||
} else {
|
||||
if ($u->{password} eq $remote->{password}) {
|
||||
# oh, they double-clicked the submit button
|
||||
$second_submit = 1;
|
||||
|
||||
# if we found a comm and everything matches, they double hit. if
|
||||
# we found a person/etc, then they tried to recreate their community,
|
||||
# which isn't allowed anymore
|
||||
$in_use = $u->{journaltype} eq 'C' ? 0 : 1;
|
||||
} else {
|
||||
LJ::handle_bad_login($u);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($in_use) {
|
||||
$error = "$ML{'.error.username.inuse'}";
|
||||
}
|
||||
}
|
||||
|
||||
last SUBMIT if $error;
|
||||
|
||||
my $qclusterid = LJ::new_account_cluster() + 0;
|
||||
die "Cluster 0 not supported" unless $qclusterid;
|
||||
|
||||
my $userid = ref $u ? $u->{userid} : 0;
|
||||
unless ($second_submit) {
|
||||
my $dbh = LJ::get_db_writer();
|
||||
|
||||
my $errorcounter = 0;
|
||||
my $old_print_error = $dbh->{PrintError}; # save PrintError mode
|
||||
$dbh->{PrintError} = 0; # will check for errors manually
|
||||
|
||||
while (1) {
|
||||
my $ruserid = LJ::get_new_userid("P");
|
||||
|
||||
if (!$ruserid) {
|
||||
return "<?h1 $ML{'Error'} h1?><?p $ML{'error.procrequest'} p?>";
|
||||
}
|
||||
$dbh->do("set insert_id = $ruserid");
|
||||
|
||||
$dbh->do(
|
||||
"INSERT INTO user (user, email, status, caps, name, clusterid, dversion, journaltype) ".
|
||||
"VALUES (?, ?, ?, ?, ?, ?, $LJ::MAX_DVERSION, 'C')",
|
||||
undef, $user, $remote->{email}, $remote->{status}, int($LJ::NEWUSER_CAPS), $title, $qclusterid);
|
||||
|
||||
if ($dbh->err) {
|
||||
# who wants to try forever
|
||||
if ($errorcounter > 10) {
|
||||
return "<?h1 $ML{'Error'} h1?><?p $ML{'error.procrequest'} <b>" . $dbh->errstr . "</b> p?>";
|
||||
}
|
||||
|
||||
$errorcounter++;
|
||||
sleep 1; # let it breathe
|
||||
next; # try again
|
||||
}
|
||||
else {
|
||||
$userid = $dbh->{'mysql_insertid'}; # smells like success
|
||||
$dbh->{PrintError} = $old_print_error; # restore error reporting
|
||||
|
||||
return 0 unless $userid; # but?
|
||||
|
||||
last; # finally
|
||||
}
|
||||
}
|
||||
|
||||
if ($LJ::LJR_FIF) {
|
||||
use LJ::MemCache;
|
||||
my $ljr_fif_id = LJ::get_userid($LJ::LJR_FIF);
|
||||
if ($ljr_fif_id) {
|
||||
$dbh->do("INSERT INTO friends (userid, friendid) VALUES (?, ?)", undef, $ljr_fif_id, $userid);
|
||||
# refresh memcache
|
||||
#my $memkey = [$ljr_fif_id, "friends:$ljr_fif_id"];
|
||||
#LJ::MemCache::delete($memkey);
|
||||
LJ::get_friends($ljr_fif_id, undef, undef, 'force', {} );
|
||||
}
|
||||
}
|
||||
|
||||
$dbh->do("REPLACE INTO useridmap (userid, user) VALUES (?, ?)", undef, $userid, $user);
|
||||
$dbh->do("REPLACE INTO userusage (userid, timecreate) VALUES (?, NOW())", undef, $userid);
|
||||
|
||||
# set any properties that get set in new users
|
||||
$u = LJ::load_userid($userid);
|
||||
while (my ($name, $val) = each %LJ::USERPROP_INIT) {
|
||||
LJ::set_userprop($u, $name, $val);
|
||||
}
|
||||
|
||||
# since they're a community, let's do more setup
|
||||
$dbh->do("REPLACE INTO community (userid, membership, postlevel) VALUES (?, ?, ?)",
|
||||
undef, $userid, $POST{membership}, $POST{postlevel});
|
||||
LJ::set_userprop($u, 'nonmember_posting', $POST{nonmember_posting} + 0);
|
||||
LJ::set_userprop($u, 'moderated', $POST{moderated} + 0);
|
||||
LJ::set_rel($userid, $remote->{userid}, 'M') if $POST{moderated}; # moderator if moderated
|
||||
LJ::set_rel($userid, $remote->{userid}, 'A'); # maintainer
|
||||
LJ::join_community($remote, $u, 0, 1); # make them a member of the community
|
||||
|
||||
LJ::run_hooks("post_create", {
|
||||
'userid' => $userid,
|
||||
'user' => $user,
|
||||
});
|
||||
}
|
||||
|
||||
my $nu = LJ::load_userid($userid, "force");
|
||||
|
||||
# log creation
|
||||
$nu->log_event('account_create', { remote => $remote });
|
||||
|
||||
# local sites may want to override what happens at this point
|
||||
my $ret;
|
||||
my $redirect;
|
||||
my $stop_output;
|
||||
LJ::run_hooks("create.bml_postsession", {
|
||||
post => \%POST,
|
||||
u => $nu,
|
||||
type => 'community',
|
||||
redirect => \$redirect,
|
||||
ret => \$ret,
|
||||
stop_output => \$stop_output,
|
||||
});
|
||||
return BML::redirect($redirect) if $redirect;
|
||||
return $ret if $stop_output;
|
||||
|
||||
$ret = "<?h1 $ML{'.success.head'} h1?><?p $ML{'.success.text1'} p?>";
|
||||
my $uri = LJ::journal_base($nu);
|
||||
$ret .= "<?p $ML{'.success.text2'} p?>\n";
|
||||
$ret .= "<?standout <font size='+1' face='arial'><b><a href='$uri'>$uri/</a></b></font> standout?>\n";
|
||||
$ret .= "<?p $ML{'.success.text3'} p?>\n";
|
||||
|
||||
$ret .= "<form method='get' action='$LJ::SITEROOT/editinfo.bml?authas=$nu->{user}'>";
|
||||
$ret .= "<p align='center'>" . LJ::html_submit(undef, "$ML{'.success.btn.enterinfo'} →") . "</p>";
|
||||
$ret .= "</form>\n";
|
||||
|
||||
return $ret;
|
||||
|
||||
}
|
||||
|
||||
if ($mode eq "getinfo" || $error)
|
||||
{
|
||||
my $ret;
|
||||
|
||||
if ($error) {
|
||||
$ret .= "<?errorbar <strong>$ML{'.errors.label'}</strong><ul>";
|
||||
$ret .= "<li>$error</li>";
|
||||
$ret .= "</ul> errorbar?>";
|
||||
}
|
||||
|
||||
$ret .= "<?p $ML{'.create.text'} p?>" unless $error;
|
||||
$ret .= "<form action=\"create.bml\" method=\"post\">\n";
|
||||
$ret .= LJ::html_hidden(mode => 'submit', ssl => $FORM{'ssl'});
|
||||
|
||||
$ret .= "<ol>";
|
||||
|
||||
# username
|
||||
my $v = LJ::ehtml($FORM{'user'});
|
||||
$ret .= "<li><div class='formitem'><div class='formitemName'>$ML{'.username.head'}</div>";
|
||||
$ret .= "<p class='formitemFlag'>$error</p>";
|
||||
$ret .= "<div class='formitemDesc'>" . BML::ml(".username.text", { sitename => $LJ::SITENAME }) . "</div>";
|
||||
$ret .= LJ::html_text({'name' => 'user', 'size' => 15, 'maxlength' => 15, 'value' => $v, raw => 'style="<?commloginboxstyle?>"' });
|
||||
$ret .= "<br />" . BML::ml('.person', { aopts => "href='$LJ::SITEROOT/create.bml'" });
|
||||
$ret .= "<div class='formitemNote'>$ML{'.username.charsallowed'}</div>" unless $error;
|
||||
$ret .= "</div></li>";
|
||||
|
||||
# account title
|
||||
$v = LJ::ehtml($FORM{'title'});
|
||||
$ret .= "<li><div class='formitem'><div class='formitemName'>$ML{'.name.head'}</div>";
|
||||
$ret .= "<div class='formitemDesc'>$ML{'.name.text'}</div>";
|
||||
$ret .= LJ::html_text({ name => 'title', style => 'width: 60%;', maxlength => 80, value => $v, });
|
||||
$ret .= "</div></li>";
|
||||
|
||||
# membership levels
|
||||
$ret .= "<li><div class='formitem'><div class='formitemName'>$ML{'/community/settings.bml.label.membership'}" .
|
||||
"</div><div class='formitemDesc'>$ML{'/community/settings.bml.label.whocanjoin'}</div><div><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'membership', id => 'memopen',
|
||||
value => 'open', selected => ($POST{membership} eq 'open' ? 1 : 0)});
|
||||
$ret .= "<label for='memopen' $ML{'/community/settings.bml.label.openmemb'}</label><br /></p><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'membership', id => 'memmoderated',
|
||||
value => 'moderated', selected => ($POST{membership} eq 'moderated' ? 1 : 0)});
|
||||
$ret .= "<label for='memmoderated' $ML{'/community/settings.bml.label.moderatedmemb'}</label></p><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'membership', id => 'memclosed',
|
||||
value => 'closed', selected => ($POST{membership} eq 'closed' ? 1 : 0)});
|
||||
$ret .= "<label for='memclosed' $ML{'/community/settings.bml.label.closedmemb2'}</label></p>";
|
||||
$ret .= "</div></div></li>";
|
||||
|
||||
# posting access options
|
||||
$ret .= "<li><div class='formitem'><div class='formitemName'>$ML{'/community/settings.bml.label.postaccess'}" .
|
||||
"</div><div class='formitemDesc'>$ML{'/community/settings.bml.label.whocanpost'}</div><div><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'postlevel', id => 'postopen',
|
||||
value => 'members', selected => ($POST{postlevel} eq 'members' ? 1 : 0)});
|
||||
$ret .= "<label for='postopen'>$ML{'/community/settings.bml.label.anybodycan'}</label></p><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'postlevel', id => 'postclosed',
|
||||
value => 'select', selected => ($POST{postlevel} eq 'select' ? 1 : 0)});
|
||||
$ret .= "<label for='postclosed'>$ML{'/community/settings.bml.label.selcan'}</label></p>";
|
||||
$ret .= "</div></div></li>";
|
||||
|
||||
# nonmember posting options
|
||||
$ret .= "<li><div class='formitem'><div class='formitemName'>$ML{'/community/settings.bml.label.nmheader'}" .
|
||||
"</div><div class='formitemDesc'>$ML{'/community/settings.bml.label.nmtext'}</div><div><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'nonmember_posting', id => 'nonopen',
|
||||
value => '0', selected => ($POST{nonmember_posting} eq '0' ? 1 : 0)});
|
||||
$ret .= "<label for='nonopen'>$ML{'/community/settings.bml.label.nmcant'}</label></p><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'nonmember_posting', id => 'nonclosed',
|
||||
value => '1', selected => ($POST{nonmember_posting} eq '1' ? 1 : 0)});
|
||||
$ret .= "<label for='nonclosed'>$ML{'/community/settings.bml.label.nmcan'}</label></p>";
|
||||
$ret .= "</div></div></li>";
|
||||
|
||||
# moderated options
|
||||
$ret .= "<li><div class='formitem'><div class='formitemName'>$ML{'/community/settings.bml.label.modheader'}" .
|
||||
"</div><div class='formitemDesc'>$ML{'/community/settings.bml.label.modtext'}</div><div><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'moderated', id => 'radunmod',
|
||||
value => '0', selected => ($POST{moderated} eq '0' ? 1 : 0)});
|
||||
$ret .= "<label for='radunmod'>$ML{'/community/settings.bml.label.modisnt'}</label></p><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'moderated', id => 'radmod',
|
||||
value => '1', selected => ($POST{moderated} eq '1' ? 1 : 0)});
|
||||
$ret .= "<label for='radmod'>$ML{'/community/settings.bml.label.modis'}</label></p>";
|
||||
$ret .= "</div></div></li>";
|
||||
|
||||
LJ::run_hooks("create.bml_opts", {
|
||||
post => \%POST,
|
||||
get => \%GET,
|
||||
ret => \$ret,
|
||||
});
|
||||
|
||||
$ret .= "</ol>";
|
||||
|
||||
$ret .= "<div style='width:600; text-align: center'>";
|
||||
$ret .= "<input type='submit' value=\"$ML{'.btn.create'}\">";
|
||||
$ret .= "</div>";
|
||||
$ret .= "</form>";
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
return "$ML{'error.unknownmode'}: <b>$mode</b>";
|
||||
}
|
||||
_code?>
|
||||
<=body
|
||||
page?>
|
||||
148
local/htdocs/community/join.bml
Executable file
148
local/htdocs/community/join.bml
Executable file
@@ -0,0 +1,148 @@
|
||||
<?_code
|
||||
|
||||
LJ::set_active_crumb('joincomm');
|
||||
|
||||
$title = $ML{'.title'};
|
||||
$body = "";
|
||||
|
||||
# is there a user out there?
|
||||
my $remote = LJ::get_remote();
|
||||
unless ($remote) {
|
||||
$body = "<?h1 $ML{'Sorry'}.. h1?><?p $ML{'.label.loginfirst'} p?>";
|
||||
return;
|
||||
}
|
||||
|
||||
# bad statusvis?
|
||||
unless ($remote->{statusvis} eq 'V') {
|
||||
$body = "<?h1 $ML{'.error.statusvis.title'} h1?><?p $ML{'.error.statusvis.body'} p?>";
|
||||
return;
|
||||
}
|
||||
|
||||
# get info about the community
|
||||
my $cuserid = $FORM{'cuserid'}+0;
|
||||
my $cu = $FORM{comm} ?
|
||||
LJ::load_user($FORM{comm}) : # they gave us the comm name
|
||||
LJ::load_userid($cuserid); # they gave us the comm id
|
||||
|
||||
# NOTE: we wrapped this in an eval due to code going live; the library isn't going to go
|
||||
# live at the same time as the BML file, and we don't want weird things happening, so we
|
||||
# verify that this is all good and return an error if it's not okay.
|
||||
my $ci;
|
||||
eval { $ci = LJ::get_community_row($cu); };
|
||||
if ($@) {
|
||||
$body = "<?h1 Temporarily Disabled h1?><?p This page is disabled while we update the site. Please try again later. p?>";
|
||||
return;
|
||||
}
|
||||
$cuserid = $ci->{'userid'};
|
||||
|
||||
LJ::text_out(\$ci->{'name'});
|
||||
my $ecname = LJ::ehtml($ci->{'name'});
|
||||
|
||||
# does this community even exit?
|
||||
unless ($cu) {
|
||||
$body .= "<?h1 $ML{'Error'} h1?><?p $ML{'.label.errorcomminfo'} p?>";
|
||||
return;
|
||||
}
|
||||
|
||||
# make sure a community doesn't join a community (that's confusing
|
||||
# or something)
|
||||
unless ($remote->{'journaltype'} eq "P") {
|
||||
$body .= "<?h1 $ML{'Error'} h1?><?p $ML{'.label.commlogged'} p?>";
|
||||
return;
|
||||
}
|
||||
|
||||
# ensure this user isn't banned
|
||||
if (LJ::is_banned($remote, $cuserid)) {
|
||||
$body .= "<?h1 $ML{'Sorry'} h1?><?p $ML{'.label.banned'} p?>";
|
||||
return;
|
||||
}
|
||||
|
||||
# # and make sure they're not already a member
|
||||
# if (LJ::is_friend($cuserid, $remote->{userid})) {
|
||||
# $body .= "<?h1 $ML{'Error'} h1?><?p $ML{'.error.already.member'} p?>";
|
||||
# return;
|
||||
# }
|
||||
|
||||
# get the list of maintainers and their usernames
|
||||
my $dbr = LJ::get_db_reader();
|
||||
my $admins = $dbr->selectcol_arrayref("SELECT u.user FROM useridmap u, reluser r ".
|
||||
"WHERE r.userid=$cuserid AND r.targetid=u.userid AND r.type='A'") || [];
|
||||
my $list = "<ul>";
|
||||
foreach (sort @$admins) { $list .= "<li><?ljuser $_ ljuser?></li>"};
|
||||
$list .= "</ul>";
|
||||
|
||||
# can't join closed communities
|
||||
# but if invited, go around and finally join
|
||||
|
||||
my $invited=0;
|
||||
|
||||
if ($ci->{membership} eq 'closed') {
|
||||
|
||||
my $inv = LJ::get_sent_invites($cuserid) || [];
|
||||
|
||||
foreach my $invite (@$inv) {
|
||||
my $id = $invite->{userid};
|
||||
if (($invited!=1) && ($id == $remote->{'userid'})) {$invited=1;}
|
||||
}
|
||||
|
||||
if($invited == 0){
|
||||
$body .= "<?h1 $ML{'Sorry'} h1?><?p " .
|
||||
BML::ml('.error.closed', { admins => $list }) .
|
||||
" p?>";
|
||||
return;
|
||||
}
|
||||
}
|
||||
# now do the join
|
||||
if ($POST{confirm}) {
|
||||
# can members join this community openly?
|
||||
# another case if user is already invited - then we will not make a request
|
||||
if (($ci->{membership} ne 'open') && ($invited == 0)) {
|
||||
# hit up the maintainers to let them know a join was requested
|
||||
LJ::comm_join_request($cu, $remote);
|
||||
$body .= "<?h1 $ML{'.reqsubmitted.title'} h1?><?p $ML{'.reqsubmitted.body'} $list p?>";
|
||||
return;
|
||||
}
|
||||
|
||||
# make remote user a friend of the community
|
||||
LJ::join_community($remote, $cu, $FORM{addfriend});
|
||||
|
||||
# success message
|
||||
$body .= "<?h1 $ML{'.success'} h1?><?p " . BML::ml('.label.membernow',
|
||||
{ username => $ci->{user}, commname => $ecname}) . " p?>";
|
||||
|
||||
# if community permits it, tell the user they have access
|
||||
if ($ci->{postlevel} eq "members") {
|
||||
$body .= "<?p $ML{'.label.allowposting'} p?>";
|
||||
} else {
|
||||
$body .= "<?p " . BML::ml('.label.auth', { admins => $list }) . " p?>";
|
||||
}
|
||||
} else {
|
||||
if (($ci->{membership} ne 'open') && ($invited == 0)) {
|
||||
$body .= "<?h1 $ML{'.request.title'} h1?><?p ";
|
||||
$body .= BML::ml('.request.body', { comm => LJ::ljuser($cu) }) . "<br /> p?>";
|
||||
$body .= "<div style='margin-left: 30px;'><form method='post' action='join.bml'>";
|
||||
$body .= "<input type='hidden' name='cuserid' value='$ci->{userid}' />";
|
||||
$body .= "<input type='hidden' name='confirm' value='1' />";
|
||||
$body .= "<input type='submit' value=\"$ML{'.button.join'}\" /></form></div>";
|
||||
return;
|
||||
}
|
||||
|
||||
$body .= "<?h1 $ML{'.label.sure'} h1?><?p " . BML::ml('.label.expls', { maintainer => $ecname });
|
||||
$body .= "<form method='post' action='join.bml'>";
|
||||
$body .= "<input type='hidden' name='cuserid' value='$ci->{'userid'}' />";
|
||||
$body .= "<input type='hidden' name='confirm' value='1' /><center>";
|
||||
$body .= "<input type='checkbox' name='addfriend' checked>";
|
||||
$body .= BML::ml('.label.addtofriends', { maintainer => $ecname });
|
||||
$body .= "<br><input type='submit' value=\"$ML{'.button.join'}\" /></center></form> p?>";
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
_code?><?page
|
||||
title=><?_code return $title; _code?>
|
||||
body=><?_code return $body; _code?>
|
||||
page?><?_c <LJDEP>
|
||||
link: htdocs/login.bml, htdocs/userinfo.bml
|
||||
post: htdocs/community/join.bml
|
||||
</LJDEP> _c?>
|
||||
|
||||
135
local/htdocs/community/pending.bml
Executable file
135
local/htdocs/community/pending.bml
Executable file
@@ -0,0 +1,135 @@
|
||||
<?page
|
||||
title=><?_ml .title _ml?>
|
||||
body<=
|
||||
<?_code
|
||||
{
|
||||
use strict;
|
||||
use vars qw(%GET %POST);
|
||||
|
||||
LJ::set_active_crumb('commpending');
|
||||
|
||||
return LJ::server_down_html() if $LJ::SERVER_DOWN;
|
||||
|
||||
# always have links at top
|
||||
my $ret = BML::ml('Backlink', {
|
||||
'link' => '/community/manage.bml',
|
||||
'text' => $ML{'/community/members.bml.manage2'},
|
||||
});
|
||||
|
||||
# get remote
|
||||
my $remote = LJ::get_remote();
|
||||
return "<?h1 $ML{'Error'} h1?><?p $ML{'error.noremote'} p?>"
|
||||
unless $remote;
|
||||
|
||||
my $cname = $GET{'comm'};
|
||||
return BML::redirect("$LJ::SITEROOT/community/manage.bml") unless $cname;
|
||||
|
||||
# get $c object
|
||||
my $c = LJ::load_user($cname);
|
||||
return "<?h1 $ML{'Error'} h1?><?p $ML{'/community/members.bml.error.nocomm'} p?>"
|
||||
unless $c;
|
||||
my $cid = $c->{'userid'};
|
||||
|
||||
# is $remote an admin?
|
||||
unless (LJ::can_manage($remote, $c)) {
|
||||
$ret .= "<?h1 $ML{'Error'} h1?><?p ";
|
||||
$ret .= BML::ml('/community/members.bml.error.noaccess',
|
||||
{ comm => LJ::ljuser($cname, { type => 'C' }) });
|
||||
$ret .= " p?>";
|
||||
return $ret;
|
||||
}
|
||||
|
||||
# hit up the database to find pending members
|
||||
my $pendids = LJ::get_pending_members($c) || [];
|
||||
my $us = LJ::load_userids(@$pendids);
|
||||
|
||||
# nothing pending?
|
||||
return "<?h1 $ML{'.nopending.title'} h1?><?p $ML{'.nopending.body'} p?>"
|
||||
unless @$pendids || LJ::did_post();
|
||||
|
||||
# saving a form submission
|
||||
if ($POST{'action:update'}) {
|
||||
my @userids = split(',', $POST{'ids'});
|
||||
|
||||
# need a db handle now
|
||||
my $dbh = LJ::get_db_writer();
|
||||
|
||||
# hit up each user to find out what to do with them
|
||||
my ($added, $rejected, $ignored, $previous);
|
||||
foreach my $id (@userids) {
|
||||
unless ($us->{$id}) {
|
||||
$previous++;
|
||||
next;
|
||||
}
|
||||
if ($POST{"pending_$id"} eq 'yes') {
|
||||
LJ::approve_pending_member($cid, $id);
|
||||
$added++;
|
||||
} elsif ($POST{"pending_$id"} eq 'no') {
|
||||
LJ::reject_pending_member($cid, $id);
|
||||
$rejected++;
|
||||
} else {
|
||||
$ignored++;
|
||||
}
|
||||
}
|
||||
|
||||
$ret .= "<?h1 $ML{'/community/members.bml.success.header'} h1?><?p $ML{'/community/members.bml.success.message2'} p?>";
|
||||
$ret .= "<?p " . BML::ml('.success.added', { num => $added }) . " p?>" if $added;
|
||||
$ret .= "<?p " . BML::ml('.success.rejected', { num => $rejected }) . " p?>" if $rejected;
|
||||
$ret .= "<?p " . BML::ml('.success.ignored', { num => $ignored }) . " p?>" if $ignored;
|
||||
$ret .= "<?p " . BML::ml('.success.previous', { num => $previous }) . " p?>" if $previous;
|
||||
$ret .= "<?p " . BML::ml("/community/members.bml.success.return", { 'link' => BML::get_uri() . "?comm=$cname" }) . " p?>";
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
my @users = sort { $a->{user} cmp $b->{user} } values %$us;
|
||||
my $page_size = 100; # change to adjust page size
|
||||
|
||||
# how to make links back to this page
|
||||
my $self_link = sub {
|
||||
return "pending.bml?comm=$cname&page=$_[0]";
|
||||
};
|
||||
|
||||
my %items = BML::paging(\@users, $GET{page}, $page_size);
|
||||
my $navbar = LJ::paging_bar($items{page}, $items{pages},
|
||||
{ self_link => $self_link });
|
||||
@users = @{$items{items}};
|
||||
|
||||
# output starts here
|
||||
$ret .= "<?p " . BML::ml('/community/members.bml.name', { name => LJ::ljuser($cname, { type => 'C' }) });
|
||||
$ret .= " " . BML::ml('/community/members.bml.settings', { 'link' => "settings.bml?comm=$cname"}) . " p?>";
|
||||
|
||||
$ret .= "<form method='post' action='pending.bml?comm=$cname'>";
|
||||
|
||||
# table headers
|
||||
$ret .= "<br /><div align='center'><table class='borderedtable' cellspacing='0' cellpadding='2'>\n<tr>" .
|
||||
"<th>$ML{'/community/members.bml.key.user'}</th><th colspan='2'>$ML{'.approve.title'}</th></tr>\n";
|
||||
|
||||
# rows for existing users
|
||||
my $rc = 0;
|
||||
foreach (@users) {
|
||||
my $rstyle = ($rc++ & 1) ? '<?altcolor1?>' : '<?altcolor2?>';
|
||||
$ret .= "<tr style='background-color: $rstyle;'><td>" . LJ::ljuser($_->{user}) . "</td>";
|
||||
$ret .= "<td>" . LJ::html_check({ type => 'radio', name => "pending_$_->{userid}",
|
||||
id => "pending_$_->{userid}_yes", value => 'yes' });
|
||||
$ret .= " <label for='pending_$_->{userid}_yes'>$ML{'.yes'}</label></td>\n";
|
||||
$ret .= "<td>" . LJ::html_check({ type => 'radio', name => "pending_$_->{userid}",
|
||||
id => "pending_$_->{userid}_no", value => 'no' });
|
||||
$ret .= " <label for='pending_$_->{userid}_no'>$ML{'.no'}</label></td>\n";
|
||||
$ret .= "</tr>\n";
|
||||
}
|
||||
|
||||
# some hidden values
|
||||
$ret .= LJ::html_hidden('ids', join(',', map { $_->{userid}} @users)) . "\n";
|
||||
$ret .= "</table><p>" . LJ::html_submit('action:update', $ML{'/community/members.bml.update'}) . "</p>\n";
|
||||
$ret .= "</div></form>\n\n";
|
||||
|
||||
$ret .= $navbar;
|
||||
|
||||
return $ret;
|
||||
|
||||
}
|
||||
_code?>
|
||||
|
||||
<=body
|
||||
page?>
|
||||
252
local/htdocs/community/settings.bml
Executable file
252
local/htdocs/community/settings.bml
Executable file
@@ -0,0 +1,252 @@
|
||||
<?page
|
||||
title<=
|
||||
<?_code
|
||||
if ($GET{'mode'} eq 'create') {
|
||||
return $ML{'.title.create'};
|
||||
}
|
||||
else {
|
||||
return $ML{'.title.modify'};
|
||||
}
|
||||
_code?>
|
||||
<=title
|
||||
head<=
|
||||
<style type='text/css'>
|
||||
div.opts { margin: 10px 0 10px 30px; }
|
||||
</style>
|
||||
<=head
|
||||
body<=
|
||||
<?_code
|
||||
|
||||
use strict;
|
||||
use vars qw(%GET %POST);
|
||||
|
||||
# always have links at top
|
||||
my $ret = BML::ml('Backlink', {
|
||||
'link' => '/community/manage.bml',
|
||||
'text' => $ML{'/community/members.bml.manage2'},
|
||||
});
|
||||
my %errors;
|
||||
|
||||
my $remote = LJ::get_remote();
|
||||
|
||||
unless ($remote) {
|
||||
$ret .= "<?h1 $ML{'Error'} h1?><?p $ML{'error.noremote'} p?>";
|
||||
return $ret;
|
||||
}
|
||||
|
||||
unless ($remote->{'journaltype'} eq 'P') {
|
||||
$ret .= "<?h1 $ML{'Error'} h1?><?p $ML{'.error.maintainertype'} p?>";
|
||||
return $ret;
|
||||
}
|
||||
|
||||
my $mode = "modify";
|
||||
$mode = "create" if $GET{'mode'} eq 'create';
|
||||
|
||||
if (LJ::did_post())
|
||||
{
|
||||
my $sth;
|
||||
my $cuser = LJ::canonical_username($POST{'cuser'});
|
||||
my $cu = LJ::load_user($cuser);
|
||||
|
||||
unless ($cu) {
|
||||
$errors{'username'} = $ML{'.error.notfound'};
|
||||
}
|
||||
|
||||
if ($cu && $cu->{'userid'} == $remote->{'userid'}) {
|
||||
$errors{'username'} = $ML{'.error.samenames'};
|
||||
}
|
||||
|
||||
# if we're changing rather than creating, check that we can
|
||||
if ($mode eq 'modify' && !LJ::can_manage_other($remote, $cu)) {
|
||||
$errors{'username'} = BML::ml('.error.noaccess', {'comm'=>$cuser});
|
||||
}
|
||||
|
||||
# if we're creating, community password must match
|
||||
if ($mode eq 'create' && $cu && !LJ::auth_okay($cu, $POST{'cpassword'})) {
|
||||
$errors{'password'} = $ML{'.error.badpassword'};
|
||||
}
|
||||
|
||||
# disallow changing the journal type if the journal has entries
|
||||
if ($mode eq 'create' && !%errors && !LJ::check_priv($remote, "changejournaltype", "")) {
|
||||
my $count;
|
||||
my $userid=$cu->{'userid'}+0;
|
||||
|
||||
my $dbcr = LJ::get_cluster_reader($cu);
|
||||
$count = $dbcr->selectrow_array("SELECT COUNT(*) FROM log2 WHERE journalid=$userid AND posterid=journalid");
|
||||
|
||||
$errors{'username'} = $ML{'.error.hasentries'} if $count;
|
||||
}
|
||||
|
||||
# if it's already a community, don't let them turn it into a community
|
||||
if ($mode eq 'create' && !%errors && $cu->{journaltype} eq 'C') {
|
||||
$errors{'username'} = $ML{'.error.alreadycomm'};
|
||||
}
|
||||
|
||||
# if we found errors, we'll redisplay the form below. otherwise,
|
||||
# proceed.
|
||||
unless (%errors) {
|
||||
my $dbh = LJ::get_db_writer();
|
||||
my $cid = $cu->{'userid'};
|
||||
my $qmembership = $POST{membership};
|
||||
$qmembership = 'closed' unless $qmembership =~ m/(?:open|moderated|closed)/;
|
||||
$qmembership = $dbh->quote($qmembership);
|
||||
my $qpostlevel = $dbh->quote($POST{'postlevel'} eq "members" ? "members" : "select");
|
||||
|
||||
LJ::update_user($cu, { journaltype => 'C' });
|
||||
if ($mode eq 'create') {
|
||||
$dbh->do("REPLACE INTO community (userid, membership, postlevel) VALUES ($cid, $qmembership, $qpostlevel)");
|
||||
LJ::set_rel($cu, $remote, 'A');
|
||||
|
||||
# delete existing friends
|
||||
my $friends = LJ::get_friends($cid, undef, undef, 'force') || {};
|
||||
LJ::remove_friend($cid, [ keys %$friends ]);
|
||||
|
||||
} else {
|
||||
$dbh->do("UPDATE community SET membership=$qmembership, postlevel=$qpostlevel WHERE userid=$cid");
|
||||
}
|
||||
|
||||
my $nonmembers = $POST{'nonmember_posting'} + 0;
|
||||
my $moderated = $POST{'moderated'} + 0;
|
||||
|
||||
LJ::set_userprop($cu, 'nonmember_posting', $nonmembers);
|
||||
LJ::set_userprop($cu, 'moderated', $moderated);
|
||||
|
||||
if ($moderated && ! LJ::load_rel_user($cu->{'userid'}, 'M')->[0]) {
|
||||
LJ::set_rel($cu->{'userid'}, $remote->{'userid'}, 'M');
|
||||
}
|
||||
|
||||
$ret .= "<?h1 $ML{'.success'} h1?>";
|
||||
if ($mode eq 'create') {
|
||||
$ret .= "<?p $ML{'.label.commcreated'} p?>";
|
||||
} else {
|
||||
$ret .= "<?p $ML{'.label.commchanged'} p?>";
|
||||
}
|
||||
|
||||
$ret .= "<?p $ML{'.label.rellinks'} <ul><li><a href='$LJ::SITEROOT/community/$cu->{'user'}/'>$ML{'.label.commsite'}</a></li>";
|
||||
$ret .= "<li><a href='/userinfo.bml?user=$cu->{'user'}'>$ML{'.label.comminfo'}</a></li><li>"
|
||||
. BML::ml('.label.managepage', { 'aopts' => 'href="/community/manage.bml"' }) . "</li></ul> p?>";
|
||||
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
# we're either creating a new community or modifying settings of an existing one
|
||||
# based on whether $mode is 'create' or 'modify'. Most of the page is the same in
|
||||
# either case, and additionally we must preload existing settings when modifying.
|
||||
|
||||
my ($cname, $c);
|
||||
|
||||
$cname = $POST{'cuser'}; # if we're falling through with errors when creating
|
||||
|
||||
my %info = (
|
||||
'membership'=>$POST{'membership'} || 'open',
|
||||
'postlevel'=>$POST{'postlevel'} || 'members',
|
||||
'nonmember_posting'=>$POST{'nonmember_posting'} || 0,
|
||||
'moderated'=>$POST{'moderated'} || 0,
|
||||
);
|
||||
|
||||
if ($mode eq 'modify') {
|
||||
$cname = LJ::canonical_username($GET{'comm'});
|
||||
$c = LJ::load_user($cname);
|
||||
unless ($c) {
|
||||
# if no community was specified, redirect to manage.bml
|
||||
return BML::redirect("$LJ::SITEROOT/community/manage.bml");
|
||||
}
|
||||
unless ($c->{'journaltype'} eq 'C') {
|
||||
$ret = "<?h1 $ML{'Error'} h1?><?p $ML{'.error.notcomm'} p?>";
|
||||
return $ret;
|
||||
}
|
||||
my $dbr = LJ::get_db_reader();
|
||||
($info{'membership'},$info{'postlevel'}) =
|
||||
$dbr->selectrow_array("SELECT membership, postlevel FROM community WHERE userid=$c->{'userid'}");
|
||||
LJ::load_user_props($c, "nonmember_posting", "moderated");
|
||||
$info{'nonmember_posting'} = $c->{'nonmember_posting'} ? 1 : 0;
|
||||
$info{'moderated'} = $c->{'moderated'} ? 1 : 0;
|
||||
}
|
||||
|
||||
$ret .= "<form method='post' action='settings.bml?mode=$mode'>";
|
||||
|
||||
if ($mode eq 'modify') {
|
||||
$ret .= "<?h1 $ML{'.label.changeheader'} h1?><?p $ML{'.label.changetext'} p?>";
|
||||
} else {
|
||||
$ret .= "<?h1 $ML{'.label.createheader'} h1?><?p $ML{'.label.createtext'} p?>";
|
||||
}
|
||||
|
||||
if ($mode eq 'create') {
|
||||
LJ::set_active_crumb('createcommunity');
|
||||
$ret .= "<?h2 $ML{'.label.commheader'} h2?>" .
|
||||
($mode eq 'modify' ? "<?p $ML{'.label.commchanged'} p?>" : "<?p $ML{'.label.commcreate'} p?>");
|
||||
$ret .= "<?standout <table width='350' cellpadding='7'><tr valign='top'><td><b>$ML{'.label.maintainer'}</b></td>";
|
||||
$ret .= "<td><?ljuser $remote->{'user'} ljuser?><br />$ML{'.label.maintainer.login'}</td></tr>";
|
||||
$ret .= "<tr valign='top'><td><b>$ML{'.label.community'}</b></td>";
|
||||
$ret .= "<td>$ML{'.label.username'}<br /><input name='cuser' maxlength='15' value='$cname' /><br />";
|
||||
$ret .= "<?inerr $errors{'username'} inerr?><br />";
|
||||
$ret .= "$ML{'.label.password'}<br /><input name='cpassword' type='password' /><br />";
|
||||
$ret .= "<?inerr $errors{'password'} inerr?></td></tr></table> standout?>";
|
||||
} else {
|
||||
LJ::set_active_crumb('commsettings');
|
||||
$ret .= LJ::html_hidden('cuser', $cname);
|
||||
$ret .= "<?p " . BML::ml('.name',{'name'=>"<?ljcomm $cname ljcomm?>"});
|
||||
$ret .= " " . BML::ml('.members',{'link'=>"/community/members.bml?comm=$cname"}) . " p?>";
|
||||
}
|
||||
|
||||
$ret .= "<?h1 $ML{'.label.commopts'} h1?><?p $ML{'.label.howoperates'} p?>";
|
||||
$ret .= "<?h2 $ML{'.label.membership'} h2?><?p $ML{'.label.whocanjoin'} p?><div class='opts'>";
|
||||
|
||||
# membership levels
|
||||
$ret .= "<p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'membership', id => 'memopen',
|
||||
value => 'open', selected => ($info{membership} eq 'open' ? 1 : 0)});
|
||||
$ret .= "<label for='memopen' $ML{'.label.openmemb'}</label></p><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'membership', id => 'memmoderated',
|
||||
value => 'moderated', selected => ($info{membership} eq 'moderated' ? 1 : 0)});
|
||||
$ret .= "<label for='memmoderated' $ML{'.label.moderatedmemb'}</label></p><p>";
|
||||
$ret .= LJ::html_check({ type => 'radio', name => 'membership', id => 'memclosed',
|
||||
value => 'closed', selected => ($info{membership} eq 'closed' ? 1 : 0)});
|
||||
$ret .= "<label for='memclosed' $ML{'.label.closedmemb2'}</label></p>";
|
||||
$ret .= "</div>";
|
||||
|
||||
my ($optopen,$optclosed);
|
||||
if ($info{'postlevel'} eq 'members') {
|
||||
($optopen,$optclosed)=(" checked='checked'","");
|
||||
} else {
|
||||
($optopen,$optclosed)=("", " checked='checked'");
|
||||
}
|
||||
|
||||
$ret .= "<?h2 $ML{'.label.postaccess'} h2?><?p $ML{'.label.whocanpost'} p?><div class='opts'>";
|
||||
$ret .= "<input type='radio' id='postopen' name='postlevel' value='members'$optopen /><label for='postopen'> $ML{'.label.anybodycan'}</label>";
|
||||
$ret .= "<p><input type='radio' id='postclosed' name='postlevel' value='select'$optclosed /><label for='postclosed'> $ML{'.label.selcan'}</label>";
|
||||
$ret .= "</div>";
|
||||
|
||||
if ($info{'nonmember_posting'}) {
|
||||
($optopen,$optclosed)=(" checked='checked'","");
|
||||
} else {
|
||||
($optopen,$optclosed)=("", " checked='checked'");
|
||||
}
|
||||
|
||||
$ret .= "<?h2 $ML{'.label.nmheader'} h2?><?p $ML{'.label.nmtext'} p?><div class='opts'>";
|
||||
$ret .= "<input type='radio' id='nonopen' name='nonmember_posting' value='0'$optclosed /><label for='nonopen'> $ML{'.label.nmcant'}</label>";
|
||||
$ret .= "<p><input type='radio' id='nonclosed' name='nonmember_posting' value='1'$optopen /><label for='nonclosed'> $ML{'.label.nmcan'}</label>";
|
||||
$ret .= "</div>";
|
||||
|
||||
if ($info{'moderated'}) {
|
||||
($optopen,$optclosed)=(" checked='checked'","");
|
||||
} else {
|
||||
($optopen,$optclosed)=("", " checked='checked'");
|
||||
}
|
||||
|
||||
$ret .= "<?h2 $ML{'.label.modheader'} h2?><?p $ML{'.label.modtext'} p?><div class='opts'>";
|
||||
$ret .= "<input type='radio' id='radunmod' name='moderated' value='0'$optclosed /><label for='radunmod'> $ML{'.label.modisnt'}</label>";
|
||||
$ret .= "<p><input type='radio' id='radmod' name='moderated' value='1'$optopen /><label for='radmod'> $ML{'.label.modis'}</label>";
|
||||
$ret .= "</div>\n";
|
||||
|
||||
$ret .= "<center><input type='submit' value='" .
|
||||
($mode eq 'create' ? "$ML{'.button.createcommunity'}" : "$ML{'.button.changecommunity'}") .
|
||||
"' /></center></form>";
|
||||
|
||||
return $ret;
|
||||
|
||||
_code?>
|
||||
|
||||
<=body
|
||||
page?>
|
||||
Reference in New Issue
Block a user