GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Issues (4873)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

plugins/cardwall/include/cardwallPlugin.class.php (5 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * Copyright (c) Enalean, 2011. All Rights Reserved.
4
 *
5
 * This file is a part of Tuleap.
6
 *
7
 * Tuleap is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 2 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * Tuleap is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with Tuleap. If not, see <http://www.gnu.org/licenses/>.
19
 */
20
21
require_once 'common/plugin/Plugin.class.php';
22
require_once 'constants.php';
23
require_once 'autoload.php';
24
25
/**
26
 * CardwallPlugin
27
 */
28
class cardwallPlugin extends Plugin {
29
    
30
    /** 
31
     * @var Cardwall_OnTop_ConfigFactory
32
     */
33
    private $config_factory;
34
    
35
    public function getConfigFactory() {
36
        if (!$this->config_factory) {
37
            $tracker_factory  = TrackerFactory::instance();
38
            $element_factory  = Tracker_FormElementFactory::instance();
39
            $this->config_factory = new Cardwall_OnTop_ConfigFactory($tracker_factory, $element_factory);
40
        }
41
        return $this->config_factory;
42
    }
43
44
    const RENDERER_TYPE = 'plugin_cardwall';
45
46
47
    public function getHooksAndCallbacks() {
48
        if (defined('TRACKER_BASE_URL')) {
49
            $this->addHook('cssfile');
50
            $this->addHook('javascript_file');
51
            $this->addHook('tracker_report_renderer_types');
52
            $this->addHook('tracker_report_renderer_instance');
53
            $this->addHook(TRACKER_EVENT_TRACKERS_DUPLICATED);
54
            $this->addHook(TRACKER_EVENT_BUILD_ARTIFACT_FORM_ACTION);
55
            $this->addHook(TRACKER_EVENT_REDIRECT_AFTER_ARTIFACT_CREATION_OR_UPDATE);
56
            $this->_addHook(Event::JAVASCRIPT);
57
            $this->addHook(Event::IMPORT_XML_PROJECT_TRACKER_DONE);
58
            $this->addHook(TRACKER_EVENT_MANAGE_SEMANTICS);
59
            $this->addHook(TRACKER_EVENT_SEMANTIC_FROM_XML);
60
            $this->addHook(TRACKER_EVENT_GET_SEMANTIC_FACTORIES);
61
62
            if (defined('AGILEDASHBOARD_BASE_DIR')) {
63
                $this->addHook(AGILEDASHBOARD_EVENT_ADDITIONAL_PANES_ON_MILESTONE);
64
                $this->addHook(AGILEDASHBOARD_EVENT_ADDITIONAL_PANES_INFO_ON_MILESTONE);
65
                $this->addHook(AGILEDASHBOARD_EVENT_INDEX_PAGE);
66
                $this->addHook(AGILEDASHBOARD_EVENT_MILESTONE_SELECTOR_REDIRECT);
67
                $this->addHook(AGILEDASHBOARD_EVENT_PLANNING_CONFIG);
68
                $this->addHook(AGILEDASHBOARD_EVENT_PLANNING_CONFIG_UPDATE);
69
                $this->addHook(AGILEDASHBOARD_EVENT_REST_GET_CARDWALL);
70
                $this->addHook(AGILEDASHBOARD_EVENT_REST_GET_MILESTONE);
71
                $this->addHook(AGILEDASHBOARD_EVENT_IS_CARDWALL_ENABLED);
72
                $this->addHook(AGILEDASHBOARD_EVENT_GET_CARD_FIELDS);
73
                $this->addHook(AGILEDASHBOARD_EVENT_REST_RESOURCES);
74
                $this->addHook(AGILEDASHBOARD_EXPORT_XML);
75
            }
76
        }
77
        return parent::getHooksAndCallbacks();
78
    }
79
80
    /**
81
     * @see Plugin::getDependencies()
82
     */
83
    public function getDependencies() {
84
        return array('tracker');
85
    }
86
87
    
88
    // TODO : transform into a OnTop_Config_Command, and move code to ConfigFactory
89
    public function tracker_event_trackers_duplicated($params) {
90
        foreach ($params['tracker_mapping'] as $from_tracker_id => $to_tracker_id) {
91
            if ($this->getOnTopDao()->duplicate($from_tracker_id, $to_tracker_id)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getOnTopDao()->du...ker_id, $to_tracker_id) of type integer|false is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
92
                $this->getOnTopColumnDao()->duplicate($from_tracker_id, $to_tracker_id, $params);
93
                $this->getOnTopColumnMappingFieldDao()->duplicate($from_tracker_id, $to_tracker_id, $params['tracker_mapping'], $params['field_mapping']);
94
                $this->getOnTopColumnMappingFieldValueDao()->duplicate($from_tracker_id, $to_tracker_id, $params['tracker_mapping'], $params['field_mapping'], $params['plugin_cardwall_column_mapping']);
95
            }
96
        }
97
    }
98
99
    /**
100
     * This hook ask for types of report renderer
101
     *
102
     * @param array types Input/Output parameter. Expected format: $types['my_type'] => 'Label of the type'
103
     */
104
    public function tracker_report_renderer_types($params) {
105
        $params['types'][self::RENDERER_TYPE] = $GLOBALS['Language']->getText('plugin_cardwall', 'title');
106
    }
107
108
    /**
109
     * This hook asks to create a new instance of a renderer
110
     *
111
     * @param array $params:
0 ignored issues
show
There is no parameter named $params:. Did you maybe mean $params?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
112
     *              mixed  'instance' Output parameter. must contain the new instance
113
     *              string 'type' the type of the new renderer
114
     *              array  'row' the base properties identifying the renderer (id, name, description, rank)
115
     *              Report 'report' the report
116
     *
117
     * @return void
118
     */
119
    public function tracker_report_renderer_instance($params) {
120
        if ($params['type'] == self::RENDERER_TYPE) {
121
            //First retrieve specific properties of the renderer that are not saved in the generic table
122
            if ( !isset($row['field_id']) ) {
0 ignored issues
show
The variable $row seems only to be defined at a later point. As such the call to isset() seems to always evaluate to false.

This check marks calls to isset(...) or empty(...) that are found before the variable itself is defined. These will always have the same result.

This is likely the result of code being shifted around. Consider removing these calls.

Loading history...
123
                $row['field_id'] = null;
124
                if ($params['store_in_session']) {
125
                    $this->report_session = new Tracker_Report_Session($params['report']->id);
126
                    $this->report_session->changeSessionNamespace("renderers.{$params['row']['id']}");
127
                    $row['field_id'] = $this->report_session->get("field_id");
128
                }
129
                if (!$row['field_id']) {
130
                    $dao = new Cardwall_RendererDao();
131
                    $cardwall_row = $dao->searchByRendererId($params['row']['id'])->getRow();
132
                    if ($cardwall_row) {
133
                        $row['field_id'] = $cardwall_row['field_id'];
134
                    }
135
                }
136
            }
137
138
            $report = $params['report'];
139
            $config = new Cardwall_OnTop_ConfigEmpty();
140
            
141
            if ($report->tracker_id != 0) {
142
                $config = $this->getConfigFactory()->getOnTopConfigByTrackerId($report->tracker_id);
143
            }
144
            //Build the instance from the row
145
            $params['instance'] = new Cardwall_Renderer(
146
                $this,
147
                $config,
148
                $params['row']['id'],
149
                $params['report'],
150
                $params['row']['name'],
151
                $params['row']['description'],
152
                $params['row']['rank'],
153
                $row['field_id'],
154
                $this->getPluginInfo()->getPropVal('display_qr_code')
0 ignored issues
show
The method getPropVal does only exist in ArchiveDeletedItemsPlugi... and CardwallPluginInfo, but not in AdminDelegationPluginInf...gileDashboardPluginInfo.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
155
            );
156
            if ($params['store_in_session']) {
157
                $params['instance']->initiateSession();
158
            }
159
        }
160
    }
161
162
    public function getPluginInfo() {
163
        if (!is_a($this->pluginInfo, 'CardwallPluginInfo')) {
164
            $this->pluginInfo = new CardwallPluginInfo($this);
165
        }
166
        return $this->pluginInfo;
167
    }
168
169
    public function cssfile($params) {
170
        // Only show the stylesheet if we're actually in the Cardwall pages.
171
        // This stops styles inadvertently clashing with the main site.
172
        if ($this->isAgileDashboardOrTrackerUrl() ||
173
            strpos($_SERVER['REQUEST_URI'], '/my/') === 0 ||
174
            strpos($_SERVER['REQUEST_URI'], '/projects/') === 0 ||
175
            strpos($_SERVER['REQUEST_URI'], '/widgets/') === 0 ) {
176
            echo '<link rel="stylesheet" type="text/css" href="'. $this->getThemePath() .'/css/style.css" />';
177
        }
178
    }
179
180
    public function javascript_file($params) {
181
        // Only show the js if we're actually in the Cardwall pages.
182
        // This stops styles inadvertently clashing with the main site.
183
        if ($this->isAgileDashboardOrTrackerUrl() && $this->canUseStandardJavsacript()) {
184
            echo $this->getJavascriptIncludesForScripts(array(
185
                'ajaxInPlaceEditorExtensions.js',
186
                'cardwall.js',
187
                'script.js',
188
                'custom-mapping.js',
189
                'CardsEditInPlace.js',
190
                'fullscreen.js',
191
            ));
192
        }
193
    }
194
195
    /**
196
     * @see Event::TRACKER_EVENT_MANAGE_SEMANTICS
197
     */
198
    public function tracker_event_manage_semantics($parameters) {
199
        $tracker   = $parameters['tracker'];
200
        /* @var $semantics Tracker_SemanticCollection */
201
        $semantics = $parameters['semantics'];
202
203
204
        $card_fields_semantic = Cardwall_Semantic_CardFields::load($tracker);
205
        $semantics->add($card_fields_semantic->getShortName(), $card_fields_semantic);
206
    }
207
208
    /**
209
     * @see TRACKER_EVENT_SEMANTIC_FROM_XML
210
     */
211
    public function tracker_event_semantic_from_xml($params) {
212
        $tracker     = $params['tracker'];
213
        $xml         = $params['xml'];
214
        $xml_mapping = $params['xml_mapping'];
215
        $type        = $params['type'];
216
217
        if ($type == Cardwall_Semantic_CardFields::NAME) {
218
            $params['semantic'] = Cardwall_Semantic_CardFieldsFactory::instance()->getInstanceFromXML($xml, $xml_mapping, $tracker);
219
        }
220
    }
221
222
    /**
223
     * @see TRACKER_EVENT_GET_SEMANTIC_FACTORIES
224
     */
225
    public function tracker_event_get_semantic_factories($params) {
226
        $params['factories'][] = Cardwall_Semantic_CardFieldsFactory::instance();
227
    }
228
229
    private function getJavascriptIncludesForScripts(array $script_names) {
230
        $html = '';
231
        foreach ($script_names as $script_name) {
232
            $html .= '<script type="text/javascript" src="'.$this->getPluginPath().'/js/'.$script_name.'"></script>'."\n";
233
        }
234
        return $html;
235
    }
236
237
    private function isAgileDashboardOrTrackerUrl() {
238
        return (defined('AGILEDASHBOARD_BASE_DIR') &&
239
                strpos($_SERVER['REQUEST_URI'], AGILEDASHBOARD_BASE_URL.'/') === 0 ||
240
                strpos($_SERVER['REQUEST_URI'], TRACKER_BASE_URL.'/') === 0);
241
    }
242
243
    private function canUseStandardJavsacript() {
244
        $use_standard = true;
245
246
        $em = EventManager::instance();
247
        $em->processEvent(
248
            CARDWALL_EVENT_USE_STANDARD_JAVASCRIPT,
249
            array(
250
                'use_standard' => &$use_standard
251
            )
252
        );
253
254
        return $use_standard;
255
    }
256
257
    public function javascript($params) {
258
        include $GLOBALS['Language']->getContent('script_locale', null, 'cardwall', '.js');
259
        echo "var tuleap = tuleap || { };".PHP_EOL;
260
        echo "tuleap.cardwall = tuleap.cardwall || { };".PHP_EOL;
261
        echo "tuleap.cardwall.base_url = '". CARDWALL_BASE_URL ."/';".PHP_EOL;
262
        echo PHP_EOL;
263
    }
264
265
    private function denyAccess($tracker_id) {
0 ignored issues
show
This method is not used, and could be removed.
Loading history...
266
        $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker_admin', 'access_denied'));
267
        $GLOBALS['Response']->redirect(TRACKER_BASE_URL.'/?tracker='. $tracker_id);
268
    }
269
270
    /**
271
     * @see Event::AGILEDASHBOARD_EVENT_GET_CARD_FIELDS
272
     */
273
    public function agiledashboard_event_get_card_fields($parameters) {
274
        $parameters['card_fields_semantic'] = Cardwall_Semantic_CardFields::load($parameters['tracker']);
275
    }
276
277
    public function agiledashboard_event_additional_panes_on_milestone($params) {
278
        $pane_info = $this->getPaneInfo($params['milestone']);
279
280
        if (! $pane_info) {
281
            return;
282
        }
283
284
        if ($params['request']->get('pane') == Cardwall_PaneInfo::IDENTIFIER) {
285
            $pane_info->setActive(true);
286
            $params['active_pane'] = $this->getCardwallPane($pane_info, $params['milestone'], $params['user'], $params['milestone_factory']);
287
        }
288
        $params['panes'][] = $pane_info;
289
    }
290
291
    public function agiledashboard_event_additional_panes_info_on_milestone($params) {
292
        $pane_info = $this->getPaneInfo($params['milestone']);
293
294
        if (! $pane_info) {
295
            return;
296
        }
297
298
        $params['pane_info_list'][] = $pane_info;
299
    }
300
301
    private function getPaneInfo($milestone) {
302
        $tracker  = $milestone->getArtifact()->getTracker();
303
304
        if (! $this->getOnTopDao()->isEnabled($tracker->getId())) {
305
            return;
306
        }
307
308
        return new Cardwall_PaneInfo($milestone, $this->getThemePath());
309
    }
310
311
    public function agiledashboard_event_index_page($params) {
312
        // Only display a cardwall if there is something to display
313
        if ($params['milestone'] && $params['milestone']->getPlannedArtifacts() && count($params['milestone']->getPlannedArtifacts()->getChildren()) > 0) {
314
            $pane_info = new Cardwall_PaneInfo($params['milestone'], $this->getThemePath());
315
            $params['pane'] = $this->getCardwallPane($pane_info, $params['milestone'], $params['user'], $params['milestone_factory']);
316
        }
317
    }
318
319
    protected function getCardwallPane(Cardwall_PaneInfo $info, Planning_Milestone $milestone, PFUser $user, Planning_MilestoneFactory $milestone_factory) {
320
        $config = $this->getConfigFactory()->getOnTopConfigByPlanning($milestone->getPlanning());
321
        if ($config) {
322
            return new Cardwall_Pane(
323
                $info,
324
                $milestone,
325
                $config,
326
                $user,
327
                $milestone_factory
328
            );
329
        }
330
        return null;
331
    }
332
333
    public function agiledashboard_event_milestone_selector_redirect($params) {
334
        if ($params['milestone']->getArtifact()) {
335
            $tracker  = $params['milestone']->getArtifact()->getTracker();
336
            if ($this->getOnTopDao()->isEnabled($tracker->getId())) {
337
                $params['redirect_parameters']['pane'] = 'cardwall';
338
            }
339
        }
340
    }
341
342
    public function tracker_event_redirect_after_artifact_creation_or_update($params) {
343
        $cardwall = $params['request']->get('cardwall');
344
        $redirect = $params['redirect'];
345
        if ($cardwall) {
346
            if (!$redirect->stayInTracker()) {
347
                list($redirect_to, $redirect_params) = each($cardwall);
348
                switch ($redirect_to) {
349
                case 'agile':
350
                    $this->redirectToAgileDashboard($redirect, $redirect_params);
351
                    break;
352
                case 'renderer':
353
                    $this->redirectToRenderer($redirect, $redirect_params);
354
                    break;
355
                }
356
            } else {
357
                $this->appendCardwallParameter($redirect, $cardwall);
358
            }
359
        }
360
    }
361
362
    private function redirectToAgileDashboard(Tracker_Artifact_Redirect $redirect, array $redirect_params) {
363
        list($planning_id, $artifact_id) = each($redirect_params);
364
        $planning = PlanningFactory::build()->getPlanning($planning_id);
365
        if ($planning) {
366
            $redirect->base_url         = AGILEDASHBOARD_BASE_URL;
367
            $redirect->query_parameters = array(
368
                'group_id'    => $planning->getGroupId(),
369
                'planning_id' => $planning->getId(),
370
                'action'      => 'show',
371
                'aid'         => $artifact_id,
372
                'pane'        => 'cardwall',
373
            );
374
        }
375
    }
376
377
    private function redirectToRenderer(Tracker_Artifact_Redirect $redirect, array $redirect_params) {
378
        list($report_id, $renderer_id) = each($redirect_params);
379
        $redirect->base_url            = TRACKER_BASE_URL;
380
        $redirect->query_parameters    = array(
381
            'report'   => $report_id,
382
            'renderer' => $renderer_id,
383
        );
384
    }
385
386
    public function tracker_event_build_artifact_form_action($params) {
387
        $cardwall = $params['request']->get('cardwall');
388
        if ($cardwall) {
389
            $this->appendCardwallParameter($params['redirect'], $cardwall);
390
        }
391
    }
392
393
    private function appendCardwallParameter(Tracker_Artifact_Redirect $redirect, $cardwall) {
394
        list($key, $value) = explode('=', urldecode(http_build_query(array('cardwall' => $cardwall))));
395
        $redirect->query_parameters[$key] = $value;
396
    }
397
398
    /**
399
     * @param array $params parameters send by Event
400
     * Parameters:
401
     *  'project'  => The given project
402
     *  'into_xml' => The SimpleXMLElement to fill in
403
     */
404
    public function agiledashboard_export_xml ($params) {
405
        $tracker_factory = TrackerFactory::instance();
406
407
        $cardwall_xml_export = new CardwallConfigXmlExport(
408
            $params['project'],
409
            $tracker_factory,
410
            $this->getConfigFactory(),
411
            new XML_RNGValidator()
412
        );
413
414
        $cardwall_xml_export->export($params['into_xml']);
415
    }
416
417
    /**
418
     *
419
     * @param array $params
420
     * @see Event::IMPORT_XML_PROJECT_TRACKER_DONE
421
     */
422
    public function import_xml_project_tracker_done($params) {
423
        $cardwall_ontop_import = new CardwallConfigXmlImport(
424
            $params['project_id'],
425
            $params['mapping'],
426
            new Cardwall_OnTop_Dao,
427
            new Cardwall_OnTop_ColumnDao,
428
            EventManager::instance(),
429
            new XML_RNGValidator()
430
        );
431
        $cardwall_ontop_import->import($params['xml_content']);
432
    }
433
434
    public function agiledashboard_event_rest_get_milestone($params) {
435
        $config = $this->getConfigFactory()->getOnTopConfig($params['milestone']->getPlanning()->getPlanningTracker());
436
        if ($config && $config->isEnabled()) {
437
            $params['milestone_representation']->enableCardwall();
438
        }
439
    }
440
441
    private function buildRightVersionOfMilestonesCardwallResource($version) {
442
        $class_with_right_namespace = '\\Tuleap\\Cardwall\\REST\\'.$version.'\\MilestonesCardwallResource';
443
        return new $class_with_right_namespace($this->getConfigFactory());
444
    }
445
446
    public function agiledashboard_event_rest_get_cardwall($params) {
447
        $milestones_cardwall = $this->buildRightVersionOfMilestonesCardwallResource($params['version']);
448
449
        $params['cardwall'] = $milestones_cardwall->get($params['milestone']);
450
451
    }
452
453
    /**
454
     * Fetches HTML
455
     *
456
     * @param array $params parameters sent by Event
457
     *
458
     * Parameters:
459
     *  'tracker' => The planning tracker
460
     *  'view'    => A string of HTML
461
     */
462
    public function agiledashboard_event_planning_config($params) {
463
        $tracker = $params['tracker'];
464
        $config  = $this->getConfigFactory()->getOnTopConfig($tracker);
465
466
        $admin_view = new Cardwall_OnTop_Config_View_Admin();
467
        $params['view'] = $admin_view->displayAdminOnTop($config);
468
    }
469
470
    public function agiledashboard_event_is_cardwall_enabled($params) {
471
        $tracker = $params['tracker'];
472
        $params['enabled'] = $this->getConfigFactory()
473
            ->isOnTopConfigEnabledForPlanning($tracker);
474
    }
475
476
    /**
477
     * @param array $params parameters sent by Event
478
     *
479
     * Parameters:
480
     *  'tracker' => The planning tracker
481
     *  'request' => The Request
482
     */
483
    public function agiledashboard_event_planning_config_update($params) {
484
        $request = $params['request'];
485
        $request->set('use_freestyle_columns', 1);
486
487
        $this->getConfigFactory()->getOnTopConfigUpdater($params['tracker'])
488
                ->process($request);
489
    }
490
491
    /**
492
     * @return Cardwall_OnTop_Dao
493
     */
494
    private function getOnTopDao() {
495
        return new Cardwall_OnTop_Dao();
496
    }
497
498
    /**
499
     * @return Cardwall_OnTop_ColumnDao
500
     */
501
    private function getOnTopColumnDao() {
502
        return new Cardwall_OnTop_ColumnDao();
503
    }
504
505
    /**
506
     * @return Cardwall_OnTop_ColumnMappingFieldDao
507
     */
508
    private function getOnTopColumnMappingFieldDao() {
509
        return new Cardwall_OnTop_ColumnMappingFieldDao();
510
    }
511
512
    /**
513
     * @return Cardwall_OnTop_ColumnMappingFieldValueDao
514
     */
515
    private function getOnTopColumnMappingFieldValueDao() {
516
        return new Cardwall_OnTop_ColumnMappingFieldValueDao();
517
    }
518
519
    public function process(Codendi_Request $request) {
520
        switch($request->get('action')) {
521
            case 'toggle_user_autostack_column':
522
                $display_preferences_controller = new Cardwall_UserPreferences_UserPreferencesController($request);
523
                $display_preferences_controller->toggleAutostack();
524
                break;
525
526
            case 'toggle_user_display_avatar':
527
                $display_preferences_controller = new Cardwall_UserPreferences_UserPreferencesController($request);
528
                $display_preferences_controller->toggleUserDisplay();
529
                break;
530
531
            case 'get-card':
532
                try {
533
                    $single_card_builder = new Cardwall_SingleCardBuilder(
534
                        $this->getConfigFactory(),
535
                        new Cardwall_CardFields(
536
                            UserManager::instance(),
537
                            Tracker_FormElementFactory::instance()
538
                        ),
539
                        Tracker_ArtifactFactory::instance(),
540
                        PlanningFactory::build()
541
                    );
542
                    $controller = new Cardwall_CardController(
543
                        $request,
544
                        $single_card_builder->getSingleCard(
545
                            $request->getCurrentUser(),
546
                            $request->getValidated('id', 'uint', 0),
547
                            $request->getValidated('planning_id', 'uint', 0)
548
                        )
549
                    );
550
                    $controller->getCard();
551
                } catch (Exception $exception) {
552
                    $GLOBALS['Response']->addFeedback(Feedback::ERROR, $exception->getMessage());
553
                    $GLOBALS['Response']->sendStatusCode(400);
554
                }
555
                break;
556
557
            default:
558
                echo 'Hello !';
559
        }
560
    }
561
562
    public function agiledashboard_event_rest_resources($params) {
563
        $injector = new Cardwall_REST_ResourcesInjector();
564
        $injector->populate($params['restler']);
565
    }
566
}