diff --git a/module/sonarqube/config.php b/module/sonarqube/config.php new file mode 100644 index 0000000000..32f0451daf --- /dev/null +++ b/module/sonarqube/config.php @@ -0,0 +1,5 @@ +sonarqube = new stdclass(); + +$config->sonarqube->create = new stdclass(); +$config->sonarqube->create->requiredFields = 'name,url,account,password'; diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 079a5212ec..f6dd4434cc 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -48,4 +48,52 @@ class sonarqube extends control $this->display(); } + + /** + * create a sonarqube. + * + * @access public + * @return void + */ + public function create() + { + if($_POST) + { + $this->checkToken(); + $sonarqubeID = $this->loadModel('pipeline')->create('sonarqube'); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + $this->loadModel('action'); + $actionID = $this->action->create('sonarqube', $sonarqubeID, 'created'); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'))); + } + + $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->createServer; + + $this->display(); + } + + /** + * Check post info. + * + * @access protected + * @return void + */ + protected function checkToken() + { + $sonarqube = fixer::input('post')->get(); + $this->dao->update('sonarqube')->data($sonarqube)->batchCheck($this->config->sonarqube->create->requiredFields, 'notempty'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + if(strpos($sonarqube->url, 'http') !== 0) return $this->send(array('result' => 'fail', 'message' => array('url' => array($this->lang->sonarqube->hostError)))); + + /* Check name and url unique. */ + $isExist = $this->dao->select('*')->from(TABLE_PIPELINE)->where("name='{$sonarqube->name}' or url='{$sonarqube->url}'")->fetch(); + if($isExist) return $this->send(array('result' => 'fail', 'message' => $this->lang->sonarqube->repeatError)); + + $token = base64_encode("{$sonarqube->account}:{$sonarqube->password}"); + $result = $this->sonarqube->apiValidate($sonarqube->url, $token); + + if(!isset($result->valid) or !$result->valid) return $this->send(array('result' => 'fail', 'message' => array('token' => array($this->lang->sonarqube->validError)))); + $this->post->set('token', $token); + } } diff --git a/module/sonarqube/css/create.css b/module/sonarqube/css/create.css new file mode 100644 index 0000000000..f30cf17aeb --- /dev/null +++ b/module/sonarqube/css/create.css @@ -0,0 +1 @@ +.table-form .c-name {width: 130px;} diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index 5ac24fa38a..5ebc459551 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -8,3 +8,24 @@ $lang->sonarqube->edit = 'Edit SonarQube'; $lang->sonarqube->delete = 'Delete SonarQube'; $lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; $lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; + +$lang->sonarqube->id = 'ID'; +$lang->sonarqube->name = "{$lang->sonarqube->common} Name"; +$lang->sonarqube->url = 'URL'; +$lang->sonarqube->account = 'Username'; +$lang->sonarqube->password = 'Password'; +$lang->sonarqube->token = 'Token'; +$lang->sonarqube->defaultProject = 'Default Project'; +$lang->sonarqube->private = 'MD5 Verify'; + +$lang->sonarqube->createServer = 'Create SonarQube Server'; +$lang->sonarqube->desc = 'Description'; +$lang->sonarqube->createSuccess = 'Create success'; + +$lang->sonarqube->placeholder = new stdclass; +$lang->sonarqube->placeholder->name = ''; +$lang->sonarqube->placeholder->url = "Please fill in the access address of the SonarQube Server homepage, as: https://sonarqube.zentao.net."; + +$lang->sonarqube->repeatError = 'Server name or server address already exists!'; +$lang->sonarqube->validError = 'Sonarqube user authority authentication failed!'; +$lang->sonarqube->hostError = "Invalid SonarQube service address."; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index 215e9b4502..392d69840b 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -8,3 +8,24 @@ $lang->sonarqube->edit = '编辑SonarQube'; $lang->sonarqube->delete = '删除SonarQube'; $lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; $lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; + +$lang->sonarqube->id = 'ID'; +$lang->sonarqube->name = "{$lang->sonarqube->common}名称"; +$lang->sonarqube->url = '服务地址'; +$lang->sonarqube->account = '用户名'; +$lang->sonarqube->password = '密码'; +$lang->sonarqube->token = 'Token'; +$lang->sonarqube->defaultProject = '默认项目'; +$lang->sonarqube->private = 'MD5验证'; + +$lang->sonarqube->createServer = '添加SonarQube服务器'; +$lang->sonarqube->desc = '描述'; +$lang->sonarqube->createSuccess = "创建成功"; + +$lang->sonarqube->placeholder = new stdclass; +$lang->sonarqube->placeholder->name = ''; +$lang->sonarqube->placeholder->url = "请填写SonarQube Server首页的访问地址,如:https://sonarqube.zentao.net。"; + +$lang->sonarqube->repeatError = "服务器名称或服务器地址已存在!"; +$lang->sonarqube->validError = "SonarQube 用户权限认证失败!"; +$lang->sonarqube->hostError = "无效的SonarQube服务地址。"; diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 79f3f144dd..91b529ba19 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -27,4 +27,37 @@ class sonarqubeModel extends model return $sonarqubeList; } + + /** + * Get sonarqube api base url and header by id. + * + * @param int $id + * @access public + * @return array + */ + public function getApiBase($id) + { + $sonarqube = $this->loadModel('pipeline')->getByID($id); + if(!$sonarqube) return ''; + + $url = rtrim($sonarqube->url, '/') . '/api/%s'; + $header[] = 'Authorization: Basic ' . $sonarqube->token; + + return array($url, $header); + } + + /** + * check sonarqube valid + * + * @param string $host + * @param string $token + * @access public + * @return array + */ + public function apiValidate($host, $token) + { + $url = rtrim($host, '/') . "/api/authentication/validate"; + $header = 'Authorization: Basic ' . $token; + return json_decode(commonModel::http($url, null, array(), $header)); + } } diff --git a/module/sonarqube/view/create.html.php b/module/sonarqube/view/create.html.php new file mode 100644 index 0000000000..15253bb19e --- /dev/null +++ b/module/sonarqube/view/create.html.php @@ -0,0 +1,51 @@ + + * @package sonarqube + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +