true, 'message' => false, 'form' => (object) [ 'title' => (object) [ 'value' => false, 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'preview' => (object) [ 'value' => false, 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'description' => (object) [ 'value' => false, 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'dn' => (object) [ 'value' => false, 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'xt' => (object) [ 'value' => [], 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'kt' => (object) [ 'value' => [], 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'tr' => (object) [ 'value' => [], 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'as' => (object) [ 'value' => [], 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'xs' => (object) [ 'value' => [], 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'public' => (object) [ 'value' => false, 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'comments' => (object) [ 'value' => false, 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'sensitive' => (object) [ 'value' => false, 'valid' => (object) [ 'success' => true, 'message' => false, ] ], 'approved' => (object) [ 'value' => false, ], ] ]; // Yggdrasil connections only if (!Valid::host($_SERVER['REMOTE_ADDR'])) { $response->success = false; $response->message = _('Yggdrasil connection required to enable resource features'); } // Init session else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time())) { $response->success = false; $response->message = _('Could not init user session'); } // Get user else if (!$user = $db->getUser($userId)) { $response->success = false; $response->message = _('Could not init user info'); } // Init magnet else if (!$magnet = $db->getMagnet(isset($_GET['magnetId']) ? (int) $_GET['magnetId'] : 0)) { $response->success = false; $response->message = _('Magnet not found!'); } // Validate access else if (!($user->address == $db->getUser($magnet->userId)->address || in_array($user->address, MODERATOR_IP_LIST))) { $response->success = false; $response->message = _('You have no permissions to edit this magnet!'); } // On first visit, redirect user to the welcome page with access level question else if (is_null($user->public)) { header( sprintf('Location: %s/welcome.php', WEBSITE_URL) ); } // Process form else { // Validate magnet lock if ($lastMagnetLock = $db->findLastMagnetLock($magnet->magnetId)) { if ($lastMagnetLock->userId != $user->userId && $lastMagnetLock->timeAdded > time() - MAGNET_EDITOR_LOCK_TIMEOUT) { $response->success = false; $response->message = _('This form have opened by owner or moderator, to prevent overwriting, try attempt later!'); } } // Lock form for moderators $db->addMagnetLock($magnet->magnetId, $user->userId, time()); // Update form if (!empty($_POST)) { // Push event to other nodes if (API_EXPORT_ENABLED && API_EXPORT_PUSH_ENABLED && API_EXPORT_USERS_ENABLED && API_EXPORT_MAGNETS_ENABLED) { if (!$memoryApiExportPush = $memory->get('api.export.push')) { $memoryApiExportPush = []; } $memoryApiExportPush[] = (object) [ 'time' => time(), 'userId' => $user->userId, 'magnetId' => $magnet->magnetId, ]; $memory->set('api.export.push', $memoryApiExportPush, 3600); } // Approve by moderation request if (in_array($user->address, MODERATOR_IP_LIST)) { $db->updateMagnetApproved($magnet->magnetId, isset($_POST['approved']), time()); // Auto-approve user on magnet approve if (USER_AUTO_APPROVE_ON_MAGNET_APPROVE) { $db->updateUserApproved($magnet->userId, isset($_POST['approved']), time()); } } // Approve by user approved status else { $db->updateMagnetApproved($magnet->magnetId, (bool) $user->approved, time()); } // Social $db->updateMagnetComments($magnet->magnetId, isset($_POST['comments']) ? true : false, time()); $db->updateMagnetSensitive($magnet->magnetId, isset($_POST['sensitive']) ? true : false, time()); if (isset($_POST['public'])) // could be enabled once only because of distributed database model #1 { $db->updateMagnetPublic($magnet->magnetId, true, time()); } // Title $response->form->title->valid->success = true; $response->form->title->valid->message = []; if (!Valid::magnetTitle($_POST['title'], $response->form->title->valid->message)) { $response->form->title->valid->success = false; } else { $db->updateMagnetTitle( $magnet->magnetId, Filter::magnetTitle($_POST['title']), time() ); } // Preview $response->form->preview->valid->success = true; $response->form->preview->valid->message = []; if (!Valid::magnetPreview($_POST['preview'], $response->form->preview->valid->message)) { $response->form->preview->valid->success = false; } else { $db->updateMagnetPreview( $magnet->magnetId, Filter::magnetPreview($_POST['preview']), time() ); } // Description $response->form->description->valid->success = true; $response->form->description->valid->message = []; if (!Valid::magnetDescription($_POST['description'], $response->form->description->valid->message)) { $response->form->description->valid->success = false; } else { $db->updateMagnetDescription( $magnet->magnetId, Filter::magnetDescription($_POST['description']), time() ); } // Display Name $response->form->dn->valid->success = true; $response->form->dn->valid->message = []; if (!Valid::magnetDn($_POST['dn'], $response->form->dn->valid->message)) { $response->form->dn->valid->success = false; } else { $db->updateMagnetDn( $magnet->magnetId, Filter::magnetDn($_POST['dn']), time() ); } // Exact Topic if (isset($_POST['xt'])) { foreach ((array) $_POST['xt'] as $version => $value) { switch ($version) { case 1: if (!empty($value) && Yggverse\Parser\Magnet::isXTv1($value)) { $exist = false; foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result) { if ($infoHash = $db->getInfoHash($result->infoHashId)) { if ($infoHash->version == 1) { $exist = true; } } } if (!$exist) { $db->addMagnetToInfoHash( $magnet->magnetId, $db->initInfoHashId( Yggverse\Parser\Magnet::filterInfoHash($value), 1 ) ); } } break; case 2: if (!empty($value) && Yggverse\Parser\Magnet::isXTv2($value)) { $exist = false; foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result) { if ($infoHash = $db->getInfoHash($result->infoHashId)) { if ($infoHash->version == 2) { $exist = true; } } } if (!$exist) { $db->addMagnetToInfoHash( $magnet->magnetId, $db->initInfoHashId( Yggverse\Parser\Magnet::filterInfoHash($value), 2 ) ); } } break; } } } // Keyword Topic $db->deleteMagnetToKeywordTopicByMagnetId($magnet->magnetId); if (!empty($_POST['kt'])) { foreach (explode(PHP_EOL, str_replace(['#', ',', ' '], PHP_EOL, $_POST['kt'])) as $kt) { $kt = trim($kt); if (!empty(trim($kt))) { $db->initMagnetToKeywordTopicId( $magnet->magnetId, $db->initKeywordTopicId(trim(mb_strtolower(strip_tags(html_entity_decode($kt))))) ); } } } // Address Tracker $db->deleteMagnetToAddressTrackerByMagnetId($magnet->magnetId); if (!empty($_POST['tr'])) { $response->form->tr->valid->success = false; $response->form->tr->valid->message = _('* please, provide at least one Yggdrasil address'); foreach (explode(PHP_EOL, str_replace(['#', ',', ' '], PHP_EOL, $_POST['tr'])) as $tr) { $tr = trim($tr); if (Valid::url($tr)) { if ($url = Yggverse\Parser\Url::parse($tr)) { $db->initMagnetToAddressTrackerId( $magnet->magnetId, $db->initAddressTrackerId( $db->initSchemeId($url->host->scheme), $db->initHostId($url->host->name), $db->initPortId($url->host->port), $db->initUriId($url->page->uri) ) ); $response->form->tr->valid->success = true; $response->form->tr->valid->message = false; } } } } // Acceptable Source $db->deleteMagnetToAcceptableSourceByMagnetId($magnet->magnetId); if (!empty($_POST['as'])) { $response->form->as->valid->success = false; $response->form->as->valid->message = _('* please, provide at least one Yggdrasil address'); foreach (explode(PHP_EOL, str_replace(['#', ',', ' '], PHP_EOL, $_POST['as'])) as $as) { $xs = trim($as); if (Valid::url($as)) { if ($url = Yggverse\Parser\Url::parse($as)) { $db->initMagnetToAcceptableSourceId( $magnet->magnetId, $db->initAcceptableSourceId( $db->initSchemeId($url->host->scheme), $db->initHostId($url->host->name), $db->initPortId($url->host->port), $db->initUriId($url->page->uri) ) ); $response->form->as->valid->success = true; $response->form->as->valid->message = false; } } } } // Exact Source $db->deleteMagnetToExactSourceByMagnetId($magnet->magnetId); if (!empty($_POST['xs'])) { $response->form->xs->valid->success = false; $response->form->xs->valid->message = _('* please, provide at least one Yggdrasil address'); foreach (explode(PHP_EOL, str_replace(['#', ',', ' '], PHP_EOL, $_POST['xs'])) as $xs) { $xs = trim($xs); if (Valid::url($xs)) { if ($url = Yggverse\Parser\Url::parse($xs)) { $db->initMagnetToExactSourceId( $magnet->magnetId, $db->initExactSourceId( $db->initSchemeId($url->host->scheme), $db->initHostId($url->host->name), $db->initPortId($url->host->port), $db->initUriId($url->page->uri) ) ); $response->form->xs->valid->success = true; $response->form->xs->valid->message = false; } } } } // Is valid if ($response->success && $response->form->title->valid->success && $response->form->preview->valid->success && $response->form->description->valid->success && $response->form->dn->valid->success && $response->form->tr->valid->success && $response->form->as->valid->success && $response->form->xs->valid->success) { // Unlock form $db->flushMagnetLock($magnet->magnetId); // Return redirect to the magnet page header( sprintf('Location: %s/magnet.php?magnetId=%s', WEBSITE_URL, $magnet->magnetId) ); } else { // Refresh magnet data $magnet = $db->getMagnet($magnet->magnetId); // Replace fields by last POST data foreach ($_POST as $key => $value) { $magnet->{$key} = $value; } } } // Meta Title, auto-replace with Display Name on empty value $response->form->title->value = $magnet->title ? $magnet->title : $magnet->dn; // Meta Description $response->form->preview->value = $magnet->preview; // Description $response->form->description->value = $magnet->description; // Magnet settings $response->form->public->value = (bool) $magnet->public; $response->form->comments->value = (bool) $magnet->comments; $response->form->sensitive->value = (bool) $magnet->sensitive; $response->form->approved->value = (bool) $magnet->approved; // Display Name $response->form->dn->value = $magnet->dn; // Exact Topic foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result) { if ($infoHash = $db->getInfoHash($result->infoHashId)) { $response->form->xt->value[$infoHash->version] = $infoHash->value; } } // Keyword Topic $kt = []; foreach ($db->findKeywordTopicByMagnetId($magnet->magnetId) as $result) { $kt[] = $db->getKeywordTopic($result->keywordTopicId)->value; } $response->form->kt->value = implode(', ', $kt); // Address Tracker $tr = []; foreach ($db->findAddressTrackerByMagnetId($magnet->magnetId) as $result) { $addressTracker = $db->getAddressTracker($result->addressTrackerId); $scheme = $db->getScheme($addressTracker->schemeId); $host = $db->getHost($addressTracker->hostId); $port = $db->getPort($addressTracker->portId); $uri = $db->getUri($addressTracker->uriId); $tr[] = $port->value ? sprintf('%s://%s:%s%s', $scheme->value, $host->value, $port->value, $uri->value) : sprintf('%s://%s%s', $scheme->value, $host->value, $uri->value); } $response->form->tr->value = implode(PHP_EOL, $tr); // Acceptable Source $as = []; foreach ($db->findAcceptableSourceByMagnetId($magnet->magnetId) as $result) { $acceptableSource = $db->getAcceptableSource($result->acceptableSourceId); $scheme = $db->getScheme($acceptableSource->schemeId); $host = $db->getHost($acceptableSource->hostId); $port = $db->getPort($acceptableSource->portId); $uri = $db->getUri($acceptableSource->uriId); $as[] = $port->value ? sprintf('%s://%s:%s%s', $scheme->value, $host->value, $port->value, $uri->value) : sprintf('%s://%s%s', $scheme->value, $host->value, $uri->value); } $response->form->as->value = implode(PHP_EOL, $as); // Exact Source $xs = []; foreach ($db->findExactSourceByMagnetId($magnet->magnetId) as $result) { $eXactSource = $db->getExactSource($result->eXactSourceId); $scheme = $db->getScheme($eXactSource->schemeId); $host = $db->getHost($eXactSource->hostId); $port = $db->getPort($eXactSource->portId); $uri = $db->getUri($eXactSource->uriId); $xs[] = $port->value ? sprintf('%s://%s:%s%s', $scheme->value, $host->value, $port->value, $uri->value) : sprintf('%s://%s%s', $scheme->value, $host->value, $uri->value); } $response->form->xs->value = implode(PHP_EOL, $xs); } ?>