View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
13738 | Bug reports | RemoteControl | public | 2018-06-03 15:25 | 2021-08-31 08:42 |
Reporter | aaskoura | Assigned To | ollehar | ||
Priority | none | Severity | partial_block | ||
Status | closed | Resolution | reopened | ||
Product Version | 3.8.x | ||||
Fixed in Version | 3.10.x | ||||
Summary | 13738: RPC method upload_file is not working. | ||||
Description | RPC method | ||||
Steps To Reproduce | using postman 1- get_session_key 2- upload_file attached response | ||||
Additional Information | in latest version, an extra validation was created when adding a given response... This method - in case the survey has a A current call to OfflineSurveys, due to lack of an RPC Otherwise, is it also possible to add a method to enable/disable this validation on adding a given response? It could make perfect sense to enable it by default on web responses, there is no backward compatibility issues here, but it completely breaks how OfflineSurveys submit responses to LimeSurvey server. | ||||
Tags | No tags attached. | ||||
Attached Files | file_upload_response.html (32,200 bytes)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Error</title> <style type="text/css"> /* <![CDATA[*/ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;margin:0;padding:0;} body{line-height:1;} ol,ul{list-style:none;} blockquote,q{quotes:none;} blockquote:before,blockquote:after,q:before,q:after{content:none;} :focus{outline:0;} ins{text-decoration:none;} del{text-decoration:line-through;} table{border-collapse:collapse;border-spacing:0;} body { font: normal 9pt "Verdana"; color: #000; background: #fff; } h1 { font: normal 18pt "Verdana"; color: #f00; margin-bottom: .5em; } h2 { font: normal 14pt "Verdana"; color: #800000; margin-bottom: .5em; } h3 { font: bold 11pt "Verdana"; } pre { font: normal 11pt Menlo, Consolas, "Lucida Console", Monospace; } pre span.error { display: block; background: #fce3e3; } pre span.ln { color: #999; padding-right: 0.5em; border-right: 1px solid #ccc; } pre span.error-ln { font-weight: bold; } .container { margin: 1em 4em; } .version { color: gray; font-size: 8pt; border-top: 1px solid #aaa; padding-top: 1em; margin-bottom: 1em; } .message { color: #000; padding: 1em; font-size: 11pt; background: #f3f3f3; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; margin-bottom: 1em; line-height: 160%; } .source { margin-bottom: 1em; } .code pre { background-color: #ffe; margin: 0.5em 0; padding: 0.5em; line-height: 125%; border: 1px solid #eee; } .source .file { margin-bottom: 1em; font-weight: bold; } .traces { margin: 2em 0; } .trace { margin: 0.5em 0; padding: 0.5em; } .trace.app { border: 1px dashed #c00; } .trace .number { text-align: right; width: 2em; padding: 0.5em; } .trace .content { padding: 0.5em; } .trace .plus, .trace .minus { display:inline; vertical-align:middle; text-align:center; border:1px solid #000; color:#000; font-size:10px; line-height:10px; margin:0; padding:0 1px; width:10px; height:10px; } .trace.collapsed .minus, .trace.expanded .plus, .trace.collapsed pre { display: none; } .trace-file { cursor: pointer; padding: 0.2em; } .trace-file:hover { background: #f0ffff; } /*]]>*/ </style> </head> <body> <div class="container"> <h1>Error</h1> <p class="message"> Call to undefined function getQuestionAttributeValues() </p> <div class="source"> <p class="file">/var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/application/helpers/remotecontrol/remotecontrol_handle.php(2733)</p> <div class="code"> <pre> <span class="ln">2721</span> $sTempUploadDir = $tempdir.'/upload/'; <span class="ln">2722</span> if (!file_exists($sTempUploadDir)) { <span class="ln">2723</span> if (!mkdir($sTempUploadDir)) { <span class="ln">2724</span> return array('status' => 'Can not make temporary upload directory'); <span class="ln">2725</span> } <span class="ln">2726</span> } <span class="ln">2727</span> <span class="ln">2728</span> $aFieldMap = createFieldMap($oSurvey, 'short', false, false, Yii::app()->getConfig('defaultlang')); <span class="ln">2729</span> if (!isset($aFieldMap[$sFieldName])) { <span class="ln">2730</span> return array('status' => 'Can not obtain field map'); <span class="ln">2731</span> } <span class="ln">2732</span> //FIXME undefined function getQuestionAttributeValues() <span class="error"> <span class="ln error-ln">2733</span> $aAttributes = getQuestionAttributeValues($aFieldMap[$sFieldName]['qid']); </span> <span class="ln">2734</span> <span class="ln">2735</span> $iFileUploadTotalSpaceMB = Yii::app()->getConfig('iFileUploadTotalSpaceMB'); <span class="ln">2736</span> <span class="ln">2737</span> $maxfilesize = (int) $aAttributes['max_filesize']; <span class="ln">2738</span> $allowed_filetypes = $aAttributes['allowed_filetypes']; <span class="ln">2739</span> $valid_extensions_array = explode(",", $allowed_filetypes); <span class="ln">2740</span> $valid_extensions_array = array_map('trim', $valid_extensions_array); <span class="ln">2741</span> <span class="ln">2742</span> $pathinfo = pathinfo($sFileName); <span class="ln">2743</span> $ext = strtolower($pathinfo['extension']); <span class="ln">2744</span> <span class="ln">2745</span> // check to see that this file type is allowed </pre> </div> </div> <div class="traces"> <h2>Stack Trace</h2> <table style="width:100%;"> <tr class="trace app expanded"> <td class="number"> #0 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/application/libraries/LSjsonRPCServer.php(36): <strong>remotecontrol_handle</strong>-> <strong>upload_file</strong>("JR5FvHC81nfsJJFhOUgAP3nt9zH9G7Go", 765587, "765587X44X1232", "fu_kabaka", ...) </div> <div class="code"> <pre> <span class="ln">31</span> 'result' => null, <span class="ln">32</span> 'error' => sprintf('unable to decode malformed json') <span class="ln">33</span> ); <span class="ln">34</span> } else { <span class="ln">35</span> try { <span class="error"> <span class="ln error-ln">36</span> $result = @call_user_func_array(array($object, $request['method']), $request['params']); </span> <span class="ln">37</span> if ($result !== false) { <span class="ln">38</span> $response = array( <span class="ln">39</span> 'id' => $request['id'], <span class="ln">40</span> 'result' => $result, <span class="ln">41</span> 'error' => null </pre> </div> </td> </tr> <tr class="trace app expanded"> <td class="number"> #1 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/application/controllers/admin/remotecontrol.php(60): <strong>LSjsonRPCServer</strong>:: <strong>handle</strong>(remotecontrol_handle) </div> <div class="code"> <pre> <span class="ln">55</span> Yii::app()->loadLibrary('LSjsonRPCServer'); <span class="ln">56</span> if (!isset($_SERVER['CONTENT_TYPE'])) { <span class="ln">57</span> $serverContentType = explode(';', $_SERVER['HTTP_CONTENT_TYPE']); <span class="ln">58</span> $_SERVER['CONTENT_TYPE'] = reset($serverContentType); <span class="ln">59</span> } <span class="error"> <span class="ln error-ln">60</span> LSjsonRPCServer::handle($oHandler); </span> <span class="ln">61</span> } <span class="ln">62</span> foreach (App()->log->routes as $route) { <span class="ln">63</span> $route->enabled = $route->enabled && !($route instanceOf CWebLogRoute); <span class="ln">64</span> } <span class="ln">65</span> </pre> </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #2 </td> <td class="content"> <div class="trace-file"> unknown(0): <strong>remotecontrol</strong>-> <strong>run</strong>() </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #3 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/framework/web/actions/CAction.php(109): <strong>ReflectionMethod</strong>-> <strong>invokeArgs</strong>(remotecontrol, array()) </div> <div class="code"> <pre> <span class="ln">104</span> elseif($param->isDefaultValueAvailable()) <span class="ln">105</span> $ps[]=$param->getDefaultValue(); <span class="ln">106</span> else <span class="ln">107</span> return false; <span class="ln">108</span> } <span class="error"> <span class="ln error-ln">109</span> $method->invokeArgs($object,$ps); </span> <span class="ln">110</span> return true; <span class="ln">111</span> } <span class="ln">112</span> } </pre> </div> </td> </tr> <tr class="trace app expanded"> <td class="number"> #4 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/application/core/Survey_Common_Action.php(83): <strong>CAction</strong>-> <strong>runWithParamsInternal</strong>(remotecontrol, ReflectionMethod, array()) </div> <div class="code"> <pre> <span class="ln">78</span> $oMethod = new ReflectionMethod($this, $sDefault); <span class="ln">79</span> } <span class="ln">80</span> <span class="ln">81</span> // We're all good to go, let's execute it <span class="ln">82</span> // runWithParamsInternal would automatically get the parameters of the method and populate them as required with the params <span class="error"> <span class="ln error-ln">83</span> return parent::runWithParamsInternal($this, $oMethod, $params); </span> <span class="ln">84</span> } <span class="ln">85</span> <span class="ln">86</span> /** <span class="ln">87</span> * Some functions have different parameters, which are just an alias of the <span class="ln">88</span> * usual parameters we're getting in the url. This function just populates </pre> </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #5 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/framework/web/CController.php(308): <strong>Survey_Common_Action</strong>-> <strong>runWithParams</strong>(array()) </div> <div class="code"> <pre> <span class="ln">303</span> { <span class="ln">304</span> $priorAction=$this->_action; <span class="ln">305</span> $this->_action=$action; <span class="ln">306</span> if($this->beforeAction($action)) <span class="ln">307</span> { <span class="error"> <span class="ln error-ln">308</span> if($action->runWithParams($this->getActionParams())===false) </span> <span class="ln">309</span> $this->invalidActionParams($action); <span class="ln">310</span> else <span class="ln">311</span> $this->afterAction($action); <span class="ln">312</span> } <span class="ln">313</span> $this->_action=$priorAction; </pre> </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #6 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/framework/web/CController.php(286): <strong>CController</strong>-> <strong>runAction</strong>(remotecontrol) </div> <div class="code"> <pre> <span class="ln">281</span> * @see runAction <span class="ln">282</span> */ <span class="ln">283</span> public function runActionWithFilters($action,$filters) <span class="ln">284</span> { <span class="ln">285</span> if(empty($filters)) <span class="error"> <span class="ln error-ln">286</span> $this->runAction($action); </span> <span class="ln">287</span> else <span class="ln">288</span> { <span class="ln">289</span> $priorAction=$this->_action; <span class="ln">290</span> $this->_action=$action; <span class="ln">291</span> CFilterChain::create($this,$action,$filters)->run(); </pre> </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #7 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/framework/web/CController.php(265): <strong>CController</strong>-> <strong>runActionWithFilters</strong>(remotecontrol, array()) </div> <div class="code"> <pre> <span class="ln">260</span> { <span class="ln">261</span> if(($parent=$this->getModule())===null) <span class="ln">262</span> $parent=Yii::app(); <span class="ln">263</span> if($parent->beforeControllerAction($this,$action)) <span class="ln">264</span> { <span class="error"> <span class="ln error-ln">265</span> $this->runActionWithFilters($action,$this->filters()); </span> <span class="ln">266</span> $parent->afterControllerAction($this,$action); <span class="ln">267</span> } <span class="ln">268</span> } <span class="ln">269</span> else <span class="ln">270</span> $this->missingAction($actionID); </pre> </div> </td> </tr> <tr class="trace app collapsed"> <td class="number"> #8 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/application/controllers/AdminController.php(158): <strong>CController</strong>-> <strong>run</strong>("remotecontrol") </div> <div class="code"> <pre> <span class="ln">153</span> $this->redirect(array('/admin/authentication/sa/login')); <span class="ln">154</span> } <span class="ln">155</span> } <span class="ln">156</span> } <span class="ln">157</span> <span class="error"> <span class="ln error-ln">158</span> return parent::run($action); </span> <span class="ln">159</span> } <span class="ln">160</span> <span class="ln">161</span> /** <span class="ln">162</span> * Routes all the actions to their respective places <span class="ln">163</span> * </pre> </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #9 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-> <strong>run</strong>("remotecontrol") </div> <div class="code"> <pre> <span class="ln">277</span> { <span class="ln">278</span> list($controller,$actionID)=$ca; <span class="ln">279</span> $oldController=$this->_controller; <span class="ln">280</span> $this->_controller=$controller; <span class="ln">281</span> $controller->init(); <span class="error"> <span class="ln error-ln">282</span> $controller->run($actionID); </span> <span class="ln">283</span> $this->_controller=$oldController; <span class="ln">284</span> } <span class="ln">285</span> else <span class="ln">286</span> throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".', <span class="ln">287</span> array('{route}'=>$route===''?$this->defaultController:$route))); </pre> </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #10 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-> <strong>runController</strong>("admin/remotecontrol") </div> <div class="code"> <pre> <span class="ln">136</span> foreach(array_splice($this->catchAllRequest,1) as $name=>$value) <span class="ln">137</span> $_GET[$name]=$value; <span class="ln">138</span> } <span class="ln">139</span> else <span class="ln">140</span> $route=$this->getUrlManager()->parseUrl($this->getRequest()); <span class="error"> <span class="ln error-ln">141</span> $this->runController($route); </span> <span class="ln">142</span> } <span class="ln">143</span> <span class="ln">144</span> /** <span class="ln">145</span> * Registers the core application components. <span class="ln">146</span> * This method overrides the parent implementation by registering additional core components. </pre> </div> </td> </tr> <tr class="trace core collapsed"> <td class="number"> #11 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/framework/base/CApplication.php(185): <strong>CWebApplication</strong>-> <strong>processRequest</strong>() </div> <div class="code"> <pre> <span class="ln">180</span> public function run() <span class="ln">181</span> { <span class="ln">182</span> if($this->hasEventHandler('onBeginRequest')) <span class="ln">183</span> $this->onBeginRequest(new CEvent($this)); <span class="ln">184</span> register_shutdown_function(array($this,'end'),0,false); <span class="error"> <span class="ln error-ln">185</span> $this->processRequest(); </span> <span class="ln">186</span> if($this->hasEventHandler('onEndRequest')) <span class="ln">187</span> $this->onEndRequest(new CEvent($this)); <span class="ln">188</span> } <span class="ln">189</span> <span class="ln">190</span> /** </pre> </div> </td> </tr> <tr class="trace app collapsed"> <td class="number"> #12 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/vhosts/mysurveyhosting.com/httpdocs/limeoffline/demo3/index.php(194): <strong>CApplication</strong>-> <strong>run</strong>() </div> <div class="code"> <pre> <span class="ln">189</span> require_once APPPATH . 'core/LSYii_Application' . EXT; <span class="ln">190</span> <span class="ln">191</span> $config = require_once(APPPATH . 'config/internal' . EXT); <span class="ln">192</span> <span class="ln">193</span> Yii::$enableIncludePath = false; <span class="error"> <span class="ln error-ln">194</span> Yii::createApplication('LSYii_Application', $config)->run(); </span> <span class="ln">195</span> <span class="ln">196</span> /* End of file index.php */ <span class="ln">197</span> /* Location: ./index.php */ </pre> </div> </td> </tr> </table> </div> <div class="version"> 2018-05-28 15:48:02 Apache <a href="http://www.yiiframework.com/">Yii Framework</a>/1.1.19 </div> </div> <script type="text/javascript"> /* <![CDATA[*/ var traceReg = new RegExp("(^|\\s)trace-file(\\s|$)"); var collapsedReg = new RegExp("(^|\\s)collapsed(\\s|$)"); var e = document.getElementsByTagName("div"); for(var j=0,len=e.length;j<len;j++){ if(traceReg.test(e[j].className)){ e[j].onclick = function(){ var trace = this.parentNode.parentNode; if(collapsedReg.test(trace.className)) trace.className = trace.className.replace("collapsed", "expanded"); else trace.className = trace.className.replace("expanded", "collapsed"); } } } /*]]>*/ </script> </body> </html> | ||||
Bug heat | 10 | ||||
Complete LimeSurvey version number (& build) | 3.8.1+180524 | ||||
I will donate to the project if issue is resolved | No | ||||
Browser | N/A - REST Client | ||||
Database type & version | MySQL 5 | ||||
Server OS (if known) | Ubuntu 14 TLS | ||||
Webserver software & version (if known) | Apache 2 | ||||
PHP Version | PHP Version 7.0.30 | ||||
Hej Olle, this is related to the remote control fix you already applied recently. There is still another issue, see details above. |
|
Can we add (validateFiles = TRUE) to RPC method add_response that we can set to false to maintain backward compatibility |
|
Who ever implemented this feature in the first place should be responsible in fixing it. Did you ask the person I linked on github? |
|
@aaskoura Maybe you should open a separate ticket for that issue? |
|
@olle, which exact commit do you refer to? Who has adjusted that function recently without looking at backwards compatibility? |
|
@Mazi, I pinged you in this commit: https://github.com/LimeSurvey/LimeSurvey/commit/a6b9fe0542699faa29ca93bb4007e1db172cb6f2 You should get in touch with the implementor. |
|
The issue is here : https://github.com/LimeSurvey/LimeSurvey/commit/66c1871d981128178f8cebe9ff91ff7bfb77d024 :) |
|
pardo-bsso seems to be not available. So who wants to repair his bugs...? |
|
@olle: You already fixed a related issue, can you give it a try? |
|
Fix committed to master branch: http://bugs.limesurvey.org/plugin.php?page=Source/view&id=27365 |
|
@Mazi Pushed a fix. Feel free to test, but don't git pull into a production environment (some things are broken right now). |
|
Thanks, olle! Does the fix only look that complex (many adjusted files)? Is it sufficient to only adjust the remotecontrol_handle.php and export_helper.php files for testing? |
|
Whoops, the fix included some composer files. I did not expect them to be included, that was a mistake by me. Only the two first files are the actual fix. |
|
It looks like after the recent fix the API returns invalid or unexpected token. We'll analyse the issue and post comments here. |
|
Hello aaskoura, |
|
Hello aaskoura, we have asked for feedback on this issue. Because we did not get an answer we assume that the issue is resolved. Thank you and best regards, c_schmitz |
|
LimeSurvey: master 8dd05df8 2018-06-11 16:35 Details Diff |
Fixed issue 13738: RPC method is not working. |
Affected Issues 13738 |
|
mod - application/helpers/export_helper.php | Diff File | ||
mod - application/helpers/remotecontrol/remotecontrol_handle.php | Diff File | ||
mod - third_party/composer/autoload_classmap.php | Diff File | ||
mod - third_party/composer/autoload_namespaces.php | Diff File | ||
mod - third_party/composer/autoload_psr4.php | Diff File | ||
mod - third_party/composer/autoload_static.php | Diff File |
Date Modified | Username | Field | Change |
---|---|---|---|
2018-06-03 15:25 | aaskoura | New Issue | |
2018-06-03 15:25 | aaskoura | File Added: file_upload_response.html | |
2018-06-03 15:42 | Mazi | Assigned To | => ollehar |
2018-06-03 15:42 | Mazi | Status | new => assigned |
2018-06-03 15:43 | Mazi | Note Added: 47953 | |
2018-06-04 10:37 | aaskoura | Note Added: 47954 | |
2018-06-04 10:46 | ollehar | Note Added: 47955 | |
2018-06-04 10:46 | ollehar | Note Added: 47956 | |
2018-06-04 10:55 | Mazi | Note Added: 47957 | |
2018-06-04 13:39 | ollehar | Note Added: 47961 | |
2018-06-05 08:00 | DenisChenu | Note Added: 47980 | |
2018-06-05 12:20 | ollehar | Note Added: 47986 | |
2018-06-07 23:30 | Mazi | Note Added: 48023 | |
2018-06-11 14:36 | ollehar | Changeset attached | => LimeSurvey master 8dd05df8 |
2018-06-11 14:36 | ollehar | Note Added: 48044 | |
2018-06-11 14:36 | ollehar | Resolution | open => fixed |
2018-06-11 14:36 | ollehar | Note Added: 48045 | |
2018-06-11 14:36 | ollehar | Status | assigned => feedback |
2018-06-11 16:11 | Mazi | Note Added: 48048 | |
2018-06-11 16:23 | ollehar | Note Added: 48049 | |
2018-06-11 16:25 | ollehar | Status | feedback => resolved |
2018-06-11 16:32 |
|
Status | resolved => closed |
2018-06-11 16:32 |
|
Fixed in Version | => 3.10.x |
2018-06-14 20:33 | Mazi | Status | closed => feedback |
2018-06-14 20:33 | Mazi | Resolution | fixed => reopened |
2018-06-14 20:33 | Mazi | Note Added: 48116 | |
2021-03-10 16:50 | ollehar | Note Added: 63021 | |
2021-08-31 08:42 | c_schmitz | Status | feedback => closed |
2021-08-31 08:42 | c_schmitz | Note Added: 66207 | |
2021-08-31 08:42 | c_schmitz | Bug heat | 8 => 10 |