Commit Graph

1199 Commits (ed1262d55a01a6ffbefe01eb3b5fc22d33dfad24)

Author SHA1 Message Date
Andrew Dolgov 9652fa6b66 API: small fix 7 years ago
Andrew Dolgov 3467e1fd7c api: switch to PDO 7 years ago
Andrew Dolgov dd90eefae1 PDO: set unicode for mysql and other connection params 7 years ago
Andrew Dolgov aee3f0e6d9 fix typo 7 years ago
Andrew Dolgov 7fc303e6ab query feed headlines: fix limit/offset 7 years ago
Andrew Dolgov cb13089af1 public: use PDO headlines result (2) 7 years ago
Andrew Dolgov dc393a580b public: use PDO headlines result 7 years ago
Andrew Dolgov 3623ebb1a1 feeds: handle escaping 7 years ago
Andrew Dolgov c9b6ca8b70 feeds: remove escaping 7 years ago
Andrew Dolgov b5791f11c5 queryfeedheadlines: PDOize (1) 7 years ago
Andrew Dolgov 29f1908e03 feeds: right before queryfeedheadlines() 7 years ago
Andrew Dolgov cc9450c309 ccache, misc: fixes
feeds: start PDO transition
7 years ago
Andrew Dolgov 1271407eea public: partial conversion to PDO, misc fixes 7 years ago
Andrew Dolgov fbde19580c db_prefs: PDO 7 years ago
Andrew Dolgov abf94f00b4 digest: use PDO 7 years ago
Andrew Dolgov 9ead64f6d8 dlg: PDO 7 years ago
Andrew Dolgov 933ff559e6 ccache: PDO 7 years ago
Andrew Dolgov a25ac0d7c8 counters: PDO 7 years ago
Andrew Dolgov c9d5c26041 auth/base: PDO
functions: fix small pdo-related bug
7 years ago
Andrew Dolgov 2c57df75ff article: remove db_escape..() 7 years ago
Andrew Dolgov d0e73ed8ae article: switch to PDO 7 years ago
Andrew Dolgov 2e46b434da pdo: set warnings 7 years ago
Andrew Dolgov c39ee27235 article: start pdo 7 years ago
Andrew Dolgov bfc54b0369 Merge branch 'pdo-experimental' of git.fakecake.org:tt-rss into pdo-experimental 7 years ago
Andrew Dolgov d9e60c0f68 Merge branch 'master' of git.fakecake.org:tt-rss into pdo-experimental 7 years ago
Andrew Dolgov e50c8eaa4e enforce unconditional requests every 6 hours even if server claims data is not modified 7 years ago
Andrew Dolgov 8adb3ec472 add some WIP pdo stuff 7 years ago
Andrew Dolgov ca82bb03c8 rm db_stmt 7 years ago
Andrew Dolgov 99bda9cc12 add some starting pdo glue 7 years ago
Andrew Dolgov 9dd336a2c3 generate base css files using lessc 7 years ago
dim0x69 5395526444 add HOOK_UNSUBSCRIBE_FEED 7 years ago
Andrew Dolgov 2352c320c2 fix possible sql injection in public/forgotpass 7 years ago
Andrew Dolgov 9d930af9e1 fetch_file_contents: improve error handling
1. if request fails get error string from http  response status line
2. do not override http error with possible CURL/php specific last error
3. fix silent php error generated while processing response headers to get last modified value
7 years ago
Andrew Dolgov 91f49ba17d api, setArticleLabel: allow JSON booleans 7 years ago
fox d320b55af9 Merge branch 'sort_title_date' of ggrandou/tt-rss into master 7 years ago
Gilles Grandou f9ad33c2d8 allows favicons to be in Windows PC BMP format 7 years ago
Gilles Grandou 81d96c0dee makes 'order by title' to sort by title and by ascending date
* this allows to chronologically browse all articles with the
  same title.
7 years ago
Andrew Dolgov 8b73bd28d8 remove apache-specific x-sendfile stuff
implement a hook (HOOK_SEND_LOCAL_FILE) which plugins may use to send files
via httpd-specific implementation to increase performance typically on larger files
7 years ago
fox b1d1bc901f Merge branch 'checkbox-feed' of dxbi/tt-rss into master 7 years ago
Felix Eckhofer cc50affb62
Add checkbox for authentication in edit feed dialog
This makes the UI more consistent with the "add feed" dialog and
prevents overzealous password-managers from leaking the login password.
7 years ago
Andrew Dolgov 51b521c326 fix batch feed editor using wrong SQL syntax when saving feed password
remove uses of auth_pass_encrypted in several other places
7 years ago
wn_ 3476690cbf Only require an array of basic info from 'HOOK_FEED_BASIC_INFO'.
Removes the need for the plugin to provide feed content.

Gives plugins a chance to provide 'title' and 'site_url' basic info.
Falls back to attempting retrieval+parsing of the fetch URL if needed.
7 years ago
wn_ bec5ba93e2 Add 'HOOK_FEED_BASIC_INFO' to enable plugins to provide basic feed info.
It's expected the plugin will return content parsable by FeedParser, which
will act as an interface to the basic feed info.  In the case of a plugin
that also uses 'HOOK_FETCH_FEED', both might return the same content.

The hook signature was made somewhat similar to 'HOOK_FETCH_FEED'.
7 years ago
wn_ f3774b9d65 Use 'saveHTML' when generating HTML from a DOMDocument.
This primarily occurs when modifying article content.  If 'saveXML' is
used following 'loadHTML' there is the possibility of strangeness, such
as a self-closing anchor tag.

Note that the DOMDocument used in 'classes/feeditem/atom.php' came from
'loadXML', but we use 'saveHTML' since we're returning HTML content.
7 years ago
Andrew Dolgov 153cb6d305 add support for http 304 not modified (no timestamp calculation bullshit like last time) 7 years ago
Andrew Dolgov edefcec19d filters/edit: properly parse feed-specific legacy format filter rules 7 years ago
Andrew Dolgov ab8daa0389 use mysqli_set_charset() to set MYSQL_CHARSET 7 years ago
Andrew Dolgov 20d2195f13 rssutils: include comment count when calculating article hash 7 years ago
Andrew Dolgov 51f13e7736 get_all_labels: order by caption 7 years ago
Andrew Dolgov 5e78b0c253 do not base headlines label context submenu on feed tree labels category 7 years ago
Andrew Dolgov be61f1c45c filters dialog: do not break markup on long feed names 7 years ago
Andrew Dolgov b2d42e960b replace some usages of SELF_URL_PATH with get_self_url_prefix() 7 years ago
Andrew Dolgov 667d32fd26 remove obsolete forum plugin links
mention how to enable system plugins in the UI
7 years ago
Andrew Dolgov 7b994e4bec filters: when adding rule select all feeds by default 8 years ago
Andrew Dolgov 57a1143c9d dbupdater: fail if version file missing 8 years ago
Andrew Dolgov 02f3992a5a Revert "Revert "filters: support matching on multiple feeds/categories""
This reverts commit f5d174bda9.
8 years ago
Andrew Dolgov f5d174bda9 Revert "filters: support matching on multiple feeds/categories"
This reverts commit 0bf7e007bb.
8 years ago
Andrew Dolgov e0f51d786f Merge branch 'master' of git.fakecake.org:tt-rss 8 years ago
Andrew Dolgov 0bf7e007bb filters: support matching on multiple feeds/categories
opml: update filter export/import for new format
8 years ago
Andrew Dolgov c053b97697 pref/feeds: start user category ordering from 1
api, getFeeds: send subcategory order_id
8 years ago
Andrew Dolgov e130b283a7 db prefs: ignore cache when preference requested for specified UID (in case cached value of a different profile is stored)
prefs: show (and set) enabled plugins for default profile only
8 years ago
Andrew Dolgov 93af11cb7a update_daemon_common: do not escape feed_url twice, remove some comments and stuff 8 years ago
Andrew Dolgov 6fd0399694 tunables:
* add CACHE_MAX_DAYS as a tunable generic expiry interval for various cached files
* add some comments to tunables in functions.php
* rename _MIN_CACHE_FILE_SIZE to MIN_CACHE_FILE_SIZE
* respect MIN_CACHE_FILE_SIZE setting in a few more places where content is cached
8 years ago
Andrew Dolgov e50a647916 add HOOK_FORMAT_ARTICLE & HOOK_FORMAT_ARTICLE_CDM
Feeds::format_headlines_list: add some comments for cdm article closing tags
8 years ago
Andrew Dolgov 9e381bc202 classes/Plugin: remove dbh & host fields; set init() and about() as abstract methods. 8 years ago
Andrew Dolgov 5b6ea1ef91 remove pubsubhubbub: dead 8 years ago
Andrew Dolgov 8f0a59f34a share function: remove tt-rss prefix from page title 8 years ago
Andrew Dolgov c114a2596f move add_feed_url() to pref_feeds 8 years ago
Andrew Dolgov 4fd0790804 fix DAEMON_SLEEP_INTERVAL not being defined when used
enforce minimum 60 sec spawn/sleep interval in update processes
8 years ago
Andrew Dolgov e6c886bf66 wrap rssfuncs into rssutils class 8 years ago
Andrew Dolgov 65af3b2cbb move counter stuff to a separate class 8 years ago
Andrew Dolgov 40f4a7aa6b feeditem_common: add get_element() 8 years ago
Andrew Dolgov 7c9b5a3fe4 move label stuff to Labels class
fix some unresolved functions
8 years ago
Andrew Dolgov c2f0f24e4c move digest stuff to Digest class 8 years ago
Andrew Dolgov 0086a89740 move some label stuff to labels.php
move getfeedcategory() to Feeds
8 years ago
Andrew Dolgov 4a0da0e5bf move get_article_labels to Article 8 years ago
Andrew Dolgov 2ed0d6c433 move counter cache to a separate class
fix references to get_article_tags
8 years ago
Andrew Dolgov aeb1abedb2 move a bunch of functions into Feeds/Article namespaces
+       static function catchupArticlesById($ids, $cmode, $owner_uid = false) {
+       static function getLastArticleId() {
+       static function queryFeedHeadlines($params) {
+       static function getParentCategories($cat, $owner_uid) {
+       static function getChildCategories($cat, $owner_uid) {

move the rest of functions2.php back to functions.php as it is of more manageable size, remove the former
8 years ago
Andrew Dolgov a230bf88a9 move to Article:
+       static function purge_orphans($do_output = false) {

move to Feeds

+       static function getGlobalUnread($user_id = false) {
+       static function getCategoryTitle($cat_id) {
+       static function getLabelUnread($label_id, $owner_uid = false) {
8 years ago
Andrew Dolgov 86a8351ca2 move the following to Feeds:
+       static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+       static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+       static function subscribe_to_feed($url, $cat_id = 0,
+       static function getFeedIcon($id) {
+       static function getFeedTitle($id, $cat = false) {
+       static function getCategoryUnread($cat, $owner_uid = false) {
+       static function getCategoryChildrenUnread($cat, $owner_uid = false) {
8 years ago
Andrew Dolgov 7e5f8d9fb3 move the following to Article:
+       static function format_article_enclosures($id, $always_display_enclosures,
+       static function format_article($id, $mark_as_read = true, $zoom_mode = false, $owner_uid = false) {
+       static function get_article_tags($id, $owner_uid = 0, $tag_cache = false) {
+       static function format_tags_string($tags) {
+       static function format_article_labels($labels) {
+       static function format_article_note($id, $note, $allow_edit = true) {
+       static function get_article_enclosures($id) {
8 years ago
Andrew Dolgov 4122da0290 move getArticleFeed to Article
move print_label_select to controls
8 years ago
Andrew Dolgov e60d5b0a84 move opml-specific get_feed_category to opml.php 8 years ago
Andrew Dolgov 3517d363d3 add api test for labels, api: fix setArticleLabel assign not handled correctly 8 years ago
Andrew Dolgov 891df34637 add some basic API unit tests 8 years ago
Andrew Dolgov ea79a0e033 remove some redundant php closing tags 8 years ago
Andrew Dolgov 7b55001eee fix various issues reported by static analysis
update gitlab-ci config
8 years ago
Andrew Dolgov 3c11159776 return result codes if DB connection or --debug-feed fails 8 years ago
Andrew Dolgov 337535416f filter by search results while marking feed as read 8 years ago
Andrew Dolgov 9c3c0ace6b rename cache images option label (rip translations) 8 years ago
Andrew Dolgov 41bead9baa remove local file extensions and generalize some method names for cached media
file extensions may still be present in urls, but are ignored by the backend

MIGRATION (if you have any cached data worth keeping, not required):
in cache/images run "rename 's/\..*$//' *" i.e. strip file extensions
8 years ago
Andrew Dolgov 63f0ed3d9c cdmClicked: do not use event.target.parents to figure out if clicked on a heading 8 years ago
Andrew Dolgov 270c0a00e5 improve JS error logging with additional stuff 8 years ago
Andrew Dolgov 1bfe1d7b31 simplify error handling
* less convoluted exception dialogs
* use window.onerror for the majority of exception catching/reporting
* remove most of now useless try/catch blocks
* report stacktrace instead of manually specified error locations
8 years ago
Andrew Dolgov b835a52814 rework the way headlines menus identify calling row 8 years ago
Andrew Dolgov 5161460048 bind headlines menu to a selector to avoid remaking it unnecessarily 8 years ago
Andrew Dolgov 58210301e0 add HOOK_ENCLOSURE_ENTRY for af_zz_imgproxy 8 years ago
Jérémy DECOOL ba2853caac Prevent target='_blank' vulnerability on dynamic link 8 years ago
Andrew Dolgov 4daaf23491 allow user plugins to expose public methods out in a limited fashion 8 years ago
Andrew Dolgov 328118d12e use print_hidden() for hidden dojo form fields 8 years ago
Andrew Dolgov 38b3998bbc af_zz_imgproxy: use inline disposition, misc updates 8 years ago
Andrew Dolgov 9c7ebaa08c cached_image: remove unnecessary basename() 8 years ago
Andrew Dolgov 0442cbb6c1 image cache: send files as content-disposition: attachment; add .png suffix to image urls 8 years ago
Andrew Dolgov 24c7e4132d subscribe dialog: do not report errors via alert()
fetch_file_contents: reset all globals on start, return error message body when not using curl
subscribe_to_feed: report if cloudflare is in the error message
8 years ago
Andrew Dolgov 22387de225 preferences: set themes dropdown to default if selected theme is missing 8 years ago
Andrew Dolgov e432b8fbe2 implement cache-busting for default theme.css
night theme: small fixes
8 years ago
Andrew Dolgov cb3f877303 reference pubsubhubbub classes using their namespace 8 years ago
Andrew Dolgov ad326dbf78 unpackVisibleHeadlines: do not iterate over all RROWs all the time 8 years ago
Andrew Dolgov 967f0619c7 force ngettext() count argument type to string 8 years ago
Andrew Dolgov 84012df5cd prefs: auto expand feed tree 8 years ago
Andrew Dolgov 6b06a609af headlines toolbar: move selection links into the dropdown 8 years ago
Andrew Dolgov 6293d3717c add toggle_sidebar plugin, remove obsolete toggle button
add PluginHost::HOOK_MAIN_TOOLBAR_BUTTON
8 years ago
Andrew Dolgov 17a8e61d2a deprecate encrypted feed passwords because mcrypt is getting removed from php 7.1
1. transparent decryption for existing installs stays for the time being
2. new passwords are not going to be encrypted even if FEED_CRYPT_KEY is defined
3. added update.php --decrypt-feeds to bulk decrypt existing encrypted passwords
4. updated install to not auto-generate crypt key
5. added warning to config.php-dist
8 years ago
Andrew Dolgov 8b8568e9a3 edit tags dialog: fix height 8 years ago
Andrew Dolgov eee818c46a ttrssmailer: include phpmailer's smtp class 8 years ago
Andrew Dolgov e4071d2544 feedparser: fix syntax error 8 years ago
Andrew Dolgov 4a5490dc58 feedparser: fix normalize_encoding() not working properly for some encodings 8 years ago
Andrew Dolgov cde8272205 parser: only try to convert encoding if mbstring actually supports it 8 years ago
John Brayton f1b3b3f330 Add feed_id to subscribeToFeed response when the code is 1 or 0.
Set the API_LEVEL to 14.
8 years ago
Andrew Dolgov e54eb40a8c remove support for legacy mysql driver 8 years ago
Andrew Dolgov a005ebb693 remove classes/db/api.php (shouldn't be there) 8 years ago
Heiko Adams 2842cf6e45 Merge branch 'master' into german-translation 8 years ago
Andrew Dolgov a84fb943b4 pre-users: disallow renaming admin user 8 years ago
Andrew Dolgov 1818614949 api: fix article guid not being passed to render article hook 8 years ago
Andrew Dolgov cfc2fe50cb fix sql error when subscribing to a feed using feed archive 9 years ago
Heiko Adams 94e3a9ab44
Merge with master 9 years ago
Andrew Dolgov c9a5903bcc disable autocomplete in subscription dialog 9 years ago
Andrew Dolgov ec21abb85d update autocomplete to "new-password" 9 years ago
Andrew Dolgov fa0e0ef315 set feed editor password fields to autocomplete=off 9 years ago
Andrew Dolgov aa4ab8e0bc remove .htaccess files 9 years ago
Andrew Dolgov 2f1a29d9c8 generate_syndicated_feed: sanitize content excerpt 9 years ago
Andrew Dolgov 977cea1438 actually check for failures properly in the dbupdater 9 years ago
Andrew Dolgov 79c891a8b7 set smallish timeout on update check, exclude update checking on initial load 9 years ago
Andrew Dolgov b6b5554db4 normalize some html5 custom attributes 9 years ago
Andrew Dolgov 2d052e42b5 getLoadedArticleIds: consider visible rows only
catchupFeedInGroup: hide articles when catching up, with caveats
9 years ago
Andrew Dolgov 9232283815 pass feed information to hook_article_export_feed 9 years ago
Andrew Dolgov 399678a14e add PluginHost.HOOK_ARTICLE_EXPORT_FEED 9 years ago
Andrew Dolgov 4f100ece19 pref_filters: sort rules by reg_exp when displaying index 9 years ago
Andrew Dolgov cc43e19b44 error handler: do not log last query, truncate error message to a smaller length 9 years ago
Andrew Dolgov 3261dbfa21 generate_syndicated_feed: pass article id to sanitize() 9 years ago
Andrew Dolgov d9de136c39 inline feed update: set feed as needing update if open_basedir is set + plugins need curl 9 years ago
Andrew Dolgov 67f3e3f942 pref-labels: remove obsolete searching code 9 years ago
Andrew Dolgov 9def554082 pref-feeds: allow searching by feed_url 9 years ago
Andrew Dolgov a5556c2471 fix item_id not being properly escaped in pref_feeds::process_category_order() (possible sql injection) 9 years ago
Andrew Dolgov 7af2e79578 create_published_article: only use readability if enabled in the plugin 9 years ago
Andrew Dolgov 666cd33360 enable support for readability (if af_readability is enabled) in shareanything bookmarklet 9 years ago
Andrew Dolgov 71b75bb7fa fix multiple issues with archived feeds 9 years ago
Andrew Dolgov 41245888f1 only stop inline feed updates with open_basedir enabled if there are any plugins that require CURL enabled
add plugin->flags() returning array with additional plugin information, currently only CURL requirement (optional)
9 years ago
Andrew Dolgov 29c92d7b08 prevent frontend updating of feeds on view if open_basedir is set to prevent plugins potentially not working correctly (i.e. if backend system has open_basedir disabled) 9 years ago
Andrew Dolgov 7d1e15c396 parser: properly support tag subtrees instead of text content for article content 9 years ago
Andrew Dolgov d2bb392bae Revert "parser: use node->c14n() instead of expecting html in nodeValue"
This reverts commit 1383514ad9.
9 years ago
Andrew Dolgov 1383514ad9 parser: use node->c14n() instead of expecting html in nodeValue 9 years ago
Andrew Dolgov 312742db6e updates: auto-disable CURL if open_basedir is enabled, notify possible issues w/ plugins 9 years ago
Andrew Dolgov 5bdcb8fd78 remove option ALLOW_DUPLICATE_POSTS as confusing/useless 9 years ago
Andrew Dolgov 9b736a20b3 do not automatically call cleanup_tags() in housekeeping tasks 9 years ago
Andrew Dolgov f61f2a2699 format_headlines_list: fix pg_num_rows() called incorrectly when firstid check failed 9 years ago
Andrew Dolgov b8619f8db0 store formatted backtrace to sql log 9 years ago
Andrew Dolgov 1bd552ee31 compat patches for php7 9 years ago
Andrew Dolgov 475d762872 logger: record last query before logged error 9 years ago
Andrew Dolgov 154f14d01b filters: do not strip_tags() on regexps 9 years ago
JustAMacUser 73c77ab0a5 Add optional (default: true), boolean "sanitize" parameter to API::getArticle() method. 9 years ago
Andrew Dolgov 19e47ad60b queryFeedHeadlines: don't check first_id when sorting by oldest first 9 years ago
Andrew Dolgov 583f163f40 don't init plugins when loading everything to make a list, duh 9 years ago
Andrew Dolgov 86d07d367c rpc, setpref: properly save settings to active profile 9 years ago
Andrew Dolgov 77e8100669 add date suffixes to opml & import_export generated files 9 years ago
Andrew Dolgov 9a35ed6709 disable filter test result highlighting for the time being 9 years ago
Andrew Dolgov 94b8ce6cec queryfeedheadlines: remove disable_offsets hack 9 years ago
Andrew Dolgov dbeef0ca67 filter preview: remove unnecessary checkbox 9 years ago
Andrew Dolgov f48f292d2b tweak filter preview layout a bit; allow previewing matched articles in a popup 9 years ago
Andrew Dolgov 261226a3a5 mostly implement async filter test dialog 9 years ago
Andrew Dolgov a007c18dff wip: filter async testing 9 years ago
Andrew Dolgov e17079dcef make disabled filter rules easier to discern
show if filter set match_any_rule on the overview
9 years ago
Andrew Dolgov 73dfda1da6 various minor style updates, add danger buttons 9 years ago
Andrew Dolgov dcbe36b2a2 fix some remaining old-style viewfeed() calls 9 years ago
Andrew Dolgov d98779972d tabbed feed editor 9 years ago
Andrew Dolgov bf9cc9ad95 combine user edit & user details 9 years ago
Andrew Dolgov f232aa5a34 remove num_articles from main pref_users query 9 years ago
Andrew Dolgov f9c1f8b0d4 pref-feeds: check for inactive feeds asynchronously 9 years ago
Andrew Dolgov 1edff0d439 user manager: show stored feeds/articles 9 years ago
Andrew Dolgov b028da0a2d display lack of filter plugin actions properly 9 years ago
Andrew Dolgov be2cfc1fff Merge branch 'master' of git.fakecake.org:tt-rss 9 years ago
Andrew Dolgov 90da4ada66 move attachments back to cdm content 9 years ago
Andrew Dolgov b87744534a add plugin-based filter actions (see example plugin in attic)
bump schema
9 years ago
Andrew Dolgov ad9928a5cb adjust cpu_tuple to 0.5 9 years ago
Andrew Dolgov 981059fd1f postgresql: adjust cpu_tuple (experimental) 9 years ago
Andrew Dolgov 314956d440 filter test dialog fixes for filters w/ many rules 9 years ago
Andrew Dolgov fb8a032a6b minor textarea fixes 9 years ago
Andrew Dolgov 6901ec6659 fix subtoolbar links lack of margin 9 years ago
Andrew Dolgov e79e274fc8 add styles for several other dijit elements 9 years ago
Andrew Dolgov bc20cb9fad move attachment dropdown to cdmFooter, use table styles for cdmFooter 9 years ago
Andrew Dolgov 6810a1de42 use dijit form widget for attachments dropdown 9 years ago
Andrew Dolgov 91837f0a2a update site_url (and title if needed) when changing feed_url in feed editor 9 years ago
Andrew Dolgov 0bd172cd6a experimental: if using adaptive/unread mode w/ auto catchup don't calculate offsets because we're only interested in top $limit headlines anyway 9 years ago
Andrew Dolgov 60e680599d allow selecting stemming language in search dialog 9 years ago
Andrew Dolgov df659891ac implement per-feed stemming language setting 9 years ago
Andrew Dolgov 3ceb893f66 add one catchall function to make uniqids/keyhashes/etc used by tt-rss 9 years ago
Andrew Dolgov 0d0cb8fe1e fix missing cdmFeedTitle 10 years ago
Andrew Dolgov 33c4bd8968 fix error feed (i.e. when requested feed no longer exists) not display properly 10 years ago
Andrew Dolgov f17069960c roll back separate headline transport 10 years ago
Andrew Dolgov 6b954c0a83 fix dashboard feed 10 years ago