]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: API panel and wizard improvements
authorMarcin Haba <marcin.haba@bacula.pl>
Sun, 12 Aug 2018 09:03:44 +0000 (11:03 +0200)
committerKern Sibbald <kern@sibbald.com>
Wed, 15 Aug 2018 08:33:08 +0000 (10:33 +0200)
- add editing OAuth2 clients
- add combobox to select OAuth2 client
- simplify OAuth2 clients table view
- in API wizard don't show OAuth2 nor HTTP Basic params if not needed

gui/baculum/protected/API/Lang/en/messages.mo
gui/baculum/protected/API/Lang/en/messages.po
gui/baculum/protected/API/Lang/pl/messages.mo
gui/baculum/protected/API/Lang/pl/messages.po
gui/baculum/protected/API/Lang/pt/messages.mo
gui/baculum/protected/API/Lang/pt/messages.po
gui/baculum/protected/API/Pages/Panel/APIHome.page
gui/baculum/protected/API/Pages/Panel/APIHome.php
gui/baculum/protected/API/Pages/Panel/APIInstallWizard.page
gui/baculum/protected/API/Pages/Panel/APIInstallWizard.php
gui/baculum/themes/Baculum-v1/css/style.css

index 6f8cde7ec76d85c07734739933ddadb6ca7eb5c4..b29b322aebd17b3a1f3b1eaf1ab7592c982ae569 100644 (file)
Binary files a/gui/baculum/protected/API/Lang/en/messages.mo and b/gui/baculum/protected/API/Lang/en/messages.mo differ
index b898af0d5aa0675dd91bd6b08d03dd44120c3528..e52e7e519b68d437dbf902f39c9b5eab159b544f 100644 (file)
@@ -418,3 +418,18 @@ msgstr "Send request"
 
 msgid "Basic auth ready..."
 msgstr "Basic auth ready..."
+
+msgid "Name"
+msgstr "Name"
+
+msgid "Short name:"
+msgstr "Short name:"
+
+msgid "Edit"
+msgstr "Edit"
+
+msgid "Edit OAuth2 client parameters"
+msgstr "Edit OAuth2 client parameters"
+
+msgid "Select:"
+msgstr "Select:"
index 404d4679180a646a2bcb91d90866f08152569bd7..e01f83a8affb5c63c389ac2954eae5032df92c7a 100644 (file)
Binary files a/gui/baculum/protected/API/Lang/pl/messages.mo and b/gui/baculum/protected/API/Lang/pl/messages.mo differ
index 902d23b53556b687df3022aed627e53953bc04b8..3273a4e6de0c716aff21f92fc7096240d1507aac 100644 (file)
@@ -418,3 +418,18 @@ msgstr "Wyślij żądanie"
 
 msgid "Basic auth ready..."
 msgstr "Autentykacja Basic jest gotowa..."
+
+msgid "Name"
+msgstr "Nazwa"
+
+msgid "Short name:"
+msgstr "Krótka nazwa:"
+
+msgid "Edit"
+msgstr "Edytuj"
+
+msgid "Edit OAuth2 client parameters"
+msgstr "Edytuj parametry klienta OAuth2"
+
+msgid "Select:"
+msgstr "Wybierz:"
index 154c7babd89333645170ddcf9c481c4936e4ec8f..3c88940052a45223a1f9cf320894f073e7aeb874 100644 (file)
Binary files a/gui/baculum/protected/API/Lang/pt/messages.mo and b/gui/baculum/protected/API/Lang/pt/messages.mo differ
index 89ac643f47ee09978cee31c149e4fdb016027c24..d761f5f58a511521595e7e62dd01b68f77233207 100644 (file)
@@ -418,3 +418,18 @@ msgstr "Enviar solicitação"
 
 msgid "Basic auth ready..."
 msgstr "Autenticação básica pronta..."
+
+msgid "Name"
+msgstr "Name"
+
+msgid "Short name:"
+msgstr "Short name:"
+
+msgid "Edit"
+msgstr "Edit"
+
+msgid "Edit OAuth2 client parameters"
+msgstr "Edit OAuth2 client parameters"
+
+msgid "Select:"
+msgstr "Select:"
index 84142f109a0ea1aa5e3ded95bd581a68da4f12fe..d52f8d7f64a22735efb674c76c167750718c4d87 100644 (file)
                                </com:TJuiProgressbar>
                                <img id="api_refresh" src="<%=$this->getPage()->getTheme()->getBaseUrl()%>/icon_refresh.png" alt="<%[ Refresh token ]%>" title="<%[ Refresh token ]%>" onclick="oAPIHome.init_oauth2_client();" />
                        </div>
-                       <div>
-                               <com:TActiveDropDownList ID="AuthParams" OnLoad="loadAuthParams" />
+                       <div class="line" id="auth_params_combo_container" style="margin-top: 10px; width: 700px; display: none">
+                               <div class="text"><com:TLabel ForControl="AuthParamsCombo" Text="<%[ Select: ]%>" /></div>
+                               <div class="field">
+                                       <com:TActiveDropDownList ID="AuthParamsCombo" AutoPostBack="false" />
+                               </div>
                        </div>
                        <div style="clear: left; margin-top: 60px;">
                                <select id="section" class="api_select">
                                        HeaderText="<%[ Redirect URI ]%>"
                                        DataField="redirect_uri"
                                />
-                               <com:TBoundColumn
-                                       HeaderText="<%[ Scopes ]%>"
-                                       DataField="scope"
-                               />
-                               <com:TBoundColumn
-                                       HeaderText="<%[ Bconsole Path ]%>"
-                                       DataField="bconsole_cfg_path"
-                               />
                                <com:TTemplateColumn
                                        ID="OAuth2DeleteColumn"
                                        HeaderText="<%[ Delete ]%>"
                                        ItemStyle.HorizontalAlign="Center"
                                >
                                <prop:ItemTemplate>
+                                       <com:TActiveLinkButton
+                                               Text="<%[ Edit ]%>"
+                                               OnCommand="SourceTemplateControl.editOAuth2Item"
+                                               CommandParameter="<%#$this->getParent()->Data['client_id']%>"
+                                       />
                                        <com:TActiveLinkButton
                                                Text="<%[ Delete ]%>"
                                                OnCommand="SourceTemplateControl.deleteOAuth2Item"
                                                CommandParameter="<%=$this->getParent()->Data['client_id']%>"
                                                Attributes.onclick="if(!confirm('<%[ Are you sure? ]%>')) return false;"
-                                               Visible="<%=($this->getParent()->Data['client_id'] != $this->getPage()->main_client_id)%>"
                                        />
                                </prop:ItemTemplate>
                                </com:TTemplateColumn>
                        </com:TActiveDataGrid>
                </div>
+               <com:TJuiDialog
+                       ID="APIOAuth2EditPopup"
+                       Options.Title="<%[ Edit OAuth2 client parameters ]%>"
+                       Options.AutoOpen="False"
+                       Options.Width="700px"
+               >
+                       <com:TPanel DefaultButton="APIOAuth2SaveBtn">
+                       <div class="line">
+                               <div class="text"><com:TLabel ForControl="APIOAuth2ClientId" Text="<%[ OAuth2 Client ID: ]%>" /></div>
+                               <div class="field">
+                                       <com:TActiveTextBox
+                                               ID="APIOAuth2ClientId"
+                                               CssClass="textbox"
+                                               ReadOnly="true"
+                                       />
+                               </div>
+                       </div>
+                       <div class="line">
+                               <div class="text"><com:TLabel ForControl="APIOAuth2ClientSecret" Text="<%[ OAuth2 Client Secret: ]%>" /></div>
+                               <div class="field">
+                                       <com:TActiveTextBox
+                                               ID="APIOAuth2ClientSecret"
+                                               CssClass="textbox"
+                                               CausesValidation="false"
+                                               MaxLength="40"
+                                       />
+                                       <com:TRequiredFieldValidator
+                                               CssClass="validator-block"
+                                               Display="Dynamic"
+                                               ControlCssClass="invalidate"
+                                               ControlToValidate="APIOAuth2ClientSecret"
+                                               ValidationGroup="APIOAuth2Edit"
+                                               Text="<%[ Please enter Client Secret. ]%>"
+                                       />
+                                       <com:TRegularExpressionValidator
+                                               CssClass="validator-block"
+                                               Display="Dynamic"
+                                               ControlCssClass="invalidate"
+                                               ControlToValidate="APIOAuth2ClientSecret"
+                                               RegularExpression="<%=OAuth2::CLIENT_SECRET_PATTERN%>"
+                                               ValidationGroup="APIOAuth2Edit"
+                                               Text="<%[ Invalid Client Secret value. Client Secret may contain any character that is not a whitespace character. ]%>"
+                                       />
+                                       <a href="javascript:void(0)" onclick="document.getElementById('<%=$this->APIOAuth2ClientSecret->ClientID%>').value = get_random_string('ABCDEFabcdef0123456789', 40); return false;"><%[ generate ]%></a>
+                               </div>
+                       </div>
+                       <div class="line">
+                               <div class="text"><com:TLabel ForControl="APIOAuth2RedirectURI" Text="<%[ OAuth2 Redirect URI (example: https://baculumgui:9095/web/redirect): ]%>" /></div>
+                               <div class="field">
+                                       <com:TActiveTextBox
+                                               ID="APIOAuth2RedirectURI"
+                                               CssClass="textbox"
+                                               CausesValidation="false"
+                                       />
+                                       <com:TRequiredFieldValidator
+                                               CssClass="validator-block"
+                                               Display="Dynamic"
+                                               ControlCssClass="invalidate"
+                                               ControlToValidate="APIOAuth2RedirectURI"
+                                               ValidationGroup="APIOAuth2Edit"
+                                               Text="<%[ Please enter Redirect URI. ]%>"
+                                       />
+                               </div>
+                       </div>
+                       <div class="line">
+                               <div class="text"><com:TLabel ForControl="APIOAuth2Scope" Text="<%[ OAuth2 scopes (space separated): ]%>" /></div>
+                               <div class="field">
+                                       <com:TActiveTextBox
+                                               ID="APIOAuth2Scope"
+                                               CssClass="textbox"
+                                               CausesValidation="false"
+                                               TextMode="MultiLine"
+                                       />
+                                       <a href="javascript:void(0)" onclick="set_scopes('<%=$this->APIOAuth2Scope->ClientID%>'); return false;" style="vertical-align: top"><%[ set all scopes ]%></a>
+                                       <com:TRequiredFieldValidator
+                                               CssClass="validator-block"
+                                               Display="Dynamic"
+                                               ControlCssClass="invalidate"
+                                               ControlToValidate="APIOAuth2Scope"
+                                               ValidationGroup="APIOAuth2Edit"
+                                               Text="<%[ Please enter OAuth2 scopes. ]%>"
+                                       />
+                               </div>
+                       </div>
+                       <div class="line">
+                               <div class="text"><com:TLabel ForControl="APIOAuth2BconsoleCfgPath" Text="<%[ Dedicated Bconsole config file path: ]%>" /></div>
+                               <div class="field">
+                                       <com:TActiveTextBox
+                                               ID="APIOAuth2BconsoleCfgPath"
+                                               CssClass="textbox"
+                                               CausesValidation="false"
+                                       /> <%[ (optional) ]%>
+                               </div>
+                       </div>
+                       <div class="line">
+                               <div class="text"><com:TLabel ForControl="APIOAuth2Name" Text="<%[ Short name: ]%>" /></div>
+                               <div class="field">
+                                       <com:TActiveTextBox
+                                               ID="APIOAuth2Name"
+                                               CssClass="textbox"
+                                               CausesValidation="false"
+                                       /> <%[ (optional) ]%>
+                               </div>
+                       </div>
+                       <div class="center">
+                               <com:BButton
+                                       Text="<%[ Cancel ]%>"
+                                       CausesValidation="false"
+                                       Attributes.onclick="$('#<%=$this->APIOAuth2EditPopup->ClientID%>').dialog('close'); return false;"
+                               />
+                               <com:BActiveButton
+                                       ID="APIOAuth2SaveBtn"
+                                       ValidationGroup="APIOAuth2Edit"
+                                       OnCommand="TemplateControl.saveOAuth2Item"
+                                       Text="<%[ Save ]%>"
+                               >
+                               </com:BActiveButton>
+                       </div>
+                       </com:TPanel>
+               </com:TJuiDialog>
        </div>
+       <com:TActiveHiddenField ID="AuthParamsInput" />
+       <com:TCallback ID="AuthParamsCallback" OnCallback="setAuthParams">
+               <prop:ClientSide.OnComplete>
+                       oAPIHome.set_auth_params();
+                       oAPIHome.init_auth();
+               </prop:ClientSide.OnComplete>
+       </com:TCallback>
        <com:TClientScript>
                var oAPIHome = {
                        ids: {
                                result: 'api_result',
                                progress_bar: '<%=$this->Progress->ClientID%>',
                                progress_label: 'progress_label',
-                               refresh_token: 'api_refresh'
+                               refresh_token: 'api_refresh',
+                               auth_params_combo_container: 'auth_params_combo_container',
+                               auth_params_combo: '<%=$this->AuthParamsCombo->ClientID%>',
+                               auth_params_input: '<%=$this->AuthParamsInput->ClientID%>'
                        },
                        default_commands: {
                                storages: '/api/v1/storages/',
                                bvfs: '/api/v1/bvfs/lsdirs?jobids=1&path=&limit=8'
                        },
                        token: null,
-                       baculum_auth: JSON.parse('<%=$this->auth_params%>'),
+                       auth_params_cb: <%=$this->AuthParamsCallback->ActiveControl->Javascript%>,
                        init: function() {
                                this.set_events();
+                               this.set_auth_params();
+                               this.init_auth();
+                               this.init_tabs();
+                       },
+                       init_auth: function() {
                                if (typeof(this.baculum_auth) == 'object') {
                                        if (this.baculum_auth.auth_type == 'oauth2') {
+                                               document.getElementById(this.ids.auth_params_combo_container).style.display = '';
                                                this.init_oauth2_client();
                                        } else if (this.baculum_auth.auth_type == 'basic') {
                                                this.init_basic();
                                        }
                                }
-                               this.init_tabs();
+                       },
+                       set_auth_params: function() {
+                               var params = document.getElementById(this.ids.auth_params_input).value;
+                               this.baculum_auth = JSON.parse(params);
                        },
                        set_progress: function(value, text) {
                                $('#' + this.ids.progress_bar).progressbar('value', value);
                                document.getElementById(this.ids.refresh_token).style.display = 'none';
                        },
                        init_oauth2_client: function() {
+                               if (this.baculum_auth && !this.baculum_auth.hasOwnProperty('client_id')) {
+                                       // no client id, no client initialization
+                                       // Posibly case when first (default) API client is not able to get token
+                                       return;
+                               }
                                this.set_progress(1, 'Sending auth code request...');
                                var authorization_uri = document.location.origin + '/api/auth';
                                var auth_params = {
                                        var el = e.srcElement || e.target;
                                        this.set_default_command(el.value);
                                }.bind(this));
+                               var auth_params_combo = document.getElementById(this.ids.auth_params_combo);
+                               auth_params_combo.addEventListener('change', function(e) {
+                                       this.auth_params_cb.setCallbackParameter(auth_params_combo.value)
+                                       this.auth_params_cb.dispatch();
+                               }.bind(this));
                        },
                        set_default_command: function(section) {
                                if (this.default_commands.hasOwnProperty(section)) {
                                } else if (this.baculum_auth.auth_type == 'basic') {
                                        headers = {'Authorization': 'Basic ' + btoa(this.baculum_auth.login + ":" + this.baculum_auth.password)};
                                }
+                               this.clear_result();
                                var request = $.ajax({
                                        url: url,
                                        type: 'GET',
                        },
                        show_result: function(data) {
                                document.getElementById(this.ids.result).textContent = JSON.stringify(data, null, 2);
+                       },
+                       clear_result: function() {
+                               document.getElementById(this.ids.result).textContent = '';
                        }
                };
                $(function() {
index f3e09af409d8f548ee526b9a8fe66e50c5672d0a..519c1f0acce1eae5124fcf3aa3bd2107fc660ee6 100644 (file)
 Prado::using('System.Web.UI.JuiControls.TJuiProgressbar');
 Prado::using('System.Web.UI.ActiveControls.TActiveDataGrid');
 Prado::using('System.Web.UI.ActiveControls.TActiveLinkButton');
+Prado::using('System.Web.UI.ActiveControls.TActiveTextBox');
+Prado::using('System.Web.UI.ActiveControls.TCallback');
 Prado::using('Application.API.Class.BaculumAPIPage');
 
 class APIHome extends BaculumAPIPage {
 
-       public $auth_params;
-       public $main_client_id;
-
        public function onInit($param) {
                parent::onInit($param);
 
@@ -37,32 +36,45 @@ class APIHome extends BaculumAPIPage {
                if(count($config) === 0) {
                        // Config doesn't exist, go to wizard
                        $this->goToPage('Panel.APIInstallWizard');
-               } else {
-                       $base_params = array('auth_type' => $config['api']['auth_type']);
-                       $params = array();
+                       return;
+               } elseif (!$this->IsCallback) {
+                       $this->loadBasicUsers(null, null);
+                       $this->loadOAuth2Users(null, null);
+                       $this->setAuthParams(null, null);
+               }
+       }
+
+       public function setAuthParams($sender, $param) {
+               $config = $this->getModule('api_config')->getConfig();
+               $base_params = array('auth_type' => $config['api']['auth_type']);
+               $params = array();
+               if ($config['api']['auth_type'] === 'oauth2') {
                        $oauth2_cfg = $this->getModule('oauth2_config')->getConfig();
-                       if ($config['api']['auth_type'] === 'oauth2') {
-                               if (key_exists($config['api']['client_id'], $oauth2_cfg)) {
-                                       $this->main_client_id = $config['api']['client_id'];
-                               }
-                                       $params = array(
-                                               'client_id' => $config['api']['client_id'],
-                                               'client_secret' =>  $oauth2_cfg[$config['api']['client_id']]['client_secret'],
-                                               'redirect_uri' => $oauth2_cfg[$config['api']['client_id']]['redirect_uri'],
-                                               'scope' => explode(' ', $oauth2_cfg[$config['api']['client_id']]['scope'])
-                                       );
-                       } elseif ($config['api']['auth_type'] === 'basic') {
+                       $client_id = null;
+                       if (is_object($param)) {
+                               $client_id = $param->CallbackParameter;
+                       } elseif (key_exists($config['api']['client_id'], $oauth2_cfg)) {
+                               $client_id = $config['api']['client_id'];
+                       }
+                       if (is_string($client_id)) {
                                $params = array(
-                                       'login' => $config['api']['login'],
-                                       'password' => $config['api']['password']
+                                       'client_id' => $oauth2_cfg[$client_id]['client_id'],
+                                       'client_secret' =>  $oauth2_cfg[$client_id]['client_secret'],
+                                       'redirect_uri' => $oauth2_cfg[$client_id]['redirect_uri'],
+                                       'scope' => explode(' ', $oauth2_cfg[$client_id]['scope'])
                                );
-                               // login and password are not needed because user is already logged in
                        }
-                       $params = array_merge($base_params, $params);
-                       $this->auth_params = json_encode($params);
-                       $this->loadBasicUsers(null, null);
-                       $this->loadOAuth2Users(null, null);
+               } elseif ($config['api']['auth_type'] === 'basic') {
+                       if (is_null($param)) {
+                               $params['login'] = $config['api']['login'];
+                               $params['password'] = $config['api']['password'];
+                       } elseif (is_object($param)) {
+                               $params['login'] = $param->CallbackParameter;
+                               $params['password'] = '';
+                       }
                }
+               $params = array_merge($base_params, $params);
+               $this->AuthParamsInput->Value = json_encode($params);
        }
 
        public function loadBasicUsers($sender, $param) {
@@ -76,13 +88,25 @@ class APIHome extends BaculumAPIPage {
                $oauth2_cfg = $this->getModule('oauth2_config')->getConfig();
                $this->OAuth2ClientList->dataSource = array_values($oauth2_cfg);
                $this->OAuth2ClientList->dataBind();
+               $this->loadAuthParams(null, null);
        }
 
-       public function loadAuthParams($sneder, $param) {
-               $oauth2_cfg = $this->getModule('oauth2_config')->getConfig();
-               $clientids = array_keys($oauth2_cfg);
-               $this->AuthParams->DataSource = array_combine($clientids, $clientids);
-               $this->AuthParams->dataBind();
+       public function loadAuthParams($sender, $param) {
+               $ids = $values = array();
+               $config = $this->getModule('api_config')->getConfig();
+               if ($config['api']['auth_type'] === 'oauth2') {
+                       $oauth2_cfg = $this->getModule('oauth2_config')->getConfig();
+                       $ids = array_keys($oauth2_cfg);
+                       $values = array();
+                       for ($i = 0; $i < count($ids); $i++) {
+                               $values[] = "{$oauth2_cfg[$ids[$i]]['client_id']} ({$oauth2_cfg[$ids[$i]]['name']})";
+                       }
+               } elseif ($config['api']['auth_type'] === 'basic') {
+                       $api_user_cfg = $this->getModule('basic_apiuser')->getAllUsers();
+                       $values = $ids = array_keys($api_user_cfg);
+               }
+               $this->AuthParamsCombo->DataSource = array_combine($ids, $values);
+               $this->AuthParamsCombo->dataBind();
        }
 
        private function getBasicUsers() {
@@ -105,12 +129,47 @@ class APIHome extends BaculumAPIPage {
                $config = $this->getModule('oauth2_config');
                $clients = $config->getConfig();
                $client_id = $param->getCommandParameter();
-               if (array_key_exists($client_id, $clients)) {
+               if (key_exists($client_id, $clients)) {
                        unset($clients[$client_id]);
                }
                $config->setConfig($clients);
                $this->OAuth2ClientList->DataSource = array_values($config->getConfig());
                $this->OAuth2ClientList->dataBind();
+               $this->loadAuthParams(null, null);
+       }
+
+       public function editOAuth2Item($sender, $param) {
+               $config = $this->getModule('oauth2_config');
+               $clients = $config->getConfig();
+               $client_id = $param->getCommandParameter();
+               if (key_exists($client_id, $clients)) {
+                       $this->APIOAuth2ClientId->Text = $clients[$client_id]['client_id'];
+                       $this->APIOAuth2ClientSecret->Text = $clients[$client_id]['client_secret'];
+                       $this->APIOAuth2RedirectURI->Text = $clients[$client_id]['redirect_uri'];
+                       $this->APIOAuth2Scope->Text = $clients[$client_id]['scope'];
+                       $this->APIOAuth2BconsoleCfgPath->Text = $clients[$client_id]['bconsole_cfg_path'];
+                       $this->APIOAuth2Name->Text = $clients[$client_id]['name'];
+               }
+               $this->APIOAuth2EditPopup->open();
+       }
+
+       public function saveOAuth2Item($sender, $param) {
+               $config = $this->getModule('oauth2_config');
+               $clients = $config->getConfig();
+               $client_id = $this->APIOAuth2ClientId->Text;
+               if (key_exists($client_id, $clients)) {
+                       $clients[$client_id]['client_id'] = $client_id;
+                       $clients[$client_id]['client_secret'] = $this->APIOAuth2ClientSecret->Text;
+                       $clients[$client_id]['redirect_uri'] = $this->APIOAuth2RedirectURI->Text;
+                       $clients[$client_id]['scope'] = $this->APIOAuth2Scope->Text;
+                       $clients[$client_id]['bconsole_cfg_path'] = $this->APIOAuth2BconsoleCfgPath->Text;
+                       $clients[$client_id]['name'] = $this->APIOAuth2Name->Text;
+                       $config->setConfig($clients);
+               }
+               $this->APIOAuth2EditPopup->close();
+               $this->OAuth2ClientList->DataSource = array_values($clients);
+               $this->OAuth2ClientList->dataBind();
+               $this->loadAuthParams(null, null);
        }
 }
 ?>
index 8fc6f5cc6f09497b10128de29871af5339851bf4..91c37a26c22d2957f5c5cccc67a9e5a6bcd62654 100644 (file)
                                        ID="AuthBasic"
                                        GroupName="SelectAuth"
                                        Checked="true"
-                                       Attributes.onclick="$('#configure_oauth2_auth').hide();$('#configure_basic_auth').show();"
+                                       Attributes.onclick="$('#configure_oauth2_auth').hide();$('#configure_basic_auth').show();%>;"
                                        OnCallback="setBasicValidation"
                                />
                                <com:TLabel
                                />
                        </div>
                        <div id="configure_basic_auth" style="display: <%=($this->AuthBasic->Checked === true) ? '' : 'none';%>">
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APILogin" Text="<%[ Administration login: ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APILogin"
-                                                       CssClass="textbox"
-                                                       CausesValidation="false"
-                                               />
-                                               <com:TRequiredFieldValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APILogin"
-                                                       ValidationGroup="Basic"
-                                                       Text="<%[ Please enter login. ]%>"
-                                               />
-                                               <com:TRegularExpressionValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APILogin"
-                                                       ValidationGroup="Basic"
-                                                       RegularExpression="<%=BasicAPIUserConfig::USER_PATTERN%>"
-                                                       Text="<%[ Invalid login value. Login may contain a-z A-Z 0-9 characters. ]%>"
-                                               />
+                               <com:TPanel Visible="<%=$this->first_run%>">
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APILogin" Text="<%[ Administration login: ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APILogin"
+                                                               CssClass="textbox"
+                                                               CausesValidation="false"
+                                                       />
+                                                       <com:TRequiredFieldValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APILogin"
+                                                               ValidationGroup="Basic"
+                                                               Text="<%[ Please enter login. ]%>"
+                                                       />
+                                                       <com:TRegularExpressionValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APILogin"
+                                                               ValidationGroup="Basic"
+                                                               RegularExpression="<%=BasicAPIUserConfig::USER_PATTERN%>"
+                                                               Text="<%[ Invalid login value. Login may contain a-z A-Z 0-9 characters. ]%>"
+                                                       />
+                                               </div>
                                        </div>
-                               </div>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APIPassword" Text="<%[ Administration password: ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APIPassword"
-                                                       CssClass="textbox"
-                                                       TextMode="Password"
-                                                       MaxLength="30"
-                                                       PersistPassword="true"
-                                               />
-                                               <com:TRequiredFieldValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIPassword"
-                                                       ValidationGroup="Basic"
-                                                       Text="<%[ Please enter password. ]%>"
-                                               />
-                                               <com:TRegularExpressionValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIPassword"
-                                                       RegularExpression="[\S\s]{5,30}"
-                                                       ValidationGroup="Basic"
-                                                       Text="<%[ Password must be longer than 4 chars. ]%>"
-                                               />
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APIPassword" Text="<%[ Administration password: ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APIPassword"
+                                                               CssClass="textbox"
+                                                               TextMode="Password"
+                                                               MaxLength="30"
+                                                               PersistPassword="true"
+                                                       />
+                                                       <com:TRequiredFieldValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIPassword"
+                                                               ValidationGroup="Basic"
+                                                               Text="<%[ Please enter password. ]%>"
+                                                       />
+                                                       <com:TRegularExpressionValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIPassword"
+                                                               RegularExpression="[\S\s]{5,30}"
+                                                               ValidationGroup="Basic"
+                                                               Text="<%[ Password must be longer than 4 chars. ]%>"
+                                                       />
+                                               </div>
                                        </div>
-                               </div>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="RetypeAPIPassword" Text="<%[ Retype administration password: ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="RetypeAPIPassword"
-                                                       CssClass="textbox"
-                                                       TextMode="Password"
-                                                       MaxLength="30"
-                                                       PersistPassword="true"
-                                               />
-                                               <com:TRequiredFieldValidator
-                                                       ID="RetypePasswordRequireValidator"
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="RetypeAPIPassword"
-                                                       ValidationGroup="Basic"
-                                                       Text="<%[ Please enter retype password. ]%>"
-                                               />
-                                               <com:TRegularExpressionValidator
-                                                       ID="RetypePasswordRegexpValidator"
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="RetypeAPIPassword"
-                                                       RegularExpression="[\S\s]{5,30}"
-                                                       ValidationGroup="Basic"
-                                                       Text="<%[ Password must be longer than 4 chars. ]%>"
-                                               />
-                                               <com:TCompareValidator
-                                                       ID="RetypePasswordCustomValidator"
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="RetypeAPIPassword"
-                                                       ControlToCompare="APIPassword"
-                                                       ValidationGroup="Basic"
-                                                       Text="<%[ Passwords must be the same. ]%>"
-                                               />
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="RetypeAPIPassword" Text="<%[ Retype administration password: ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="RetypeAPIPassword"
+                                                               CssClass="textbox"
+                                                               TextMode="Password"
+                                                               MaxLength="30"
+                                                               PersistPassword="true"
+                                                       />
+                                                       <com:TRequiredFieldValidator
+                                                               ID="RetypePasswordRequireValidator"
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="RetypeAPIPassword"
+                                                               ValidationGroup="Basic"
+                                                               Text="<%[ Please enter retype password. ]%>"
+                                                       />
+                                                       <com:TRegularExpressionValidator
+                                                               ID="RetypePasswordRegexpValidator"
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="RetypeAPIPassword"
+                                                               RegularExpression="[\S\s]{5,30}"
+                                                               ValidationGroup="Basic"
+                                                               Text="<%[ Password must be longer than 4 chars. ]%>"
+                                                       />
+                                                       <com:TCompareValidator
+                                                               ID="RetypePasswordCustomValidator"
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="RetypeAPIPassword"
+                                                               ControlToCompare="APIPassword"
+                                                               ValidationGroup="Basic"
+                                                               Text="<%[ Passwords must be the same. ]%>"
+                                                       />
+                                               </div>
                                        </div>
-                               </div>
+                               </com:TPanel>
                        </div>
-                       <div id="configure_oauth2_auth" style="display: <%=($this->AuthOAuth2->Checked === true) ? '' : 'none';%>">
-                               <h3><%[ First client registration ]%></h3>
-                               <h4><%[ Please do not forget to disable HTTP Basic auth in the API web server config. Othwerise OAuth2 will not work. ]%></h4>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APIOAuth2ClientId" Text="<%[ OAuth2 Client ID: ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APIOAuth2ClientId"
-                                                       CssClass="textbox"
-                                                       CausesValidation="false"
-                                                       MaxLength="32"
-                                               />
-                                               <com:TRequiredFieldValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIOAuth2ClientId"
-                                                       ValidationGroup="OAuth2"
-                                                       Text="<%[ Please enter Client ID. ]%>"
-                                               />
-                                               <com:TRegularExpressionValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIOAuth2ClientId"
-                                                       RegularExpression="<%=OAuth2::CLIENT_ID_PATTERN%>"
-                                                       ValidationGroup="OAuth2"
-                                                       Text="<%[ Invalid Client ID value. Client ID may contain a-z A-Z 0-9 - _ characters. ]%>"
+                       <div id="configure_oauth2_auth" style="display: <%=$this->AuthOAuth2->Checked ? '' : 'none';%>">
+                               <com:TPanel Visible="<%=($this->first_run || $this->add_auth_params)%>">
+                                       <h3><%[ First client registration ]%></h3>
+                                       <h4><%[ Please do not forget to disable HTTP Basic auth in the API web server config. Othwerise OAuth2 will not work. ]%></h4>
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APIOAuth2ClientId" Text="<%[ OAuth2 Client ID: ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APIOAuth2ClientId"
+                                                               CssClass="textbox"
+                                                               CausesValidation="false"
+                                                               MaxLength="32"
                                                        />
-                                               <a href="javascript:void(0)" onclick="document.getElementById('<%=$this->APIOAuth2ClientId->ClientID%>').value = get_random_string('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', 32); return false;"><%[ generate ]%></a>
+                                                       <com:TRequiredFieldValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIOAuth2ClientId"
+                                                               ValidationGroup="OAuth2"
+                                                               Text="<%[ Please enter Client ID. ]%>"
+                                                       />
+                                                       <com:TRegularExpressionValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIOAuth2ClientId"
+                                                               RegularExpression="<%=OAuth2::CLIENT_ID_PATTERN%>"
+                                                               ValidationGroup="OAuth2"
+                                                               Text="<%[ Invalid Client ID value. Client ID may contain a-z A-Z 0-9 - _ characters. ]%>"
+                                                               />
+                                                       <a href="javascript:void(0)" onclick="document.getElementById('<%=$this->APIOAuth2ClientId->ClientID%>').value = get_random_string('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', 32); return false;"><%[ generate ]%></a>
+                                               </div>
                                        </div>
-                               </div>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APIOAuth2ClientSecret" Text="<%[ OAuth2 Client Secret: ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APIOAuth2ClientSecret"
-                                                       CssClass="textbox"
-                                                       CausesValidation="false"
-                                                       MaxLength="40"
-                                               />
-                                               <com:TRequiredFieldValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIOAuth2ClientSecret"
-                                                       ValidationGroup="OAuth2"
-                                                       Text="<%[ Please enter Client Secret. ]%>"
-                                               />
-                                               <com:TRegularExpressionValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIOAuth2ClientSecret"
-                                                       RegularExpression="<%=OAuth2::CLIENT_SECRET_PATTERN%>"
-                                                       ValidationGroup="OAuth2"
-                                                       Text="<%[ Invalid Client Secret value. Client Secret may contain any character that is not a whitespace character. ]%>"
-                                               />
-                                               <a href="javascript:void(0)" onclick="document.getElementById('<%=$this->APIOAuth2ClientSecret->ClientID%>').value = get_random_string('ABCDEFabcdef0123456789', 40); return false;"><%[ generate ]%></a>
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APIOAuth2ClientSecret" Text="<%[ OAuth2 Client Secret: ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APIOAuth2ClientSecret"
+                                                               CssClass="textbox"
+                                                               CausesValidation="false"
+                                                               MaxLength="40"
+                                                       />
+                                                       <com:TRequiredFieldValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIOAuth2ClientSecret"
+                                                               ValidationGroup="OAuth2"
+                                                               Text="<%[ Please enter Client Secret. ]%>"
+                                                       />
+                                                       <com:TRegularExpressionValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIOAuth2ClientSecret"
+                                                               RegularExpression="<%=OAuth2::CLIENT_SECRET_PATTERN%>"
+                                                               ValidationGroup="OAuth2"
+                                                               Text="<%[ Invalid Client Secret value. Client Secret may contain any character that is not a whitespace character. ]%>"
+                                                       />
+                                                       <a href="javascript:void(0)" onclick="document.getElementById('<%=$this->APIOAuth2ClientSecret->ClientID%>').value = get_random_string('ABCDEFabcdef0123456789', 40); return false;"><%[ generate ]%></a>
+                                               </div>
                                        </div>
-                               </div>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APIOAuth2RedirectURI" Text="<%[ OAuth2 Redirect URI (example: https://baculumgui:9095/web/redirect): ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APIOAuth2RedirectURI"
-                                                       CssClass="textbox"
-                                                       CausesValidation="false"
-                                               />
-                                               <com:TRequiredFieldValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIOAuth2RedirectURI"
-                                                       ValidationGroup="OAuth2"
-                                                       Text="<%[ Please enter Redirect URI. ]%>"
-                                               />
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APIOAuth2RedirectURI" Text="<%[ OAuth2 Redirect URI (example: https://baculumgui:9095/web/redirect): ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APIOAuth2RedirectURI"
+                                                               CssClass="textbox"
+                                                               CausesValidation="false"
+                                                       />
+                                                       <com:TRequiredFieldValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIOAuth2RedirectURI"
+                                                               ValidationGroup="OAuth2"
+                                                               Text="<%[ Please enter Redirect URI. ]%>"
+                                                       />
+                                               </div>
                                        </div>
-                               </div>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APIOAuth2Scope" Text="<%[ OAuth2 scopes (space separated): ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APIOAuth2Scope"
-                                                       CssClass="textbox"
-                                                       CausesValidation="false"
-                                                       TextMode="MultiLine"
-                                               />
-                                               <a href="javascript:void(0)" onclick="set_scopes('<%=$this->APIOAuth2Scope->ClientID%>'); return false;" style="vertical-align: top"><%[ set all scopes ]%></a>
-                                               <com:TRequiredFieldValidator
-                                                       CssClass="validator-block"
-                                                       Display="Dynamic"
-                                                       ControlCssClass="invalidate"
-                                                       ControlToValidate="APIOAuth2Scope"
-                                                       ValidationGroup="OAuth2"
-                                                       Text="<%[ Please enter OAuth2 scopes. ]%>"
-                                               />
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APIOAuth2Scope" Text="<%[ OAuth2 scopes (space separated): ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APIOAuth2Scope"
+                                                               CssClass="textbox"
+                                                               CausesValidation="false"
+                                                               TextMode="MultiLine"
+                                                       />
+                                                       <a href="javascript:void(0)" onclick="set_scopes('<%=$this->APIOAuth2Scope->ClientID%>'); return false;" style="vertical-align: top"><%[ set all scopes ]%></a>
+                                                       <com:TRequiredFieldValidator
+                                                               CssClass="validator-block"
+                                                               Display="Dynamic"
+                                                               ControlCssClass="invalidate"
+                                                               ControlToValidate="APIOAuth2Scope"
+                                                               ValidationGroup="OAuth2"
+                                                               Text="<%[ Please enter OAuth2 scopes. ]%>"
+                                                       />
+                                               </div>
                                        </div>
-                               </div>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APIOAuth2BconsoleCfgPath" Text="<%[ Dedicated Bconsole config file path: ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APIOAuth2BconsoleCfgPath"
-                                                       CssClass="textbox"
-                                                       CausesValidation="false"
-                                                       ValidationGroup="OAuth2"
-                                               /> <%[ (optional) ]%>
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APIOAuth2BconsoleCfgPath" Text="<%[ Dedicated Bconsole config file path: ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APIOAuth2BconsoleCfgPath"
+                                                               CssClass="textbox"
+                                                               CausesValidation="false"
+                                                               ValidationGroup="OAuth2"
+                                                       /> <%[ (optional) ]%>
+                                               </div>
                                        </div>
-                               </div>
-                               <div class="line">
-                                       <div class="text"><com:TLabel ForControl="APIOAuth2Name" Text="<%[ Short name: ]%>" /></div>
-                                       <div class="field">
-                                               <com:TTextBox
-                                                       ID="APIOAuth2Name"
-                                                       CssClass="textbox"
-                                                       CausesValidation="false"
-                                               /> <%[ (optional) ]%>
+                                       <div class="line">
+                                               <div class="text"><com:TLabel ForControl="APIOAuth2Name" Text="<%[ Short name: ]%>" /></div>
+                                               <div class="field">
+                                                       <com:TTextBox
+                                                               ID="APIOAuth2Name"
+                                                               CssClass="textbox"
+                                                               CausesValidation="false"
+                                                       /> <%[ (optional) ]%>
+                                               </div>
                                        </div>
-                               </div>
+                               </com:TPanel>
                        </div>
                        <script type="text/javascript">
                                var wizard_validation = function() {
index 10e899dae3cbeda3a98e413f54ef21ea43db6b90..c27ef6e0e5a33ce45894ed7e40db39933915ed9b 100644 (file)
@@ -38,6 +38,7 @@ Prado::using('Application.API.Class.BasicAPIUserConfig');
 class APIInstallWizard extends BaculumAPIPage {
 
        public $first_run;
+       public $add_auth_params = false;
        public $config;
 
        const DEFAULT_DB_NAME = 'bacula';
@@ -67,6 +68,8 @@ class APIInstallWizard extends BaculumAPIPage {
                $config = $this->getModule('api_config');
                $this->config = $config->getConfig();
                $this->first_run = (count($this->config) === 0);
+               $oauth2_cfg = $this->getModule('oauth2_config')->getConfig();
+               $this->add_auth_params = (count($oauth2_cfg) === 0);
        }
 
        public function onLoad($param) {
index 8f50d61a33583e42bdf5e82f42f99fc683c97de7..224b54f899ba4fbe4fd5e6153c662679796f6c19 100644 (file)
@@ -41,9 +41,9 @@ input[type=checkbox] {
 }
 
 input.textbox, select.textbox, textarea.textbox {
-       width: 260px;
+       width: 300px;
        border: 1px solid black;
-       font-size: 11pt;
+       font-size: 11pt !important;
        display: table-cell;
 }
 
@@ -239,6 +239,11 @@ input.bbutton:hover {
        text-decoration: underline !important;
 }
 
+.ui-dialog-content div a {
+       color: black !important;
+       text-decoration: underline !important;
+}
+
 .ui-tabs {
        font-size: 12px !important;
 }