[#5343] Handle 4-part+ artifact links gracefully
diff --git a/Allura/allura/model/index.py b/Allura/allura/model/index.py
index 736a1e1..5772d20 100644
--- a/Allura/allura/model/index.py
+++ b/Allura/allura/model/index.py
@@ -127,22 +127,24 @@
     def from_links(cls, *links):
         '''Convert a sequence of shortlinks to the matching Shortlink objects'''
         if len(links):
+            result = {}
             # Parse all the links
             parsed_links = dict((link, cls._parse_link(link)) for link in links)
             links_by_artifact = defaultdict(list)
             project_ids = set()
-            for link, d in parsed_links.iteritems():
-                project_ids.add(d['project_id'])
-                links_by_artifact[unquote(d['artifact'])].append(d)
+            for link, d in parsed_links.items():
+                if d:
+                    project_ids.add(d['project_id'])
+                    links_by_artifact[unquote(d['artifact'])].append(d)
+                else:
+                    result[link] = parsed_links.pop(link)
             q = cls.query.find(dict(
                     link={'$in': links_by_artifact.keys()},
                     project_id={'$in': list(project_ids)}
                 ), validate=False)
-            result = {}
             matches_by_artifact = dict(
                 (link, list(matches))
                 for link, matches in groupby(q, key=lambda s:unquote(s.link)))
-            result = {}
             for link, d in parsed_links.iteritems():
                 matches = matches_by_artifact.get(unquote(d['artifact']), [])
                 matches = (
diff --git a/Allura/allura/tests/model/test_artifact.py b/Allura/allura/tests/model/test_artifact.py
index b00f77a..0a621a7 100644
--- a/Allura/allura/tests/model/test_artifact.py
+++ b/Allura/allura/tests/model/test_artifact.py
@@ -98,6 +98,7 @@
     assert M.Shortlink.lookup('[TestPage2]')
     assert M.Shortlink.lookup('[wiki:TestPage2]')
     assert M.Shortlink.lookup('[test:wiki:TestPage2]')
+    assert not M.Shortlink.lookup('[test:wiki:TestPage2:foo]')
     assert not M.Shortlink.lookup('[Wiki:TestPage2]')
     assert not M.Shortlink.lookup('[TestPage2_no_such_page]')
     c.project.uninstall_app('wiki')