Templating and Account settings page
This commit is contained in:
parent
1238e052ff
commit
e6bb69d9d3
89
Main.php
89
Main.php
@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace IdnoPlugins\Diaspora {
|
namespace IdnoPlugins\KnownDiaspora {
|
||||||
|
|
||||||
class Main extends \Idno\Common\Plugin
|
class Main extends \Idno\Common\Plugin
|
||||||
{
|
{
|
||||||
@ -9,31 +9,23 @@
|
|||||||
|
|
||||||
function registerPages()
|
function registerPages()
|
||||||
{
|
{
|
||||||
// Deauth URL
|
|
||||||
\Idno\Core\site()->addPageHandler('facebook/deauth', '\IdnoPlugins\Facebook\Pages\Deauth');
|
|
||||||
// Register the callback URL
|
|
||||||
\Idno\Core\site()->addPageHandler('facebook/callback', '\IdnoPlugins\Facebook\Pages\Callback');
|
|
||||||
// Register admin settings
|
|
||||||
\Idno\Core\site()->addPageHandler('admin/facebook', '\IdnoPlugins\Facebook\Pages\Admin');
|
|
||||||
// Register settings page
|
// Register settings page
|
||||||
\Idno\Core\site()->addPageHandler('account/facebook', '\IdnoPlugins\Facebook\Pages\Account');
|
\Idno\Core\site()->addPageHandler('account/diaspora', '\IdnoPlugins\KnownDiaspora\Pages\Account');
|
||||||
|
|
||||||
/** Template extensions */
|
/** Template extensions */
|
||||||
// Add menu items to account & administration screens
|
// Add menu items to account screens
|
||||||
\Idno\Core\site()->template()->extendTemplate('admin/menu/items', 'admin/facebook/menu');
|
\Idno\Core\site()->template()->extendTemplate('account/menu/items', 'account/diaspora/menu');
|
||||||
\Idno\Core\site()->template()->extendTemplate('account/menu/items', 'account/facebook/menu');
|
|
||||||
\Idno\Core\site()->template()->extendTemplate('onboarding/connect/networks', 'onboarding/connect/facebook');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function registerEventHooks()
|
/*function registerEventHooks()
|
||||||
{
|
{ // TODO
|
||||||
|
|
||||||
\Idno\Core\site()->syndication()->registerService('facebook', function () {
|
\Idno\Core\site()->syndication()->registerService('diaspora', function () {
|
||||||
return $this->hasFacebook();
|
return $this->hasDiaspora();
|
||||||
}, array('note', 'article', 'image', 'media','rsvp', 'bookmark'));
|
}, array('note', 'article', 'image', 'media','rsvp', 'bookmark'));
|
||||||
|
|
||||||
if ($this->hasFacebook()) {
|
if ($this->hasDiaspora()) {
|
||||||
if (is_array(\Idno\Core\site()->session()->currentUser()->facebook) && !array_key_exists('access_token', \Idno\Core\site()->session()->currentUser()->facebook)) {
|
if (is_array(\Idno\Core\site()->session()->currentUser()->diaspora) && !array_key_exists('access_token', \Idno\Core\site()->session()->currentUser()->facebook)) {
|
||||||
foreach(\Idno\Core\site()->session()->currentUser()->facebook as $username => $details) {
|
foreach(\Idno\Core\site()->session()->currentUser()->facebook as $username => $details) {
|
||||||
\Idno\Core\site()->syndication()->registerServiceAccount('facebook', $username, $details['name']);
|
\Idno\Core\site()->syndication()->registerServiceAccount('facebook', $username, $details['name']);
|
||||||
}
|
}
|
||||||
@ -180,66 +172,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the URL to authenticate with Facebook
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
function getAuthURL()
|
|
||||||
{
|
|
||||||
$facebook = $this;
|
|
||||||
if ($facebookAPI = $facebook->connect()) {
|
|
||||||
return $facebookAPI->getLoginUrl();
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connect to Facebook
|
|
||||||
* @return bool|FacebookAPI
|
|
||||||
*/
|
|
||||||
function connect($account_id = '')
|
|
||||||
{
|
|
||||||
if (!empty(\Idno\Core\site()->config()->facebook)) {
|
|
||||||
|
|
||||||
require_once(dirname(__FILE__) . '/external/facebook-sdk/autoload.php');
|
|
||||||
\Facebook\FacebookSession::setDefaultApplication(
|
|
||||||
\Idno\Core\site()->config()->facebook['appId'],
|
|
||||||
\Idno\Core\site()->config()->facebook['secret']
|
|
||||||
);
|
|
||||||
|
|
||||||
$facebookAPI = new FacebookAPI();
|
|
||||||
if (!empty($account_id)) {
|
|
||||||
if (!empty(\Idno\Core\site()->session()->currentUser()->facebook[$account_id])) {
|
|
||||||
$facebookAPI->setAccessToken(\Idno\Core\site()->session()->currentUser()->facebook[$account_id]['access_token']);
|
|
||||||
$this->endpoint = $account_id;
|
|
||||||
return $facebookAPI;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!empty(\Idno\Core\site()->session()->currentUser()->facebook['access_token'])) {
|
|
||||||
$facebookAPI->setAccessToken(\Idno\Core\site()->session()->currentUser()->facebook['access_token']);
|
|
||||||
}
|
|
||||||
return $facebookAPI; // This needs to return even if we haven't set the user token yet, for the auth callback
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Can the current user use Twitter?
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
function hasFacebook()
|
|
||||||
{
|
|
||||||
if (!\Idno\Core\site()->session()->currentUser()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return \Idno\Core\site()->session()->currentUser()->facebook;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* Diaspora pages
|
* Diaspora pages
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace IdnoPlugins\Diaspora\Pages {
|
namespace IdnoPlugins\KnownDiaspora\Pages {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default class to serve Diaspora-related account settings
|
* Default class to serve Diaspora-related account settings
|
||||||
@ -14,23 +14,36 @@
|
|||||||
|
|
||||||
function getContent()
|
function getContent()
|
||||||
{
|
{
|
||||||
$this->gatekeeper(); // Logged-in users only
|
if(isset($_GET['remove'])) {
|
||||||
if ($diaspora = \Idno\Core\site()->plugins()->get('Diaspora')) {
|
\Idno\Core\site()->config->config['diaspora'] = [
|
||||||
$login_url = $diaspora->getAuthURL();
|
'diaspora_username' => '',
|
||||||
|
'diaspora_password' => '',
|
||||||
|
'diaspora_pod' => ''
|
||||||
|
];
|
||||||
|
\Idno\Core\site()->config()->save();
|
||||||
|
\Idno\Core\site()->session()->addMessage('Your Diaspora credentials were removed.');
|
||||||
|
$this->forward(\Idno\Core\site()->config()->getDisplayURL() . 'account/diaspora/');
|
||||||
}
|
}
|
||||||
|
$this->gatekeeper(); // Logged-in users only
|
||||||
$t = \Idno\Core\site()->template();
|
$t = \Idno\Core\site()->template();
|
||||||
$body = $t->__(array('login_url' => $login_url))->draw('account/diaspora');
|
$body = $t->__(array())->draw('account/diaspora');
|
||||||
$t->__(array('title' => 'Diaspora', 'body' => $body))->drawPage();
|
$t->__(array('title' => 'Diaspora', 'body' => $body))->drawPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
function postContent() {
|
function postContent() {
|
||||||
$this->gatekeeper(); // Logged-in users only
|
$this->gatekeeper(); // Logged-in users only
|
||||||
if (($this->getInput('remove'))) {
|
$pod = $this->getInput('pod');
|
||||||
$user = \Idno\Core\site()->session()->currentUser();
|
$username = $this->getInput('user');
|
||||||
$user->diaspora = array();
|
$password = $this->getInput('pass');
|
||||||
$user->save();
|
\Idno\Core\site()->config->config['diaspora'] = [
|
||||||
\Idno\Core\site()->session()->addMessage('Your Diaspora settings have been removed from your account.');
|
'diaspora_username' => $username,
|
||||||
|
'diaspora_pod' => $pod
|
||||||
|
];
|
||||||
|
if (empty(\Idno\Core\site()->config->config['diaspora']['diaspora_password']) || !empty($password) ) {
|
||||||
|
\Idno\Core\site()->config->config['diaspora']['diaspora_password'] = $password;
|
||||||
}
|
}
|
||||||
|
\Idno\Core\site()->config()->save();
|
||||||
|
\Idno\Core\site()->session()->addMessage('Your Diaspora credentials were saved.');
|
||||||
$this->forward(\Idno\Core\site()->config()->getDisplayURL() . 'account/diaspora/');
|
$this->forward(\Idno\Core\site()->config()->getDisplayURL() . 'account/diaspora/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Diaspora pages
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace IdnoPlugins\Diaspora\Pages {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default class to serve Diaspora settings in administration
|
|
||||||
*/
|
|
||||||
class Admin extends \Idno\Common\Page
|
|
||||||
{
|
|
||||||
|
|
||||||
function getContent()
|
|
||||||
{
|
|
||||||
$this->adminGatekeeper(); // Admins only
|
|
||||||
$t = \Idno\Core\site()->template();
|
|
||||||
$body = $t->draw('admin/diaspora');
|
|
||||||
$t->__(array('title' => 'Diaspora', 'body' => $body))->drawPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
function postContent() {
|
|
||||||
$this->adminGatekeeper(); // Admins only
|
|
||||||
$appId = $this->getInput('appId');
|
|
||||||
$secret = $this->getInput('secret');
|
|
||||||
\Idno\Core\site()->config->config['diaspora'] = array(
|
|
||||||
'appId' => $appId,
|
|
||||||
'secret' => $secret
|
|
||||||
);
|
|
||||||
\Idno\Core\site()->config()->save();
|
|
||||||
\Idno\Core\site()->session()->addMessage('Your Diaspora application details were saved.');
|
|
||||||
$this->forward(\Idno\Core\site()->config()->getDisplayURL() . 'admin/diaspora/');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,66 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Diaspora pages
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace IdnoPlugins\Diaspora\Pages {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default class to serve the Diaspora callback
|
|
||||||
*/
|
|
||||||
class Callback extends \Idno\Common\Page
|
|
||||||
{
|
|
||||||
|
|
||||||
function getContent()
|
|
||||||
{
|
|
||||||
$this->gatekeeper(); // Logged-in users only
|
|
||||||
if ($diaspora = \Idno\Core\site()->plugins()->get('Diaspora')) {
|
|
||||||
if ($diasporaAPI = $diaspora->connect()) {
|
|
||||||
/* @var \IdnoPlugins\diaspora\diasporaAPI $diasporaAPI */
|
|
||||||
if ($session = $diasporaAPI->getSessionOnLogin()) {
|
|
||||||
$user = \Idno\Core\site()->session()->currentUser();
|
|
||||||
$access_token = $session->getToken();
|
|
||||||
$diasporaAPI->setAccessToken($access_token);
|
|
||||||
if ($person = $diasporaAPI->api('/me','GET')) {
|
|
||||||
$name = $person['response']->getProperty('name');
|
|
||||||
$id = $person['response']->getProperty('id');
|
|
||||||
$user->diaspora[$id] = ['id' => $id, 'access_token' => $access_token, 'name' => $name];
|
|
||||||
\Idno\Core\site()->syndication()->registerServiceAccount('diaspora', $id, $name);
|
|
||||||
if (\Idno\Core\site()->config()->multipleSyndicationAccounts()) {
|
|
||||||
if ($companies = $diasporaAPI->api('/me/accounts','GET')) {
|
|
||||||
if (!empty($companies['response'])) {
|
|
||||||
foreach($companies['response']->asArray() as $company_container) {
|
|
||||||
foreach($company_container as $company) {
|
|
||||||
$company = (array) $company;
|
|
||||||
if ($perms = $company['perms']) {
|
|
||||||
if (in_array('CREATE_CONTENT', $perms) && !empty($company['name'])) {
|
|
||||||
$id = $company['id'];
|
|
||||||
$name = $company['name'];
|
|
||||||
$access_token = $company['access_token'];
|
|
||||||
$user->diaspora[$id] = ['id' => $id, 'access_token' => $access_token, 'name' => $name, 'page' => true];
|
|
||||||
\Idno\Core\site()->syndication()->registerServiceAccount('diaspora', $id, $name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$user->diaspora = array('access_token' => $access_token);
|
|
||||||
}
|
|
||||||
$user->save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!empty($_SESSION['onboarding_passthrough'])) {
|
|
||||||
unset($_SESSION['onboarding_passthrough']);
|
|
||||||
$this->forward(\Idno\Core\site()->config()->getURL() . 'begin/connect-forwarder');
|
|
||||||
}
|
|
||||||
$this->forward(\Idno\Core\site()->config()->getDisplayURL() . 'account/diaspora/');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
[Plugin description]
|
[Plugin description]
|
||||||
name = "Diaspora"
|
name = "KnownDiaspora"
|
||||||
version = 0.1
|
version = 0.1
|
||||||
author = "Lucas Verney (Phyks)"
|
author = "Lucas Verney (Phyks)"
|
||||||
author_email = "phyks@phyks.me"
|
author_email = "phyks@phyks.me"
|
||||||
|
@ -1,110 +0,0 @@
|
|||||||
<div class="row">
|
|
||||||
|
|
||||||
<div class="span10 offset1">
|
|
||||||
<?= $this->draw('account/menu') ?>
|
|
||||||
<h1>Facebook</h1>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="span10 offset1">
|
|
||||||
<?php
|
|
||||||
if (empty(\Idno\Core\site()->session()->currentUser()->facebook)) {
|
|
||||||
?>
|
|
||||||
<div class="control-group">
|
|
||||||
<div class="controls-config">
|
|
||||||
<div class="row">
|
|
||||||
<div class="span6">
|
|
||||||
<p>
|
|
||||||
Easily share pictures, updates, and posts to Facebook.</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
With Facebook connected, you can cross-post content that you publish publicly on
|
|
||||||
your site.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="social span6">
|
|
||||||
<p>
|
|
||||||
<a href="<?= $vars['login_url'] ?>" class="connect fb">Connect Facebook</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
?>
|
|
||||||
<div class="control-group">
|
|
||||||
<div class="controls-config">
|
|
||||||
<div class="row">
|
|
||||||
<div class="span6">
|
|
||||||
<p>
|
|
||||||
Your account is currently connected to Facebook.
|
|
||||||
Public updates, pictures, and posts that you publish
|
|
||||||
here can be cross-posted to Facebook.
|
|
||||||
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
|
|
||||||
if ($accounts = \Idno\Core\site()->syndication()->getServiceAccounts('facebook')) {
|
|
||||||
|
|
||||||
foreach ($accounts as $id => $account) {
|
|
||||||
|
|
||||||
?>
|
|
||||||
<div class="social">
|
|
||||||
<form action="<?= \Idno\Core\site()->config()->getDisplayURL() ?>facebook/deauth"
|
|
||||||
class="form-horizontal" method="post">
|
|
||||||
<p>
|
|
||||||
<input type="hidden" name="remove" value="<?= $account['username'] ?>"/>
|
|
||||||
<button type="submit"
|
|
||||||
class="connect fb connected"><?= $account['name'] ?> (Disconnect)
|
|
||||||
</button>
|
|
||||||
<?= \Idno\Core\site()->actions()->signForm('/account/facebook/') ?>
|
|
||||||
</p>
|
|
||||||
</form>
|
|
||||||
<?php
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="social">
|
|
||||||
<form action="<?= \Idno\Core\site()->config()->getDisplayURL() ?>facebook/deauth"
|
|
||||||
class="form-horizontal" method="post">
|
|
||||||
<p>
|
|
||||||
<input type="hidden" name="remove" value="1"/>
|
|
||||||
<button type="submit" class="connect fb connected">Disconnect Facebook
|
|
||||||
</button>
|
|
||||||
<?= \Idno\Core\site()->actions()->signForm('/account/facebook/') ?>
|
|
||||||
</p>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="<?= $vars['login_url'] ?>" ><icon class="icon-plus"></icon> Add another Facebook account</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1 +0,0 @@
|
|||||||
<li <?php if ($_SERVER['REQUEST_URI'] == '/account/facebook/') echo 'class="active"'; ?>><a href="/account/facebook/">Facebook</a></li>
|
|
@ -1,55 +0,0 @@
|
|||||||
<div class="row">
|
|
||||||
|
|
||||||
<div class="span10 offset1">
|
|
||||||
<?=$this->draw('admin/menu')?>
|
|
||||||
<h1>Facebook configuration</h1>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="span10 offset1">
|
|
||||||
<form action="<?=\Idno\Core\site()->config()->getURL()?>admin/facebook/" class="form-horizontal" method="post">
|
|
||||||
<div class="control-group">
|
|
||||||
<div class="controls-config">
|
|
||||||
<p>
|
|
||||||
To begin using Facebook, <a href="https://developers.facebook.com/apps" target="_blank">create a new application in
|
|
||||||
the Facebook apps portal</a>.</p>
|
|
||||||
<p>
|
|
||||||
Mark the Platform as <strong>Website</strong>, and use <strong><?=\Idno\Core\site()->config()->url?></strong>
|
|
||||||
as the site URL. Be sure to also include an email address. Then, click <em>Status & Review</em>, and make the app public.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Once you've finished, fill in the details below. You can then <a href="<?=\Idno\Core\site()->config()->getURL()?>account/facebook/">connect your Facebook account</a>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="control-group">
|
|
||||||
<label class="control-label" for="name">App ID</label>
|
|
||||||
<div class="controls">
|
|
||||||
<input type="text" id="name" placeholder="App ID" class="span6" name="appId" value="<?=htmlspecialchars(\Idno\Core\site()->config()->facebook['appId'])?>" >
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="control-group">
|
|
||||||
<label class="control-label" for="name">App secret</label>
|
|
||||||
<div class="controls">
|
|
||||||
<input type="text" id="name" placeholder="App secret" class="span6" name="secret" value="<?=htmlspecialchars(\Idno\Core\site()->config()->facebook['secret'])?>" >
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="control-group">
|
|
||||||
<p>
|
|
||||||
After the Facebook application is configured, you must connect under account Settings.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="control-group">
|
|
||||||
<div class="controls-save">
|
|
||||||
<button type="submit" class="btn btn-primary">Save settings</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?= \Idno\Core\site()->actions()->signForm('/admin/facebook/')?>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1 +0,0 @@
|
|||||||
<li <?php if ($_SERVER['REQUEST_URI'] == '/admin/facebook/') echo 'class="active"'; ?>><a href="<?=\Idno\Core\site()->config()->getURL()?>admin/facebook/">Facebook</a></li>
|
|
@ -1 +0,0 @@
|
|||||||
<i class="icon-facebook"></i>
|
|
@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
if ($facebook = \Idno\Core\site()->plugins()->get('Facebook')) {
|
|
||||||
if (empty(\Idno\Core\site()->session()->currentUser()->facebook)) {
|
|
||||||
$login_url = $facebook->getAuthURL();
|
|
||||||
} else {
|
|
||||||
$login_url = \Idno\Core\site()->config()->getURL() . 'facebook/deauth';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
||||||
<div class="social">
|
|
||||||
<a href="<?=$login_url?>" class="connect fb <?php
|
|
||||||
|
|
||||||
if (!empty(\Idno\Core\site()->session()->currentUser()->facebook)) { echo 'connected'; }
|
|
||||||
|
|
||||||
?>" target="_top">Facebook<?php if (!empty(\Idno\Core\site()->session()->currentUser()->facebook)) { echo ' - connected!'; } ?></a><br>
|
|
||||||
<label class="control-label">Share pictures, updates, and posts to Facebook.</label>
|
|
||||||
</div>
|
|
Loading…
Reference in New Issue
Block a user