Commit inicial - WordPress Análisis de Precios Unitarios

- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-11-03 21:04:30 -06:00
commit a22573bf0b
24068 changed files with 4993111 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
<?php
namespace bizpanda\includes\gates\facebook;
use bizpanda\includes\gates\exceptions\GateBridgeException;
use bizpanda\includes\gates\GateBridge;
use bizpanda\includes\gates\OAuthGateBridge;
/**
* Proxy for requests to the Facebook API.
*/
class FacebookBridge extends OAuthGateBridge {
/**
* Returns an URL to authorize and grant permissions.
* @param array $stateArgs An extra data to add into the state argument. They will be passed back on callback.
* @return string An URL to authorize.
*/
public function getAuthorizeURL( $stateArgs = [] ) {
$endpointUrl = 'https://www.facebook.com/v7.0/dialog/oauth';
$args = [
'scope' => $this->permissions,
'response_type' => 'code',
'redirect_uri' => $this->callbackUrl,
'client_id' => $this->clientId,
'display' => 'popup',
'auth_type' => 'rerequest',
'state' => $this->buildStateParam( $stateArgs )
];
return $endpointUrl . '?' . http_build_query( $args );
}
/**
* Gets the access token using the code received on the authorization step.
* @param $code Code received on the authorization step.
* @return mixed[]
* @throws GateBridgeException
*/
function getAccessToken( $code ) {
$endpointUrl = 'https://graph.facebook.com/v7.0/oauth/access_token';
$requestData = [
'code' => $code,
'redirect_uri' => $this->callbackUrl,
'client_id' => $this->clientId,
'client_secret' => $this->clientSecret
];
$json = $this->requestJson($endpointUrl, 'GET', [
'data' => $requestData
]);
if ( !isset( $json['access_token'] ) ) {
throw $this->createException( GateBridgeException::UNEXPECTED_RESPONSE, 'The parameter [access_token] is not set.' );
}
return [
'accessToken' => $json['access_token']
];
}
/**
* Gets user info.
*/
function getUserInfo() {
$endpointUrl = 'https://graph.facebook.com/me';
$url = $endpointUrl . '?fields=email,first_name,last_name,gender,link&access_token=' . $this->accessToken;
return $this->requestJson($url, 'GET');
}
/**
* Makes a request to Facebook API.
* @param $url
* @param $method
* @param array $options
* @return string
* @throws GateBridgeException
*/
function requestJson($url, $method, $options = [] ) {
$options['expectJson'] = true;
$json = $this->http( $url, $method, $options );
return $this->throwExceptionOnErrors( $json );
}
/**
* Throws an exception if the response contains errors.
* @param $json
* @return mixed[] Returns response data back.
* @throws GateBridgeException
*/
function throwExceptionOnErrors( $json ) {
if ( isset( $json['error'] ) && isset( $json['error_description'] ) ) {
throw $this->createException( GateBridgeException::ERROR_RESPONSE, $json['error_description']);
} else if ( isset( $json['error'] ) && isset( $json['error']['message'] ) ) {
throw $this->createException( GateBridgeException::ERROR_RESPONSE, $json['error']['message']);
}
return $json;
}
}

View File

@@ -0,0 +1,116 @@
<?php
namespace bizpanda\includes\gates\facebook;
use bizpanda\includes\gates\Gate;
use bizpanda\includes\gates\exceptions\GateException;
use bizpanda\includes\gates\OAuthGate;
use bizpanda\includes\gates\OAuthGateBridge;
use Yii;
/**
* The class to proxy the request to the Facebook API.
*/
class FacebookGate extends OAuthGate {
/**
* FacebookGate constructor.
* @param null $session
* @param null $config
* @param null $request
*/
public function __construct($session = null, $config = null, $request = null)
{
parent::__construct($session, $config, $request);
$this->name = 'facebook';
$this->allowedPermissionScopes = ['userinfo'];
}
/**
* @inheritDoc
*/
public function createBridge( $authorized = false ) {
$config = $this->getOptionsForBridge( $authorized );
return new FacebookBridge( $config );
}
/**
* @inheritDoc
*/
public function getOptionsForBridge( $authorized = false ) {
$options = $this->config->get( $this->name );
if ( !isset( $options['clientId'] ) || !isset( $options['clientSecret'] ) ) {
throw GateException::create(GateException::APP_NOT_CONFIGURED, 'App Id or App Secret are not set.' );
}
$options['permissions'] = $this->getFacebookPermissions( $this->permissionScopes );
if ( $authorized ) {
$options['accessToken'] = $this->getVisitorValue($this->name . '_access_token', null );
if ( empty( $options['accessToken'] ) ) {
throw GateException::create(GateException::AUTH_FLOW_BROKEN, 'The access token is not set.' );
}
}
return $options;
}
/**
* Converts app scopes to Facebook permissions.
* @param array $permissionScopes A set of scopes to convert to Facebook permissions.
* @return string
*/
public function getFacebookPermissions( $permissionScopes ) {
$permissions = [];
foreach( $permissionScopes as $scope ) {
if ( 'userinfo' === $scope ) {
$permissions[] = 'public_profile';
$permissions[] = 'email';
}
}
return implode(' ', $permissions);
}
/**
* Returns user profile info.
* @return mixed
*/
public function doGetUserInfo() {
$bridge = $this->createBridge( true );
$result = $bridge->getUserInfo();
$identity = [
'source' => 'facebook',
'email' => isset( $result['email'] ) ? $result['email'] : false,
'displayName' => false,
'name' => isset( $result['first_name'] ) ? $result['first_name'] : false,
'family' => isset( $result['last_name'] ) ? $result['last_name'] : false,
'gender' => isset( $result['gender'] ) ? $result['gender'] : false,
'social' => true,
'facebookId' => isset( $result['id'] ) ? $result['id'] : false,
'facebookUrl' => isset( $result['link'] ) ? $result['link'] : false,
'image' => false
];
$identity['displayName'] = $this->buildDisplayName( $identity );
if ( !empty( $identity['facebookId'] ) ) {
$identity['image'] = 'https://graph.facebook.com/' . $identity['facebookId'] . '/picture?type=large';
}
return $this->prepareResult([
'identity' => $identity,
]);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long