* Copyright (C) 2003,2005 Rodolphe Quiedeville * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2004 Sebastien Di Cintio * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2005-2011 Regis Houssin * Copyright (C) 2011 Juanjo Menent * Copyright (C) 2020 Tobias Sekan * Copyright (C) 2024 MDW * Copyright (C) 2024 Frédéric France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/admin/faitdivers.php * \ingroup faitdivers * \brief Page to setupe module Socialnetworks */ //load Dolibarr environment require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/socialnetwork.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/modules/modSocialNetworks.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/infobox.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/fediverseparser.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/boxes/box_fediverse.php'; //load translation files requires by the page $langs->loadLangs(array('admin', 'users', 'dict')); $action = GETPOST('action', 'aZ09'); // Security check if (!$user->admin) { accessforbidden(); } if (!isModEnabled('socialnetworks')) { accessforbidden('Module Social Networks is not enabled'); } /* * Actions */ if ($action == 'add') { $error = 0; if (empty(GETPOST('socialnetwork_name')) || empty(GETPOST('socialnetwork_url'))) { $error++; } $socialNetworkName = GETPOST('socialnetwork_name', 'alpha'); $socialNetworkUrl = GETPOST('socialnetwork_url', 'alpha'); // other params if exist $paramNames = GETPOST('param_name', 'array'); $paramValues = GETPOST('param_value', 'array'); $additionalParams = []; if (!empty($paramNames) && is_array($paramNames)) { foreach ($paramNames as $index => $paramName) { if (!empty($paramName) && isset($paramValues[$index])) { $additionalParams[$paramName] = $paramValues[$index]; } } } if (!$error) { $db->begin(); $socialNetworkData = array( 'title' => $socialNetworkName, 'url' => $socialNetworkUrl ); $socialNetworkData = array_merge($socialNetworkData, $additionalParams); $boxlabel = '(SocialNetwoksInformations)'; $sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes_def (file, note)"; $sql .= " VALUES ('box_fediverse.php', '".$db->escape($socialNetworkName)."')"; if (!$db->query($sql)) { dol_print_error($db); $error++; } else { $jsonData = json_encode($socialNetworkData); $result = dolibarr_set_const($db, "SOCIAL_NETWORKS_DATA_".$socialNetworkName, $jsonData, 'chaine', 0, '', $conf->entity); } } if ($result) { $db->commit(); header("Location: ".$_SERVER["PHP_SELF"]); exit; } else { $db->rollback(); dol_print_error($db); } } if ($action == 'confirm_delete' && GETPOST('confirm') == 'yes') { $error = 0; $key = GETPOST('key', 'alpha'); $name = ''; $sqlgetName = "SELECT note FROM ".MAIN_DB_PREFIX."boxes_def WHERE rowid=".((int) $key); $resqName = $db->query($sqlgetName); if ($resqName) { $objName = $db->fetch_object($resqName); $name = $objName->note; } $db->begin(); $sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes"; $sql .= " WHERE entity = ".$conf->entity; $sql .= " AND box_id = ".((int) $key); $resql1 = $db->query($sql); $sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes_def"; $sql .= " WHERE rowid = ".((int) $key); $resql2 = $db->query($sql); if (!$resql1 || !$resql2) { $db->rollback(); dol_print_error($db, "sql=".$sql); exit; } else { $result = dolibarr_del_const($db, "SOCIAL_NETWORKS_DATA_".$name, $conf->entity); if ($result) { $db->commit(); header("Location: ".$_SERVER["PHP_SELF"]); exit; } else { $db->rollback(); dol_print_error($db); } } } if ($action == 'updatesocialnetwork') { $error = 0; $id = GETPOST('key', 'alpha'); $name = GETPOST('socialnetwork_name'); $url = GETPOST('socialnetwork_url'); $paramsKey = GETPOST('paramsKey', 'array'); $paramsVal = GETPOST('paramsVal', 'array'); $result = dolibarr_get_const($db, "SOCIAL_NETWORKS_DATA_".$name, $conf); $socialNetworkData = json_decode($result, true); foreach ($paramsKey as $index => $key) { if (empty($key) || empty($paramsVal[$index])) { $error++; } } // delete others params foreach ($socialNetworkData as $key => $value) { if ($key != 'title' && $key != 'url') { unset($socialNetworkData[$key]); } } // new keys and new values in array $mergedParams = array(); foreach ($paramsKey as $index => $key) { if (isset($paramsVal[$index])) { $mergedParams[$key] = $paramsVal[$index]; } } // Add new key, value if changed foreach ($mergedParams as $newKey => $newValue) { if (!isset($socialNetworkData[$newKey]) || $socialNetworkData[$newKey] !== $newValue) { $socialNetworkData[$newKey] = $newValue; } } if (!$error) { $newData = json_encode($socialNetworkData); $result = dolibarr_set_const($db, "SOCIAL_NETWORKS_DATA_".$name, $newData, 'chaine', 0, '', $conf->entity); if ($result) { $db->commit(); header("Location: ".$_SERVER["PHP_SELF"]); exit; } else { $db->rollback(); dol_print_error($db); } } else { setEventMessages($langs->trans("ErrorInputRequired"), null, 'errors'); header("Location: ".$_SERVER["PHP_SELF"].'?action=editsocialnetwork&token='.newToken().'&key='.$id); exit; } } /* * View */ $form = new Form($db); llxHeader('', $langs->trans("FediverseSetup"), '', '', 0, 0, '', '', '', 'mod-admin page-dict'); $head = socialnetwork_prepare_head(); $linkback = ''.$langs->trans("BackToModuleList").''; print dol_get_fiche_head($head, 'divers', $langs->trans('MenuDict'), -1, 'user', 0, $linkback, '', 0, '', 0); $title = $langs->trans("ConfigImportSocialNetwork"); print_barre_liste($title, '', $_SERVER["PHP_SELF"], '', '', '', '', -1, '', 'tools', 0, '', '', -1, 0, 0, 0, ''); print '
'; print ''; print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print '
'.$langs->trans("NewSocialNetwork").''.$langs->trans("Example").'
'.$langs->trans("Title").'Mastodon
'.$langs->trans('SocialNetworkUrl').'https://mastodon.social/api/v1/accounts/id_user
'; print $form->textwithpicto($langs->trans("Others"), $langs->trans("AddMoreParams")); print 'Token : ****
Cookie : ****
'; print '
'; print '
'; print '
'; print $form->buttonsSaveCancel("Add", ''); print ''; print ''; print '
'; print '

'; print ''.$langs->trans('SocialNetworksNote').''; print ' - '; print ''.$langs->trans('JumpToBoxes').''; print '

'; if ($action == 'deletesocialnetwork') { $formconfirm = $form->formconfirm( $_SERVER["PHP_SELF"].'?key='.urlencode(GETPOST('key', 'alpha')), $langs->trans('Delete'), $langs->trans('ConfirmDeleteSocialNetwork', GETPOST('key', 'alpha')), 'confirm_delete', '', 0, 1 ); print $formconfirm; } $sql = "SELECT rowid, file, note FROM ".MAIN_DB_PREFIX."boxes_def"; $sql .= " WHERE file = 'box_fediverse.php'"; $sql .= " ORDER BY note"; dol_syslog("select socialnetworks boxes", LOG_DEBUG); $resql = $db->query($sql); if ($resql) { $boxlist = InfoBox::listBoxes($db, 'activated', -1, null); $num = $db->num_rows($resql); $i = 0; while ($i < $num) { $obj = $db->fetch_object($resql); $jsonData = getDolGlobalString("SOCIAL_NETWORKS_DATA_".$obj->note); $socialNetworkData = json_decode($jsonData, true); $socialNetworkTitle = $socialNetworkData['title']; $socialNetworkUrl = $socialNetworkData['url']; $socialNetworkId = $obj->rowid; $fediverseparser = new SocialNetworkManager($socialNetworkTitle); $path_fediverse = DOL_DATA_ROOT.'/fediverse/temp/'.$socialNetworkTitle; //check if other params exist $authParams = []; foreach ($socialNetworkData as $key => $value) { if ($key !== 'title' && $key !== 'url') { $authParams[$key] = $value; } } $result = $fediverseparser->fetchPosts($socialNetworkUrl, 5, 300, $path_fediverse, $authParams); print "
"; print '
'."\n"; print ''."\n"; print ''."\n"; print ''; print ""; print ''; print ''."\n"; print ''; print '"; print ''; print ''."\n"; print ''; print ""; print ''; print ''."\n"; print ''; print ""; print ""; print ''."\n"; // Active $active = _isInBoxListFediverse((int) $socialNetworkId, $boxlist) ? 'yes' : 'no'; print ''; print ''; print ''; print ''."\n"; if ($action == 'editsocialnetwork' && $socialNetworkId == GETPOST('key')) { foreach ($socialNetworkData as $k => $val) { if ($k != 'title' && $k != 'url') { print ''; print ''; print ''."\n"; } } print ''; print ''; print ''; print ''."\n"; } print '
".$langs->trans("SocialNetworks")." ".($i+1)."'; print ''.img_edit().''; print ''.img_delete().''; print ''; print '
'.$langs->trans("Title")."
".$langs->trans("URL")."
".$langs->trans("Status").""; if ($result > 0 && empty($fediverseparser->error)) { print ''.img_picto($langs->trans("Online"), 'tick', 'class="pictofixedwidth"').$langs->trans("Online").''; } else { print ''.$langs->trans("Offline"); $langs->load("errors"); if ($fediverseparser->error) { print ' - '.$langs->trans($fediverseparser->error); } print ''; } print "
'.$langs->trans('WidgetAvailable').''.yn($active); print '   -   '; print $langs->trans("JumpToBoxes"); print ''; print '
'; if ($k == 'password') { print ''; } else { print ''; } print '
'."\n"; print "
\n"; $i++; } } else { dol_print_error($db); } print dol_get_fiche_end(); llxFooter(); $db->close(); /** * Check if the given fediverse feed if inside the list of boxes/widgets * * @param int $id The id of the socialnetwork * @param array $boxlist A list with boxes/widgets (array of stdClass objects). * @return bool True if the socialnetwork is inside the box/widget list, otherwise false */ function _isInBoxListFediverse(int $id, array $boxlist) { foreach ($boxlist as $box) { if ($box->boxcode === "lastfediverseinfos") { return true; } } return false; }