public function executeDelete() { $token = mfwRequest::param('token', null, 'POST'); if ($token !== mfwSession::get(self::SESKEY_TOKEN)) { return $this->buildErrorPage('Bad Request', array(self::HTTP_400_BADREQUEST)); } mfwSession::clear(self::SESKEY_TOKEN); $con = mfwDBConnection::getPDO(); $con->beginTransaction(); try { $this->app = ApplicationDb::retrieveByPKForUpdate($this->app->getId()); $this->package->delete($con); if ($this->app->getLastUpload() == $this->package->getCreated()) { // 最終アップデート時刻を前のものに戻す $pkg = PackageDb::selectNewestOneByAppId($this->app->getId()); $lastupload = $pkg ? $pkg->getCreated() : null; $this->app->updateLastUpload($lastupload, $con); } $con->commit(); } catch (Exception $e) { $con->rollback(); error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); throw $e; } apache_log('app_id', $this->app->getId()); apache_log('pkg_id', $this->package->getId()); apache_log('platform', $this->package->getPlatform()); try { $this->package->deleteFile(); } catch (Exception $e) { // S3から削除出来なくてもDBからは消えているので許容する } return $this->redirect("/app?id={$this->app->getId()}"); }
public function executeDelete() { $appid = mfwRequest::param('id'); $instapp = InstallLog::getInstallApp($this->login_user, $appid); if ($instapp) { $instapp->delete(); } return $this->redirect('/myapps/installed'); }
public function executeIndex() { $current_page = mfwRequest::param('page', 1); $app_count = ApplicationDb::selectCount(); $max_page = ceil($app_count / self::LINE_IN_PAGE); $offset = max(0, min($current_page, $max_page) - 1) * self::LINE_IN_PAGE; $apps = ApplicationDb::selectByUpdateOrderWithLimit($offset, self::LINE_IN_PAGE); $comments = CommentDb::selectCountsByAppIds($apps->getColumnArray('id')); $params = array('applications' => $apps, 'comments' => $comments, 'cur_page' => $current_page, 'max_page' => $max_page); return $this->build($params); }
public function executeGoogle_callback() { $code = mfwRequest::param('code'); $token = $this->getAccessToken($code); $userinfo = $this->getUserInfo($token); $mail = isset($userinfo['email']) ? $userinfo['email'] : null; if (!$this->checkAccount($mail)) { return $this->redirect('/login/google_error'); } User::login($mail); apache_log('user', $mail); return $this->redirectUrlBeforeLogin(); }
public function executeNotification_setting() { try { $app_id = mfwRequest::param('id'); $notify = mfwRequest::param('value', false); $instapp = InstallLog::getInstallApp($this->login_user, $app_id); if (!$instapp) { return $this->jsonResponse(self::HTTP_404_NOTFOUND, array('error' => 'installed application not found.')); } $instapp->updateNotifySetting($notify); } catch (Exception $e) { error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); return $this->jsonResponse(self::HTTP_500_INTERNALSERVERERROR, array('error' => $e->getMessage(), 'exception' => get_class($e))); } return $this->jsonResponse(self::HTTP_200_OK, $instapp->toArray()); }
public function executePassword_commit() { $key = mfwRequest::param('key'); $pass = mfwRequest::param('password'); $data = mfwMemcache::get($key); $user_pass = null; if (isset($data['mail'])) { $user_pass = UserPassDb::selectByEmail($data['mail']); } if (!$user_pass) { return $this->buildErrorPage('invalid key'); } $user_pass->updatePasshash($pass); mfwMemcache::delete($key); return $this->build(); }
public function initialize() { if ($this->action === 'install' && mfwRequest::has('token')) { // token付きインストールリンクの場合, token情報のみで認証する. return $this->initializeByInstallToken(mfwRequest::param('token')); } if ($err = parent::initialize()) { return $err; } $id = mfwRequest::param('id'); $this->package = PackageDb::retrieveByPK($id); if (!$this->package) { return $this->buildErrorPage('Not Found', array(self::HTTP_404_NOTFOUND)); } $this->app = $this->package->getApplication(); return null; }
public function executeUpload_post() { $temp_name = mfwRequest::param('temp_name'); $platform = mfwRequest::param('platform'); $title = mfwRequest::param('title'); $description = mfwRequest::param('description'); $tag_names = mfwRequest::param('tags'); $ios_identifier = mfwRequest::param('ios_identifier'); $notify = mfwRequest::param('notify'); $org_filename = mfwRequest::param('file_name'); $filesize = mfwRequest::param('file_size'); if (!$temp_name || !$title) { error_log(__METHOD__ . '(' . __LINE__ . "): bad request: {$temp_name}, {$title}"); return $this->response(self::HTTP_400_BADREQUEST); } $ext = pathinfo($temp_name, PATHINFO_EXTENSION); $con = mfwDBConnection::getPDO(); $con->beginTransaction(); try { $app = ApplicationDb::retrieveByPKForUpdate($this->app->getId(), $con); $tags = $app->getTagsByName($tag_names, $con); $pkg = PackageDb::insertNewPackage($this->app->getId(), $platform, $ext, $title, $description, $ios_identifier, $org_filename, $filesize, $tags, $con); $pkg->renameTempFile($temp_name); $app->updateLastUpload($pkg->getCreated(), $con); $con->commit(); } catch (Exception $e) { error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); $con->rollback(); throw $e; } if ($notify) { try { $users = $app->getInstallUsers(); $users->noticePackageUploaded($pkg); } catch (Exception $e) { // アップロード通知が送れなくても許容する error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); } } apache_log('app_id', $app->getId()); apache_log('pkg_id', $pkg->getId()); return $this->redirect("/package?id={$pkg->getId()}"); }
public function executeInstall_plist() { $token = mfwRequest::param('t'); if (!$this->checkToken($token)) { return $this->buildErrorPage('Permission Denied', array(self::HTTP_403_FORBIDDEN)); } $pkg = $this->package; $app = $pkg->getApplication(); $ipa_url = $pkg->getFileUrl('+60 min'); $image_url = $app->getIconUrl(); $bundle_identifier = $pkg->getIOSIdentifier(); $pkg_title = $pkg->getTitle(); $app_title = $app->getTitle(); ob_start(); include APP_ROOT . '/data/templates/package/install_plist.php'; $plist = ob_get_clean(); $header = array('Content-Type: text/xml'); return array($header, $plist); }
public function executeComment_post() { $message = mfwRequest::param('message'); $package_id = mfwRequest::param('package_id'); $con = mfwDBConnection::getPDO(); $con->beginTransaction(); try { $this->app = ApplicationDb::retrieveByPkForUpdate($this->app->getId()); $comment = CommentDb::post($this->login_user, $this->app, $package_id, $message); $this->app->updateLastCommented($comment->getCreated()); $con->commit(); } catch (Exception $e) { error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); $con->rollback(); throw $e; } $owners = $this->app->getOwners(); $owners->noticeNewComment($comment, $this->app); return $this->redirect('/app/comment', array('id' => $this->app->getId())); }
public function executePackage_list() { try { $api_key = mfwRequest::param('api_key'); $app = ApplicationDb::selectByApiKey($api_key); if (!$app) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'Invalid api_key')); } $pkgs = PackageDb::selectByAppId($app->getId()); $ret = array(); foreach ($pkgs as $pkg) { $ret[] = $this->makePackageArray($pkg); } } catch (Exception $e) { error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); return $this->jsonResponse(self::HTTP_500_INTERNALSERVERERROR, array('error' => $e->getMessage(), 'exception' => get_class($e))); } apache_log('app_id', $app->getId()); return $this->jsonResponse(self::HTTP_200_OK, $ret); }
public function executePreferences_update_owners() { $owners = mfwRequest::param('owners'); $owners = array_filter($owners, 'strlen'); // 自分自身は除外させない $owners[] = $this->login_user->getMail(); $owners = array_unique($owners); $con = mfwDBConnection::getPDO(); $con->beginTransaction(); try { $this->app = ApplicationDb::retrieveByPkForUpdate($this->app->getId(), $con); $this->app->setOwners($owners, $con); $con->commit(); } catch (Exception $e) { error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); $con->rollback(); throw $e; } return $this->redirect("/app/preferences?id={$this->app->getId()}#owners"); }
public function executeDelete() { $con = null; try { $api_key = mfwRequest::param('api_key'); $pkg_id = mfwRequest::param('id'); $app = ApplicationDb::selectByApiKey($api_key); if (!$app) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'Invalid api_key')); } $pkg = PackageDb::retrieveByPK($pkg_id); if (!$pkg || $app->getId() !== $pkg->getAppId()) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'Invalid package id')); } $con = mfwDBConnection::getPDO(); $con->beginTransaction(); $app = ApplicationDb::retrieveByPKForUpdate($app->getId(), $con); $pkg->delete($con); if ($app->getLastUpload() == $pkg->getCreated()) { // 最終アップデート時刻を前のものに戻す $pkg = PackageDb::selectNewestOneByAppId($app->getId()); $lastupload = $pkg ? $pkg->getCreated() : null; $app->updateLastUpload($lastupload, $con); } $con->commit(); } catch (Exception $e) { if ($con) { $con->rollback(); } error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); return $this->jsonResponse(self::HTTP_500_INTERNALSERVERERROR, array('error' => $e->getMessage(), 'exception' => get_class($e))); } try { $pkg->deleteFile(); } catch (Exception $e) { // S3から削除出来なくてもDBからは消えているので許容する } apache_log('app_id', $app->getId()); apache_log('pkg_id', $pkg->getId()); return $this->jsonResponse(self::HTTP_200_OK, $this->makePackageArray($pkg)); }
public function executeCreate_token() { try { $api_key = mfwRequest::param('api_key'); $pkg_id = mfwRequest::param('id'); $mail = mfwRequest::param('mail'); $expire_hour = mfwRequest::param('expire_hour'); // api_key check $app = ApplicationDb::selectByApiKey($api_key); if (!$app) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'Invalid api_key')); } // id check $pkg = PackageDb::retrieveByPK($pkg_id); if (!$pkg || $app->getId() !== $pkg->getAppId()) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'Invalid package id')); } // mail check $owner_mails = $app->getOwners()->getMailArray(); if (!in_array($mail, $owner_mails)) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'Invalid mail address')); } // create install token $expire_hour = empty($expire_hour) ? 1 : $expire_hour; $token_expire = sprintf('+%s hours', $expire_hour); $expire_time = strtotime($token_expire); $mc_expire = $expire_time - time(); $tokendata = array('mail' => $mail, 'package_id' => $pkg_id, 'expire' => date('Y-m-d H:i:s', $expire_time)); $token = Random::string(32); mfwMemcache::set(self::INSTALL_TOKEN_PREFIX . $token, json_encode($tokendata), $mc_expire); apache_log('token', $token); apache_log('token_data', $tokendata); $ret = $this->makePackageArray($pkg); $ret['install_url'] = mfwRequest::makeURL("/package/install?token={$token}"); } catch (Exception $e) { error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); return $this->jsonResponse(self::HTTP_500_INTERNALSERVERERROR, array('error' => $e->getMessage(), 'exception' => get_class($e))); } apache_log('app_id', $app->getId()); return $this->jsonResponse(self::HTTP_200_OK, $ret); }
public function executeEdit_commit() { $title = mfwRequest::param('title'); $description = mfwRequest::param('description'); $tag_names = mfwRequest::param('tags'); if (!$title) { error_log(__METHOD__ . '(' . __LINE__ . "): bad request: {$temp_name}, {$title}"); return $this->response(self::HTTP_400_BADREQUEST); } $con = mfwDBConnection::getPDO(); $con->beginTransaction(); try { $app = ApplicationDb::retrieveByPKForUpdate($this->app->getId(), $con); $tags = $app->getTagsByName($tag_names, $con); $pkg = PackageDb::retrieveByPKForUpdate($this->package->getId(), $con); $pkg->updateInfo($title, $description, $tags); $con->commit(); } catch (Exception $e) { $con->rollback(); throw $e; } return $this->redirect("/package?id={$this->package->getId()}"); }
public function executeUpload_package_temporary() { try { $file_info = mfwRequest::param('file'); if (!$file_info || !isset($file_info['error']) || $file_info['error'] != UPLOAD_ERR_OK) { error_log(__METHOD__ . '(' . __LINE__ . '): upload file error: $_FILES[file]=' . json_encode($file_info)); return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'upload_file error: $_FILES[file]=' . json_encode($file_info))); } $file_name = $file_info['name']; $file_path = $file_info['tmp_name']; $file_type = $file_info['type']; list($platform, $ext, $mime) = PackageDb::getPackageInfo($file_name, $file_path, $file_type); $temp_name = Package::uploadTempFile($file_path, $ext, $mime); $ios_identifier = null; if ($platform === Package::PF_IOS) { $plist = IPAFile::parseInfoPlist($file_path); $ios_identifier = $plist['CFBundleIdentifier']; } } catch (Exception $e) { error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); return $this->jsonResponse(self::HTTP_500_INTERNALSERVERERROR, array('error' => $e->getMessage(), 'exception' => get_class($e))); } return $this->jsonResponse(self::HTTP_200_OK, array('file_name' => $file_name, 'temp_name' => $temp_name, 'platform' => $platform, 'ios_identifier' => $ios_identifier)); }
public function executeUpload() { $con = null; try { if (mfwRequest::method() !== 'POST') { return $this->jsonResponse(self::HTTP_405_METHODNOTALLOWED, array('error' => 'Method Not Allowed')); } $api_key = mfwRequest::param('api_key'); $file_info = mfwRequest::param('file'); $title = mfwRequest::param('title'); $description = mfwRequest::param('description'); $notify = mfwRequest::param('notify'); $tag_names = explode(',', mfwRequest::param('tags')); if (!$api_key || !$file_info || !$title) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'A required field is not present.')); } if (!isset($file_info['error']) || $file_info['error'] !== UPLOAD_ERR_OK) { error_log(__METHOD__ . '(' . __LINE__ . '): upload file error: $_FILES[file]=' . json_encode($file_info)); return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'upload file error: $_FILES[file]=' . json_encode($file_info))); } $app = ApplicationDb::selectByApiKey($api_key); if (!$app) { return $this->jsonResponse(self::HTTP_400_BADREQUEST, array('error' => 'Invalid api_key')); } apache_log('app_id', $app->getId()); // ファイルフォーマット確認, 情報抽出 list($platform, $ext, $mime) = PackageDb::getPackageInfo($file_info['name'], $file_info['tmp_name'], $file_info['type']); $ios_identifier = null; if ($platform === Package::PF_IOS) { $plist = IPAFile::parseInfoPlist($file_info['tmp_name']); $ios_identifier = $plist['CFBundleIdentifier']; } // DBへ保存 $con = mfwDBConnection::getPDO(); $con->beginTransaction(); $app = ApplicationDb::retrieveByPKForUpdate($app->getId()); $tags = $app->getTagsByName($tag_names, $con); $pkg = PackageDb::insertNewPackage($app->getId(), $platform, $ext, $title, $description, $ios_identifier, $file_info['name'], $file_info['size'], $tags, $con); apache_log('pkg_id', $pkg->getId()); // S3へアップロード $pkg->uploadFile($file_info['tmp_name'], $mime); $app->updateLastUpload($pkg->getCreated(), $con); $con->commit(); } catch (Exception $e) { if ($con) { $con->rollback(); } error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); return $this->jsonResponse(self::HTTP_500_INTERNALSERVERERROR, array('error' => $e->getMessage(), 'exception' => get_class($e))); } if ($notify) { try { $users = $app->getInstallUsers(); $users->noticePackageUploaded($pkg); } catch (Exception $e) { // アップロード通知が送れなくても許容する error_log(__METHOD__ . '(' . __LINE__ . '): ' . get_class($e) . ":{$e->getMessage()}"); } } return $this->jsonResponse(self::HTTP_200_OK, $this->makePackageArray($pkg)); }
public function executeIndex() { static $pf = array('android' => Package::PF_ANDROID, 'ios' => Package::PF_IOS, 'all' => null); $platform = mfwRequest::param('pf'); if (!in_array($platform, array('android', 'ios', 'all'))) { $ua = mfwRequest::userAgent(); if ($ua->isAndroid()) { $platform = 'android'; } elseif ($ua->isIOS()) { $platform = 'ios'; } else { $platform = 'all'; } } $tags = mfwRequest::param('tags') ? explode(' ', mfwRequest::param('tags')) : array(); $current_page = mfwRequest::param('page', 1); $offset = ($current_page - 1) * self::LINE_IN_PAGE; $pkgs = PackageDb::selectByAppIdPfTagsWithLimit($this->app->getId(), $pf[$platform], $tags, $offset, self::LINE_IN_PAGE + 1); $has_next_page = false; if ($pkgs->count() > self::LINE_IN_PAGE) { $pkgs = $pkgs->slice(0, self::LINE_IN_PAGE); $has_next_page = true; } $comment_count = CommentDb::selectCountByAppId($this->app->getId()); $top_comments = CommentDb::selectByAppId($this->app->getId(), 2); $commented_package = PackageDb::retrieveByPKs($top_comments->getColumnArray('package_id')); $params = array('pf' => $platform, 'is_owner' => $this->app->isOwner($this->login_user), 'packages' => $pkgs, 'active_tags' => $tags, 'current_page' => $current_page, 'has_next_page' => $has_next_page, 'filter_open' => mfwRequest::param('filter_open'), 'top_comments' => $top_comments, 'comment_count' => $comment_count, 'commented_package' => $commented_package); return $this->build($params); }