Coding standards
Security in ResourceSpace
Developer reference
- Project structure
- Database schema
- Fixed list fields
- Debugging ResourceSpace
- Writing your own plugins
- Context help links
- Custom fields ("user" defined)
- Query caching
- All user permissions
- Client side API calls
- Modals
- Sending user notifications
- Progressive Web App
- Managing (PHP) code dependencies
- Managing (JS) code dependencies
- OpenAPI documentation
Database
- Table: activity_log
- Table: annotation
- Table: annotation_node
- Table: collection
- Table: collection_keyword
- Table: collection_log
- Table: collection_resource
- Table: collection_savedsearch
- Table: comment
- Table: daily_stat
- Table: dash_tile
- Table: dynamic_tree_node
- Table: external_access_keys
- Table: filter
- Table: filter_rule
- Table: filter_rule_node
- Table: ip_lockout
- Table: job_queue
- Table: keyword
- Table: keyword_related
- Table: mail_log
- Table: message
- Table: node
- Table: node_keyword
- Table: plugins
- Table: preview_size
- Table: report
- Table: report_periodic_emails
- Table: report_periodic_emails_unsubscribe
- Table: request
- Table: research_request
- Table: resource
- Table: resource_alt_files
- Table: resource_custom_access
- Table: resource_dimensions
- Table: resource_keyword
- Table: resource_log
- Table: resource_node
- Table: resource_related
- Table: resource_type
- Table: resource_type_field
- Table: resource_type_field_resource_type
- Table: search_log
- Table: site_text
- Table: slideshow
- Table: sysvars
- Table: tab
- Table: user
- Table: user_collection
- Table: user_dash_tile
- Table: user_message
- Table: user_preferences
- Table: user_rating
- Table: user_report
- Table: user_userlist
- Table: usergroup
- Table: usergroup_collection
- Table: usergroup_dash_tile
File management (uploads)
Developers must always follow OWASP best practices when it comes to file management. In ResourceSpace, we've tried to abstract some of those practices to help handled these cases in a consistent way.
The following functions are useful when processing files (usually during upload).
- process_file_upload - (from v10.6) a higher level function which can take a file (already on the server) or HTTP POSTd one and "move" it to your desired destination (usually path generated by get_resource_path). See examples section
- parse_filename_extension - (from v10.6) parses a basename to extract the extension out of it. It will handle various cases as recommended by OWASP (e.g. special files like .htaccess, or DOS 8.3 short paths - HTACCE~1)
- is_banned_extension and check_valid_file_extension - both functions are meant to control what files can be uploaded. Limit the type of files that can be uploaded to only those types that should be allowed (where it's practical to do so).
- Input validators:
- is_valid_rs_path()
- is_valid_upload_path
- is_safe_basename()
Examples
Usual workflow
$process_file_upload = process_file_upload($_FILES['file'], new SplFileInfo(get_resource_path($ref, true, '')), []);
if (!$process_file_upload['success']) {
return ['error' => $process_file_upload['error']->i18n($lang)];
}
- Limit file types (allow list)
$process_file_upload = process_file_upload($from, $to, ['allow_extensions' => ['csv']]);
- Copy file (instead of the default - rename)
$process_file_upload = process_file_upload($from, $to, ['file_move' => 'copy']);
Custom error message
return [
'error' => match ($process_file_upload['error']) {
ProcessFileUploadErrorCondition::InvalidExtension => str_replace(
'%EXTENSIONS',
'csv',
$lang['invalidextension_mustbe-extensions']
),
default => $process_file_upload['error']->i18n($lang),
},
];