src/Controller/ApiClientController.php line 389
<?phpnamespace App\Controller;use App\AppHelper\Helper;use App\AppHelper\Settings;use App\Entity\Fonts;use App\Entity\Licences;use App\Entity\OAuth2UserConsent;use App\Entity\Product;use App\Entity\ProductLicense;use App\Entity\SystemSettings;use App\Entity\User;use App\Products\FlxZip;use DateTimeImmutable;use Doctrine\ORM\EntityManagerInterface;use Doctrine\ORM\Query\Expr\Join;use Exception;use Firebase\JWT\JWK;use Firebase\JWT\JWT;use League\Bundle\OAuth2ServerBundle\Model\Client;use League\Bundle\OAuth2ServerBundle\Model\Client as clientModel;use League\OAuth2\Server\AuthorizationServer;use League\OAuth2\Server\Exception\OAuthServerException;use Psr\Http\Message\ServerRequestInterface;use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\BinaryFileResponse;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\HttpFoundation\ResponseHeaderBag;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Security\Core\User\UserInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\Serializer\SerializerInterface;use ZipArchive;class ApiClientController extends AbstractController{use Settings;public function __construct(private readonly EntityManagerInterface $em,private readonly SerializerInterface $serializer){}#[Route('/api/license/{license}', name: 'app_get_license_by_id')]public function apiGetLicenseById(Request $request): JsonResponse{$license = $request->get('license');$referer = $request->headers->get('X-Origin-URL');$query = $this->em->createQueryBuilder()->from(ProductLicense::class, 'l')->select('l, u, ud')->leftJoin('l.user', 'u')->leftJoin('u.userdetails', 'ud')->andWhere('l.product_license =:product_license')->setParameter('product_license', $license);$result = $query->getQuery()->getArrayResult();$data = $result[0] ?? null;$apiRedirect = [];if($data){$email = $data['user']['email'];$client = $this->em->getRepository(Client::class)->findOneBy(['name' => $email]);$urls = $client->getRedirectUris();$apiRedirect = implode(',', $urls);$apiRedirect = explode(',', $apiRedirect);}$helper = Helper::instance();$redirectArr = [];foreach ($apiRedirect as $tmp) {$redirectArr[] = $helper->removeTrailingSlash($tmp);}$referer = $helper->removeTrailingSlash($referer);$license_status = false;if(in_array($referer, $redirectArr)) {$license_status = true;}$object = ['id' => $license,'license' => $license_status,'urls' => $apiRedirect,'referer' => $referer,'cronjob' => $data['user']['userdetails']['cronjob'],'user_active' => $data['user']['userdetails']['aktiv']];// return $this->json($object);$json = $this->serializer->serialize($object, 'json');return new JsonResponse($json, 200, [], true);}#[Route('/api/test', name: 'app_api_test')]#[IsGranted('ROLE_OAUTH2_BASIC')]public function apiTest(Request $request): Response{/** @var User $user */$user = $this->getUser();if ($user) {$loggedInEmail = $user->getEmail();} else {$loggedInEmail = 'empty';}$callValidate = $this->validate_client($request);$client = $callValidate['client'];$clientUser = $callValidate['user'];if (!$callValidate['status']) {return $this->json(['error' => $callValidate['msg'],'error_description' => 'Client authentication failed','message' => 'Client authentication failed'], 403);}return $this->json(['message' => 'You successfully authenticated!','email' => $client->getName(),'loggend_in_user' => $loggedInEmail,'vorname' => $clientUser->getUserdetails()->getFirstName(),'nachname' => $clientUser->getUserdetails()->getLastName(),'scope' => explode(',', $callValidate['scopes']),], 200);}/*** @param Fonts $fonts* @return BinaryFileResponse|void*/#[Route('/api/fonts/{id}/download', name: '_api_download_font')]#[IsGranted('ROLE_OAUTH2_BASIC')]public function api_font_download(Fonts $fonts){$helper = Helper::instance();$fontDir = $this->getParameter('fonts_dir');$zipDir = $fontDir . 'zip';$tmpDir = $fontDir . 'tmp';$fileDir = $fontDir . 'fonts' . DIRECTORY_SEPARATOR . $fonts->getBezeichnung();if (is_dir($zipDir)) {$helper->recursive_destroy_dir($zipDir);}try {$helper->make_is_dir($tmpDir);} catch (Exception $e) {dd($e->getMessage());}try {$helper->make_is_dir($zipDir);} catch (Exception $e) {dd($e->getMessage());}try {$helper->recursive_copy($fileDir, $tmpDir . DIRECTORY_SEPARATOR . $fonts->getBezeichnung());} catch (Exception $e) {dd($e->getMessage());}$srcCss = $fontDir . 'fonts' . DIRECTORY_SEPARATOR . $fonts->getBezeichnung() . '.css';$destCss = $tmpDir . DIRECTORY_SEPARATOR . 'stylesheet.css';try {$helper->move_file($srcCss, $destCss);} catch (Exception $e) {dd($e->getMessage());}$zipFile = $zipDir . DIRECTORY_SEPARATOR . $fonts->getBezeichnung() . '.zip';$za = new FlxZip;$res = $za->open($zipFile, ZipArchive::CREATE);if ($res === true) {$za->addDir($tmpDir, '');$za->close();}$helper->recursive_destroy_dir($tmpDir);if (is_file($zipFile)) {$response = new BinaryFileResponse($zipFile);$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT,$fonts->getBezeichnung() . '.zip');return $response;}}#[Route('/api/get-client', name: 'app_get_client')]#[IsGranted('ROLE_OAUTH2_BASIC')]public function api_get_client(Request $request): Response{$callValidate = $this->validate_client($request);if (!$callValidate['status']) {return $this->json(['error' => $callValidate['msg'],'error_description' => 'Client authentication failed','message' => 'Client authentication failed'], 403);}$client = $callValidate['client'];$valUser = $callValidate['user'];$loggedInEmail = '';/** @var User $user */if ($this->getUser() !== null) {$user = $this->getUser();if ($user) {if ($user->getRoles()) {$loggedInEmail = $user->getEmail();}}}//$lizenz = $this->em->getRepository(ProductLicense::class)->get_lizenz($valUser->getId(), $callValidate['redirect_uri']);$client = $this->em->getRepository(Client::class)->find($request->get('client_id'));if (!in_array($callValidate['redirect_uri'], $client->getRedirectUris())) {return $this->json(['error' => $callValidate['msg'],'error_description' => 'Client authentication failed','message' => 'Client authentication failed (URL)'], 403);}$lizenz = $this->em->getRepository(ProductLicense::class)->get_lizenz_not_check_uri($valUser->getId());//dd($lizenz);// $lizenz = $this->em->getRepository(ProductLicense::class)->get_others_uri_lizenz($valUser->getId());if (!$lizenz->status) {return $this->json(['error' => 'error','error_description' => 'Client authentication failed','message' => 'Client authentication failed'], 403);}$lizenzData = $lizenz->record;$lizenzDaten = [];foreach ($lizenzData as $tmp) {if (!$tmp['activatedAt']) {$activatedAt = new DateTimeImmutable();$activatedAtLizenz = $this->em->getRepository(ProductLicense::class)->find($tmp['id']);$activatedAtLizenz->setActivatedAt($activatedAt);$this->em->persist($activatedAtLizenz);$this->em->flush();}$produkt = $this->em->getRepository(Product::class)->find($tmp['product_id']);unset($tmp['upload_token']);$tmp['version'] = $produkt->getVersion();$tmp['description'] = $produkt->getBeschreibung();$tmp['redirect_uri'] = $callValidate['redirect_uri'];$lizenzDaten[] = $tmp;}$lsP = [];$licenseProducts = $this->em->getRepository(Product::class)->findBy(['is_license' => true, 'is_show_api' => true]);if ($licenseProducts) {foreach ($licenseProducts as $tmp) {$s = $this->get_product_type($tmp->getType());$item = ['basename' => $tmp->getSlug(),'bezeichnung' => $tmp->getBezeichnung(),'type' => $tmp->getType(),'raw_type' => $s['type']];$lsP[] = $item;}}return $this->json(['email' => $client->getName(),'logged_in_email' => $loggedInEmail,'vorname' => $valUser->getUserdetails()->getFirstName(),'nachname' => $valUser->getUserdetails()->getLastName(),'lizenz_data' => $lizenzDaten,'lizenz_products' => $lsP,'cronjob' => $valUser->getUserdetails()->getCronjob(),'scope' => explode(',', $callValidate['scopes']),], 200);}#[Route('/api/{product_license}/wp-cron', name: 'app_wp_cron_check')]public function wp_cron_check(Request $request): Response{$product_license = $request->get('product_license');$redirectUri = $request->query->get('redirect_uri');$redirect_uri = filter_var($redirectUri, FILTER_VALIDATE_URL);if (!$product_license || !$redirect_uri) {return $this->json(['error' => 'not-found','error_description' => 'Product not found','message' => 'Product not found',], 401);}$productLicense = $this->em->getRepository(ProductLicense::class)->get_license_cron($product_license);if (!$productLicense) {return $this->json(['error' => 'not-found','error_description' => 'Product not found','message' => 'Product not found or not active','delete_file' => 1], 401);}if (!$productLicense['aktiv']) {return $this->json(['error' => 'not-active (' . __LINE__ . ')','error_description' => 'License not active','message' => 'License not active','delete_file' => 0], 401);}if (!in_array($redirect_uri, $productLicense['redirectUris'])) {return $this->json(['error' => 'error','error_description' => 'Client authentication failed','message' => 'Client authentication failed (URL)'], 403);}$dateTime = date('Y-m-d H:i:s', strtotime($productLicense['activatedAt']->format('Y-m-d H:i:s')));$lizenz = $this->em->getRepository(Licences::class)->find($productLicense['licenseId']);$days = $lizenz->getTimeLimit();$rest = strtotime("$dateTime +$days days");if ($lizenz->getTimeLimit() && $rest - time() <= 0) {return $this->json(['error' => 'not-active (' . __LINE__ . ')','error_description' => 'License not active','message' => 'License not active','delete_file' => 0], 401);}return $this->json(['license' => $product_license,], 200);}#[Route('/api/{product_license}/token', name: 'app_get_download_code')]public function get_download_code(Request $request): RedirectResponse{$redirect = urldecode($request->get('redirect'));$license = $this->em->getRepository(ProductLicense::class)->get_license_by_product_license(['product_license' => $request->get('product_license')]);if ($license && $license['redirectUris'] && in_array($redirect, $license['redirectUris'])) {return $this->redirect($redirect . '?upload_code=' . $license['upload_token'] . '&type=' . $license['product_type'] . '&slug=' . $license['product_slug']);}return $this->redirect($redirect . '?error=URL nicht gefunden.');}#[Route('/api/download-free', name: 'app_download_free')]#[IsGranted('ROLE_OAUTH2_PRODUCT')]public function api_download_free(Request $request): Response{$body = json_decode($request->getContent(), true);$product = $this->em->getRepository(Product::class)->find($body['product_id']);if (!$product) {return $this->json(['error' => 'not found db','error_description' => 'Product not found','message' => 'Product not found',], 401);}if (!in_array($product->getType(), $this->free_products)) {return $this->json(['error' => 'not free','error_description' => 'No free product','message' => 'No free product'], 403);}return $this->json(['slug' => $product->getSlug(),'type' => $product->getType(),'download' => '/api/' . $product->getId() . '/download'], 200);}#[Route('/api/{slug}/{type}/update-options', name: '_api_product_update_options')]public function update_options(Request $request): Response{$slug = $request->get('slug');$type = $request->get('type');$product = $this->em->getRepository(Product::class)->findOneBy(['slug' => $slug]);if (!$product) {return $this->json(['error' => 'not found db','error_description' => 'Product not found','message' => 'Product not found',], 401);}if ($product->getUpdateChecker()) {$update = json_decode($product->getUpdateChecker()->getUpdateData(), true);$gitData = json_decode($product->getUpdateChecker()->getGitData(), true);} else {return $this->json(['error' => 'not found db','error_description' => 'Product not found','message' => 'Product not found',], 401);}$selfUrl = $request->getSchemeAndHttpHost();if ($type == 'conf') {return $this->json(['is_git' => $product->isIsGit(),'is_aktive' => $product->getUpdateChecker()->isAktive(),'self' => $selfUrl,'git_data' => $gitData,'update_url' => $selfUrl . '/api/' . $slug . '/update/update-options'], 200);}if ($product->getUpdateChecker()->getType() == 'plugin') {if (!$product->getUpdateChecker()->isRatingAktiv()) {unset($update['rating']);unset($update['num_ratings']);unset($update['downloaded']);unset($update['active_installs']);}if (!$product->getUpdateChecker()->isLanguageAktiv()) {unset($update['translations']);}}return $this->json($update, 200);}/*** @param Product $product* @return BinaryFileResponse|void*/#[IsGranted('ROLE_OAUTH2_PRODUCT')]#[Route('/api/{id}/download', name: '_download_api_product')]public function download_product(Product $product){$file = $this->getParameter('product_dir') . '/' . $product->getSlug() . '/' . $product->getSlug() . '.zip';if (is_file($file)) {$response = new BinaryFileResponse($file);$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT,$product->getSlug() . '.zip');return $response;}}/*** @param Request $request* @return BinaryFileResponse|JsonResponse*/#[IsGranted('ROLE_OAUTH2_PRODUCT')]#[Route('/api/{upload_token}/lizenz-product-download', name: '_download_api_lizenz_product')]public function download_lizenz_product(Request $request): BinaryFileResponse|JsonResponse{/* if(!$this->isGranted('ROLE_OAUTH2_PRODUCT')) {return $this->json(['error' => 'ungültiger access token','error_description' => 'ungültiger access token','message' => 'ungültiger access token',], 403);}*/$productLicense = $this->em->getRepository(ProductLicense::class)->findOneBy(['upload_token' => $request->get('upload_token')]);if (!$productLicense) {return $this->json(['error' => 'not found product license','error_description' => 'Product not found','message' => 'Product not found',], 401);}// dd($productLicense, $request->get('upload_token'));//ProductLicense $productLicense$product = $this->em->getRepository(Product::class)->find($productLicense->getProductId());if (!$product) {return $this->json(['error' => 'not found product','error_description' => 'Product not found','message' => 'Product not found',], 401);}$file = $this->getParameter('product_dir') . '/' . $product->getSlug() . '/' . $product->getSlug() . '.zip';if (is_file($file)) {$helper = Helper::instance();$newToken = $helper->generate_callback_pw(200, 0, 100);$productLicense->setUploadToken($newToken);$productLicense->setAktiv(true);$this->em->persist($productLicense);$this->em->flush();$response = new BinaryFileResponse($file);$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT,$product->getSlug() . '.zip');return $response;}return $this->json(['error' => 'not found file','error_description' => 'Product not found','message' => 'Product not found',], 401);}/*** @param Request $request* @return BinaryFileResponse|Response*/#[Route('/api/{product_license}/aktivierungs-file', name: '_download_api_lizenz_file')]#[IsGranted('ROLE_OAUTH2_PRODUCT')]public function aktivierungs_file_data(Request $request): BinaryFileResponse|Response{$productLicense = $this->em->getRepository(ProductLicense::class)->findOneBy(['product_license' => $request->get('product_license')]);//ProductLicense $productLicense$produkt = $this->em->getRepository(Product::class)->find($productLicense->getProductId());$version = str_replace(['v'], '-', $produkt->getVersion());$filePath = $this->getParameter('product_dir') . '/' . $produkt->getSlug() . '/' . $produkt->getSlug() . $version . '/' . $produkt->getAktivierungsPath();if (is_file($filePath) && $productLicense->isAktiv()) {$response = new BinaryFileResponse($filePath);$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT,basename($filePath));return $response;}return $this->json(['error' => 'not found','error_description' => 'Not found product','message' => 'Not found product','file' => $filePath], 403);}#[Route('/api/remove-consent', name: 'app_remove_consent')]#[IsGranted('ROLE_OAUTH2_BASIC')]public function remove_consent(Request $request): Response{$callValidate = $this->validate_client($request);if (!$callValidate['status']) {return $this->json(['error' => $callValidate['msg'],'error_description' => 'Client authentication failed','message' => 'Client authentication failed'], 403);}$client = $callValidate['client'];$valUser = $callValidate['user'];$consent = $this->em->getRepository(OAuth2UserConsent::class)->findOneBy(['user' => $valUser]);if (!$consent) {return $this->json(['error' => $callValidate['msg'],'error_description' => 'Not found','message' => 'Consent not found'], 403);}$this->em->remove($consent);$this->em->flush();return $this->json(['email' => $client->getName(),'vorname' => $valUser->getUserdetails()->getFirstName(),'nachname' => $valUser->getUserdetails()->getLastName(),'scope' => explode(',', $callValidate['scopes']),], 200);}private function validate_client($request): array{$client = $this->em->getRepository(Client::class)->findOneBy(['identifier' => $request->request->get('client_id')]);$user = $this->em->getRepository(User::class)->findOneBy(['email' => $client->getName()]);$scopes = implode(',', $client->getScopes());$user_active = $user->getUserdetails()->isAktiv();if (!$client->isActive() || !$user_active) {return ['status' => false,'msg' => 'User not active',];}$urlError = false;$redirect_uri = filter_var($request->request->get('redirect_uri'), FILTER_VALIDATE_URL);if (!$redirect_uri) {$urlError = true;}$apiRedirect = $client->getRedirectUris();$apiRedirect = implode(',', $apiRedirect);$apiRedirect = explode(',', $apiRedirect);if (!in_array($redirect_uri, $apiRedirect)) {$urlError = true;}if ($urlError) {return ['status' => false,'msg' => sprintf('User not active for this URL: %s', $redirect_uri),];}return ['status' => true,'client' => $client,'user' => $user,'scopes' => $scopes,'redirect_uri' => $redirect_uri];}}