From 8a5a47077b4044b1679e33c1237ce9cf46d25aae Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Mon, 1 Jul 2013 09:35:59 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20BRANCHES/DEV/HEAD-QA=20to=20HEAD:=20?= =?UTF-8?q?=20=20=2048730:=20Record=20only=20merge=20from=204-1.BUG-FIX=20?= =?UTF-8?q?(4.1.5)=20to=20HEAD-BUG-FIX=20(4.2)=20=20=20=20=20=20=2048447:?= =?UTF-8?q?=20Performance=20problem=20with=20Eclipse=20can=20be=20fixed=20?= =?UTF-8?q?by=20excluding=20the=20web-client=20build=20directory=20from=20?= =?UTF-8?q?the=20searchable=20resources.=20=20=20=20=20=20=20=20=20=20Done?= =?UTF-8?q?=20for=2058=20other=20projects=20(generally=20include=20in=20th?= =?UTF-8?q?e=204.1=20code=20line)=20=20=20=20=20=20=2048726:=20Reverse=20M?= =?UTF-8?q?erge=20(did=20not=20work=20after=20an=20Eclipse=20Clean)=20-=20?= =?UTF-8?q?already=20done=20on=20HEAD=20=20=20=20=20=20=20=20=20=2048447:?= =?UTF-8?q?=20Performance=20problem=20with=20Eclipse=20can=20be=20fixed=20?= =?UTF-8?q?by=20excluding=20the=20web-client=20build=20directory=20from=20?= =?UTF-8?q?the=20searchable=20resources.=20=20=20=20=20=20=20=20=20=20Done?= =?UTF-8?q?=20for=2058=20other=20projects=20(generally=20include=20in=20th?= =?UTF-8?q?e=204.1=20code=20line)=20=20=20=2048929:=20Synced=20up=20with?= =?UTF-8?q?=20HEAD=20r48903=20=20=20=2048957:=20Merged=20PATCHES/V4.1.4=20?= =?UTF-8?q?to=20HEAD-BUG-FIX=20=20=20=20=20=20=2047847:=20Merged=20V4.1-BU?= =?UTF-8?q?G-FIX=20to=20PATCHES/V4.1.4=20=20=20=20=20=20=20=20=20=2047625:?= =?UTF-8?q?=20Fixed=20=20ALF-18063=20=20=20=20=20=20=20=20=20=20-=20Alfres?= =?UTF-8?q?coUtil's=20getPages=20method=20now=20parses=20json=20using=20js?= =?UTF-8?q?onUtils.toObject=20to=20force=20strict=20json=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20-=20CSRFFilter=20got=20new=20throwError=20action=20?= =?UTF-8?q?meaning=20the=20filter=20now=20can=20stop=20certain=20resources?= =?UTF-8?q?=20form=20being=20reached=20directly=20from=20the=20browser=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20-=20/remoteadm/*=20webscripts=20can?= =?UTF-8?q?=20no=20longer=20be=20accessed=20directly=20from=20the=20browse?= =?UTF-8?q?r=20=20=20=20=20=20=20=20=20=20-=20Modified=20regexps=20to=20be?= =?UTF-8?q?=20easier=20to=20read=20=20=20=20=20=20=20=20=20=20-=20Added=20?= =?UTF-8?q?config=20samples=20=20=20=20=20=20=2047879:=20Merged=20V4.1-BUG?= =?UTF-8?q?-FIX=20to=20PATCHES/V4.1.4=20=20=20=20=20=20=20=20=20=2047878:?= =?UTF-8?q?=20Final=20part=20of=20fix=20for=20ALF-14086=20-=20Sort=20order?= =?UTF-8?q?=20of=20folders=20including=20hyphens=20(=20-=20)=20are=20diffe?= =?UTF-8?q?rent=20in=20folder-tree=20and=20view=20on=20folders=20(in=20Sha?= =?UTF-8?q?re)=20=20=20=20=20=20=20=20=20=20=20-=20People=20Finder=20=20?= =?UTF-8?q?=20=20=20=20=2047912:=20Merged=20BRANCHES/DEV/V4.1-BUG-FIX=20to?= =?UTF-8?q?=20PATCHES/V4.1.4:=20=20=20=20=20=20=20=20=20=2047909:=20ALF-18?= =?UTF-8?q?257:=20partial=20fix=20-=20adds=20back=20in=20missing=20TinyMCE?= =?UTF-8?q?=20files.=20=20=20=20=20=20=2047928:=20Merged=20V4.1-BUG-FIX=20?= =?UTF-8?q?to=20PATCHES/V4.1.4=20=20=20=20=20=20=20=20=20=2047913:=20Final?= =?UTF-8?q?=20part=20of=20fix=20for=20ALF-18257=20-=20AWE=20panel=20is=20n?= =?UTF-8?q?ot=20displayed=20=20=20=20=20=20=2047932:=20ALF-14587:=20Create?= =?UTF-8?q?d=20article=20or=20publication=20cant=20be=20viewed=20on=20WQS?= =?UTF-8?q?=20site=20=20=20=20=20=20=20-=20Fix=20by=20Dmitry=20Vaserin=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Same=20fix=20was=20done=20to=20style1.get?= =?UTF-8?q?.html.ftl=20in=20ALF-17117=20=20=20=20=20=20=2047956:=20ALF-102?= =?UTF-8?q?43:=20workflow=20shows=20wrong=20date=20=20=20=20=20=20=20-=20M?= =?UTF-8?q?issing=20WQS=20date=20field=20configuration=20=20=20=20=20=20?= =?UTF-8?q?=2047983:=20ALF-15803:=20CH,=20NL,=20RU:=20There=20are=20no=20C?= =?UTF-8?q?hinese,=20Russian,=20Dutch=20templates=20for=20IMAP=20messages?= =?UTF-8?q?=20and=20Chinese,=20Russian=20templates=20for=20Email=20message?= =?UTF-8?q?s=20=20=20=20=20=20=20-=20Email=20templates=20from=20Gloria=20?= =?UTF-8?q?=20=20=20=20=20=2048026:=20ALF-15803:=20CH,=20NL,=20RU:=20There?= =?UTF-8?q?=20are=20no=20Chinese,=20Russian,=20Dutch=20templates=20for=20I?= =?UTF-8?q?MAP=20messages=20and=20Chinese,=20Russian=20templates=20for=20E?= =?UTF-8?q?mail=20messages=20=20=20=20=20=20=20-=20Email=20templates=20fro?= =?UTF-8?q?m=20Gloria=20=20=20=20=20=20=2048027:=20Merged=20V4.1-BUG-FIX?= =?UTF-8?q?=20to=20PATCHES/V4.1.4=20=20=20=20=20=20=20=20=20=2048020:=20Fi?= =?UTF-8?q?x=20for=20ALF-18220=20-=20Cancel=20checkout=20in=20'View=20Orig?= =?UTF-8?q?inal=20Document'=20view=20fails=20and=20causes=20document=20stu?= =?UTF-8?q?ck=20in=20checkedout=20state.=20=20=20=20=20=20=2048048:=20Merg?= =?UTF-8?q?ed=20BRANCHES/DEV/DWEBSTER/HEAD=5FAWE=20to=20PATCHES/V4.1.4:=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2048047:=20Fixes:=20ALF-14758.=20Adds?= =?UTF-8?q?=20z-index=20as=20a=20work=20around=20to=20an=20overlapping=20m?= =?UTF-8?q?enu=20bug=20that=20occurs=20if=20they=20are=20created=20in=20a?= =?UTF-8?q?=20particular=20order=20and=20viewed=20on=20a=20large=20enough?= =?UTF-8?q?=20resolution=20monitor.=20=20=20=20=20=20=2048086:=20Merged=20?= =?UTF-8?q?BRANCHES/DEV/V4.1-BUG-FIX=20to=20PATCHES/V4.1.4:=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2048083:=20Fixes=20ALF-14931=20=20=20=20=20=20=204?= =?UTF-8?q?8121:=20Merged=20BRANCHES/DEV/V4.1-BUG-FIX=20to=20PATCHES/V4.1.?= =?UTF-8?q?4:=20=20=20=20=20=20=20=20=20=2048116:=20Fixes=20build=20failur?= =?UTF-8?q?e=20caused=20by=20'fix'=20for=20ALF-14931=20=20=20=20=20=20=204?= =?UTF-8?q?8153:=20Merged=20V4.1-BUG-FIX=20to=20PATCHES/V4.1.4=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2048102:=20Fix=20for=20ALF-18354=20-=20SPP-Meet?= =?UTF-8?q?ing=20workspace=20event=20can=20be=20edited=20and=20deleted=20o?= =?UTF-8?q?n=20Agenda=20tab=20=20=20=20=20=20=20=20=20=2048124:=20Fixes=20?= =?UTF-8?q?ALF-18349:=20Slideshare=20and=20YouTube=20channels=20can=20now?= =?UTF-8?q?=20be=20created.=20=20=20=20=20=20=20=20=20=2048151:=20Fix=20fo?= =?UTF-8?q?r=20ALF-15475=20-=20Liferay=20Portal:=20IE9:=20Layout=20of=20po?= =?UTF-8?q?rtlets=20is=20broken=20when=20document=20details=20page=20is=20?= =?UTF-8?q?opened=20=20=20=20=20=20=2048156:=20Improved=20fix=20(removed?= =?UTF-8?q?=20useless=20media=20queries)=20for=20ALF-18196=20-=20Document?= =?UTF-8?q?=20Preview=20-=20Flash=20Movie=20Sized=20to=20a=20Thin=20Horizo?= =?UTF-8?q?ntal=20Bar=20at=201024x768=20Resolution=20=20=20=20=20=20=20481?= =?UTF-8?q?85:=20Another=20go=20at=20a=20solution=20for=20ALF-16413=20-=20?= =?UTF-8?q?Share=20asks=20for=20Basic-Auth=20while=20not=20needed=20trying?= =?UTF-8?q?=20to=20access=20RSS=20feeds=20(thus=20breaking=20SSO).=20=20?= =?UTF-8?q?=20=20=20=20=2048189:=20ALF-17818=20-=20Strikethrough=20formatt?= =?UTF-8?q?ing=20is=20not=20preserved=20in=20Wiki=20=20=20=20=20=20=204820?= =?UTF-8?q?8:=20ALF-18385:=20Alfresco=20Explorer:=20Localization=20is=20no?= =?UTF-8?q?t=20applied=20after=20login.=20=20=20=20=20=20=20-=20Fixes=20re?= =?UTF-8?q?gression=20caused=20by=20ALF-17189=20=20=20=20=20=20=2048261:?= =?UTF-8?q?=20Fix=20for=20ALF-18352=20-=20Manager=20can=20not=20update=20p?= =?UTF-8?q?ermissions=20more=20than=20once=20for=20the=20folder/content=20?= =?UTF-8?q?created=20by=20other=20user=20=20=20=20=20=20=2048264:=20Merged?= =?UTF-8?q?=20DEV=20to=20PATCHES/V4.1.4=20=20=20=20=20=20=20=20=20=2048258?= =?UTF-8?q?:=20ALF-18325=20:=20Can't=20delete=20wcmqs=20if=20it=20was=20pu?= =?UTF-8?q?blished=20to=20live=20=20=20=20=20=20=20=20=20=20We=20should=20?= =?UTF-8?q?also=20check=20for=20site=20is=20not=20being=20deleted=20before?= =?UTF-8?q?=20creating=20site=20container.=20=20=20=20=20=20=2048283:=20Co?= =?UTF-8?q?rrection=20to=20fix=20for=20ALF-18196=20=20=20=20=20=20=2048284?= =?UTF-8?q?:=20Fix=20for=20ALF-18328=20-=20Share=20dependencies=20containi?= =?UTF-8?q?ng=20dependencies=20breaks=20Hazelcast=20clustering=20=20=20=20?= =?UTF-8?q?=20=20=2048352:=20Fix=20for=20MNT-6390=20-=20Incorrect=20type?= =?UTF-8?q?=20for=20Group=20and=20Review=20workflow=20after=20task=20appro?= =?UTF-8?q?ved=20by=20all=20users=20=20=20=20=20=20=2048354:=20Fix=20for?= =?UTF-8?q?=20MNT-3196=20-=20No=20information=20is=20displayed=20in=20My?= =?UTF-8?q?=20Activities=20and=20Site=20Activities=20dashlets=20for=20cont?= =?UTF-8?q?ent=20creation=20=20=20=20=20=20=2048390:=20MNT-6292:=20Created?= =?UTF-8?q?=20article=20or=20publication=20cant=20be=20viewed=20on=20WQS?= =?UTF-8?q?=20site=20=20=20=20=20=20=20-=20Fix=20researched=20by=20Dmity?= =?UTF-8?q?=20Vaserin=20=20=20=20=20=20=20-=20More=20handling=20of=20empty?= =?UTF-8?q?=20lists=20=20=20=20=20=20=20-=20It=20seems=20that=20WCMQS=20re?= =?UTF-8?q?quires=20renditions=20to=20be=20indexed=20(in=20order=20for=20t?= =?UTF-8?q?hem=20to=20be=20returned=20by=20CMIS=20queries)=20so=20we=20mus?= =?UTF-8?q?t=20remove=20the=20ASPECT=5FINDEX=5FCONTROL=20aspect=20from=20t?= =?UTF-8?q?hem=20in=20RenditionHelper=20=20=20=20=20=20=2048424:=20Fixed?= =?UTF-8?q?=20MNT-7521=20"Document=20Library"=20instead=20"File=20Plan"=20?= =?UTF-8?q?displayed=20in=20the=20site=20navigation=20bar=20=20=20=20=20?= =?UTF-8?q?=20=2048430:=20MNT-7522:=20Users=20with=20"read=20only"=20or=20?= =?UTF-8?q?"read=20and=20file"=20permissions=20don't=20have=20access=20to?= =?UTF-8?q?=20RM=20folders=20=20=20=20=20=20=20-=20In=20ScriptNode.childBy?= =?UTF-8?q?NamePath()=20check=20for=20PermissionService.READ=20permission?= =?UTF-8?q?=20rather=20than=20PermissionService.READ=5FPROPERTIES=20permis?= =?UTF-8?q?sion,=20which=20apparently=20isn't=20compatible=20with=20RM!=20?= =?UTF-8?q?=20=20=20=20=20=2048434:=20MNT-7522:=20Users=20with=20"read=20o?= =?UTF-8?q?nly"=20or=20"read=20and=20file"=20permissions=20don't=20have=20?= =?UTF-8?q?access=20to=20RM=20folders=20=20=20=20=20=20=20-=20Corrected=20?= =?UTF-8?q?fix=20with=20help=20from=20Andy=20Hind=20=20=20=20=20=20=204850?= =?UTF-8?q?0:=20Fixed=20MNT-6311=20"Activities=20with=20Google=20Docs=20ar?= =?UTF-8?q?e=20not=20displayed=20in=20My=20Site=20Activities=20and=20Site?= =?UTF-8?q?=20Activities=20dashlets"=20=20=20=20=20=20=2048548:=20MNT-7528?= =?UTF-8?q?=20My=20Tasks=20to=20Do=20and=20My=20Pooled=20Tasks=20dashlets?= =?UTF-8?q?=20do=20not=20show=20the=20correct=20description=20of=20a=20wor?= =?UTF-8?q?kflow=20=20=20=20=20=20=2048635:=20MNT-8482=20Enterprise=204.1.?= =?UTF-8?q?4:=20Backwards=20compatibility=20breaking=20change=20in=20publi?= =?UTF-8?q?c=20Java=20API=20class=20org.alfresco.service.cmr.dictionary.Cl?= =?UTF-8?q?assDefinition=20=20=20=20=20=20=20=20=20=20-=20Added=20back=20i?= =?UTF-8?q?n=20missing=20methods=20and=20using=20StaticMessageLookup=20so?= =?UTF-8?q?=20will=20still=20have=20the=20issue=20identified=20by=20MNT-41?= =?UTF-8?q?3.=20=20=20=20=20=20=20=20=20=20=20=20The=20new=20methods=20sti?= =?UTF-8?q?ll=20exist=20and=20don't=20have=20this=20issue.=20=20=20=20=20?= =?UTF-8?q?=20=2048645:=20MNT-8484:=20Oracle:=20An=20unexpected=20differen?= =?UTF-8?q?ce=20is=20present=20after=20comparison=20of=20database=20schema?= =?UTF-8?q?=20with=20reference=20schema=20(post-upgrade)=20=20=20=20=20=20?= =?UTF-8?q?=2048729:=20MNT-8498=20Could=20not=20transform=20.psd=20file=20?= =?UTF-8?q?=20=20=20=20=20=2048745:=20MNT-8527:=20Activity=20Feed=20Cleane?= =?UTF-8?q?r=20broken=20on=20Oracle=20=20=20=20=20=20=20-=20Due=20to=20iba?= =?UTF-8?q?tis=20weirdnesses,=20the=20select=5Factivity=5Fuser=5Ffeeds=5Fg?= =?UTF-8?q?reater=5Fthan=5Fmax=20query=20has=20to=20exclude=20results=20wi?= =?UTF-8?q?th=20null=20user=5Fids=20(non=20user=20feeds)=20as=20this=20map?= =?UTF-8?q?s=20to=20a=20null=20row=20on=20Oracle=20and=20results=20in=20an?= =?UTF-8?q?=20NPE!=20=20=20=20=20=20=20-=20Also=20fixed=20all=20comparison?= =?UTF-8?q?s=20with=20feed=5Fuser=5Fid=20to=20be=20NULL=20safe=20=20=20=20?= =?UTF-8?q?=20=20=2048751:=20Fixed=20MNT-8504=20"Script=20error=20occurs?= =?UTF-8?q?=20when=20clicking=20Edit=20Tags=20action=20from=20document/fol?= =?UTF-8?q?der=20details=20page"=20=20=20=20=20=20=20-=20Removed=20js=5Fst?= =?UTF-8?q?ring=20encoding=20of=20nodeRef=20and=20made=20sure=20nodeRef=20?= =?UTF-8?q?is=20taken=20from=20the=20repo=20instead=20of=20the=20page=20ur?= =?UTF-8?q?l=20=20=20=20=20=20=2048752:=20MNT-8467:=20Cannot=20authorize?= =?UTF-8?q?=20to=20Share=20Kerberos=20automatically=20=20=20=20=20=20=20-?= =?UTF-8?q?=20Reversed=20r44754=20performance=20fix=20causing=20this=20(So?= =?UTF-8?q?rry=20Kev)=20=20=20=20=20=20=2048755:=20MNT-8514:=20Incorrect?= =?UTF-8?q?=20workflow=20status=20is=20displayed=20on=20My=20Tasks=20dashl?= =?UTF-8?q?et=20=20=20=20=20=20=20-=20Fix=20by=20Viachaslau=20reviewed=20b?= =?UTF-8?q?y=20Frederik=20=20=20=20=20=20=2048756:=20MNT-8531:=20Merged=20?= =?UTF-8?q?PATCHES/V4.1.3=20to=20PATCHES/V4.1.4=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2048683:=20MNT-8494:=20Lucene=20index=20recovery=20fails=20to?= =?UTF-8?q?=20reindex=20an=20orphaned=20node=20whose=20parent=20is=20delet?= =?UTF-8?q?ed=20=20=20=20=20=20=20=20=20=20-=20Added=20unit=20test=20for?= =?UTF-8?q?=20this=20and=20fixed=20regression=20over=20MNT-6545=20fix=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2048717:=20MNT-8494:=20Lucene=20index?= =?UTF-8?q?=20recovery=20fails=20to=20reindex=20an=20orphaned=20node=20who?= =?UTF-8?q?se=20parent=20is=20deleted=20=20=20=20=20=20=20=20=20=20-=20Str?= =?UTF-8?q?engthened=20unit=20test=20to=20check=20for=20deleted=20nodes=20?= =?UTF-8?q?with=20parents=20and=20strengthened=20handling=20of=20these=20a?= =?UTF-8?q?s=20a=20result=20=20=20=20=20=20=20=20=20=20-=20Hopefully=20fix?= =?UTF-8?q?es=20unit=20test=20failures=20=20=20=20=20=20=2048798:=20Fixed?= =?UTF-8?q?=20MNT-7646=20"CLONE=20-=20[Pentest]=20Internet=20Explorer=20=20it=20will=20change=20the?= =?UTF-8?q?=20mimetype=20to=20text/plain.=20=20=20=20=20=20=2048810:=20Upg?= =?UTF-8?q?rade=20Surf=20version=20in=20POM=20files=20to=201.2.0-M4=20(r12?= =?UTF-8?q?17)=20=20=20=20=20=20=2048819:=20Fixed=20MNT-8504=20"Script=20e?= =?UTF-8?q?rror=20occurs=20when=20clicking=20Edit=20Tags=20action=20from?= =?UTF-8?q?=20document/folder=20details=20page"=20part=202=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Fix=20on=20folders=20page=20=20=20=20=20=20=2048820:?= =?UTF-8?q?=20Make=20SchemaReferenceFileTest=20actually=20output=20its=20r?= =?UTF-8?q?eason=20for=20failing=20-=20I=20can't=20track=20down=20the=20te?= =?UTF-8?q?mp=20files!=20=20=20=20=20=20=2048822:=20MNT-8508:=20Fixing=20d?= =?UTF-8?q?escription-property=20in=20LazyActivitiWorkflowTask=20which=20i?= =?UTF-8?q?s=20not=20the=20same=20as=20WorklfowTask.description=20=20=20?= =?UTF-8?q?=20=20=20=2048823:=20BDE-130:=20fail=20the=20build=20when=20yui?= =?UTF-8?q?compressor=20minimization=20fails=20=20=20=20=20=20=2048890:=20?= =?UTF-8?q?Fixed=20MNT-8554=20"FF:=20Download=20button=20on=20Document=20D?= =?UTF-8?q?etails=20page=20is=20not=20working"=20=20=20=20=20=20=20-=20Not?= =?UTF-8?q?e=20also=20fixes=20the=20"Comment"=20widget=20in=20the=20header?= =?UTF-8?q?=20not=20working=20(in=20any=20browser)=20=20=20=20=20=20=20489?= =?UTF-8?q?33:=20MNT-8560:=20It's=20impossible=20to=20find=20the=20user=20?= =?UTF-8?q?by=20any=20property=20except=20the=20username=20=20=20=20=20=20?= =?UTF-8?q?=20Modify=20People.getSortedPeopleObjects()=20method=20to=20cre?= =?UTF-8?q?ate=20ArrayList=20based=20on=20provided=20List=20and?= =?UTF-8?q?=20use=20it=20for=20sort,=20because=20provided=20List?= =?UTF-8?q?=20can=20be=20unmodifiable=20list.=20=20=20=2048964:=20MNT-6494?= =?UTF-8?q?:=20Fixed=20merge=20issue=20(already=20fixed=20in=20HEAD-BUG-FI?= =?UTF-8?q?X)=20=20=20=2049033:=20Merged=20PATCHES/V4.1.4=20to=20HEAD-BUG-?= =?UTF-8?q?FIX-QA=20=20=20=20=20=20=2048996:=20MNT-8564=20:=20CLONE=20-=20?= =?UTF-8?q?Incorrect=20saving=20process=20when=20editing=20event=20=20=20?= =?UTF-8?q?=20=20=20=20Fix=20event.put.json.ftl=20to=20produce=20valid=20j?= =?UTF-8?q?son=20=20=20=20=20=20=2049006:=20MNT-8555:=20Reverse=20Merge=20?= =?UTF-8?q?MNT-6419=20(ALF-17089)=20=20=20=20=20=20=20=20=20=2045245:=20AL?= =?UTF-8?q?F-17089=20(Displaying=20Url=20Name=20instead=20of=20site=20Name?= =?UTF-8?q?=20in=20Select=20form)=20=20=20=20=20=20=20=20=20=2047089:=20AL?= =?UTF-8?q?F-17089=20(Displaying=20Url=20Name=20instead=20of=20site=20Name?= =?UTF-8?q?=20in=20Select=20form)=20=20=20=2049039:=20Merged=20HEAD=20to?= =?UTF-8?q?=20HEAD-BUG-FIX-QA=20=20=20=20=20=20=2048931:=20Fixed=20CLOUD-1?= =?UTF-8?q?511=20"My=20Documents=20dashlet=20is=20crashing=20when=20inspec?= =?UTF-8?q?ting=20the=20syncmode=20value"=20=20=20=20=20=20=2048955:=20Fix?= =?UTF-8?q?=20name=20of=20wdr-deployment=20jar=20in=20mvninstall=20task=20?= =?UTF-8?q?=20=20=20=20=20=2048979:=20ALF-18573:=20fix=20sharepoint=20modu?= =?UTF-8?q?le=20context=20name.=20=20=20=20=20=20=20This=20is=20a=20change?= =?UTF-8?q?=20that=20was=20appropriate=20for=20cloud=20but=20had=20crept?= =?UTF-8?q?=20in=20to=20HEAD=20during=20the=20megamerge.=20=20=20=20=20=20?= =?UTF-8?q?=2048988:=20Fix=20integration=20with=20CLOUD2=20+=20compile=20a?= =?UTF-8?q?nd=20package=20remote-api=20test=20classes=20separately=20=20?= =?UTF-8?q?=20=20=20=20=2048995:=20CLOUD-1460=20"CloudConv:=20Re-implement?= =?UTF-8?q?=20header=20customizations"=20=20=20=20=20=20=20-=20#1.=20Re-ad?= =?UTF-8?q?d=20link=20so=20network=20admin=20can=20access=20admin=20consol?= =?UTF-8?q?e=20=20=20=20=20=20=20=20=20=20Added=20in=20widget=20ids=20that?= =?UTF-8?q?=20could=20be=20referenced=20to=20add=20and=20remove=20widgets?= =?UTF-8?q?=20in=20the=20user=20&=20app=20items=20menu=20=20=20=20=20=20?= =?UTF-8?q?=2049008:=20Fix=20public=20api=20tests=20=20=20=20=20=20=204901?= =?UTF-8?q?4:=20Fix=20public=20api=20tests=20=20=20=2049136:=20Fix=20publi?= =?UTF-8?q?c=20api=20tests=20=20=20=2049141:=20Merged=20HEAD-BUG-FIX=20to?= =?UTF-8?q?=20HEAD-QA=20(thus=20completing=204.1.4=20->=20HEAD-QA=20merge)?= =?UTF-8?q?=20=20=20=20=20=20=2049139:=20Merged=20PATCHES/V4.1.4=20to=20BR?= =?UTF-8?q?ANCHES/DEV/HEAD-BUG-FIX=20(mergeinfo=20committed=20earlier)=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2048735:=20Fixed=20MNT-8506=20&=20MNT-?= =?UTF-8?q?8507=20=20=20=20=20=20=20=20=20=20=20=20=20*=20MNT-8506=20"A=20?= =?UTF-8?q?server=20error=20has=20occurred=20when=20press=20Follow/Unfollo?= =?UTF-8?q?w=20button=20from=20User=20Profile"=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20*=20MNT-8507=20"A=20server=20error=20occurs=20when?= =?UTF-8?q?=20set=20"Private"=20checkbox=20on=20My=20Profile"=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20*=20Instead=20of=20using=20Alfresco.?= =?UTF-8?q?util.Ajax.request=20and=20creating=20XHR=20requests=20forms=20w?= =?UTF-8?q?ere=20being=20submitted=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20meaning=20the=20Alfresco-CSRFToken=20never=20got=20added.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20*=20Now=20refactored=20t?= =?UTF-8?q?o=20use=20Alfresco.util.Ajax.request=20and=20post=20directly=20?= =?UTF-8?q?to=20the=20proxy,=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20m?= =?UTF-8?q?eaning=20the=20Share=20"services"=20now=20can=20be=20removed.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2048812:=20MNT-8506=20/=20MNT-8507:?= =?UTF-8?q?=20Fix=20up=20by=20Vasily=20to=20avoid=20YUI=20compression=20er?= =?UTF-8?q?ror=20=20=20=20=20=20=20=20=20=2048813:=20Fixed=20MNT-8507=20"A?= =?UTF-8?q?=20server=20error=20occurs=20when=20set=20"Private"=20checkbox?= =?UTF-8?q?=20on=20My=20Profile"=20part=202=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20-=20variable=20used=20keyword=20"private",=20now=20ref?= =?UTF-8?q?actored=20to=20"isPrivate"=20=20=20=2049154:=20Merged=20BRANCHE?= =?UTF-8?q?S/DEV/CLOUD1=20to=20BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20=204?= =?UTF-8?q?8470:=20Merged=20BRANCHES/DEV/FEATURES/CLOUD1-PUBLICAPI3=20to?= =?UTF-8?q?=20BRANCHES/DEV/CLOUD1:=20=20=20=20=20=20=20=20=20=20=20=204804?= =?UTF-8?q?1:=20Merged=20BRANCHES/DEV/FEATURES/CLOUD1-PUBLICAP2=20to=20BRA?= =?UTF-8?q?NCHES/DEV/FEATURES/CLOUD1-PUBLICAPI3:=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2047129:=20Merged=20BRANCHES/DEV/FEATU?= =?UTF-8?q?RES/CLOUD1-PUBLICAPI1=20to=20BRANCHES/DEV/FEATURES/CLOUD1-PUBLI?= =?UTF-8?q?CAP2:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2045439:=20PUBLICAPI-39:=20"Favourites=20API"=20wip=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?45681:=20PUBLICAPI-39:=20"Favourites=20API"=20wip=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2045897:=20?= =?UTF-8?q?Test=20a=20fix=20for=20issue=20found=20during=20bm=20testing=20?= =?UTF-8?q?-=20CMIS:=20null=20entries=20in=20property=20list=20values=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?45965:=20Public=20api=20performance=20investigation:=20test=20n?= =?UTF-8?q?ode=20bulk=20loading=20change=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=2045978:=20PUBLICAPI-39/40:=20wi?= =?UTF-8?q?p,=20changes=20from=20review.=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=2046019:=20PUBLICAPI-39:=20"Favo?= =?UTF-8?q?urites=20API"=20wip=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2046056:=20Re-instate=20opencmis=20config?= =?UTF-8?q?=20that=20was=20mistakenly=20changed=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2046156:=20Public=20api=20?= =?UTF-8?q?performance=20investigation:=20test=20node=20bulk=20loading=20c?= =?UTF-8?q?hange=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2046193:=20PUBLICAPI-39:=20"Favourites=20API"=20wip=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?46200:=20PUBLICAPI-39:=20"Favourites=20API"=20wip=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046247:=20?= =?UTF-8?q?Upgrade=20to=20OpenCMIS=200.8=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=2046248:=20PUBLICAPI-72:=20"Add?= =?UTF-8?q?=20users=20role=20to=20Site=20entity"=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=2046249:=20PUBLICAPI-72?= =?UTF-8?q?:=20"Add=20users=20role=20to=20Site=20entity"=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046250:=20PUBLIC?= =?UTF-8?q?API-40:=20"Site=20membership=20API"=20-=20modifiedAt=20timestam?= =?UTF-8?q?p=20+=20some=20tidy=20up=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2046251:=20PUBLICAPI-40:=20"Site=20mem?= =?UTF-8?q?bership=20API"=20-=20bug=20fixes=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=2046253:=20public=20api=20tes?= =?UTF-8?q?ts=20refactoring=20(split=20tests=20into=20separate=20classes?= =?UTF-8?q?=20by=20functional=20area),=20site=20membership=20api=20tests?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2046273:=20public=20api=20tests=20refactoring=20(split=20tests?= =?UTF-8?q?=20into=20separate=20classes=20by=20functional=20area),=20site?= =?UTF-8?q?=20membership=20api=20tests=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2046298:=20Cloud=20OpenCMIS=20brows?= =?UTF-8?q?er=20binding=20support=20through=20the=20OpenCMIS=20Alfresco=20?= =?UTF-8?q?webscript=20(currently=20disabled)=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2046299:=20Cloud=20OpenCMI?= =?UTF-8?q?S=20browser=20binding=20support=20through=20the=20OpenCMIS=20Al?= =?UTF-8?q?fresco=20webscript=20(currently=20disabled)=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046300:=20Cloud?= =?UTF-8?q?=20OpenCMIS=20browser=20binding=20support=20through=20the=20Ope?= =?UTF-8?q?nCMIS=20Alfresco=20webscript=20(currently=20disabled)=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046311:?= =?UTF-8?q?=20Cloud=20OpenCMIS=20browser=20binding=20support=20through=20t?= =?UTF-8?q?he=20OpenCMIS=20Alfresco=20webscript=20(currently=20disabled)?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2046337:=20PUBLICAPI-79:=20"GET=20a=20Favorite"=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046338:=20PUB?= =?UTF-8?q?LICAPI-79:=20"GET=20a=20Favorite"=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=2046339:=20public=20api=20tes?= =?UTF-8?q?ts:=20some=20refactoring=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2046340:=20Cloud=20OpenCMIS=20browser?= =?UTF-8?q?=20binding=20support=20through=20the=20OpenCMIS=20Alfresco=20we?= =?UTF-8?q?bscript=20(currently=20disabled)=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=2046345:=20Added=20name=20par?= =?UTF-8?q?ameter=20to=20the=20@uniqueId=20annotation.=20e.g.=20@UniqueId(?= =?UTF-8?q?name=3D"targetGuid")=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2046346:=20PUBLICAPI-39:=20"Favourites=20?= =?UTF-8?q?API"=20-=20tests=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2046359:=20PUBLICAPI-40:=20"Site=20membershi?= =?UTF-8?q?p=20API"=20-=20PUT=20requests=20and=20bug=20fixes=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046380:=20?= =?UTF-8?q?PUBLICAPI-40:=20"Site=20membership=20API"=20-=20PUT=20requests?= =?UTF-8?q?=20and=20bug=20fixes=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2046381:=20PUBLICAPI-40:=20"Site=20member?= =?UTF-8?q?ship=20API"=20-=20PUT=20requests=20and=20bug=20fixes=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046397:?= =?UTF-8?q?=20PUBLICAPI-40:=20"Site=20membership=20API"=20-=20add=20missin?= =?UTF-8?q?g=20file=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2046411:=20public=20api=20tests:=20re-instate=20tests?= =?UTF-8?q?=20(accidentally=20commented=20out)=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2046427:=20Cloud=20OpenCMI?= =?UTF-8?q?S=20browser=20binding=20support=20through=20the=20OpenCMIS=20Al?= =?UTF-8?q?fresco=20webscript=20(currently=20disabled)=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046442:=20Cloud?= =?UTF-8?q?=20OpenCMIS=20browser=20binding=20support=20through=20the=20Ope?= =?UTF-8?q?nCMIS=20Alfresco=20webscript=20(currently=20disabled)=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046467:?= =?UTF-8?q?=20PUBLICAPI-80:=20"GET=20on=20a=20deleted=20Favorite=20answers?= =?UTF-8?q?=20a=20500"=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2046476:=20Upgrade=20to=20OpenCMIS=200.8=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046514:?= =?UTF-8?q?=20Initial=20implementation=20of=20WHERE=20clause=20functionali?= =?UTF-8?q?ty.=20(Likely=20to=20change=20a=20lot).=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=2046518:=20PUBLICAPI-75?= =?UTF-8?q?:=20"Use=20a=20'where'=20parameter=20to=20specify=20criteria=20?= =?UTF-8?q?for=20favorite=20result=20set=20content=20"=20=20=20=2049157:?= =?UTF-8?q?=20Merged=20BRANCHES/DEV/CLOUD1=20to=20BRANCHES/DEV/HEAD-QA:=20?= =?UTF-8?q?=20=20=20=20=20=2048552:=20Merged=20BRANCHES/DEV/V4.1-BUG-FIX?= =?UTF-8?q?=20to=20BRANCHES/DEV/CLOUD1=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2048551:=20Fix=20for=20=20=20=20=20DEVOPS-2976=20=20=20P1=20-?= =?UTF-8?q?=20Solr=20nodes=20crash=20with=20tracking=20enabled=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20+=20configurati?= =?UTF-8?q?on=20fixes=20=20=20=20=20=20=2048796:=20Merged=20BRANCHES/DEV/F?= =?UTF-8?q?EATURES/ACCOUNT=5FTYPES=20to=20BRANCHES/DEV/CLOUD1:=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2048092:=20Resolve=20CLOUD-1303:=20Add=20?= =?UTF-8?q?2=20new=20Account=20Types=20to=20Cloud=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2048325:=20Translations=20from=20Gloria=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2048445:=20Japanese:=20translation=20upda?= =?UTF-8?q?te=20from=20Gloria=20=20=20=20=20=20=20=20=20=20=20=2048698:=20?= =?UTF-8?q?JA:=20Translation=20update=20from=20Gloria.=20=20=20=20=20=20?= =?UTF-8?q?=2049130:=20Merged=20BRANCHES/DEV/CLOUD1-HOTFIX=20to=20BRANCHES?= =?UTF-8?q?/DEV/CLOUD1:=20=20=20=20=20=20=20=20=20=20=20=2049120:=20Merged?= =?UTF-8?q?=20BRANCHES/DEV/FEATURES/CLOUD1-PUBLICAPI3=20to=20BRANCHES/DEV/?= =?UTF-8?q?CLOUD1-HOTFIX:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2049093:=20CLOUD-1518:=20"Favourite=20sites=20are=20not=20disp?= =?UTF-8?q?layed=20correctly"=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2049110:=20CLOUD-1518:=20"Favourite=20sites=20are=20not=20d?= =?UTF-8?q?isplayed=20correctly":=20fix=20up=20PreferencesService=20to=20r?= =?UTF-8?q?eturn=20correct=20site=20preference=20keys=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2049116:=20CLOUD-1518:=20"Favourite?= =?UTF-8?q?=20sites=20are=20not=20displayed=20correctly":=20favourite=20si?= =?UTF-8?q?tes=20uses=20the=20favourites=20service=20rather=20thanpreferen?= =?UTF-8?q?ces=20service=20directly,=20making=20it=20and=20favourites=20co?= =?UTF-8?q?nsistent=20=20=20=2049159:=20fixup=20pesky=20solrcore.propertie?= =?UTF-8?q?s=20=20=20=2049197:=20Fix=20for=20Cloud=20AccountUsageQuotaTest?= =?UTF-8?q?=20-=20make=20action-executor=20node=20service=20mt=20aware=20(?= =?UTF-8?q?fallout=20from=20previous=20commit=20that=20now=20does=20a=20no?= =?UTF-8?q?de=20existence=20check=20in=20action=20executor=20that=20needs?= =?UTF-8?q?=20to=20be=20mt=20aware)=20=20=20=2049199:=20Fix=20tests=20=20?= =?UTF-8?q?=20=2049241:=20CLOUD-1527=20"Logo=20in=20Share=20footer=20is=20?= =?UTF-8?q?broken"=20=20=20=20-=20Added=20/res=20to=20make=20logo=20gettin?= =?UTF-8?q?g=20displayed=20when=20running=20in=20multi=20tenancy=20mode=20?= =?UTF-8?q?=20=20=2049250:=20CLOUD-1527=20"Logo=20in=20Share=20footer=20is?= =?UTF-8?q?=20broken"=20=20=20=20-=20Removed=20image=20dimensions=20to=20m?= =?UTF-8?q?ake=20image=20replaceable=20=20=20=2049267:=20Fix=20tests:=20re?= =?UTF-8?q?move=20incorrect=20OpenCMIS=20jars=20=20=20=2049272:=20Use=20ne?= =?UTF-8?q?wer=20patched=20version=20of=20chemistry-opencmis-server-bindin?= =?UTF-8?q?gs=20=20=20=2049273:=20Removed=20extraneous=20chemistry=20libra?= =?UTF-8?q?ry=20dependency=20=20=20=2049293:=20CLOUD-1512=20"SAML=20integr?= =?UTF-8?q?ation=20needs=20to=20override=20"CSRFPolicy"=20config"=20=20=20?= =?UTF-8?q?=20-=20Adding=20new=20(overridable)=20getPath()=20method=20in?= =?UTF-8?q?=20CSRFFilter=20=20=20=2049315:=20Merged=20PATCHES/V4.1.4=20to?= =?UTF-8?q?=20HEAD-QA=20=20=20=20=20=20=2049236:=20Fixed=20MNT-8615=20"Bro?= =?UTF-8?q?wser=20page=20is=20not=20reloaded=20after=20deleting=20folder/f?= =?UTF-8?q?ile=20or=20after=20creation=20content=20in=20Repository"=20=20?= =?UTF-8?q?=20=20=20=20=2049301:=20Fixed=20MNT-8615=20"Browser=20page=20is?= =?UTF-8?q?=20not=20reloaded=20after=20deleting=20folder/file=20or=20after?= =?UTF-8?q?=20creation=20content=20in=20Repository"=20part=202=20=20=20=20?= =?UTF-8?q?49316:=20Merged=20PATCHES/V4.1.4=20to=20HEAD-QA=20(RECORD=20ONL?= =?UTF-8?q?Y)=20=20=20=20=20=20=2048735:=20Fixed=20MNT-8506=20&=20MNT-8507?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20*=20MNT-8506=20"A=20server=20erro?= =?UTF-8?q?r=20has=20occurred=20when=20press=20Follow/Unfollow=20button=20?= =?UTF-8?q?from=20User=20Profile"=20=20=20=20=20=20=20=20=20=20*=20MNT-850?= =?UTF-8?q?7=20"A=20server=20error=20occurs=20when=20set=20"Private"=20che?= =?UTF-8?q?ckbox=20on=20My=20Profile"=20=20=20=20=20=20=20=20=20=20*=20Ins?= =?UTF-8?q?tead=20of=20using=20Alfresco.util.Ajax.request=20and=20creating?= =?UTF-8?q?=20XHR=20requests=20forms=20were=20being=20submitted=20meaning?= =?UTF-8?q?=20the=20Alfresco-CSRFToken=20never=20got=20added.=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20*=20Now=20refactored=20to=20use=20Alfresco.ut?= =?UTF-8?q?il.Ajax.request=20and=20post=20directly=20to=20the=20proxy,=20m?= =?UTF-8?q?eaning=20the=20Share=20"services"=20now=20can=20be=20removed.?= =?UTF-8?q?=20=20=20=20=20=20=2048812:=20MNT-8506=20/=20MNT-8507:=20Fix=20?= =?UTF-8?q?up=20by=20Vasily=20to=20avoid=20YUI=20compression=20error=20=20?= =?UTF-8?q?=20=20=20=20=2048813:=20Fixed=20MNT-8507=20"A=20server=20error?= =?UTF-8?q?=20occurs=20when=20set=20"Private"=20checkbox=20on=20My=20Profi?= =?UTF-8?q?le"=20part=202=20=20=20=20=20=20=20-=20variable=20used=20keywor?= =?UTF-8?q?d=20"private",=20now=20refactored=20to=20"isPrivate"=20=20=20?= =?UTF-8?q?=2049328:=20Fix=20up=20People=20script=20class=20so=20that=20it?= =?UTF-8?q?=20deals=20with=20access=20denied=20exceptions=20(this=20will?= =?UTF-8?q?=20hopefully=20fix=20failing=20PeopleRestApiTest=20in=20Cloud2)?= =?UTF-8?q?=20=20=20=2049346:=20Fixed=20CLOUD-1532=20"Test=20email=20signu?= =?UTF-8?q?p=20page=20is=20brokebn=20due=20to=20new=20header"=20=20=20=204?= =?UTF-8?q?9364:=20Fixed=20CLOUD-1524=20"Unable=20to=20retrieve=20Google?= =?UTF-8?q?=20Docs=20subsystem=20status=20from=20Alfresco=20(re:=20googleE?= =?UTF-8?q?ditable=20not=20defined=20=3F)"=20=20=20=2049373:=20CONV:=20Fix?= =?UTF-8?q?=20CLOUD-1524=20/=20CLOUD-446=20-=20disable=20GoogleDocsV1=20su?= =?UTF-8?q?bsystem=20and=20prevent=20deferred=20start=20(and=20associated?= =?UTF-8?q?=20error)=20when=20Share=20later=20calls=20explicit=20"status"?= =?UTF-8?q?=20webscript=20(to=20see=20that=20it=20is=20disabled)=20=20=20?= =?UTF-8?q?=20-=20revert=2049364=20and=20replace=20with=20alternative=20fi?= =?UTF-8?q?x=20=20=20=20-=20see=20also=20similar=20IMAP=20status=20issue?= =?UTF-8?q?=20(CLOUD-1507)=20=20=20=2049375:=20CONV:=20Fix=20CLOUD-1507=20?= =?UTF-8?q?-fix=20IMAP=20subsystem=20to=20prevent=20deferred=20start=20(an?= =?UTF-8?q?d=20associated=20error)=20when=20Share=20later=20calls=20explic?= =?UTF-8?q?it=20"status"=20webscript=20(to=20see=20that=20it=20is=20disabl?= =?UTF-8?q?ed)=20=20=20=20-=20see=20also=20similar=20GDocsV1=20status=20is?= =?UTF-8?q?sue=20(CLOUD-1524=20/=20CLOUD-446)=20=20=20=2049416:=20Merged?= =?UTF-8?q?=20BRANCHES/DEV/CLOUD1=20to=20BRANCHES/DEV/HEAD-QA:=20=20=20=20?= =?UTF-8?q?=20=20=2049303:=20CLOUD-1518:=20"Favourite=20sites=20are=20not?= =?UTF-8?q?=20displayed=20correctly":=20fix=20fallout=20=20=20=2049418:=20?= =?UTF-8?q?CONV:=20Fix=20ALF-18698=20-=20Core=20MT:=20"create=20tenant"=20?= =?UTF-8?q?ignores=20the=20tenant-specific=20root=20contentstore=20dir=20p?= =?UTF-8?q?ath=20(if=20specified)=20=20=20=2049433:=20Fix=20for=20failing?= =?UTF-8?q?=20Cloud2=20test=20https://bamboo.alfresco.com/bamboo/browse/TH?= =?UTF-8?q?OR-CLOUD2HEADQA-JOB1-38/test/case/12496544=20=20=20=2049491:=20?= =?UTF-8?q?CLOUD-1552=20"The=20invite=20link=20icon=20in=20the=20new=20hea?= =?UTF-8?q?der's=20site=20title=20"area"=20points=20to=20the=20"on=20premi?= =?UTF-8?q?se"=20invite=20page=20(which=20has=20been=20admin=20secured)=20?= =?UTF-8?q?instead=20of=20the=20invite=20dialog"=20=20=20=20-=20Improving?= =?UTF-8?q?=20extensibility=20by=20adding=20further=20widgets=20ids=20for?= =?UTF-8?q?=20header=20menu=20=20=20=2049590:=20CLOUD-1556=20"CloudConv:?= =?UTF-8?q?=20CLOUD2=20does=20not=20start=20on=20DP:=20"Possible=20CSRF=20?= =?UTF-8?q?attack""=20part=201=20=20=20=20-=20Not=20a=20bug=20in=20the=20C?= =?UTF-8?q?SRFFIlter=20but=20an=20improvement=20that=20introduces=20a=20=20elements=20which=20may=20hold=20variables=20used?= =?UTF-8?q?=20by=20the=20CSRFPolicy=20config=20=20=20=20=20=20=20to=20avoi?= =?UTF-8?q?d=20repetition=20and=20the=20possibility=20to=20only=20override?= =?UTF-8?q?=20the=20=20section=20in=20different=20environemnts?= =?UTF-8?q?,=20i.e.=20set=20different=20referer=20proxies=20in=20test=20&?= =?UTF-8?q?=20prod.=20=20=20=2049758:=20Fix=20for=20CLOUD-1542,=20Google?= =?UTF-8?q?=20Docs=20action=20was=20missing=20from=20the=20action=20list?= =?UTF-8?q?=20in=20the=20document=20library.=20=20=20=20An=20action=20is?= =?UTF-8?q?=20still=20listed=20in=20the=20document-browse=20action=20group?= =?UTF-8?q?=20that=20has=20no=20definition,=20this=20was=20causing=20the?= =?UTF-8?q?=20web=20tier=20webscript=20to=20abort=20processing=20of=20any?= =?UTF-8?q?=20actions=20defined=20after=20it=20i.e.=20any=20custom=20actio?= =?UTF-8?q?ns.=20=20=20=2049789:=20Merged=20BRANCHES/DEV/HEAD-BUG-FIX=20to?= =?UTF-8?q?=20BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20=2049788:=20L10N=20up?= =?UTF-8?q?date=20from=20Gloria,=20based=20on=20EN=20r48822=20=20=20=20498?= =?UTF-8?q?01:=20Move=20CLOUD2=20to=20HEAD-QA,=20as=20part=20of=20Alfresco?= =?UTF-8?q?=20One=20project=20=20=20=2049806:=20Bring=20POM=20file=20back?= =?UTF-8?q?=20from=20CLOUD2=20=20=20=2049807:=20Fix=20order=20of=20from/se?= =?UTF-8?q?t/to=20lines=20in=20rules,=20to=20match=20schema=20validation.?= =?UTF-8?q?=20=20=20=2049829:=20Merged=20BRANCHES/DEV/HEAD-BUG-FIX=20to=20?= =?UTF-8?q?BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20=2049808:=20CLOUD-1615:?= =?UTF-8?q?=20CloudConv=20-=20Regression:=20CLONE:=20the=20info=20panel=20?= =?UTF-8?q?isn't=20wide=20enough=20to=20display=20the=20share=20link=20wit?= =?UTF-8?q?hout=20a=20line=20break=20=20=20=20=20=20=20=20=20=20=20=20-=20?= =?UTF-8?q?Increased=20panel=20and=20image=20widths=20=20=20=2049830:=20Me?= =?UTF-8?q?rged=20BRANCHES/DEV/HEAD-BUG-FIX=20to=20BRANCHES/DEV/HEAD-QA:?= =?UTF-8?q?=20=20=20=20=20=20=2049823:=20CLOUD-1609:=20CloudConv=20-=20Reg?= =?UTF-8?q?ression:=20DAM:=20Item=20header=20was=20moved=20(also=20incorre?= =?UTF-8?q?ct=20color=20is=20using)=20for=20folders=20and=20files.=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20Added=20overrides=20and=20cha?= =?UTF-8?q?nges=20to=20gallery=20view=20to=20accomodate=20changed=20CSS=20?= =?UTF-8?q?in=20detail=20and=20simple=20view=20=20=20=2049831:=20Merged=20?= =?UTF-8?q?BRANCHES/DEV/HEAD-BUG-FIX=20to=20BRANCHES/DEV/HEAD-QA:=20=20=20?= =?UTF-8?q?=20=20=20=2049827:=20CLOUD-1610:=20CloudConv=20-=20Regression:?= =?UTF-8?q?=20DAM:=20More=20menu=20does=20not=20disappear=20after=20first?= =?UTF-8?q?=20opening=20more=20link=20=20=20=20=20=20=20=20=20=20=20=20-?= =?UTF-8?q?=20Fixed=20el=20passed=20in=20for=20onEventUnhighlightRow=20in?= =?UTF-8?q?=20fnHideDetailPanel=20=20=20=20=20=20=20=20=20=20=20=20-=20Als?= =?UTF-8?q?o=20added=20hiding=20of=20more=20actions=20on=20mouseleave=20of?= =?UTF-8?q?=20more=20actions=20=20=20=2049834:=20SVN=20ignore=20patterns?= =?UTF-8?q?=20-=20"test"=20folder.=20=20=20=2049835:=20Merged=20BRANCHES/D?= =?UTF-8?q?EV/HEAD-BUG-FIX=20to=20BRANCHES/DEV/HEAD-QA=20=20=20=20=20=20?= =?UTF-8?q?=2049800:=20Fix=20to=20build.properties=20that=20got=20munged?= =?UTF-8?q?=20in=20rev=2049209.=20Fix=20to=20share-header=20that=20was=20h?= =?UTF-8?q?orribly=20merged=20to=20pull=20in=20code=20with=20dependencies?= =?UTF-8?q?=20that=20aren't=20present=20yet.=20Fix=20to=20login=20dialog?= =?UTF-8?q?=20width=20that=20hasn't=20made=20it=20over=20to=20this=20branc?= =?UTF-8?q?h=20for=20some=20reason.=20=20=20=2049872:=20Added=20name=20to?= =?UTF-8?q?=20logging=20of=20transformer=20registration=20=20=20=2049885:?= =?UTF-8?q?=20CLOUD-1626:=20CloudConv=20-=20Regression:=20Networks=20are?= =?UTF-8?q?=20not=20displayed=20via=20WebDav.=20=20=20=20Reinstated=20code?= =?UTF-8?q?=20that=20was=20originally=20part=20of=20THOR1=5FSPRINTS=20(r34?= =?UTF-8?q?168)=20but=20was=20lost=20as=20part=20of=20convergence=20work.?= =?UTF-8?q?=20=20=20=2049889:=20CLOUD-1669:=20upgrade=20jibx=20from=201.2.?= =?UTF-8?q?3=20to=201.2.5=20to=20allow=20full=20JDK7=20support=20=20=20=20?= =?UTF-8?q?49906:=20Merged=20BRANCHES/DEV/BELARUS/HEAD-QA-2013=5F04=5F22?= =?UTF-8?q?=20to=20BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20=2049794:=20ALF-?= =?UTF-8?q?18797=20:=20SPP:=20Check=20out=20action=20doesn't=20work=20for?= =?UTF-8?q?=20Document=20Workspace=20=20=20=20Merged=20but=20with=20minor?= =?UTF-8?q?=20bug=20fix.=20=20=20=2049908:=20CLOUD-1649:=20Added=20the=20m?= =?UTF-8?q?issing=20network=20menu=20for=20the=20public=20users.=20=20=20?= =?UTF-8?q?=2049916:=20Fix=20to=20User=20Factory=20bean=20setter=20to=20av?= =?UTF-8?q?oid:=20=20=20=20WARN=20=20[springframework.beans.GenericTypeAwa?= =?UTF-8?q?rePropertyDescriptor]=20[main]=20Invalid=20JavaBean=20property?= =?UTF-8?q?=20'userFactory'=20being=20accessed!=20Ambiguous=20write=20meth?= =?UTF-8?q?ods=20found=20next=20to=20actually=20used=20=20=20=2049917:=20M?= =?UTF-8?q?erged=20SHOULDERS=20to=20HEAD-QA=20=20=20=20=20=20=2048984:=20M?= =?UTF-8?q?inor=20UI=20fixes:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20-=20fix=20height=20of=20user=20status=20text-are?= =?UTF-8?q?a=20to=20be=20consistent=20across=20browsers=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20fix=20hover=20sty?= =?UTF-8?q?le=20and=20font=20size=20of=20user=20status=20text-area=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20fix?= =?UTF-8?q?=20login=20dialog=20width=20since=20Cloud=20merge=20=20=20=2049?= =?UTF-8?q?918:=20Fix=20for=20CLOUD-1571=20-=20CloudConv=20-=20Regression:?= =?UTF-8?q?=20My=20Sites=20dashet=20isn't=20loaded=20=20=20=2049919:=20Fix?= =?UTF-8?q?=20for=20CLOUD-1648=20-=20CloudConv=20-=20regression:=20cloud2h?= =?UTF-8?q?eadqa=20is=20not=20localized=20in=20any=20language=20=20=20=20?= =?UTF-8?q?=20-=20code=20for=20the=20login=20language=20drop-down=20refact?= =?UTF-8?q?ored=20to=20fit=20within=20login=20component=20rather=20than=20?= =?UTF-8?q?global=20function=20javascript=20=20=20=20=20-=20fixed=20to=20w?= =?UTF-8?q?ork=20since=20code=20convergence=20also=20=20=20=2049920:=20Fix?= =?UTF-8?q?=20for=20CLOUD-1584=20-=20CloudConv=20-=20Regression:=20Some=20?= =?UTF-8?q?dashlets=20should=20be=20absent=20on=20User/Site=20Dashboard=20?= =?UTF-8?q?=20=20=20=20-=20Disabled=20new=20dashlets=20(Site=20Search,=20S?= =?UTF-8?q?aved=20Search,=20My=20Discussions)=20because=20they=20are=20too?= =?UTF-8?q?=20exciting=20for=20the=20Cloud.=20=20=20=2049921:=20CLOUD-1669?= =?UTF-8?q?=20Switch=20-source=20and=20-target=20compilation=20parameters?= =?UTF-8?q?=20to=201.7=20=20=20=2049923:=20Fix=20to=20404=20error=20on=20l?= =?UTF-8?q?ogin=20page=20(visible=20in=20firebug=20etc.)=20=20=20=20Correc?= =?UTF-8?q?t=20list=20of=20image=20dependencies.=20=20=20=2049924:=20Fix?= =?UTF-8?q?=20for=20CLOUD-1629=20-=20CloudConv=20-=20Regression:=20It's=20?= =?UTF-8?q?impossible=20to=20remove=20the=20Welcome=20Widget=20on=20Site?= =?UTF-8?q?=20Dashboard=20=20=20=20=20-=20encoding=20of=20preference=20val?= =?UTF-8?q?ues=20must=20handle=20"."=20dot=20character=20or=20it=20ends=20?= =?UTF-8?q?up=20as=20nested=20preference!=20=20=20=2049927:=20Fix=20for=20?= =?UTF-8?q?CLOUD-1577=20-=20CloudConv=20-=20regression:Incorrect=20display?= =?UTF-8?q?=20of=20status=20message=20=20=20=2049928:=20Fix=20for=20CLOUD-?= =?UTF-8?q?1586=20-=20CloudConv=20-=20regression:The=20user=20is=20redirec?= =?UTF-8?q?ted=20to=20login=20page=20after=20clicking=20'Invite'=20button?= =?UTF-8?q?=20from=20Site=20members=20page=20=20=20=20=20-=20Button=20shou?= =?UTF-8?q?ld=20be=20disabled=20on=20Cloud=20(redirect=20is=20because=20on?= =?UTF-8?q?-premise=20Invite=20page=20is=20admin=20only!)=20-=20but=20patt?= =?UTF-8?q?ern=20to=20do=20so=20has=20changed=20since=20merge=20with=204.2?= =?UTF-8?q?.=20=20=20=2049931:=20WebDAV:=20exclusive=20lock=20could=20be?= =?UTF-8?q?=20obtained=20when=20shared=20lock=20already=20in=20place.=20?= =?UTF-8?q?=20=20=20In=20addition,=20the=20invalid=20lock=20state=20that?= =?UTF-8?q?=20was=20produced=20then=20led=20to=20a=20stack=20overflow=20du?= =?UTF-8?q?e=20to=20infinite=20loop.=20=20=20=2049933:=20Added=20svn:ignor?= =?UTF-8?q?e=20entires=20for=20build/pom.xml=20and=20root/privatemodules/t?= =?UTF-8?q?hor/config/log4j.properties=20=20=20=2049936:=20CLOUD-1600:=20C?= =?UTF-8?q?loudConv=20-=20regression:=20Cannot=20add=20a=20tag=20through?= =?UTF-8?q?=20inline=20edit=20option=20=20=20=20=20=20=20-=20Removed=20man?= =?UTF-8?q?datory=20validator=20=20=20=2049938:=20Merge=20V4.1-BUG-FIX=20t?= =?UTF-8?q?o=20HEAD-QA=20=20=20=20=20=20=2048904:=20BDE-109:=20generate=20?= =?UTF-8?q?coverage=20statistics=20from=20JaCoCo=20when=20running=20tests?= =?UTF-8?q?=20=20=20=20=20=20=2048925:=203rd=20party=20classpath=20refers?= =?UTF-8?q?=20to=20available=20mysql-connector-java-5.1.13-bin.jar=20=20?= =?UTF-8?q?=20=20=20=20=2049065:=20Limit=20coverage=20to=20org.alfresco=20?= =?UTF-8?q?classes,=20otherwise=20overhead=20is=20too=20big=20and=20tests?= =?UTF-8?q?=20too=20slow=20=20=20=20=20=20=2049474:=20MNT-8668=20Remove=20?= =?UTF-8?q?Maven=20declared=20dependency=20on=20addressing-1.0.mar=20=20?= =?UTF-8?q?=20=20=20=20=2049655:=20BDE-109=20new=20Ant=20task=20to=20gener?= =?UTF-8?q?ate=20JaCoCo=20report=20for=20test=20coverage=20=20=20=2049941:?= =?UTF-8?q?=20CLOUD-1668:=20CloudConv=20-=20Regression:=20Incorrect=20disp?= =?UTF-8?q?laying=20of=20default=20avatar=20on=20task=20section=20on=20doc?= =?UTF-8?q?ument's=20details=20page=20=20=20=20=20=20=20-=20Fixed=20avatar?= =?UTF-8?q?=20link=20=20=20=2049943:=20CLOUD-1661:=20CloudConv=20-=20Regre?= =?UTF-8?q?ssion:=20progress=20bar=20is=20absent=20in=20Storage=20section?= =?UTF-8?q?=20on=20Account=20Summary=20page=20=20=20=20=20=20=20-=20Brough?= =?UTF-8?q?t=20theme-bg-3,=20theme-bg-4,=20and=20theme-border-5=20CSS=20ov?= =?UTF-8?q?er=20from=20greyTheme=20to=20lightTheme=20=20=20=2049958:=20Spr?= =?UTF-8?q?ingSurf=20libs=20upgrade=20to=20r1257=20=20=20=20Updated=20Clou?= =?UTF-8?q?d=20share=20config=20overrides=20to=20remove=20values=20that=20?= =?UTF-8?q?are=20now=20the=20default=20in=20Surf=20(e.g.=20reconnect-timeo?= =?UTF-8?q?ut=20etc.)=20=20=20=2049965:=20Fix=20for=20CLOUD-1588=20-=20Clo?= =?UTF-8?q?udConv=20-=20Regression:=20"Download=20as=20Zip"=20option=20sho?= =?UTF-8?q?uld=20be=20absent=20=20=20=20=20-=20remove=20the=20lovely=20new?= =?UTF-8?q?=20Download=20as=20Zip=20feature=20from=20Cloud=20as=20it=20is?= =?UTF-8?q?=20Officially=20Too=20Exciting.=20=20=20=2049975:=20Fix=20for?= =?UTF-8?q?=20CLOUD-1663=20-=20CloudConv=20-=20Regression:=20Search=20quer?= =?UTF-8?q?y=20containing=20wildcards=20is=20partially=20cut=20off=20on=20?= =?UTF-8?q?the=20results=20page=20(encoding=20is=20not=20being=20applied)?= =?UTF-8?q?=20=20=20=2049977:=20CLOUD-1640:=20Fixed=20external=20user=20si?= =?UTF-8?q?te=20member=20visibility=20issue.=20=20=20=2050007:=20Fix=20to?= =?UTF-8?q?=20disallow=20change=20of=20own=20user=20role=20or=20removal=20?= =?UTF-8?q?in=20Site=20Member=20for=20the=20current=20user.=20=20=20=20500?= =?UTF-8?q?11:=20Activiti=20schema=20reference=20files=20ignore=20table=20?= =?UTF-8?q?column=20ordering=20(testing=20CLOUD-1675)=20=20=20=2050012:=20?= =?UTF-8?q?Reorganize=20repository=20database=20bootstrap=20beans=20to=20r?= =?UTF-8?q?egister=20scripts=20and=20patches=20with=20SchemaBootstrap=20(C?= =?UTF-8?q?LOUD-1675)=20=20=20=20=20-=20New=20Spring=20config=20file:=20al?= =?UTF-8?q?fresco/dbscripts/db-schema-context.xml=20=20=20=20=20-=20Split?= =?UTF-8?q?=20Repo,=20JPBM,=20AVM=20and=20Activiti=20scripts=20=20=20=2050?= =?UTF-8?q?013:=20Update=20module=20properties=20to=20reflect=20latest=20A?= =?UTF-8?q?lfresco=20stack=20requirement=20and=20set=20version=20to=202.0?= =?UTF-8?q?=20=20=20=2050014:=20Fixed=20CLOUD-1675:=20Upgrade=20failed=20f?= =?UTF-8?q?rom=20CLOUD1-BUG-FIX3=20to=20HEAD-QA=20=20=20=20=20-=20Use=20mo?= =?UTF-8?q?dule-friendly=20registration=20of=20create=20scripts=20=20=20?= =?UTF-8?q?=20=20-=20Note:=20Schema=20validation=20will=20report=20errors?= =?UTF-8?q?=20due=20to=202=20Cloud-specific=20tables=20in=20the=20'alf'=20?= =?UTF-8?q?schema=20namespace=20=20=20=2050018:=20CLOUD-1568:=20CloudConv?= =?UTF-8?q?=20-=20regression:created/modified=20time=20is=20not=20displaye?= =?UTF-8?q?d=20in=20Properties=20section=20=20=20=20=20=20=20-=20Added=20u?= =?UTF-8?q?nit=20test=20for=20combining=20default=20controls=20where=20a?= =?UTF-8?q?=20new=20data=20type=20is=20added,=20which=20was=20failing=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Fixed=20DefaultControlsConfigElement.comb?= =?UTF-8?q?ine=20method=20=20=20=2050023:=20Fix=20for=20CLOUD-1578=20-=20C?= =?UTF-8?q?loudConv=20-=20regression:=20Unable=20to=20join=20a=20site=20?= =?UTF-8?q?=20=20=20Fix=20for=20CLOUD-1579=20-=20CloudConv=20-=20Regressio?= =?UTF-8?q?n:=20It's=20impossible=20to=20perform=20"Leave=20Site"=20action?= =?UTF-8?q?=20by=20Site=20Member=20from=20Site=20Dashboard=20=20=20=205002?= =?UTF-8?q?7:=20BDE-150=20Create=20RPMs=20for=20Cloud=20deployment=20=20?= =?UTF-8?q?=20=2050028:=20ALF-18908:=20WebDAV=20litmus=20tests=20failing?= =?UTF-8?q?=20on=20HEAD-QA/CLOUD2=20=20=20=2050032:=20CLOUD-1624:=20CloudC?= =?UTF-8?q?onv=20-=20regression:=20Login=20button=20is=20missing=20on=20Qu?= =?UTF-8?q?ick=20Share=20page=20=20=20=20=20=20=20-=20Moved=20CSS=20loadin?= =?UTF-8?q?g=20to=20quickshare/header.get.html.ftl=20=20=20=2050039:=20CLO?= =?UTF-8?q?UD-1626:=20networks=20not=20displayed=20via=20WebDAV=20(fix=20f?= =?UTF-8?q?or=20PROPFIND)=20=20=20=2050040:=20CLOUD-1637=20/=20MNT-8462=20?= =?UTF-8?q?"Post"=20button=20works=20incorrectly=20=20=20=20=20=20=20-=20A?= =?UTF-8?q?dded=20check=20for=20response=20type=20of=20string=20to=20userS?= =?UTF-8?q?tatusUpdateSuccess=20and=20userStatusUpdateFailure=20since=20it?= =?UTF-8?q?'s=20already=20coming=20back=20as=20a=20JSON=20object=20=20=20?= =?UTF-8?q?=2050047:=20Add=20missing=20dependency=20on=20java-property-uti?= =?UTF-8?q?ls-1.6=20=20=20=2050048:=20BDE-150:=20fix=20RPMs=20=20=20=20500?= =?UTF-8?q?51:=20Fix=20for=20CLOUD-1664=20-=20CloudConv=20-=20Regression:?= =?UTF-8?q?=20New=20logo=20is=20not=20applied=20=20=20=20Fix=20for=20CLOUD?= =?UTF-8?q?-1580=20-=20CloudConv=20-=20Regression:=20It's=20impossible=20t?= =?UTF-8?q?o=20change=20the=20application=20theme=20=20=20=20=20-=20Fix=20?= =?UTF-8?q?to=20correctly=20handle=20"network=20admin"=20concept=20-=20man?= =?UTF-8?q?ually=20allow=20the=20network=20admin=20to=20perform=20admin=20?= =?UTF-8?q?actions=20where=20appropriate=20-=20AFAIK=20this=20can=20never?= =?UTF-8?q?=20have=20worked=20correctly...=20remove=20nonsense=20runas=3Da?= =?UTF-8?q?dmin=20webscripts=20overrides=20that=20don't=20work=20anyway.?= =?UTF-8?q?=20=20=20=20=20-=20Clean=20up=20of=20related=20scripts.=20=20?= =?UTF-8?q?=20=2050055:=20CLOUD-1607:=20filter=20sent-invites-min.js=20com?= =?UTF-8?q?ing=20from=20Enterprise=20build,=20so=20that=20it=20gets=20over?= =?UTF-8?q?ridden=20by=20the=20non-minimised=20cloud=20one=20=20=20=205007?= =?UTF-8?q?0:=20Temporarily=20adding=20exploded=20Ant=20build=20for=20clou?= =?UTF-8?q?d2=20environment.=20=20=20=20This=20now=20means=20the=20same=20?= =?UTF-8?q?steps=20for=20building=20a=20cloud1=20environment=20can=20be=20?= =?UTF-8?q?used=20to=20build=20a=20cloud2=20environment.=20=20=20=20NOTE:?= =?UTF-8?q?=20There=20is=20one=20outstanding=20licence=20issue=20to=20reso?= =?UTF-8?q?lve=20that=20will=20be=20fixed=20in=20a=20subsequent=20commit.?= =?UTF-8?q?=20=20=20=2050088:=20Remove=20unused=20or=20duplicate=20MyBatis?= =?UTF-8?q?=20config=20(CLOUD-1672)=20=20=20=2050090:=20CLOUD-1672:=20Clou?= =?UTF-8?q?dConv:=20MyBatis=20error=20when=20downloadCleanerJob=20is=20run?= =?UTF-8?q?=20=20=20=20=20-=20Cloud=20was=20duplicating=20the=20MyBatis=20?= =?UTF-8?q?configuration=20=20=20=20=20-=20Created=20Cloud-specific=20SQL?= =?UTF-8?q?=20templates=20=20=20=20=20-=20Tested=20using=20sign=20ups=20an?= =?UTF-8?q?d=20general=20use=20but=20full=20account=20and=20tenant=20usage?= =?UTF-8?q?=20needs=20to=20be=20tested=20=20=20=2050092:=20CLOUD-1591:=20C?= =?UTF-8?q?loudConv=20-=20Regression:=20Incorrect=20layout=20of=20"Link=20?= =?UTF-8?q?to=20Rule=20Set"=20page=20=20=20=20=20=20=20-=20Made=20the=20mo?= =?UTF-8?q?re=20specific=20rules-picker=20treeview=20width=20override=20li?= =?UTF-8?q?ghtTheme's=20overriding=20treeview=20width=20=20=20=2050094:=20?= =?UTF-8?q?Fixes=20for=20exploded=20Ant=20build.=20=20=20=2050097:=20Added?= =?UTF-8?q?=20ignore=20of=20projects/web-client/source/web/images/logo/alf?= =?UTF-8?q?resco=5Fenterprise.gif=20which=20is=20apparently=20moved=20from?= =?UTF-8?q?=20elsewhere=20during=20some=20build=20step=20=20=20=2050099:?= =?UTF-8?q?=20CLOUD-1614:=20CloudConv=20-=20Regression:=20Incorrect=20labe?= =?UTF-8?q?l=20"Start=20workflow"=20displays=20instead=20of=20"Create=20Ta?= =?UTF-8?q?sk"=20=20=20=20=20=20=20-=20Added=20page.startWorkflow.title=20?= =?UTF-8?q?to=20cloud=20localization=20files=20=20=20=2050101:=20BDE-154:?= =?UTF-8?q?=20upgrade=20urlrewritefilter=20to=204.0.4,=20avoiding=20compil?= =?UTF-8?q?ation=20warning=20=20=20=2050102:=20CLOUD-1602:=20CloudConv=20-?= =?UTF-8?q?=20Regression=20-=20Chrome=20specific:=20Close=20(X)=20button?= =?UTF-8?q?=20doesn't=20work=20on=20"Alfresco=20Cloud=20information"=20win?= =?UTF-8?q?dow=20=20=20=20=20=20=20-=20Removed=20committed=20minified=20ab?= =?UTF-8?q?out-share-min.js=20and=20ant=20touch=20command=20which=20kept?= =?UTF-8?q?=20it=20in=20place=20=20=20=2050107:=20Merged=20HEAD-BUG-FIX=20?= =?UTF-8?q?to=20HEAD-QA=20(4.2)=20for=20CLOUD-1466:=20stop=20relying=20on?= =?UTF-8?q?=20a=20patched=20version=20of=20wss4j=20=20=20=20=20=20=2049973?= =?UTF-8?q?:=20Merged=20DEV=20to=20HEAD-BUG-FIX=20(4.2)=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2049648:=20MNT-8652=20Treat=20PasswordText=20as=20def?= =?UTF-8?q?ault=20for=20CMIS=20Web=20Service=20authentication=20(using=20p?= =?UTF-8?q?atched=20version=20of=20wss4j)=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20Execute=20PasswordTypeInterceptor=20before=20WSS?= =?UTF-8?q?4JInInterceptor=20to=20add=20PasswordText=20type=20as=20default?= =?UTF-8?q?=20if=20Password=20element=20misses=20it.=20Add=20system=20test?= =?UTF-8?q?=20for=20case.=20=20=20=20=20=20=2050076:=20Follow-up=20on=20MN?= =?UTF-8?q?T-8652:=20rename=20CXFAuthenticationTest=20into=20CXFAuthentica?= =?UTF-8?q?tionSystemTest,=20so=20that=20it=20is=20not=20executed=20in=20w?= =?UTF-8?q?eb-service-client=20tests,=20but=20only=20in=20system-build-tes?= =?UTF-8?q?t=20=20=20=2050109:=20Fix=20to=20issue=20where=20application=20?= =?UTF-8?q?logo=20was=20resized=20and=20broke=20aspect=20ratio=20of=20uplo?= =?UTF-8?q?aded=20image.=20Also=20changed=20size=20to=20valid=20for=20new?= =?UTF-8?q?=20header.=20=20=20=2050113:=20Fix=20for=20CLOUD-1576=20-=20Clo?= =?UTF-8?q?udConv=20-=20Regression:=20Incorrect=20notification=20is=20disp?= =?UTF-8?q?layed=20when=20Site=20Admin=20performs=20"Leave=20Site"=20actio?= =?UTF-8?q?n=20=20=20=2050114:=20Fix=20for=20CLOUD-1662=20-=20CloudConv=20?= =?UTF-8?q?-=20Regression:=20Incorrect=20behavior=20when=20searching=20wit?= =?UTF-8?q?h=20empty=20field=20=20=20=20=20-=20trim=20searchbox=20text=20b?= =?UTF-8?q?efore=20event=20publication=20=20=20=2050116:=20Cleanup=20of=20?= =?UTF-8?q?copy/pasted=20files...=20=20=20=2050117:=20Merged=20BRANCHES/DE?= =?UTF-8?q?V/V4.1-BUG-FIX=20to=20BRANCHES/DEV/HEAD-QA=20=20=20=20=20=20=20?= =?UTF-8?q?47811:=20ALF-18245=20-=20BM-0013:=20Soak:=20Run=2006:=20Search?= =?UTF-8?q?=20population=20of=20ScriptNode=20is=20expensive:=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20Refactor=20Share=20search=20UI=20?= =?UTF-8?q?and=20REST=20API=20to=20provide=20server-side=20paging.=20=20?= =?UTF-8?q?=20=2050122:=20MNT-8480=20-=20cloud=20sync=20and=20revert=20=20?= =?UTF-8?q?=20=2050126:=20BDE-150=20Add=20build=20number=20as=20RPM=20rele?= =?UTF-8?q?ase=20property=20=20=20=2050150:=20Merged=20V4.1-BUG-FIX=20(4.1?= =?UTF-8?q?.5)=20to=20HEAD-QA=20(4.2)=20=20=20=20=20=20=20<<=20MNT-8721=20?= =?UTF-8?q?Security=20fix=20from=204.1.4.2=20>>=20=20=20=20=20=20=20<<=20M?= =?UTF-8?q?erge=20direct=20from=20V4.1-BUG-FIX=20rather=20than=20HEAD-BUG-?= =?UTF-8?q?FIX=20as=20r49633=20was=20merged=20with=20a=20block=20of=20othe?= =?UTF-8?q?r=20changes=20>>=20=20=20=20=20=20=2049633:=20Merged=20DEV=20to?= =?UTF-8?q?=20V4.1-BUG-FIX=20(4.1.5)=20=20=20=20=20=20=20=20=20=2049574:?= =?UTF-8?q?=20MNT-8473:=20Share's=20workflow-details=20page=20exposes=20al?= =?UTF-8?q?l=20workflow=20instances=20to=20everyone=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20Introduce=20WorkflowPermissionInterceptor=20that=20che?= =?UTF-8?q?ck=20if=20current=20user=20allowed=20to=20perform=20operation.?= =?UTF-8?q?=20=20=20=20=20=20=2049752:=20MNT-8473:=20Share's=20workflow-de?= =?UTF-8?q?tails=20page=20exposes=20all=20workflow=20instances=20to=20ever?= =?UTF-8?q?yone=20=20=20=20=20=20=20=20=20=20Fix=20errors=20that=20were=20?= =?UTF-8?q?found=20during=20unit=20testing.=20=20=20=2050153:=20ALF-18708:?= =?UTF-8?q?=20Merged=20V4.1-BUG-FIX=20to=20HEAD-QA=20=20=20=20=20=20=20<>=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2050151:=20MNT-8866:=20Merge=20V4.1.4=20(4.1.4.4)=20to=20V4?= =?UTF-8?q?.1-BUG-FIX=20(4.1.5)=20=20=20=20=20=20=20=20=20=20=20=20=204980?= =?UTF-8?q?2:=20MNT-8725:=20CLONE=20-=20Security=20context=20for=20Alfresc?= =?UTF-8?q?o=20Explorer=20is=20not=20being=20cleaned=20up=20after=20proces?= =?UTF-8?q?sing=20a=20request=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20JSF=20phase=20listener,=20which=20cleans=20up=20security=20c?= =?UTF-8?q?ontext=20for=20Alfresco=20Explorer=20requests.=20It=20is=20nece?= =?UTF-8?q?ssary=20for=20avoiding=20sharing=20of=20security=20context=20be?= =?UTF-8?q?tween=20Alfresco=20Explorer=20and=20CMIS=20services,=20based=20?= =?UTF-8?q?on=20OpenCMIS=20libraries=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2049803:=20MNT-8725:=20CLONE=20-=20Security=20context=20for=20?= =?UTF-8?q?Alfresco=20Explorer=20is=20not=20being=20cleaned=20up=20after?= =?UTF-8?q?=20processing=20a=20request=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20Configuration=20part=20of=20the=20fix=20has=20been?= =?UTF-8?q?=20reversed=20=20=20=20=20=20=20=20=20=20=20=20=2049804:=20MNT-?= =?UTF-8?q?8725:=20CLONE=20-=20Security=20context=20for=20Alfresco=20Explo?= =?UTF-8?q?rer=20is=20not=20being=20cleaned=20up=20after=20processing=20a?= =?UTF-8?q?=20request=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20JSF?= =?UTF-8?q?=20phase=20listener,=20which=20cleans=20up=20security=20context?= =?UTF-8?q?=20for=20Alfresco=20Explorer=20requests.=20It=20is=20necessary?= =?UTF-8?q?=20for=20avoiding=20sharing=20of=20security=20context=20between?= =?UTF-8?q?=20Alfresco=20Explorer=20and=20CMIS=20services,=20based=20on=20?= =?UTF-8?q?OpenCMIS=20libraries=20=20=20=2050164:=20Merged=20V4.1-BUG-FIX?= =?UTF-8?q?=20to=20HEAD-QA=20=20=20=20=20=20=20<<=20Priority=20for=20trans?= =?UTF-8?q?former.remote.alfresco.=20Includes=20JMX=20controls=20for=20the?= =?UTF-8?q?=20Transformers=20subsystem=20>>=20=20=20=20=20=20=2049038:=20M?= =?UTF-8?q?NT-7158=20Merge=20DEV=20to=20HEAD-BUF-FIX=20(4.2)=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Addition=20of=20TransformerConfigMBeam=20?= =?UTF-8?q?(JMX=20bean)=20to=20control=20transformers=20dynamically=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20Transformer=20level=20config=20limi?= =?UTF-8?q?ts=20are=20now=20a=20default=20for=20mimetype=20specific=20valu?= =?UTF-8?q?es.=20Possible=20now=20that=20we=20don't=20have=20these=20in=20?= =?UTF-8?q?the=20Spring=20config.=20=20=20=20=20=20=20=20=20=20=20=20previ?= =?UTF-8?q?ously=20had=20been=20'combined'=20which=20was=20not=20too=20cle?= =?UTF-8?q?ar.=20Also=20added=20system=20wide=20mimetype=20defaults.=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20All=20transformers=20are=20now=20'k?= =?UTF-8?q?nown'=20to=20the=20content=20transformer=20registry=20-=20not?= =?UTF-8?q?=20just=20the=20ones=20that=20may=20be=20selected.=20i.e=20it?= =?UTF-8?q?=20knows=20about=20the=20component=20transformers.=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20TransformerSelector=20now=20round=20robin?= =?UTF-8?q?s=20all=20equal=20priority=20transformers=20until=20they=20reac?= =?UTF-8?q?h=20their=20thresholds,=20rather=20than=20doing=20so=20for=20ea?= =?UTF-8?q?ch=20one=20in=20turn.=20=20=20=20=20=20=2049135:=20MNT-7158=20I?= =?UTF-8?q?nvestigating=20adding=20priorities=20to=20transformers=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20-=20Changes=20to=20make=20it=20possible=20?= =?UTF-8?q?to=20check=20debugTransformer.txt=20output=20in=204.1.5=20again?= =?UTF-8?q?st=204.2=20=20=20=20=20=20=2049190:=20MNT-7158=20fix=20build=20?= =?UTF-8?q?failure=20testGetMaxSourceSizeKBytesPageSupports=20=20=20=20=20?= =?UTF-8?q?=20=2049207:=20MNT-7158=20Investigating=20adding=20priorities?= =?UTF-8?q?=20to=20transformers=20=20=20=20=20=20=20=20=20=20-=20Modified?= =?UTF-8?q?=20priorities=20so=20that=20it=20is=20now=20deterministic=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20Try=20as=20sourceMimetype=20of=20?= =?UTF-8?q?00=20in=20JMX=20op=20getTransformationsByExtension=20to=20doubl?= =?UTF-8?q?e=20check=20=20=20=20=20=20=20=20=20=20-=20Changed=20default=20?= =?UTF-8?q?priorities=205=20and=2010=20to=2050=20and=20100=20for=20EXPLICI?= =?UTF-8?q?T=20and=20DEFAULT=20to=20give=20more=20room=20in=20the=20future?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20Combined=20transformer.comple?= =?UTF-8?q?x.AdobeIllustrator.Image=20with=20transformer.complex.PDF.Image?= =?UTF-8?q?=20as=20they=20were=20the=20same=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20except=20for=20the=20transformer=20settings=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20TransformerDebug=20now=20uses=20[---]=20a?= =?UTF-8?q?s=20the=20priority=20for=20compound=20transformers=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20TransformerDebug=20now=20includes=20Compo?= =?UTF-8?q?nent=20in=20the=20type=20of=20compound=20transformers=20e.g.=20?= =?UTF-8?q?fred<>=20=20=20=20=20=20=2049947:=20MNT-7158?= =?UTF-8?q?=20Investigating=20adding=20priorities=20to=20transformers=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20-=20Added=20limits=20based=20on=20us?= =?UTF-8?q?e.=20So=20a=20limit=20may=20be=20set=20for=20"index",=20"doclib?= =?UTF-8?q?",=20"webpreview",=20"syncRule",=20"asyncRule"=20...=20=20=20?= =?UTF-8?q?=20=20=20=2049985:=20MNT-7158=20Investigating=20adding=20priori?= =?UTF-8?q?ties=20to=20transformers=20=20=20=20=20=20=20=20=20=20-=20Allow?= =?UTF-8?q?=20/shared/classes/alfresco-global.properties=20to=20be?= =?UTF-8?q?=20used=20in=20transformers.=20=20=20=20=20=20=2050002:=20MNT-7?= =?UTF-8?q?158=20Investigating=20adding=20priorities=20to=20transformers?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20Missing=20file=20=20=20=20=20?= =?UTF-8?q?=20=2050061:=20MNT-7158=20Investigating=20adding=20priorities?= =?UTF-8?q?=20to=20transformers=20=20=20=20=20=20=20=20=20=20-=20Set=20up?= =?UTF-8?q?=20remote=20transformations=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20BinaryPassThrough.priority=3D20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20remote.alfresco.priority=3D30=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20remoteServer.priority=3D40=20=20=20=20=20=20?= =?UTF-8?q?=2050143:=20MNT-7158=20Investigating=20adding=20priorities=20to?= =?UTF-8?q?=20transformers=20=20=20=20=20=20=20=20=20=20-=20Show=20default?= =?UTF-8?q?=20values=20in=20getProperties,=20comment=20out=20values=20set?= =?UTF-8?q?=20to=20defaults=20and=20add=20under=20line=20transformer=20nam?= =?UTF-8?q?e=20=20=20=2050166:=20Merged=20V4.1-BUG-FIX=20to=20HEAD-QA=20?= =?UTF-8?q?=20=20=20=20=20=20<<=20Two=204.1.4.4=20hot=20fixes=20>>=20=20?= =?UTF-8?q?=20=20=20=20=2050165:=20Merged=20V4.1-BUG-FIX=20(4.1.5)=20to=20?= =?UTF-8?q?HEAD-BUG-FIX=20(4.2)=20=20=20=20=20=20=20=20=20=2050110:=20MNT-?= =?UTF-8?q?8844=20-=20CSRFFilter=20disables=20https=20login=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2050158:=20MNT-8870:=20Merge=20V4.1.4=20(4.1.4.4)?= =?UTF-8?q?=20to=20V4.1-BUG-FIX=20(4.1.5)=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2050120:=20MNT-8858:=20AJAX=20Servlet=20does=20not=20clean?= =?UTF-8?q?=20up=20security=20context=20after=20processing=20a=20request?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Modification=20?= =?UTF-8?q?for=20cleaning=20up=20security=20context=20after=20processing?= =?UTF-8?q?=20an=20AJAX=20request=20to=20'org.alfresco.web.app.servlet.aja?= =?UTF-8?q?x.AjaxServlet'=20=20=20=2050169:=20CLOUD-1641:=20Made=20people-?= =?UTF-8?q?finder=20to=20use=20CannedQuery=20rather=20than=20Solr.=20=20?= =?UTF-8?q?=20=2050173:=20Fix=20for=20CLOUD-1587=20-=20CloudConv=20-=20Reg?= =?UTF-8?q?ression:=20Advanced=20Search=20link=20should=20be=20unavailable?= =?UTF-8?q?.=20=20=20=2050174:=20Fix=20for=20CLOUD-1608=20-=20CloudConv=20?= =?UTF-8?q?-=20Regression:=20Changing=20roles=20of=20site=20members=20is?= =?UTF-8?q?=20displayed=20only=20after=20page=20refresh=20=20=20=20Fix=20f?= =?UTF-8?q?or=20ALF-18534=20-=20Changing=20roles=20of=20site=20members=20i?= =?UTF-8?q?s=20displayed=20only=20after=20page=20refresh=20=20=20=2050176:?= =?UTF-8?q?=20Fix=20for=20CLOUD-1592=20-=20CloudConv=20-=20Regression:=20C?= =?UTF-8?q?ontent=20I'm=20Editing=20dashlet=20contains=20redundant=20info?= =?UTF-8?q?=20(about=20blogs,=20wiki,=20forum)=20=20=20=2050177:=20CLOUD-1?= =?UTF-8?q?689:=20CloudConv=20-=20Regression:Networks=20are=20not=20displa?= =?UTF-8?q?yed=20via=20SPP=20=20=20=2050182:=20ALF-18702=20:=20Tenant=20is?= =?UTF-8?q?n't=20able=20to=20log=20in=20Share=20once=20another=20tenant=20?= =?UTF-8?q?has=20logged=20in=20before.=20=20=20=20Fix=20for=20clearing=20t?= =?UTF-8?q?enant=20user=20domain=20and=20authentication=20context=20after?= =?UTF-8?q?=20the=20Repository=20webscript=20is=20executed.=20=20=20=20Cop?= =?UTF-8?q?ied=20the=20TenantLeakLogger=20from=20CLOUD=20to=20HEAD=20into?= =?UTF-8?q?=20org.alfresco.web.app.servlet=20package.=20=20=20=2050183:=20?= =?UTF-8?q?CLOUD-1606,=20CLOUD-1459:=20Fixed=20the=20permissions=20issue?= =?UTF-8?q?=20for=20the=20get=20preferences=20in=20the=20MailActionExecute?= =?UTF-8?q?r.=20=20=20=2050184:=20Changed=20default=20Cloud=20Share=20Haze?= =?UTF-8?q?lcast=20config=20to=20empty=20IP=20list=20rather=20than=20promi?= =?UTF-8?q?scuous=20multicast=20-=20which=20was=20much=20too=20saucy!=20?= =?UTF-8?q?=20=20=2050185:=20XSS=20attack=20hardening=20-=20incorrect=20us?= =?UTF-8?q?e=20of=20=3Fjs=5Fstring=20for=20safe=20HTML=20element=20IDs=20-?= =?UTF-8?q?=20should=20be=20=3Fhtml=20=20=20=2050197:=20Code=20tidy=20=20?= =?UTF-8?q?=20=2050200:=20ALF-18957:=20SchemaReferenceFileTest=20failing?= =?UTF-8?q?=20on=20Oracle=20=20=20=20Updated=20ACT=20schema-reference=20fi?= =?UTF-8?q?le=20for=20Oracle.=20=20=20=2050203:=20Fix=20for=20CLOUD-1613?= =?UTF-8?q?=20-=20CloudConv=20-=20Regression:=20CLONE:=20Under=20selected?= =?UTF-8?q?=20Item=20menu=20the=20manage=20permission=20should=20be=20hidd?= =?UTF-8?q?en=20=20=20=2050208:=20Fix=20CLOUD-1660=20-=20CloudConv=20-=20R?= =?UTF-8?q?egression:=20Incorrect=20layout=20of=20tag=20icon=20on=20Search?= =?UTF-8?q?=20result=20page=20=20=20=2050211:=20Fix=20to=20(unreported=3F)?= =?UTF-8?q?=20issue=20where=20Colleagues=20dashlet=20would=20not=20show=20?= =?UTF-8?q?the=20user=20status=20relative=20time=20-=20showed=20empty=20va?= =?UTF-8?q?lue=20in=20brackets=20()=20=20=20=2050215:=20DEVOPS-3172,=20CLO?= =?UTF-8?q?UD-1701:=20cloud2/HEAD-QA=20unable=20to=20startup=20in=20DP=20e?= =?UTF-8?q?nvironment.=20=20=20=2050227:=20CLOUD-1612:=20CloudConv=20-=20R?= =?UTF-8?q?egression:=20Incorrect=20location=20of=20help=20icon=20for=20"M?= =?UTF-8?q?essage"=20field=20on=20"Create=20Task"=20page=20=20=20=20=20=20?= =?UTF-8?q?=20-=20Moved=20rendering=20of=20help=20element=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Added=20CSS=20for=20desired=20positioning=20=20=20=20?= =?UTF-8?q?50245:=20Merged=20BRANCHES/DEV/HEAD-BUG-FIX=20to=20BRANCHES/DEV?= =?UTF-8?q?/HEAD-QA:=20=20=20=20=20=20=2050240:=20Merged=20BRANCHES/DEV/V4?= =?UTF-8?q?.1-BUG-FIX=20to=20BRANCHES/DEV/HEAD-BUG-FIX:=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2050221:=20Merged=20DEV=20to=20V4.1-BUG-FIX=20(?= =?UTF-8?q?4.1.5)=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2050030:?= =?UTF-8?q?=20Attempt=20a=20workaround=20for=20MNT-8704:=20WebDAV:Content?= =?UTF-8?q?=20does=20not=20disappear=20after=20being=20deleted=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Deprecate=20vario?= =?UTF-8?q?us=20methods=20related=20to=20the=20existing=20WebDAV=20use=20o?= =?UTF-8?q?f=20sys:hidden=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Put=20in=20a=20timer=20task=20on=20use=20of=20the=20s?= =?UTF-8?q?ys:hidden=20aspect=20in=20WebDAV=20DeleteMethod=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=2050093:=20MNT-8704:=20WebDAV?= =?UTF-8?q?:Content=20does=20not=20disappear=20after=20being=20deleted=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20"if=20(!fil?= =?UTF-8?q?eFolderService.isHidden(nodeRef))"=20block=20was=20moved=20to?= =?UTF-8?q?=20deleteHackRunAs.doWork().=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2050187:=20MNT-8704:=20added=20node=20existence?= =?UTF-8?q?=20check;=20unhiding=20node=20prior=20to=20deletion.=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20As=20per=20Derek's=20?= =?UTF-8?q?comment:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20http?= =?UTF-8?q?s://issues.alfresco.com/jira/browse/MNT-8704=3FfocusedCommentId?= =?UTF-8?q?=3D227689&page=3Dcom.atlassian.jira.plugin.system.issuetabpanel?= =?UTF-8?q?s:comment-tabpanel#comment-227689=20=20=20=2050251:=20CLOUD-170?= =?UTF-8?q?2:=20Fixed=20NPE=20in=20WorkflowPermissionInterceptor,=20also?= =?UTF-8?q?=20fixed=20the=20issue=20that=20when=20the=20invitee=20tries=20?= =?UTF-8?q?to=20click=20on=20the=20link=20in=20the=20invitation=20email,?= =?UTF-8?q?=20'org.alfresco.service.cmr.security.NoSuchPersonException'=20?= =?UTF-8?q?is=20thrown.=20=20=20=2050298:=20Fixed=20the=20failing=20unit?= =?UTF-8?q?=20tests=20as=20a=20result=20of=20the=20newly=20added=20Workflo?= =?UTF-8?q?wPermissionInterceptor.=20=20=20=2050306:=20Fix=20to=20merge=20?= =?UTF-8?q?causing=20ALF-18979=20-=20Activiti=20servlet=20references=20on?= =?UTF-8?q?=20by=20default=20in=20web.xml=20=20=20=20Removed=20duplicated?= =?UTF-8?q?=20class=20now=20that=20the=20LoggerFilter=20is=20part=20of=20c?= =?UTF-8?q?ode=20webclient=20code=20=20=20=2050311:=20MNT-8890:=20Commente?= =?UTF-8?q?d=20the=20newly=20added=20method=20in=20TenantRepositoryContain?= =?UTF-8?q?er=20in=20order=20to=20fix=20the=20failing=20unit=20tests.=20?= =?UTF-8?q?=20=20=2050318:=20Generate=20a=20jar=20of=20tests=20for=20alfre?= =?UTF-8?q?sco-cloud,=20for=20consumption=20by=20QA=20tests=20later=20=20?= =?UTF-8?q?=20=2050322:=20Fix=20for=20CLOUD-1657=20-=20CloudConv=20-=20Reg?= =?UTF-8?q?ression:=20Admin=20section=20in=20the=20Header=20should=20be=20?= =?UTF-8?q?located=20in=20the=20user's=20menu=20having=20name=20"Account?= =?UTF-8?q?=20settings"=20=20=20=2050335:=20ALF-18702=20:=20Tenant=20isn't?= =?UTF-8?q?=20able=20to=20log=20in=20Share=20once=20another=20tenant=20has?= =?UTF-8?q?=20logged=20in=20before.=20=20=20=20Fixed=20failing=20JUnit=20t?= =?UTF-8?q?ests.=20=20=20=20Reverted=2050311=20revision.=20=20=20=2050337:?= =?UTF-8?q?=20CLOUD-1699:=20Cloud=20example=20content=20thumbnails=20-=20s?= =?UTF-8?q?ome=20have=20the=20wrong=20width=20and=20look=20rubbish=20in=20?= =?UTF-8?q?doclib/search=20results=20=20=20=20=20=20=20-=20Added=20new=20v?= =?UTF-8?q?ersions=20of=20doclib=20for=20Data=20Sheets=20to=20sampleConten?= =?UTF-8?q?t.acp=20=20=20=20=20=20=20-=20Added=20doclib=20and=20imgpreview?= =?UTF-8?q?=20for=20all=20content=20in=20sampleContent.acp=20except=20'Alf?= =?UTF-8?q?resco=20Cloud=20Intro.mp4'=20=20=20=2050345:=20ALF-18702=20:=20?= =?UTF-8?q?Tenant=20isn't=20able=20to=20log=20in=20Share=20once=20another?= =?UTF-8?q?=20tenant=20has=20logged=20in=20before.=20=20=20=20Fixed=20fail?= =?UTF-8?q?ing=20JUnit=20tests.=20=20=20=2050352:=20Fix=20for=20CLOUD-1691?= =?UTF-8?q?=20-=20Incorrect=20notification=20when=20leaving=20name=20field?= =?UTF-8?q?=20empty=20through=20inline=20edit=20=20=20=20=20-=20fixes=20th?= =?UTF-8?q?e=20issues=20where;=20length=20validator=20not=20fired,=20order?= =?UTF-8?q?=20of=20validators=20wrong=20for=20cm:name=20inline=20editor,?= =?UTF-8?q?=20fixes=20issue=20where=20previously=20validation=20would=20st?= =?UTF-8?q?ill=20be=20shown=20on=20reedit=20of=20field=20after=20Cancel=20?= =?UTF-8?q?<<=20hat=20tip=20to=20Mr=20Draper=20for=20validation=20solution?= =?UTF-8?q?=20=20=20=2050353:=20Fix=20for=20CLOUD-1604=20-=20CloudConv=20-?= =?UTF-8?q?=20regression:=20Links=20on=20"Oops=20page"=20should=20be=20hig?= =?UTF-8?q?hlited.=20=20=20=20=20-=20also=20removed=20duplicate=20messages?= =?UTF-8?q?=20and=20cleaned=20up=20message=20text=20from=20the=20late=2090?= =?UTF-8?q?'s.=20=20=20=2050356:=20Fixed=20CLOUD-1697:=20URL=20rewrite=20f?= =?UTF-8?q?ilter=20upgrade=20causes=20additional=20logging=20=20=20=205035?= =?UTF-8?q?7:=20Fixed=20the=20failing=20unit=20tests=20which=20were=20fail?= =?UTF-8?q?ing=20as=20a=20result=20of=20rev:=2050335=20commit.=20=20=20=20?= =?UTF-8?q?50374:=20Revert=20r50182=20and=20the=20subsequent=20changes=20m?= =?UTF-8?q?ade=20to=20fix=20the=20fallout:=20r50311,=20r50335,=20r50345,?= =?UTF-8?q?=20and=20r50357=20=20=20=2050379:=20CLOUD-1669:=20update=20Ecli?= =?UTF-8?q?pse=20JibX=20launchers=20with=20the=20upgraded=20JibX=201.2.5?= =?UTF-8?q?=20jars=20=20=20=2050390:=20Revert=20the=20part=20of=20r50306?= =?UTF-8?q?=20that=20updated=20enterprise-web-scripts-application-context.?= =?UTF-8?q?xml=20and=20deleted=20TenantLeakLogger.java.=20=20=20=20This=20?= =?UTF-8?q?was=20necessary=20following=20the=20reverts=20that=20took=20pla?= =?UTF-8?q?ce=20at=20r50374.=20=20=20=2050396:=20Corrected=20name=20of=20c?= =?UTF-8?q?ontent=20transform=20test=20class=20file.=20=20=20=2050397:=20A?= =?UTF-8?q?dded=20new=20"transform"=20folder=20(which=20should=20have=20be?= =?UTF-8?q?en=20there=20before)=20=20=20=2050398:=20Move=20content=20trans?= =?UTF-8?q?form=20test=20class=20file=20into=20the=20new=20"transform"=20f?= =?UTF-8?q?older.=20=20=20=2050401:=20-=20Added=20two=20Eclipse=20projects?= =?UTF-8?q?:=20one=20for=20the=20thor=20private=20module=20("Alfresco=20Cl?= =?UTF-8?q?oud")=20and=20one=20for=20its=20dependencies=20("Cloud=20Depend?= =?UTF-8?q?encies").=20=20=20=20-=20Turned=20the=20JiBX=20builder=20on=20b?= =?UTF-8?q?y=20default=20in=20the=20data-model=20project.=20=20=20=2050410?= =?UTF-8?q?:=20MNT-8890:=20split=20classpath=20when=20executing=20JUnit=20?= =?UTF-8?q?tests=20in=20Ant,=20so=20that=20repository=20tests=20do=20not?= =?UTF-8?q?=20get=20classes=20of=20upstream=20projects=20=20=20=2050411:?= =?UTF-8?q?=20MNT-8890=20follow-up=20=20=20=20=20-=20make=20enterprise=20r?= =?UTF-8?q?epository=20tests=20run=20with=20a=20reduced=20classpath=20too,?= =?UTF-8?q?=20otherwise=20EntRepoCacheStopTest=20fails=20=20=20=20=20-=20a?= =?UTF-8?q?dd=20wdrdeployment=20classes=20to=20reduced=20classpath,=20othe?= =?UTF-8?q?rwise=20enterprise=20tests=20cannot=20find=20alfresco/bootstrap?= =?UTF-8?q?/deployedSpace.xml=20=20=20=2050416:=20Removed=20unused=20compo?= =?UTF-8?q?nent=20(no=20longer=20required=20in=204.2=20so=20the=20override?= =?UTF-8?q?=20isn't=20required)=20=20=20=2050417:=20Dialog=20styling=20twe?= =?UTF-8?q?aks=20=20=20=2050422:=20Merged=20BRANCHES/DEV/FEATURES/CLOUD1-S?= =?UTF-8?q?ECURITY=20to=20BRANCHES/DEV/HEAD-QA=20=20=20=20=20=20=2050409:?= =?UTF-8?q?=20Fix=20for=20CLOUD-1721=20=20=20=2050473:=20CLOUD-1726=20CLOU?= =?UTF-8?q?D-1732:=20move=20tests=20CMISChangeLogServiceTest=20and=20Subsy?= =?UTF-8?q?stemsTest=20from=20repository=20to=20remote-api,=20because=20th?= =?UTF-8?q?ey=20depend=20on=20resources=20in=20remote-api=20(follow-up=20o?= =?UTF-8?q?f=20MNT-8890)=20=20=20=2050474:=20CLOUD-1736=20Shouldn't=20have?= =?UTF-8?q?=20tweaked=20the=20classpath=20of=20system-build-test,=20since?= =?UTF-8?q?=20it=20already=20has=20its=20own=20(follow-up=20of=20MNT-8890)?= =?UTF-8?q?=20=20=20=2050479:=20ALF-18927:=20SPP:=20Incorrect=20informatio?= =?UTF-8?q?n=20is=20displayed=20on=20Event=20Information=20window=20for=20?= =?UTF-8?q?yearly=20recurrect=20event=20=20=20=20BYMONTHDAY=20shouldn't=20?= =?UTF-8?q?be=20deleted=20for=20YEARLY=20recurrence.=20=20=20=20Also=20set?= =?UTF-8?q?ting=20interval=20was=20not=20accurate.=20=20=20=2050480:=20ALF?= =?UTF-8?q?-18927:=20SPP:=20Incorrect=20information=20is=20displayed=20on?= =?UTF-8?q?=20Event=20Information=20window=20for=20yearly=20recurrect=20ev?= =?UTF-8?q?ent=20=20=20=20Additional=20check=20in.=20=20=20=2050485:=20Fix?= =?UTF-8?q?es=20ALF-18702:=20Corrected=20the=20logic=20for=20how=20tenant?= =?UTF-8?q?=20switching=20is=20achieved=20so=20that=20both=20Enterprise=20?= =?UTF-8?q?and=20Cloud=20scenarios=20are=20catered=20for.=20=20=20=2050495?= =?UTF-8?q?:=20Fix=20for=20ALF-18981=20-=20Non-ASCII=20characters=20are=20?= =?UTF-8?q?not=20displayed=20in=20Share=20interface=20correctly=20=20=20?= =?UTF-8?q?=20=20-=20Fix=20to=20deal=20with=20issue=20where=20a=20valid=20?= =?UTF-8?q?JSON=20result=20string=20is=20not=20always=20valid=20JavaScript?= =?UTF-8?q?=20text=20e.g.=20some=20unicode=20characters=20etc.=20=20=20=20?= =?UTF-8?q?50498:=20svn=20ignore=20patterns=20=20=20=2050499:=20files=20sh?= =?UTF-8?q?ould=20not=20be=20in=20svn=20=20=20=2050500:=20remove=20eclipse?= =?UTF-8?q?=20folder=20settings=20from=20svn=20=20=20=2050505:=20Fix=20to?= =?UTF-8?q?=20(unreported=3F)=20search=20results=20paging=20issue=20-=20me?= =?UTF-8?q?rge=20error=20meant=20that=20only=20the=20first=20page=20of=20r?= =?UTF-8?q?esults=20would=20ever=20be=20returned=20no=20matter=20what=20pa?= =?UTF-8?q?ge=20was=20selected,=20but=20who=20goes=20past=20the=20first=20?= =?UTF-8?q?page=20anyway=20eh=3F=20=20=20=2050516:=20CLOUD-1718:=20"CloudC?= =?UTF-8?q?onv=20-=20Regression:"Imap=20Attachments"=20and=20"IMAP=20Home"?= =?UTF-8?q?=20folders=20are=20displayed=20via=20CMIS=20Workbench=20client"?= =?UTF-8?q?=20=20=20=2050517:=20CLOUD-1727:=20CloudConv=20-=20Regression?= =?UTF-8?q?=20-=20WebDav:=20The=20mapped=20network=20drive=20could=20not?= =?UTF-8?q?=20be=20created=20on=20Windows=20=20=20=20This=20was=20broken?= =?UTF-8?q?=20by=20MNT-2823.=20=20=20=2050524:=20CLOUD-1665:=20New=20accou?= =?UTF-8?q?nts=20are=20not=20available=20for=20CLOUD2=20=20=20=20Manually?= =?UTF-8?q?=20merged=20revision=2048796=20as=20it=20was=20mistakenly=20mar?= =?UTF-8?q?ked=20as=20merged.=20=20=20=2050525:=20Merged=20BRANCHES/DEV/CL?= =?UTF-8?q?OUD1=20to=20BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20=2050033:=20?= =?UTF-8?q?(RECORD=20ONLY)=20Merge=20HEAD-QA=20to=20CLOUD1=20(for=20BDE-10?= =?UTF-8?q?9:=20generate=20coverage=20on=20unit=20tests)=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20Merge=20V4.1-BUG-FIX=20to=20HEAD-QA=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=2048904:=20BDE-109:=20generat?= =?UTF-8?q?e=20coverage=20statistics=20from=20JaCoCo=20when=20running=20te?= =?UTF-8?q?sts=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2048925:=203rd=20?= =?UTF-8?q?party=20classpath=20refers=20to=20available=20mysql-connector-j?= =?UTF-8?q?ava-5.1.13-bin.jar=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?49065:=20Limit=20coverage=20to=20org.alfresco=20classes,=20othe?= =?UTF-8?q?rwise=20overhead=20is=20too=20big=20and=20tests=20too=20slow=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=2049474:=20MNT-8668=20R?= =?UTF-8?q?emove=20Maven=20declared=20dependency=20on=20addressing-1.0.mar?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2049655:=20BDE-109?= =?UTF-8?q?=20new=20Ant=20task=20to=20generate=20JaCoCo=20report=20for=20t?= =?UTF-8?q?est=20coverage=20=20=20=2050582:=20Removed=20and=20ignored=20.c?= =?UTF-8?q?lasspath=20and=20.project=20=20=20=2050614:=20CLOUD-1713=20appe?= =?UTF-8?q?nd=20the=20Cloud=20build=20number=20after=20the=20Enterprise=20?= =?UTF-8?q?build=20number,=20as=20in:=20r50345-b65-c129=20=20=20=20Upgrade?= =?UTF-8?q?=20a=20few=20Maven=20plugins=20=20=20=2050649:=20Merged=20BRANC?= =?UTF-8?q?HES/DEV/CLOUD1=20to=20BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20?= =?UTF-8?q?=2050083:=20Merged=20BRANCHES/DEV/FEATURES/CLOUD1-BUG-FIX3=20to?= =?UTF-8?q?=20BRANCHES/DEV/CLOUD1:=20=20=20=20=20=20=20=20=20=20=20=204935?= =?UTF-8?q?7:=20New=20Cloud=20Bug=20Fix=20Branch=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2049363:=20Merged=20BRANCHES/DEV/FEATURES/CLOUD1-BUG-?= =?UTF-8?q?FIX2=20to=20BRANCHES/DEV/FEATURES/CLOUD1-BUG-FIX3:=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2046487:=20Fixes=20CLOUD-1?= =?UTF-8?q?293:=20"Other"=20included=20in=20total=20activities=20count.=20?= =?UTF-8?q?Refactor=20activity=20groupings.=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2046488:=20Fixes:=20CLOUD-1310:=20Adds=20"no?= =?UTF-8?q?-wrap"=20to=20last=20element=20to=20that=20the=20second=20link?= =?UTF-8?q?=20all=20appears=20on=20the=20same=20line.=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2046493:=20Fixes:=20CLOUD-1229:=20R?= =?UTF-8?q?emoves=20max-width=20CSS=20constraint=20so=20that=20table=20cel?= =?UTF-8?q?ls=20can=20expand=20to=20find=20room=20for=20long=20transltions?= =?UTF-8?q?.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2046535:=20PU?= =?UTF-8?q?BLICAPI-63:=20"Unable=20to=20list=20comments=20associated=20to?= =?UTF-8?q?=20a=20document=20:=20Malformated=20comment=20object=20=3F":=20?= =?UTF-8?q?fix=20+=20tests=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2046555:=20PUBLICAPI-90:=20"You=20can=20not=20remove=20yoursel?= =?UTF-8?q?f=20from=20a=20site=20using=20the=20-me-=20identifier"=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=2046826:=20Fix=20for=20?= =?UTF-8?q?CLOUD-1368=20-=20Tomcat=20thread=20blocking=20during=20concurre?= =?UTF-8?q?nt=20user=20testing=20causing=20service=20to=20become=20unrespo?= =?UTF-8?q?nsive.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2047249:?= =?UTF-8?q?=20Merged=20BRANCHES/DEV/V4.1-BUG-FIX=20to=20BRANCHES/DEV/FEATU?= =?UTF-8?q?RES/CLOUD1-BUG-FIX2=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2047243:=20Fix=20for=20ALF-18194=20-=20Ba?= =?UTF-8?q?d=20performance=20with=20multiple=20contentstores=20browsing=20?= =?UTF-8?q?files=20on=20the=20slower=20stores=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2047681:=20Merged=20HEAD=20to=20CLOUD1-BU?= =?UTF-8?q?G-FIX2=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2047448,47484,47504,47518,47552=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2047865:=20GERMAN:=20Latest=20translat?= =?UTF-8?q?ion=20updates,=20based=20on=20EN=20r46485=20&=20including=20fix?= =?UTF-8?q?es=20from=20check=20report.=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2047866:=20FRENCH:=20Latest=20translation=20update?= =?UTF-8?q?s,=20based=20on=20EN=20r46485=20&=20including=20fixes=20from=20?= =?UTF-8?q?check=20report.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2047867:=20SPANISH:=20Latest=20translation=20updates,=20based?= =?UTF-8?q?=20on=20EN=20r46485=20&=20including=20fixes=20from=20check=20re?= =?UTF-8?q?port.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2047868:?= =?UTF-8?q?=20ITALIAN:=20Latest=20translation=20updates,=20based=20on=20EN?= =?UTF-8?q?=20r46485=20&=20including=20fixes=20from=20check=20report.=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2047869:=20JAPANE?= =?UTF-8?q?SE:=20Latest=20translation=20updates,=20based=20on=20EN=20r4648?= =?UTF-8?q?5=20&=20including=20fixes=20from=20check=20report.=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2047885:=20ALL=20LANG:=20M?= =?UTF-8?q?inor=20update=20to=20translations=20to=20bring=20them=20in=20li?= =?UTF-8?q?ne=20with=20EN=20r47485=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2048355:=20CLOUD-1458:=20Added=20MailActionExecuterTe?= =?UTF-8?q?st=20to=20ActionTestSuite.=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2048402:=20CLOUD-1458:=20Remove=20inadvertently=20?= =?UTF-8?q?added=20test=20class=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2048561:=20CLOUD-1458,=20CLOUD-1459,=20CLOUD-1479,=20CLO?= =?UTF-8?q?UD-1485=20-=20Fix=20MailActionExecuter=20to=20correctly=20resol?= =?UTF-8?q?ve=20primary=20domain=20for=20sender=20and=20recipients.=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2047249:=20Merged=20?= =?UTF-8?q?BRANCHES/DEV/V4.1-BUG-FIX=20to=20BRANCHES/DEV/FEATURES/CLOUD1-B?= =?UTF-8?q?UG-FIX2=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2047243:=20Fix=20for=20ALF-18194=20-=20Bad=20performa?= =?UTF-8?q?nce=20with=20multiple=20contentstores=20browsing=20files=20on?= =?UTF-8?q?=20the=20slower=20stores=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2047681:=20Merged=20HEAD=20to=20CLOUD1-BUG-FIX2=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20474?= =?UTF-8?q?48,47484,47504,47518,47552=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2047865:=20GERMAN:=20Latest=20translation=20update?= =?UTF-8?q?s,=20based=20on=20EN=20r46485=20&=20including=20fixes=20from=20?= =?UTF-8?q?check=20report.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2047866:=20FRENCH:=20Latest=20translation=20updates,=20based?= =?UTF-8?q?=20on=20EN=20r46485=20&=20including=20fixes=20from=20check=20re?= =?UTF-8?q?port.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2047867:?= =?UTF-8?q?=20SPANISH:=20Latest=20translation=20updates,=20based=20on=20EN?= =?UTF-8?q?=20r46485=20&=20including=20fixes=20from=20check=20report.=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2047868:=20ITALIA?= =?UTF-8?q?N:=20Latest=20translation=20updates,=20based=20on=20EN=20r46485?= =?UTF-8?q?=20&=20including=20fixes=20from=20check=20report.=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2047869:=20JAPANESE:=20Lat?= =?UTF-8?q?est=20translation=20updates,=20based=20on=20EN=20r46485=20&=20i?= =?UTF-8?q?ncluding=20fixes=20from=20check=20report.=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2047885:=20ALL=20LANG:=20Minor=20up?= =?UTF-8?q?date=20to=20translations=20to=20bring=20them=20in=20line=20with?= =?UTF-8?q?=20EN=20r47485=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2048355:=20CLOUD-1458:=20Added=20MailActionExecuterTest=20to?= =?UTF-8?q?=20ActionTestSuite.=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2048402:=20CLOUD-1458:=20Remove=20inadvertently=20added?= =?UTF-8?q?=20test=20class=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2048561:=20CLOUD-1458,=20CLOUD-1459,=20CLOUD-1479,=20CLOUD-148?= =?UTF-8?q?5=20-=20Fix=20MailActionExecuter=20to=20correctly=20resolve=20p?= =?UTF-8?q?rimary=20domain=20for=20sender=20and=20recipients.=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2049371:=20PUBLICAPI-166:=20"Unable=20to?= =?UTF-8?q?=20upload=20large=20file=20on=20Cloud=20=20(>=205MB)"=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2049389:=20Merged=20BRANCHES/DEV/FEATU?= =?UTF-8?q?RES/CLOUD1=5FSAML1=20to=20BRANCHES/DEV/FEATURES/CLOUD1-BUG-FIX3?= =?UTF-8?q?:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2049295:=20CL?= =?UTF-8?q?OUD-1529:=20Made=20SessionIndex=20optional=20in=20the=20SSO=20r?= =?UTF-8?q?esponse.=20Also=20commented=20out=20'autoProvisionEnabled'=20an?= =?UTF-8?q?d=20'alfrescoLoginCredentialEnabled'=20from=20the=20SAMLConfigS?= =?UTF-8?q?ettings=20as=20they=20are=20not=20implemented=20yet.=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2049406:=20CLOUD-1488:=20Merged=20BRAN?= =?UTF-8?q?CHES/DEV/V4.1-BUG-FIX=20to=20BRANCHES/DEV/FEATURES/CLOUD1-BUG-F?= =?UTF-8?q?IX3=20(Also=20added=20the=20missing=20elements=20from=20the=20m?= =?UTF-8?q?erge):=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ALF-16?= =?UTF-8?q?480:=20Merged=20PATCHES/V4.1.1=20to=20V4.1-BUG-FIX=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=2043252:=20MNT-166:=20D?= =?UTF-8?q?ocument=20lock=20not=20removed=20after=20the=20lock=20expiry=20?= =?UTF-8?q?date=20has=20been=20reached=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20=20Changed=20evaluator=20"eva?= =?UTF-8?q?luator.doclib.metadata.isLocked"=20to=20use=20"evaluator.doclib?= =?UTF-8?q?.indicator.nodeLocked"=20and=20"evaluator.doclib.indicator.lock?= =?UTF-8?q?Owner"=20evaluator.=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2043253:=20MNT-165:=20"Cancel=20Editing"=20does=20not?= =?UTF-8?q?=20completely=20remove=20lock=20from=20document=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Added=20?= =?UTF-8?q?documentLibrary=20cancel=20editing=20action=20for=20locked=20do?= =?UTF-8?q?cuments.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=204?= =?UTF-8?q?3300:=20MNT-171:=20Merged=20V4.1-BUG-FIX=20to=20PATCHES/V4.1.1?= =?UTF-8?q?=20(modified)=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2043096:=20Fix=20for=20ALF-16283=20-=20When=20document=20is?= =?UTF-8?q?=20checked=20out,=20'Edit=20Online'=20and=20'Upload=20New=20Ver?= =?UTF-8?q?sion'=20options=20should=20not=20be=20visible=20on=20the=20orig?= =?UTF-8?q?inal=20document.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2043311:=20MNT-165:=20"Cancel=20Editing"=20does=20not=20?= =?UTF-8?q?completely=20remove=20lock=20from=20document=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Fix=20for?= =?UTF-8?q?=20page=20refresh=20problem=20when=20cancel=20editing=20on=20de?= =?UTF-8?q?tails=20page=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2043421:=20MNT-186:=204.1.1.7=20HF:=20Webscipt=20error=20on=20?= =?UTF-8?q?doclib=20page,=20containing=20locked=20by=20other=20users=20fil?= =?UTF-8?q?es=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Change=20evaluator.doclib.metadata.isLocked=20to=20br?= =?UTF-8?q?eak=20circular=20dependency=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2043755:=20MNT-202:=20Upload=20New=20Version=20?= =?UTF-8?q?not=20available=20for=20a=20document=20that=20has=20been=20edit?= =?UTF-8?q?ed=20offline=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20-=20Upload=20New=20Version=20is=20now=20availabl?= =?UTF-8?q?e=20if=20editable=20by=20user=20(respecting=20locks,=20type=20o?= =?UTF-8?q?f=20checkout,=20etc).=20=20=20=20=20=20=20=20=20=20=20=2049463:?= =?UTF-8?q?=20CLOUD-1510=20-=20Cache=20remote=20transformation=20calls=20t?= =?UTF-8?q?o=20isTransformable=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Make=20TransformationOptions=20serializable=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Expose=20ehcache=20s?= =?UTF-8?q?tatistics=20and=20configuration,=20via=20JMX=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2049492:=20CLOUD-1510=20-=20Fix=20broken=20unit?= =?UTF-8?q?=20test=20=20=20=20=20=20=20=20=20=20=20=2049631:=20CLOUD-1455:?= =?UTF-8?q?=20"Hide=20activity=20in=20a=20site=20from=20the=20activity=20f?= =?UTF-8?q?eed"=20=20=20=20=20=20=20=20=20=20=20=2049662:=20CLOUD-1455:=20?= =?UTF-8?q?"Hide=20activity=20in=20a=20site=20from=20the=20activity=20feed?= =?UTF-8?q?":=20fix=20broken=20unit=20test=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2049759:=20Merged=20BRANCHES/DEV/HEAD-QA=20to=20BRANCHES/DE?= =?UTF-8?q?V/FEATURES/CLOUD1-BUG-FIX3:=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2049758:=20Fix=20for=20CLOUD-1542,=20Google=20Docs?= =?UTF-8?q?=20action=20was=20missing=20from=20the=20action=20list=20in=20t?= =?UTF-8?q?he=20document=20library.=20=20=20=20=20=20=20=20=20=20=20=20498?= =?UTF-8?q?14:=20CLOUD-1455:=20"Hide=20activity=20in=20a=20site=20from=20t?= =?UTF-8?q?he=20activity=20feed"=20=20=20=20=20=20=20=20=20=20=20=2049866:?= =?UTF-8?q?=20CLOUD-1597:=20Added=20the=20missing=20evaluators.=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2049948:=20Merged=20BRANCHES/DEV/FEATU?= =?UTF-8?q?RES/CLOUD1=5FGOOGLEDOCS=20to=20BRANCHES/DEV/FEATURES/CLOUD1-BUG?= =?UTF-8?q?-FIX3:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2049880:?= =?UTF-8?q?=20Update=20Google=20Docs=20integration=20from=202.0.2=20to=202?= =?UTF-8?q?.0.3.=20=20=20=20=20=20=20=20=20=20=20=2050045:=20Merged=20BRAN?= =?UTF-8?q?CHES/DEV/FEATURES/CLOUD1=5FGOOGLEDOCS=20to=20BRANCHES/DEV/FEATU?= =?UTF-8?q?RES/CLOUD1-BUG-FIX3:=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2050043:=20Update=202.0.3=20AMPs=20=20=20=2050686:=20GER?= =?UTF-8?q?MAN:=20Latest=20translations=20and=20updates=20based=20on=20EN?= =?UTF-8?q?=20rev49789.=20Jira=20fixes:=20MNT-7526,=20ALF-18650,=20ALF-185?= =?UTF-8?q?23,=20ALF-18521,=20ALF-18255,=20ALF-18069=20=20=20=2050689:=20S?= =?UTF-8?q?PANISH:=20Latest=20translations=20and=20updates=20based=20on=20?= =?UTF-8?q?EN=20rev49789.=20Jira=20fixes:=20ALF-18650,=20ALF-18523,=20ALF-?= =?UTF-8?q?18521,=20ALF-18255=20=20=20=2050691:=20FRENCH:=20Latest=20trans?= =?UTF-8?q?lations=20and=20updates=20based=20on=20EN=20rev49789.=20Jira=20?= =?UTF-8?q?fixes:=20ALF-18650,=20ALF-18523,=20ALF-18521,=20ALF-18255=20=20?= =?UTF-8?q?=20=2050693:=20ITALIAN:=20Latest=20translations=20and=20updates?= =?UTF-8?q?=20based=20on=20EN=20rev49789.=20Jira=20fixes:=20ALF-18650,=20A?= =?UTF-8?q?LF-18523,=20ALF-18521,=20ALF-18255=20=20=20=2050694:=20JAPANESE?= =?UTF-8?q?:=20Latest=20translations=20and=20updates=20based=20on=20EN=20r?= =?UTF-8?q?ev49789.=20Jira=20fixes:=20ALF-18650,=20ALF-18523,=20ALF-18521,?= =?UTF-8?q?=20ALF-18255=20=20=20=2050695:=20DUTCH:=20Latest=20translations?= =?UTF-8?q?=20and=20updates=20based=20on=20EN=20rev49789.=20Jira=20fixes:?= =?UTF-8?q?=20ALF-18650,=20ALF-18523,=20ALF-18521,=20ALF-18255=20=20=20=20?= =?UTF-8?q?50696:=20RUSSIAN:=20Latest=20translations=20and=20updates=20bas?= =?UTF-8?q?ed=20on=20EN=20rev49789.=20Jira=20fixes:=20ALF-18650,=20ALF-185?= =?UTF-8?q?23,=20ALF-18521,=20ALF-18255,=20ALF-18504,=20ALF-18503,=20ALF-1?= =?UTF-8?q?8502,=20ALF-17793=20=20=20=2050699:=20CHINESE:=20Latest=20trans?= =?UTF-8?q?lations=20and=20updates=20based=20on=20EN=20rev49789.=20Jira=20?= =?UTF-8?q?fixes:=20ALF-18650,=20ALF-18523,=20ALF-18521,=20ALF-18255,=20MN?= =?UTF-8?q?T-8874,=20MNT-8874,=20MNT-8874=20=20=20=2050709:=20CLOUD-1699:?= =?UTF-8?q?=20Cloud=20example=20content=20thumbnails=20-=20some=20have=20t?= =?UTF-8?q?he=20wrong=20width=20and=20look=20rubbish=20in=20doclib/search?= =?UTF-8?q?=20results=20=20=20=20=20=20=20-=20Fixed=20imgpreview=20for=20A?= =?UTF-8?q?lfresco=20Mobile.pdf=20=20=20=2050711:=20Merged=20DEV=20to=20HE?= =?UTF-8?q?AD-QA=20(4.2.0)=20=20=20=20=20=20=2050482:=20ALF-18996=20:=20Up?= =?UTF-8?q?grade=20from=203.4.12=20to=204.2.0=20fails:=20ERROR=20[domain.s?= =?UTF-8?q?chema.SchemaBootstrap]=20[localhost-startStop-1]=20Statement=20?= =?UTF-8?q?execution=20failed:=20SQL:=20ALTER=20TABLE=20ACT=5FRU=5FTASK=20?= =?UTF-8?q?MODIFY=20ASSIGNEE=5F=20VARCHAR(255)=20Error:=20Table=20'alfupg.?= =?UTF-8?q?ACT=5FRU=5FTASK'=20doesn't=20exist=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20Correctly=20handle=20activiti=20tables=20creation/upgrad?= =?UTF-8?q?e=20when=20performing=20upgrade=20from=203.4.x.=20=20=20=205072?= =?UTF-8?q?8:=20CLOUD-1754=20do=20not=20fail=20the=20build=20as=20soon=20a?= =?UTF-8?q?s=20tests=20fail:=20we=20are=20now=20quarantining=20tests=20in?= =?UTF-8?q?=20Bamboo,=20so=20installers=20need=20to=20be=20built=20regardl?= =?UTF-8?q?ess=20=20=20=2050755:=20Merged=20HEAD-BUG-FIX=20to=20HEAD-QA=20?= =?UTF-8?q?=20=20=20=20=20=20=2050754:=20Merged=20V4.1-BUG-FIX=20(4.1.6)?= =?UTF-8?q?=20to=20HEAD-BUG-FIX=20=20=20=20=20=20=20=20=20=20=2050753:=20M?= =?UTF-8?q?erged=20DEV=20to=20V4.1-BUG-FIX=20(4.1.6)=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2050727:=20MNT-3368:=20BM-0013:=20Soak:=20Ru?= =?UTF-8?q?n=2008:=20OnPremiseSyncPullJob=20runs=20without=20a=20transacti?= =?UTF-8?q?on=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Add=20transa?= =?UTF-8?q?ctions.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2050750:=20MN?= =?UTF-8?q?T-3368:=20BM-0013:=20Soak:=20Run=2008:=20OnPremiseSyncPullJob?= =?UTF-8?q?=20runs=20without=20a=20transaction=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Correction=20for=20'readOnly'=20parameter?= =?UTF-8?q?.=20=20=20=2050759:=20Merged=20BRANCHES/DEV/JAMAL/Fast=5FTest?= =?UTF-8?q?=20into=20HEAD-QA=20(CLOUD-1680:=20Make=20thor=20tests=20run=20?= =?UTF-8?q?blazingly=20fast)=20=20=20=20=20=20=2050635:=20CLOUD-1680:=20Ma?= =?UTF-8?q?ke=20thor=20tests=20run=20blazingly=20fast.=20=20=20=20=20=20?= =?UTF-8?q?=2050684:=20CLOUD-1680:=20Regouped=20a=20few=20of=20the=20publi?= =?UTF-8?q?c=20api=20tests.=20=20=20=20=20=20=2050688:=20CLOUD-1680:=20Reg?= =?UTF-8?q?ouped=20a=20few=20of=20the=20public=20api=20tests.=20=20=20=20?= =?UTF-8?q?=20=20=2050706:=20CLOUD-1680:=20Moved=20the=20excludedGroups=20?= =?UTF-8?q?from=20the=20parent=20pom=20to=20thor.=20Also=20grouped=20the?= =?UTF-8?q?=20webdav=20tests.=20=20=20=20=20=20=2050710:=20CLOUD-1680:=20D?= =?UTF-8?q?eleted=20the=20un-necessary=20junit=20category.=20=20=20=205077?= =?UTF-8?q?3:=20Fixing=20up=20the=20tests=20to=20separate=20out=20the=20cl?= =?UTF-8?q?oud=20tests.=20=20MailActionExecuter=20should=20now=20get=20the?= =?UTF-8?q?=20locale=20correctly.=20=20=20=2050779:=20Redundant=20file=20?= =?UTF-8?q?=20=20=2050780:=20Redundant=20File=20=20=20=2050782:=20Redundan?= =?UTF-8?q?t=20File=20=20=20=2050783:=20Fixed=20missing=20double=20quote?= =?UTF-8?q?=20=20=20=2050784:=20Missed=20strings=20included=20=20=20=20507?= =?UTF-8?q?85:=20Missed=20key=20included=20=20=20=2050795:=20ALF-19035=20-?= =?UTF-8?q?=20MT=20Cloud=20Policies=20run=20with=20inconsistent=20"short"?= =?UTF-8?q?=20base=20and=20"full"=20node=20refs.=20=20=20=2050823:=20ALF-1?= =?UTF-8?q?7548:=20Disable=20Google=20Docs=20v1=20integration=20=20=20=20?= =?UTF-8?q?=20=20*=20MBean=20controlling=20the=20subsystem=20has=20been=20?= =?UTF-8?q?removed=20(commented=20out)=20from=20bootstrap-context.xml=20?= =?UTF-8?q?=20=20=20=20=20*=20Admin=20console=20web=20script=20org/alfresc?= =?UTF-8?q?o/components/console/repository/google-docs.get=20has=20been=20?= =?UTF-8?q?removed=20=20=20=20=20=20*=20Admin=20console=20form=20config=20?= =?UTF-8?q?has=20been=20deleted=20from=20share-form-config.xml=20=20=20=20?= =?UTF-8?q?=20=20*=20No=20changes=20have=20been=20made=20to=20the=20instal?= =?UTF-8?q?ler,=20as=20I=20could=20find=20no=20evidence=20that=20the=20con?= =?UTF-8?q?figuration=20of=20the=20v1=20subsystem=20was=20being=20changed?= =?UTF-8?q?=20by=20it=20=20=20=20=20=20*=20Note:=20The=20subsystem=20prope?= =?UTF-8?q?rty=20'googledocs.googleeditable.enabled'=20was=20already=20set?= =?UTF-8?q?=20to=20false.=20=20=20=2050825:=20ALF-17548:=20Fix=20status=20?= =?UTF-8?q?web=20script=20which=20assumed=20the=20presence=20of=20the=20Go?= =?UTF-8?q?ogle=20Docs=20v1=20MBean=20removed=20in=20r50823.=20Now=20the?= =?UTF-8?q?=20web=20script=20returns=20enabled:=20false=20if=20the=20bean?= =?UTF-8?q?=20is=20not=20present.=20=20=20=2050827:=20CLOUD-1600:=20CloudC?= =?UTF-8?q?onv=20-=20regression:=20Cannot=20add=20a=20tag=20through=20inli?= =?UTF-8?q?ne=20edit=20option=20=20=20=20=20=20=20-=20Added=20ignoreEmpty?= =?UTF-8?q?=20argument=20to=20accommodate=20changes=20in=20r50352=20=20=20?= =?UTF-8?q?=2050831:=20CLOUD-1770:=20Redundant=20Perform=20Action=20("Embe?= =?UTF-8?q?d=20properties=20as=20metadata=20in=20content")=20is=20displaye?= =?UTF-8?q?d=20for=20Content=20Rules=20=20=20=20=20=20=20-=20Moved=20embed?= =?UTF-8?q?der=20action=20to=20sample=20file=20since=20we=20don't=20supply?= =?UTF-8?q?=20any=20embedders=20out-of-the-box=20=20=20=2050833:=20CLOUD-1?= =?UTF-8?q?770:=20Redundant=20Perform=20Action=20("Embed=20properties=20as?= =?UTF-8?q?=20metadata=20in=20content")=20is=20displayed=20for=20Content?= =?UTF-8?q?=20Rules=20=20=20=20=20=20=20-=20Programmatically=20created=20e?= =?UTF-8?q?xecuter=20rather=20than=20loading=20from=20context=20=20=20=205?= =?UTF-8?q?0838:=20Cloud:=20Patch=20overrides=20=20=20=20=20-=20Moved=20li?= =?UTF-8?q?ve=20patches=20to=20'module-schema-context.xml'=20('patch.redep?= =?UTF-8?q?loyProcessesWithReminders2'=20and=20'patch.redeployProcessesWit?= =?UTF-8?q?hReminders3')=20=20=20=20=20-=20No=20Sample=20Web=20Site=20in?= =?UTF-8?q?=20Cloud:=20(CLOUD-1480)=20Created=20no-op=20patch=20for=20'pat?= =?UTF-8?q?ch.siteLoadPatch.swsdp'=20=20=20=20=20-=20IMAP=20is=20disabled?= =?UTF-8?q?=20in=20Cloud:=20(CLOUD-1743):=20Created=20no-op=20patch=20for?= =?UTF-8?q?=20'patch.imapFolders'=20=20=20=2050839:=20ALF-18702:=20Tenant?= =?UTF-8?q?=20isn't=20able=20to=20log=20in=20Share=20once=20another=20tena?= =?UTF-8?q?nt=20has=20logged=20in=20before=20=20=20=20=20=20Following=20re?= =?UTF-8?q?view,=20added=20logic=20in=20AuthenticationServiceImpl.authenti?= =?UTF-8?q?cate=20that=20is=20similar=20to=20AuthenticationServiceImpl.val?= =?UTF-8?q?idate=20in=20order=20to=20handle=20case=20where=20the=20tenant?= =?UTF-8?q?=20is=20determined=20by=20the=20requested=20URI=20=20=20=205085?= =?UTF-8?q?1:=20First=20part=20of=20fix=20for=20ALF-19052.=20=20=20=205085?= =?UTF-8?q?3:=20ALF-18096:=20Integrate=20document=20security=20AMP=20files?= =?UTF-8?q?=20from=20the=20Alfresco=20Mobile=20iOS=201.5=20project=20=20?= =?UTF-8?q?=20=20=20=20*=20New=20aspect=20dp:restrictable=20=20=20=20=20?= =?UTF-8?q?=20*=20Form=20configuration=20for=20properties=20provided=20by?= =?UTF-8?q?=20this=20aspect=20=20=20=20=20=20*=20Note:=20As=20detailed=20o?= =?UTF-8?q?n=20the=20ticket=20the=20source=20files=20have=20been=20copied?= =?UTF-8?q?=20into=20the=20repository=20and=20slingshot=20project=20and=20?= =?UTF-8?q?mofified=20there.=20=20=20=2050864:=20Fix=20for=20CLOUD-1769=20?= =?UTF-8?q?CloudConv=20-=20Admin=20section=20in=20header=20menu=20instead?= =?UTF-8?q?=20of=20Account=20Settings=20are=20available=20for=20free=20acc?= =?UTF-8?q?ount=20user=20=20=20=2050879:=20ALF-18914=20:=20SPP:=20It's=20p?= =?UTF-8?q?ossible=20to=20create=20meeting=20with=20empty=20subject=20fiel?= =?UTF-8?q?d=20linking=20to=20an=20existing=20workspace=20=20=20=20Added?= =?UTF-8?q?=20a=20check=20for=20an=20empty=20subject=20when=20creating=20a?= =?UTF-8?q?=20meeting=20from=20iCal.=20=20=20=2050922:=20Revert=20r50853?= =?UTF-8?q?=20mistakenly=20adding=20Mobile=20project=20dp:restricted=20asp?= =?UTF-8?q?ect=20to=20HEAD-QA=20=20=20=2050925:=20CLOUD-1759:=20Fixed=20mo?= =?UTF-8?q?st=20of=20the=20Sonar=20=E2=80=98Critical=E2=80=99=20violations?= =?UTF-8?q?.=20=20=20=2050937:=20CloudConv=20-=20Regression=20-=20CLONE=20?= =?UTF-8?q?-=20No=20notification=20is=20displayed=20when=20performing=20"L?= =?UTF-8?q?eave=20Site"=20action=20=20=20=2050938:=20Added=20Cloud=20overr?= =?UTF-8?q?ide=20to=20remove=20MyFiles=20and=20Shared=20links=20from=20too?= =?UTF-8?q?lbar=20=20=20=2050941:=20Fix=20for=20=20=20=20=20CLOUD-1768=20?= =?UTF-8?q?=20=20CloudConv=20-=20Regression=20-=20CLONE:=20It's=20impossib?= =?UTF-8?q?le=20to=20find=20the=20user=20by=20any=20property=20except=20th?= =?UTF-8?q?e=20username=20=20=20=20=20=20=20and=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20CLOUD-1778=20=20=20CloudConv:in=20people=20search=20first=20?= =?UTF-8?q?name=20and=20last=20name=20people=20search=20always=20return=20?= =?UTF-8?q?zero=20results=20=20=20=2050942:=20Fix=20for=20CLOUD-1741=20-?= =?UTF-8?q?=20CloudConv:=20User=20should=20be=20redirected=20to=20Alfresco?= =?UTF-8?q?=20Cloud=20Documentation=20instead=20of=20Alfresco=20Community?= =?UTF-8?q?=204.2=20Documentation.=20Comical=20spelling=20error=20in=20con?= =?UTF-8?q?fig.=20=20=20=2050945:=20GERMAN:=20Latest=20Cloud=20translation?= =?UTF-8?q?s=20and=20updates=20based=20on=20EN=20rev50920.=20Jira=20fixes:?= =?UTF-8?q?=20CLOUD-1729=20=20=20=2050946:=20FRENCH:=20Latest=20Cloud=20tr?= =?UTF-8?q?anslations=20and=20updates=20based=20on=20EN=20rev50920.=20Jira?= =?UTF-8?q?=20fixes:=20CLOUD-1729=20and=20CLOUD-1763=20=20=20=2050947:=20S?= =?UTF-8?q?PANISH:=20Latest=20Cloud=20translations=20and=20updates=20based?= =?UTF-8?q?=20on=20EN=20rev50920.=20Jira=20fixes:=20CLOUD-1729=20and=20CLO?= =?UTF-8?q?UD-1763=20=20=20=2050948:=20ITALIAN:=20Latest=20Cloud=20transla?= =?UTF-8?q?tions=20and=20updates=20based=20on=20EN=20rev50920.=20Jira=20fi?= =?UTF-8?q?xes:=20CLOUD-1729=20and=20CLOUD-1763=20=20=20=2050949:=20JAPANE?= =?UTF-8?q?SE:=20Latest=20Cloud=20translations=20and=20updates=20based=20o?= =?UTF-8?q?n=20EN=20rev50920.=20Jira=20fixes:=20CLOUD-1729=20and=20CLOUD-1?= =?UTF-8?q?763=20=20=20=2050957:=20Fix=20for=20CLOUD-1623=20Unfriendly=20w?= =?UTF-8?q?arning=20appears=20when=20user=20try=20to=20create=20private=20?= =?UTF-8?q?site=20with=20the=20same=20URL=20=20=20=2050960:=20CLOUD-1772:?= =?UTF-8?q?=20Configuration=20files=20have=20been=20localized=20=20=20=20?= =?UTF-8?q?=20-=20Removed=20all=20pointlessly=20translated=20configuration?= =?UTF-8?q?=20files=20=20=20=2050961:=20MNT-8480=20:=20New=20web=20script?= =?UTF-8?q?=20for=20delete=20audit=20entry.=20=20=20=2050968:=20Merged=20B?= =?UTF-8?q?RANCHES/DEV/CLOUD1=20to=20BRANCHES/DEV/HEAD-QA:=20=20=20=20=20?= =?UTF-8?q?=20=2050624:=20(RECORD=20ONLY)=20Delete=20generation=20of=20ins?= =?UTF-8?q?tallers=20in=20continuous,=20to=20allow=20'amber'=20builds=20?= =?UTF-8?q?=20=20=2050973:=20Merged=20BRANCHES/DEV/CLOUD1=20to=20BRANCHES/?= =?UTF-8?q?DEV/HEAD-QA:=20=20=20=20=20=20=2050568:=20Merged=20BRANCHES/DEV?= =?UTF-8?q?/FEATURES/CLOUD1-SECURITY=20to=20BRANCHES/DEV/CLOUD1=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2050423:=20Merged=20PATCHES/V4.1.1?= =?UTF-8?q?=20to=20BRANCHES/DEV/FEATURES/CLOUD1-SECURITY=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2044129:=20MNT?= =?UTF-8?q?-223:=20Unbound=20SOLR=20result=20set=20(from=20Explorer=20tras?= =?UTF-8?q?hcan=20query)=20consumes=20heap=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2044130:=20MNT-223:=20Unbo?= =?UTF-8?q?und=20SOLR=20result=20set=20(from=20Explorer=20trashcan=20query?= =?UTF-8?q?)=20consumes=20heap=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2044129:=20MNT-223:=20Unbound=20SOLR?= =?UTF-8?q?=20result=20set=20(from=20Explorer=20trashcan=20query)=20consum?= =?UTF-8?q?es=20heap=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20Merged=20PATCHES/V4.1.4=20to=20BRANCHES/DEV/FEATURES/CLOU?= =?UTF-8?q?D1-SECURITY=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2045951:=20Fix=20for=20ALF-17687=20BM-0013:=20S?= =?UTF-8?q?oak:=20Run=2002:=20SolrJSONResultSet=20must=20preload=20nodes?= =?UTF-8?q?=20=20=20=20=20=20=2050622:=20Fix=20for=20CLOUD-1751=20=20=20Us?= =?UTF-8?q?ers=20searching=20in=20their=20home=20tenant=20(or=20other=20pe?= =?UTF-8?q?rson=20related=20operations)=20should=20not=20be=20subject=20to?= =?UTF-8?q?=20visibility=20checks=20=20=20=20=20=20=2050664:=20Fix=20for?= =?UTF-8?q?=20CLOUD-1751=20=20=20Users=20searching=20in=20their=20home=20t?= =?UTF-8?q?enant=20(or=20other=20person=20related=20operations)=20should?= =?UTF-8?q?=20not=20be=20subject=20to=20visibility=20checks=20=20=20=20509?= =?UTF-8?q?76:=20CLOUD-1634:=20CloudConv=20-=20regression:=20Upload=20form?= =?UTF-8?q?=20is=20not=20closed=20automatically=20after=20upload=20limit?= =?UTF-8?q?=20error=20occurs=20=20=20=20=20=20=20-=20Added=20Javascript=20?= =?UTF-8?q?to=20hide=20upload=20status=20and=20show=20upload=20control=20a?= =?UTF-8?q?gain=20=20=20=2050992:=20Changing=20the=20modifiers=20for=20the?= =?UTF-8?q?=20"addAuthorityNameIfMatches"=20methods=20from=20"private"=20t?= =?UTF-8?q?o=20"protected"=20to=20allow=20the=20RM=20module=20do=20RM=20sp?= =?UTF-8?q?ecific=20changes=20without=20copying=20a=20lot=20of=20the=20exi?= =?UTF-8?q?sting=20code.=20=20=20=2050993:=20Fix=20for=20ALF-18850=20-=20I?= =?UTF-8?q?ncorrect=20label=20"page.ruleEdit.title"=20on=20New=20Rule=20pa?= =?UTF-8?q?ge=20from=20Repository=20Browser=20=20=20=2051031:=20CLOUD-1761?= =?UTF-8?q?:=20Activity=20is=20not=20generated=20when=20deleting=20documen?= =?UTF-8?q?t=20via=20SPP/WebDAV=20-=20fix=20part=201=20=20=20=20This=20is?= =?UTF-8?q?=20the=20first=20part=20of=20a=20fix:=20activities=20were=20not?= =?UTF-8?q?=20being=20raised=20due=20to=20MNT-181=20fix.=20This=20is=20now?= =?UTF-8?q?=20fixed.=20However,=20the=20posts=20are=20not=20being=20proces?= =?UTF-8?q?sed=20properly,=20which=20also=20needs=20fixing.=20=20=20=20510?= =?UTF-8?q?83:=20Fixed=20the=20failing=20test=20(testHasSite)=20=20=20=205?= =?UTF-8?q?1085:=20First=20part=20of=20fix=20for=20CLOUD-1787=20=20=20=205?= =?UTF-8?q?1091:=20CLOUD-446:=20Remove=20'overridden'=20googledocs=20subsy?= =?UTF-8?q?stem=20bean=20from=20Cloud=20override=20context,=20which=20was?= =?UTF-8?q?=20causing=20the=20subsystem=20to=20start=20up=20still=20=20=20?= =?UTF-8?q?=2051092:=20Fix=20to=20URLRewrite=20config=20rule=20to=20correc?= =?UTF-8?q?t=20escape=20UTF-8=20characters=20either=20side=20of=20the=20de?= =?UTF-8?q?tected=20'@'=20character=20when=20rewriting=20URLs=20where=20br?= =?UTF-8?q?owsers=20have=20not=20correctly=20dealt=20with=20the=20@=20char?= =?UTF-8?q?acter.=20=20=20=2051097:=20Updated=20BG=20for=20ludicrous=20scr?= =?UTF-8?q?een=20resolution=20CLOUD-1795=20=20=20=2051098:=20Fix=20for=20C?= =?UTF-8?q?LOUD-1795=20-=20Login=20dialog=20centre=20on=20window=20resize?= =?UTF-8?q?=20=20=20=2051103:=20Fix=20for=20CLOUD-1796=20CloudConv:-Search?= =?UTF-8?q?=20pagination=20to=20other=20pages=20no=20results=20are=20shown?= =?UTF-8?q?=20=20=20=2051105:=20Merged=20BRANCHES/DEV/HEAD-BUG-FIX=20to=20?= =?UTF-8?q?BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20=2051104:=20Merged=20BRA?= =?UTF-8?q?NCHES/DEV/V4.1-BUG-FIX=20to=20BRANCHES/DEV/HEAD-BUG-FIX:=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2051101:=20MNT-8704:=20node=20was?= =?UTF-8?q?=20not=20being=20unhidden=20(thread=20local=20client=20marker?= =?UTF-8?q?=20needed=20setting)=20=20=20=2051107:=20Improvements=20to=20se?= =?UTF-8?q?arch=20result=20list=20handling=20-=20only=20populate=20node=20?= =?UTF-8?q?result=20structures=20for=20the=20items=20that=20are=20going=20?= =?UTF-8?q?to=20be=20returned.=20=20=20=2051140:=20Minor=20tweaks=20to=20s?= =?UTF-8?q?earch=20processing=20hand=20merged=20from=204.1.N=20=20=20=2051?= =?UTF-8?q?163:=20JAPANESE:=20Fix=20for=20CLOUD-1799=20=20=20=2051170:=20A?= =?UTF-8?q?LF-18074=20add=20a=20new=20flag=20to=20enable=20clustering.=20?= =?UTF-8?q?=20=20=2051184:=20Make=20cloud=20tests=20depend=20on=20reposito?= =?UTF-8?q?ry=20test=20resources,=20to=20be=20able=20to=20reuse=20them=20?= =?UTF-8?q?=20=20=2051234:=20CLOUD-1800:=20Made=20the=20Rules=20to=20be=20?= =?UTF-8?q?executed=20asynchronously=20in=20the=20cloud=20by=20overriding?= =?UTF-8?q?=20=E2=80=9Crule-edit.js=E2=80=9D.=20=20=20=2051245:=20Merged?= =?UTF-8?q?=20BRANCHES/DEV/HEAD42-MERGE=20to=20BRANCHES/DEV/HEAD-QA=20=20?= =?UTF-8?q?=20=20=20=20=2051230:=20Addition=20of=20a=20modified=20YUI=20Co?= =?UTF-8?q?mpressor=20ANT=20task=20to=20speed=20up=20the=20minimize-slings?= =?UTF-8?q?hot-deployed-javascript=20build=20step=20-=20from=20around=203?= =?UTF-8?q?=20mins=20on=20most=20machines=20down=20to=203=20secs.=20w00t?= =?UTF-8?q?=20=20=20=20AND=20THIS=20IS=20THE=20RESULT:=20=20=20=20ant=20cl?= =?UTF-8?q?ean=20incremental-webclient-tomcat-exploded=20incremental-sling?= =?UTF-8?q?shot-tomcat-exploded=20=20=20=20...=20=20=20=20BUILD=20SUCCESSF?= =?UTF-8?q?UL=20=20=20=20Total=20time:=201=20minute=2018=20seconds=20=20?= =?UTF-8?q?=20=2051248:=20Merged=20HEAD-BUG-FIX=20to=20HEAD-QA=20=20=20=20?= =?UTF-8?q?=20=20=2051247:=20Merged=20V4.1-BUG-FIX=20to=20HEAD-BUG-FIX=20(?= =?UTF-8?q?RECORD=20ONLY)=20=20=20=20=20=20=20=20=20=2051246=20(RECORD=20O?= =?UTF-8?q?NLY):=20Merged=20PATCHES/V4.1.5=20to=20V4.1-BUG-FIX=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2051233:=20MNT-8129:=20NPE=20-=20Servl?= =?UTF-8?q?et.service()=20-=20getGlobalConfig=20for=20"webClientConfigServ?= =?UTF-8?q?ice"=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Missing?= =?UTF-8?q?=20JGroups=20messages=20receiver=20has=20been=20added=20to=20ha?= =?UTF-8?q?ndle=20cluster=20messages=20correctly.=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20Port=20range=20default=20value=20has?= =?UTF-8?q?=20been=20increased=20to=20add=20some=20slack=20around=20requir?= =?UTF-8?q?ed=20ports=20=20=20=20=20=20=20=20=20=2050999=20(PARTIAL=20RECO?= =?UTF-8?q?RD=20ONLY):=20Better=20logging=20for=20AsynchronouslyRefreshedC?= =?UTF-8?q?ache=20(MNT-8129)=20=20=20=2051273:=20Partial=20fix=20for=20CLO?= =?UTF-8?q?UD-1806.=20This=20checkin=20fixes=20serialisation=20of=20Transf?= =?UTF-8?q?ormationSourceOptions=20objects.=20=20=20=20A=20subsequent=20ch?= =?UTF-8?q?eck-in=20will=20fix=20deserialisation.=20=20=20=2051275:=20Fixe?= =?UTF-8?q?d=20CLOUD-1804=20=20=20=2051279:=20Allow=20calls=20to=20NodeDAO?= =?UTF-8?q?.getParentAssocs=20to=20succeed=20for=20deleted=20nodes=20=20?= =?UTF-8?q?=20=20=20-=20The=20error=20message=20reported=20is=20incorrect.?= =?UTF-8?q?=20=20Previously,=20no=20calls=20were=20made=20to=20the=20DAO?= =?UTF-8?q?=20to=20=20=20=20=20=20=20retrieve=20details=20for=20deleted=20?= =?UTF-8?q?nodes.=20=20There=20was=20therefore=20an=20assumption=20that=20?= =?UTF-8?q?the=20node=20had=20been=20=20=20=20=20=20=20internally=20refere?= =?UTF-8?q?nced=20and=20that=20this=20represented=20an=20error.=20=20This?= =?UTF-8?q?=20is=20no=20longer=20the=20case=20(nor=20has=20it=20=20=20=20?= =?UTF-8?q?=20=20=20been=20for=20a=20some=20time).=20=20=20=20=20-=20In=20?= =?UTF-8?q?this=20case,=20the=20SOLR=20tracking=20attempts=20to=20get=20th?= =?UTF-8?q?e=20parent=20associations=20for=20all=20nodes,=20=20=20=20=20?= =?UTF-8?q?=20=20regardless=20of=20their=20state=20of=20deletion.=20=20=20?= =?UTF-8?q?=20=20-=20CLOUD-1807:=20CloudConv:=20I=20get=20the=20following?= =?UTF-8?q?=20error=20in=20the=20solr=20nodes=20"Detected=20stale=20node?= =?UTF-8?q?=20entry:=20NodeVersionKey"=20=20=20=20=20-=20MNT-9072:=20SOLR?= =?UTF-8?q?=20tracking=20can=20be=20delayed=20by=20node=20deletion=20=20?= =?UTF-8?q?=20=2051291:=20JobLockService.releaseLock=20is=20not=20optimist?= =?UTF-8?q?ic=20=20=20=20=20-=20AcquireLockException=20is=20no=20longer=20?= =?UTF-8?q?thrown=20if=20the=20lock=20token=20is=20invalid=20=20=20=20=20-?= =?UTF-8?q?=20releaseLock=20returns=20a=20boolean=20to=20indicate=20whethe?= =?UTF-8?q?r=20the=20lock=20was=20removed=20or=20whether=20it=20was=20alre?= =?UTF-8?q?ady=20gone=20=20=20=20=20-=20Prevents=20unnecessary=20retrying?= =?UTF-8?q?=20withing=20JobLockService=20implementation=20(ALF-19098)=20?= =?UTF-8?q?=20=20=2051292:=20Fix=20thread=20safety=20in=20PostLookup=20w.r?= =?UTF-8?q?.t.=20job=20lock=20state;=20general=20logging=20improvements=20?= =?UTF-8?q?(ALF-19098)=20=20=20=2051293:=20Fix=20build=20after=20rev=20512?= =?UTF-8?q?91=20(ALF-19098):=20JobLockService.releaseLock=20is=20now=20opt?= =?UTF-8?q?imistic=20=20=20=2051305:=20Remainder=20of=20fix=20for=20CLOUD-?= =?UTF-8?q?1806.=20RemoteAlfrescoTransformer=20is=20unable=20to=20serializ?= =?UTF-8?q?e=20transformation=20options=20as=20JSON.=20=20=20=20This=20che?= =?UTF-8?q?ck-in=20just=20changes=20Jackson=20configuration=20to=20handle?= =?UTF-8?q?=20the=20new=20TransformationSourceOptions=20which=20are=20now?= =?UTF-8?q?=20part=20of=20TransformationOptions.=20=20=20=20As=20this=20fi?= =?UTF-8?q?eld=20needs=20to=20be=20JSON=20serialised=20along=20with=20its?= =?UTF-8?q?=20containing=20TransformationOptions=20instance=20-=20and=20pa?= =?UTF-8?q?rticularly=20because=20TransformationSourceOptions=20=20=20=20i?= =?UTF-8?q?s=20not=20a=20concrete=20type=20-=20we=20need=20extra=20Jackson?= =?UTF-8?q?=20config=20in=20order=20to=20correctly=20marshall=20and=20unma?= =?UTF-8?q?rshall=20the=20actual=20concrete=20types=20of=20any=20instances?= =?UTF-8?q?=20of=20TransformationSourceOptions.=20=20=20=2051307:=20Slight?= =?UTF-8?q?=20tidy-up=20of=20fix=20for=20CLOUD-1806.=20=20=20=20I=20had=20?= =?UTF-8?q?specified=20some=20Jackson=20config=20in=203=20subclasses=20and?= =?UTF-8?q?=20didn't=20need=20it=20as=20it=20was=20already=20configured=20?= =?UTF-8?q?on=20a=20base=20type.=20=20=20=2051315:=20Fix=20on=20HEAD-QA=20?= =?UTF-8?q?only=20for=20ALF-19101,=20which=20I=20believe=20may=20affect=20?= =?UTF-8?q?CLOUD-1806.=20=20=20=20A=20typo=20in=20a=20TransformationSource?= =?UTF-8?q?Options=20method=20breaks=20the=20JavaBeans=20contract=20and=20?= =?UTF-8?q?imperils=20the=20JSON=20serialisation=20needed=20for=20CLOUD-18?= =?UTF-8?q?06.=20=20=20=20I=20think=20the=20method=20with=20the=20typo=20h?= =?UTF-8?q?as=20been=20published=20(in=204.1=3F)=20so=20rather=20than=20re?= =?UTF-8?q?name=20it,=20I've=20deprecated=20it=20and=20added=20a=20new=20o?= =?UTF-8?q?ne=20with=20the=20correct=20spelling.=20=20=20=2051350:=20Prepa?= =?UTF-8?q?ratory=20work=20for=20fixing=20CLOUD-1754.=20MailActionExecuter?= =?UTF-8?q?Test=20failing.=20=20=20=20It=20has=20been=20very=20difficult?= =?UTF-8?q?=20to=20get=20reliable=20test=20feedback=20on=20dealing=20with?= =?UTF-8?q?=20the=20MailActionExecuter.=20=20=20=20This=20is=20largely=20b?= =?UTF-8?q?ecause=20of=20the=20difference=20in=20the=20way=20mail=20action?= =?UTF-8?q?s=20are=20handled=20in=20cloud=20and=20on=20enterprise.=20=20?= =?UTF-8?q?=20=20Therefore=20I=20have=20refactored=20and=20extended=20our?= =?UTF-8?q?=20test=20code=20to=20support=20fixing=20the=20MailActionExecut?= =?UTF-8?q?er.=20=20=20=20Part=201:=20Refactor=20the=20JUnit=20Rules=20Alf?= =?UTF-8?q?rescoPeople,=20AlfrescoPerson,=20AlfrescoTenant=20so=20that=20w?= =?UTF-8?q?hen=20a=20test=20is=20run=20in=20=20=20=20Community,=20Enterpri?= =?UTF-8?q?se=20or=20Cloud=20the=20test=20'does=20the=20right=20thing'=20w?= =?UTF-8?q?hen=20creating/tearing=20down=20test=20users.=20=20=20=20i.e.?= =?UTF-8?q?=20On=20Community/Enterprise,=20create=20the=20user/auth=20and?= =?UTF-8?q?=20the=20person=20on=20the=20single=20tenant.=20=20=20=20In=20C?= =?UTF-8?q?loud=20create=20the=20user=20in=20system=20tenant,=20create=20t?= =?UTF-8?q?he=20person=20in=20their=20home=20tenant,=20precreating=20the?= =?UTF-8?q?=20tenant=20if=20necessary=20=20=20=20and=20tear=20the=20whole?= =?UTF-8?q?=20thing=20down=20again.=20=20=20=20I=20achieved=20this=20by=20?= =?UTF-8?q?having=20the=20cm:person-related=20rules=20delegate=20to=20a=20?= =?UTF-8?q?spring=20bean=20responsible=20for=20dealing=20with=20test=20use?= =?UTF-8?q?rs.=20=20=20=20Then=20I've=20got=20a=20mechanism=20to=20let=20E?= =?UTF-8?q?nterprise=20override=20Community=20and=20Cloud=20override=20Ent?= =?UTF-8?q?erprise.=20=20=20=20So=20the=20Community=20'TestUserComponent'?= =?UTF-8?q?=20just=20creates/deletes=20users.=20Enterprise=20'inherits'=20?= =?UTF-8?q?this=20behaviour.=20=20=20=20The=20Cloud=20TestUserComponent=20?= =?UTF-8?q?deals=20with=20the=20tenant=20sideshow.=20=20=20=20It's=20all?= =?UTF-8?q?=20started=20in=20the=20global-integration-test-context.xml.=20?= =?UTF-8?q?=20=20=2051351:=20Adding=20the=20JIRA=20number=20for=20BDE-173?= =?UTF-8?q?=20into=20this=20file.=20=20=20=2051353:=20Fixing=20some=20test?= =?UTF-8?q?=20fallout=20from=20pervious=20commit=20(51350)=20which=20was?= =?UTF-8?q?=20part=20of=20preparatory=20work=20for=20fixing=20CLOUD-1754.?= =?UTF-8?q?=20=20=20=20Looks=20like=20the=20SyncAudit=20tests=20were=20usi?= =?UTF-8?q?ng=20ApplicationContextHelper's=20getApplicationContext=20metho?= =?UTF-8?q?d=20having=20already=20started=20a=20custom=20app=20context=3F?= =?UTF-8?q?=20=20=20=2051371:=20Merged=20BRANCHES/DEV/HEAD42-MERGE=20to=20?= =?UTF-8?q?BRANCHES/DEV/HEAD-QA=20=20=20=20=20=20=2051277:=20Fix=20for=20A?= =?UTF-8?q?LF-18948=20-=20Share=20Hazelcast=20cluster=20configuration=20ch?= =?UTF-8?q?ange=20required=20in=204.2=20=20=20=20=20=20=2051313:=20Minor?= =?UTF-8?q?=20css=20improvements=20to=20search=20box=20=20=20=20=20=20=205?= =?UTF-8?q?1367:=20Fixed=20order=20of=20button=20styles=20for=20lightTheme?= =?UTF-8?q?=20overrides=20=20=20=20=20=20=2051368:=20Fix=20to=20broken=20c?= =?UTF-8?q?ss=20file=20-=20erroneous=20end=20comment=20marker=20=20=20=20?= =?UTF-8?q?=20=20=2051370:=20Fix=20for=20CLOUD-1795=20-=20Login=20screen?= =?UTF-8?q?=20isn't=20resizing=20to=20display=20window=20=20=20=2051406:?= =?UTF-8?q?=20CLOUD-1573:=20CloudConv=20-=20regression:Preview=20is=20not?= =?UTF-8?q?=20displayed=20for=20locked=20document=20=20=20=20=20=20=20-=20?= =?UTF-8?q?Added=20check=20for=20presence=20of=20container=20element=20bef?= =?UTF-8?q?ore=20attempting=20setup=20of=20document=20versions=20data=20ta?= =?UTF-8?q?ble=20=20=20=2051407:=20Fix=20for=20CLOUD-1754.=20MailActionExe?= =?UTF-8?q?cuterTest=20test=20failing.=20=20=20=20The=20code=20in=20MailAc?= =?UTF-8?q?tionExecuter=20needs=20some=20refactoring.=20As=20it=20was,=20v?= =?UTF-8?q?alidation=20of=20the=20mail=20recipients=20(are=20they=20userna?= =?UTF-8?q?mes=3F=20email=20addresses=3F=20do=20the=20users=20exist=3F=20e?= =?UTF-8?q?tc)=20are=20not=20the=20same=20for=20the=20to-many=20parameter?= =?UTF-8?q?=20as=20they=20are=20for=20the=20'to'=20parameter.=20There=20ar?= =?UTF-8?q?e=20various=20other=20inconsistencies=20in=20the=20code=20also.?= =?UTF-8?q?=20I=20have=20tried=20to=20fix=20the=20cases=20where=20the=20in?= =?UTF-8?q?consistencies=20are=20obvious=20and=20I've=20tried=20to=20impor?= =?UTF-8?q?ove=20the=20test=20coverage=20too.=20This=20code=20has=20now=20?= =?UTF-8?q?become=20a=20little=20too=20complex=20and=20a=20future=20JIRA?= =?UTF-8?q?=20will=20lead=20to=20simplification.=20Currently=20the=20prior?= =?UTF-8?q?ity=20is=20to=20complete=20code=20convergence.=20=20=20=2051410?= =?UTF-8?q?:=20Fix=20for=20=20=20=20=20CLOUD-1641=20=20=20CloudConv=20-=20?= =?UTF-8?q?Regression:=20User=20from=20other=20domain=20cannot=20be=20foun?= =?UTF-8?q?d=20=20=20=20-=20cloud=20queries=20for=20people=20use=20all=20a?= =?UTF-8?q?=20users=20domains=20(OK=20until=20we=20partition=20by=20tenant?= =?UTF-8?q?)=20=20=20=20Fix=20for=20=20=20=20=20CLOUD-1768=20=20CloudConv?= =?UTF-8?q?=20-=20Regression=20-=20CLONE:=20It's=20impossible=20to=20find?= =?UTF-8?q?=20the=20user=20by=20any=20property=20except=20the=20username?= =?UTF-8?q?=20=20=20=2051422:=20Partial=20revert=20of=20r51410=20where=20a?= =?UTF-8?q?ccountService=20was=20apparently=20added=20to=20the=20wrong=20b?= =?UTF-8?q?ean=20definition=20=20=20=2051424:=20Correct=20wire=20up=20for?= =?UTF-8?q?=20R=2051410=20related=20to=20=20=20=20Fix=20for=20=20=20=20=20?= =?UTF-8?q?CLOUD-1641=20=20=20CloudConv=20-=20Regression:=20User=20from=20?= =?UTF-8?q?other=20domain=20cannot=20be=20found=20=20=20=20-=20cloud=20que?= =?UTF-8?q?ries=20for=20people=20use=20all=20a=20users=20domains=20(OK=20u?= =?UTF-8?q?ntil=20we=20partition=20by=20tenant)=20=20=20=20Fix=20for=20=20?= =?UTF-8?q?=20=20=20CLOUD-1768=20=20CloudConv=20-=20Regression=20-=20CLONE?= =?UTF-8?q?:=20It's=20impossible=20to=20find=20the=20user=20by=20any=20pro?= =?UTF-8?q?perty=20except=20the=20username=20=20=20=2051429:=20CLOUD-1641:?= =?UTF-8?q?=20User=20from=20other=20domain=20cannot=20be=20found=20=20=20?= =?UTF-8?q?=20Removing=20previous=20fix=20for=20CLOUD-1641,=20the=20back-e?= =?UTF-8?q?nd=20should=20decide=20the=20best=20route=20to=20go=20depending?= =?UTF-8?q?=20on=20the=20parameters=20provided.=20Forcing=20the=20query=20?= =?UTF-8?q?to=20use=20a=20canned=20query=20has=20caused=20CLOUD-1768.=20?= =?UTF-8?q?=20=20=2051444:=20Fix=20for=20=20=20=20=20CLOUD-1641=20=20=20Cl?= =?UTF-8?q?oudConv=20-=20Regression:=20User=20from=20other=20domain=20cann?= =?UTF-8?q?ot=20be=20found=20=20=20=20Fix=20for=20=20=20=20=20CLOUD-1768?= =?UTF-8?q?=20=20CloudConv=20-=20Regression=20-=20CLONE:=20It's=20impossib?= =?UTF-8?q?le=20to=20find=20the=20user=20by=20any=20property=20=20=20=20-?= =?UTF-8?q?=20ignore=20tenant=20filter=20for=20cloud=20people=20query=20an?= =?UTF-8?q?d=20rely=20on=20post=20query=20visibility=20filtering=20(to=20s?= =?UTF-8?q?ee=20people=20from=20other=20tenants=20invited=20in)=20=20=20?= =?UTF-8?q?=2051466:=20Fix=20for=20=20=20=20=20CLOUD-1641=20=20=20CloudCon?= =?UTF-8?q?v=20-=20Regression:=20User=20from=20other=20domain=20cannot=20b?= =?UTF-8?q?e=20found=20=20=20=20Fix=20for=20=20=20=20=20CLOUD-1768=20=20Cl?= =?UTF-8?q?oudConv=20-=20Regression=20-=20CLONE:=20It's=20impossible=20to?= =?UTF-8?q?=20find=20the=20user=20by=20any=20property=20=20=20=20-=20exclu?= =?UTF-8?q?de=20permission=20evaluation=20when=20searching=20for=20people?= =?UTF-8?q?=20in=20the=20cloud=20(covered=20by=20the=20visibility=20stuff)?= =?UTF-8?q?=20=20=20=2051553:=20CLOUD-1780:=20CloudConv=20:-=20follow=20bu?= =?UTF-8?q?tton=20is=20visible=20for=20external=20user=20as=20well=20=20?= =?UTF-8?q?=20=20=20=20=20-=20Refactored=20customizations=20for=20new=20de?= =?UTF-8?q?pendency=20loading=20to=20fix=20order=20of=20loading=20=20=20?= =?UTF-8?q?=20=20=20=20-=20Refactored=20widget=20userHomeTenant=20option?= =?UTF-8?q?=20addition=20for=20new=20instantiation=20pattern=20=20=20=20?= =?UTF-8?q?=20=20=20-=20Refactored=20override=20of=20widget's=20=5FrenderF?= =?UTF-8?q?ollowingActions=20method=20with=20new=20CloudPeopleFinder=20obj?= =?UTF-8?q?ect=20that=20extends=20PeopleFinder=20=20=20=2051571:=20Merged?= =?UTF-8?q?=20HEAD-BUG-FIX=20to=20HEAD-QA=20=20=20=20=20=20=2051473:=20Mov?= =?UTF-8?q?ed=20CacheTest=20back=20into=20Repository=20=20=20=20=20=20=20N?= =?UTF-8?q?ote=20for=20Cluster=20features:=20This=20change=20no=20longer?= =?UTF-8?q?=20relies=20on=20any=20distributed=20caches=20and=20therefore?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20the=20new=20files=20shou?= =?UTF-8?q?ld=20just=20stay=20as=20they=20are=20and=20the=20old=20ones=20r?= =?UTF-8?q?emoved.=20=20=20=2051583:=20Merged=20HEAD-BUG-FIX=20to=20HEAD-Q?= =?UTF-8?q?A=20=20=20=20=20=20=2051477=20Merged=20V4.1-BUG-FIX=20to=20HEAD?= =?UTF-8?q?-BUG-FIX=20=20=20=20=20=20=20=20=20=2050995:=20Support=20for=20?= =?UTF-8?q?locking=20and=20unlocking=20of=20values=20in=20the=20Transactio?= =?UTF-8?q?nalCache=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20?= =?UTF-8?q?Infrastructure=20for=20MNT-8997:=20Support=20definitive=20write?= =?UTF-8?q?s=20for=20TransactionalCache=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Allows=20a=20definitive=20write=20(put=20?= =?UTF-8?q?or=20remove)=20call=20to=20be=20made=20to=20the=20Transactional?= =?UTF-8?q?Cache=20=20=20=2051584:=20Merged=20HEAD-BUG-FIX=20to=20HEAD-QA?= =?UTF-8?q?=20=20=20=20=20=20=2051478:=20Merged=20V4.1-BUG-FIX=20to=20HEAD?= =?UTF-8?q?-BUG-FIX=20=20=20=20=20=20=20=20=20=2050997:=20Make=20use=20of?= =?UTF-8?q?=20TransactionalCache's=20locking=20ability=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20-=20MNT-8997:=20Support=20defi?= =?UTF-8?q?nitive=20writes=20for=20TransactionalCache=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20PersonServiceImpl=20and=20Aut?= =?UTF-8?q?horityDaoImpl=20both=20do=20cache=20modificiations=20in=20'befo?= =?UTF-8?q?reXYZ'=20callbacks,=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20which=20leaves=20room=20for=20further=20attempte?= =?UTF-8?q?d=20cache=20updates=20by=20other=20callbacks.=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20Reapplied=20the=20fixes?= =?UTF-8?q?=20using=20TransactionalCache=20locks=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2051327:=20Fix=20=20CLOUD-1698=20Intermittent=20invite=20te?= =?UTF-8?q?st=20failures=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20Uses=20MNT-8997:=20Support=20transactional=20locking=20f?= =?UTF-8?q?or=20Authentication=20Cache=20removal=20=20=20=2051635:=20CLOUD?= =?UTF-8?q?-1812=20Fix=20invalid=20license=20issue:=20modify=20version.pro?= =?UTF-8?q?perties=20to=20have=20version.label=3DCloud=20and=20version.edi?= =?UTF-8?q?tion=3DEnterprise=20=20=20=2051739:=20Merged=20HEAD-BUG-FIX=20(?= =?UTF-8?q?4.2)=20to=20HEAD-QA=20=20=20=20=20=20=20<<=20Low=20risk=20chang?= =?UTF-8?q?e=20to=20avoid=20NPE=20found=20testing=20remote=20alfresco=20tr?= =?UTF-8?q?ansformation=20nodes=20in=20DP=20env=20>>=20=20=20=20=20=20=205?= =?UTF-8?q?1738:=20Merged=20V4.1-BUG-FIX=20(4.1.6)=20to=20HEAD-BUG-FIX=20(?= =?UTF-8?q?4.2)=20=20=20=20=20=20=20=20=20=2051731:=20Avoid=20NPE=20in=20C?= =?UTF-8?q?ontentServiceImpl.debugActiveTransformers().=20Relates=20to=20M?= =?UTF-8?q?NT-7158=20Investigating=20adding=20priorities=20to=20transforme?= =?UTF-8?q?rs=20=20=20=2051752:=20CLOUD-1812=20Fix=20version.label=20to=20?= =?UTF-8?q?simply=20add=20a=20'-Cloud'=20suffix.=20=20=20=2051753:=20CLOUD?= =?UTF-8?q?-1822=20Change=20RPM=20installation=20folder=20from=20tomcat6?= =?UTF-8?q?=20to=20tomcat7=20=20=20=2051760:=20CLOUD-1385:=20"Sending=20a?= =?UTF-8?q?=20PUT=20request=20without=20a=20Content-Type=20header=20resets?= =?UTF-8?q?=20the=20contents=20mimetype=20to=20application/octet-stream"?= =?UTF-8?q?=20-=20CMIS=20was=20not=20correctly=20parsing=20the=20mime=20ty?= =?UTF-8?q?pe=20header=20=20=20=2051779:=20Depend=20on=20Spring=20Surf=201?= =?UTF-8?q?.2.0-M6=20(r1265)=20rather=20than=20a=20SNAPSHOT=20version=20?= =?UTF-8?q?=20=20=2051780:=20Depend=20on=20Spring=20Surf=201.2.0-M6=20(r12?= =?UTF-8?q?65)=20rather=20than=20a=20SNAPSHOT=20version=20=20=20=2051783:?= =?UTF-8?q?=20Merged=20HEAD=20to=20BRANCHES/DEV/HEAD-QA=20(RECORD=20ONLY)?= =?UTF-8?q?=20=20=20=20=20=20=2049055:=20=20=20=20=20=20=20=20=20=20ALF-15?= =?UTF-8?q?191:=20Saving=20files=20(new=20or=20existing)=20to=20Alfresco?= =?UTF-8?q?=20via=20CIFS=20using=20iWork=20Pages=20or=20Numbers=20results?= =?UTF-8?q?=20in=20invisible=20files=20=20=20=20=20=20=20=20=20=20Modify?= =?UTF-8?q?=20HiddenAspect=20to=20hide=20node=20with=20explicit=3D'false'?= =?UTF-8?q?=20by=20default.=20=20=20=20=20=20=2049062:=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20ALF-15191:=20Saving=20files=20(new=20or=20existing)?= =?UTF-8?q?=20to=20Alfresco=20via=20CIFS=20using=20iWork=20Pages=20or=20Nu?= =?UTF-8?q?mbers=20results=20in=20invisible=20files=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20Revert=20changes=20that=20were=20mistakenly=20committe?= =?UTF-8?q?d.=20=20=20=20=20=20=20=20=20=20Rolled=20back=20to=20r49054=20?= =?UTF-8?q?=20=20=20=20=20=2049075:=20=20=20=20=20=20=20=20=20=20Merged=20?= =?UTF-8?q?BRANCHES/DEV/HEAD-QA=20to=20HEAD:=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2049074:=20ALF-18573:=20exclude=20module-context.xml=20f?= =?UTF-8?q?rom=20alfresco-spp-config.jar=20=20=20=20=20=20=2049245:=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20Merged=20HEAD-QA=20to=20HEAD=20(RECORD?= =?UTF-8?q?=20ONLY)=20=20=20=20=20=20=20=20=20=20=20=20=2049244:=20Switch?= =?UTF-8?q?=20version=20of=20mvninstall=20to=204.2.0-QA-SNAPSHOT=20=20=20?= =?UTF-8?q?=20=20=20=2049442:=20=20=20=20=20=20=20=20=20=20CLOUD-1541:=20"?= =?UTF-8?q?CloudConv:=20REGRESS=20-=20can't=20connect=20to=20cmisatom=20on?= =?UTF-8?q?=20HEAD=20(works=20on=20HEAD-QA)":=20spurious=20chemistry=20lib?= =?UTF-8?q?rary=20appeared=20=20=20=20=20=20=2049599:=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20CLOUD-1541:=20"CloudConv:=20REGRESS=20-=20can't=20conn?= =?UTF-8?q?ect=20to=20cmisatom=20on=20HEAD=20(works=20on=20HEAD-QA)":=20sp?= =?UTF-8?q?urious=20chemistry=20library=20appeared=20=20=20=20=20=20=20499?= =?UTF-8?q?80:=20=20=20=20=20=20=20=20=20=20Merged=20BRANCHES/DEV/HEAD-QA?= =?UTF-8?q?=20to=20HEAD:=20=20=20=20=20=20=20=20=20=20=20=20=2049458:=20Me?= =?UTF-8?q?rged=20BRANCHES/DEV/HEAD-BUG-FIX=20to=20BRANCHES/DEV/HEAD-QA:?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2049117:=20?= =?UTF-8?q?Merged=20BRANCHES/DEV/CONV=5FV413=20to=20BRANCHES/DEV/HEAD-BUG-?= =?UTF-8?q?FIX:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2049111:=20-=20Revert=20of=20r47645=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20-=20Change=20of=20imgpreview=20thumbnailDefinition=20t?= =?UTF-8?q?o=20mimetype=20and=20size=20expected=20for=20HEAD=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20-=20Relates=20to=20ALF-5051=20and=20MNT-8599=20/?= =?UTF-8?q?=20ALF-18726=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2049118:=20Restored=20high=20resolution=20placeholder=20icons?= =?UTF-8?q?=20for=20imgpreview,=20relates=20to=20ALF-13984=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2049979:=20ALF-18726:=20Alfresco=20could?= =?UTF-8?q?=20not=20start=20with=20WCMQS=20applied=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20Updated=20RenditionServiceInt?= =?UTF-8?q?egrationTest=20with=20new=20imgpreview=20values=20=20=20=205179?= =?UTF-8?q?3:=20Increase=20size=20of=20in-transaction=20"nodeOwnerCache"?= =?UTF-8?q?=20to=2040K=20items.=20=20=20=2051819:=20CLOUD-1385:=20"Sending?= =?UTF-8?q?=20a=20PUT=20request=20without=20a=20Content-Type=20header=20re?= =?UTF-8?q?sets=20the=20contents=20mimetype=20to=20application/octet-strea?= =?UTF-8?q?m"=20-=20add=20further=20tests=20not=20covered=20by=20original?= =?UTF-8?q?=20fix=20=20=20=2051836:=20TenantUtil=20now=20gives=20a=20bit?= =?UTF-8?q?=20more=20information=20when=20exceptions=20pass=20through=20(C?= =?UTF-8?q?LOUD-1685)=20=20=20=2051837:=20Merged=20BRANCHES/DEV/CLOUD1=20t?= =?UTF-8?q?o=20BRANCHES/DEV/HEAD-QA:=20=20=20=20=20=20=2051502:=20Merged?= =?UTF-8?q?=20BRANCHES/DEV/FEATURES/CLOUD1-SECURITY=20to=20BRANCHES/DEV/CL?= =?UTF-8?q?OUD1:=20=20=20=20=20=20=20=20=20=20=20=2050389:=20Created=20bra?= =?UTF-8?q?nch=20for=20Cloud1=20Security=20Release=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2050395:=20Merged=20BRANCHES/DEV/FEATURES/CLOUD1-BUG-?= =?UTF-8?q?FIXSF=20to=20BRANCHES/DEV/FEATURES/CLOUD1-SECURITY:=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2049713:=20Branch=20for=20?= =?UTF-8?q?SalesForce=20bug=20fix=20merges=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2049718:=20Fix=20for=20CLOUD-1590=20-=20Sess?= =?UTF-8?q?ion=20fixation=20on=20Cloud=20specific=20login=20page=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=2049721:=20CLOUD-1589?= =?UTF-8?q?=20Protect=20Login-page=20against=20XSS=20Cross-Site=20Scriptin?= =?UTF-8?q?g=20attacks=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=205?= =?UTF-8?q?0320:=20CLOUD-1653:=20Improve=20password=20strength=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20*=20Password?= =?UTF-8?q?=20length=20constraint=20previously=20contained=20in=20client-s?= =?UTF-8?q?ide=20files=20has=20now=20been=20removed=20and=20is=20now=20loa?= =?UTF-8?q?ded=20from=20the=20'Users'=20scoped=20config=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20*=20Minimum=20pass?= =?UTF-8?q?word=20length=20is=20increased=20to=208=20characters=20from=206?= =?UTF-8?q?=20previously=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20*=20The=20length=20requirement=20has=20been=20au?= =?UTF-8?q?gmented=20with=20restrictions=20on=20the=20content,=20contained?= =?UTF-8?q?=20in=20a=20=20element=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20A=20minimum?= =?UTF-8?q?=20number=20of=20uppercase,=20lowercase,=20numeric=20and=20spec?= =?UTF-8?q?ial=20characters=20can=20be=20specified=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20The=20system-w?= =?UTF-8?q?ide=20default=20is=20zero=20for=20these=20new=20restrictions=20?= =?UTF-8?q?(i.e.=20no=20restrictions)=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20*=20Alongside=20the=20existing=20=20element,=20=20allows=20the=20password=20l?= =?UTF-8?q?ength=20or=20content=20policies=20to=20be=20tightened=20for=20s?= =?UTF-8?q?pecific=20networks=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20Example=20config=20is=20provided=20?= =?UTF-8?q?in=20cloud-config.xml=20showing=20showing=20how=20to=20do=20thi?= =?UTF-8?q?s=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20*=20Cleaned=20up=20existing=20validation=20messages=20and=20?= =?UTF-8?q?added=20a=20custom=20message=20based=20on=20the=20content=20res?= =?UTF-8?q?trictions,=20where=20this=20is=20configured=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Due=20to?= =?UTF-8?q?=20ALF-18975=20the=20message=20appears=20with=20raw=20HTML=20vi?= =?UTF-8?q?sible=20for=20now=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20*=20IMPORTANT=20NOTE:=20No=20checking=20of=20?= =?UTF-8?q?submitted=20password=20values=20takes=20place=20(as=20before).?= =?UTF-8?q?=20Users=20can=20by-pass=20the=20length=20and=20content=20check?= =?UTF-8?q?s=20by=20mimiking=20the=20web=20browser=20themselves.=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-?= =?UTF-8?q?=20It=20is=20not=20feasible=20to=20add=20this=20as=20part=20of?= =?UTF-8?q?=20this=20work=20unit,=20since=20there=20are=20multiple=20form?= =?UTF-8?q?=20targets=20in=20use,=20some=20of=20which=20are=20in=20the=20r?= =?UTF-8?q?epository.=20There=20are=20no=20password=20policies=20defined?= =?UTF-8?q?=20in=20the=20repository,=20so=20these=20would=20need=20adding.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2050358:=20CLO?= =?UTF-8?q?UD-1707:=20Regress:=20Copyright=20logo=20is=20incorrectly=20enc?= =?UTF-8?q?oded=20on=20Login=20and=20My=20Dashboard=20pages=20for=20French?= =?UTF-8?q?=20locale=20=20=20=20=20=20=20=20=20=20=20=2050408:=20CLOUD-146?= =?UTF-8?q?8:=20Red=20bar=20in=20Tasks=20"error=20loading=20items".=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2050409:=20Fix=20for=20CLOUD-1721?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=2050413:=20Merge=20of=20rev?= =?UTF-8?q?=2050185=20-=20XSS=20attack=20hardening=20-=20incorrect=20use?= =?UTF-8?q?=20of=20=3Fjs=5Fstring=20for=20safe=20HTML=20element=20IDs=20-?= =?UTF-8?q?=20should=20be=20=3Fhtml=20=20=20=20=20=20=20=20=20=20=20=20505?= =?UTF-8?q?76:=20Merged=20alfresco/BRANCHES/DEV/FEATURES/CLOUD1-BUG-FIXSF?= =?UTF-8?q?=20to=20alfresco/BRANCHES/DEV/FEATURES/CLOUD1-SECURITY:=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2050518:=20ALF-19012?= =?UTF-8?q?:=20Form=20validation=20messages=20shown=20in=20Bubble=20widget?= =?UTF-8?q?s=20are=20not=20consistent=20with=20the=20input=20title=20attri?= =?UTF-8?q?bute=20value=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?50574:=20ALF-18975:=20HTML=20in=20forms=20validation=20messages?= =?UTF-8?q?=20appears=20as=20raw=20HTML=20in=20the=20UI=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20*=20HTML=20message?= =?UTF-8?q?s=20added=20via=20Alfresco.forms.Form.addValidation()=20method?= =?UTF-8?q?=20no=20longer=20escape=20HTML=20entities=20in=20validation=20m?= =?UTF-8?q?essages=20presented=20to=20the=20user=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20*=20The=20'message'=20pa?= =?UTF-8?q?rameter=20in=20addValidation()=20can=20now=20be=20an=20object?= =?UTF-8?q?=20with=20separate=20'html'=20and=20'text'=20properties.=20Not?= =?UTF-8?q?=20all=20methods=20of=20displaying=20messages=20to=20the=20user?= =?UTF-8?q?=20support=20HTML.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20If=20no=20separate=20HTML=20and=20t?= =?UTF-8?q?ext=20values=20are=20supplied,=20the=20message=20is=20assumed?= =?UTF-8?q?=20to=20be=20HTML=20and=20is=20converted=20to=20text=20by=20rem?= =?UTF-8?q?oving=20HTML=20elements=20via=20a=20regexp=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2050575:=20CLOUD-1653:=20Supply=20s?= =?UTF-8?q?eparate=20HTML=20and=20text=20validation=20messages=20for=20pas?= =?UTF-8?q?sword=20content=20validation=20failures,=20since=20HTML=20canno?= =?UTF-8?q?t=20always=20be=20displayed=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?50577:=20CLOUD-1653:=20Use=20separate=20HTML=20and=20text=20val?= =?UTF-8?q?idation=20messages=20for=20Reset=20Password=20and=20Account=20C?= =?UTF-8?q?ompletion=20pages=20=20=20=20=20=20=20=20=20=20=20=2050731:=20C?= =?UTF-8?q?LOUD-1722:=20Apply=20config=20for=20Aetna=20specific=20password?= =?UTF-8?q?=20policy.=20=20=20=20=20=20=20=20=20=20=20=2050745:=20Merged?= =?UTF-8?q?=20BRANCHES/DEV/CLOUD1=20to=20BRANCHES/DEV/FEATURES/CLOUD1-SECU?= =?UTF-8?q?RITY:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2050622:?= =?UTF-8?q?=20Fix=20for=20=20=20=20=20CLOUD-1751=20=20=20Users=20searching?= =?UTF-8?q?=20in=20their=20home=20tenant=20(or=20other=20person=20related?= =?UTF-8?q?=20operations)=20should=20not=20be=20subject=20to=20visibility?= =?UTF-8?q?=20checks=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20506?= =?UTF-8?q?64:=20Fix=20for=20=20=20=20=20CLOUD-1751=20=20=20Users=20search?= =?UTF-8?q?ing=20in=20their=20home=20tenant=20(or=20other=20person=20relat?= =?UTF-8?q?ed=20operations)=20should=20not=20be=20subject=20to=20visibilit?= =?UTF-8?q?y=20checks=20=20=20=20=20=20=20=20=20=20=20=2050748:=20Merged?= =?UTF-8?q?=20BRANCHES/DEV/CLOUD1=20to=20BRANCHES/DEV/FEATURES/CLOUD1-SECU?= =?UTF-8?q?RITY:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2050568:?= =?UTF-8?q?=20(RECORD=20ONLY)=20Merged=20BRANCHES/DEV/FEATURES/CLOUD1-SECU?= =?UTF-8?q?RITY=20to=20BRANCHES/DEV/CLOUD1=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2050423:=20Merged=20PATCHE?= =?UTF-8?q?S/V4.1.1=20to=20BRANCHES/DEV/FEATURES/CLOUD1-SECURITY=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2044129:=20MNT-223:=20Unbound=20SOLR?= =?UTF-8?q?=20result=20set=20(from=20Explorer=20trashcan=20query)=20consum?= =?UTF-8?q?es=20heap=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2044130:=20MNT-223:?= =?UTF-8?q?=20Unbound=20SOLR=20result=20set=20(from=20Explorer=20trashcan?= =?UTF-8?q?=20query)=20consumes=20heap=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?44129:=20MNT-223:=20Unbound=20SOLR=20result=20set=20(from=20Exp?= =?UTF-8?q?lorer=20trashcan=20query)=20consumes=20heap=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20Merged=20PATCHES/V4.1.4=20to=20BRANCHES/DEV/FEATURES/C?= =?UTF-8?q?LOUD1-SECURITY=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2045951:=20Fix?= =?UTF-8?q?=20for=20ALF-17687=20BM-0013:=20Soak:=20Run=2002:=20SolrJSONRes?= =?UTF-8?q?ultSet=20must=20preload=20nodes=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2050624:=20(RECORD=20ONLY)=20Delete=20genera?= =?UTF-8?q?tion=20of=20installers=20in=20continuous,=20to=20allow=20'amber?= =?UTF-8?q?'=20builds=20=20=20=20=20=20=20=20=20=20=20=2050869:=20CLOUD-17?= =?UTF-8?q?73:=20Cloud1Security=20branch=20build8.=20User=20cannot=20creat?= =?UTF-8?q?e=20site=20=20=20=20=20=20=20=20=20=20=20=2050872:=20CLOUD-1653?= =?UTF-8?q?:=20Ensure=20password=20policy=20is=20always=20loaded=20based?= =?UTF-8?q?=20on=20home=20network,=20rather=20than=20the=20current=20conte?= =?UTF-8?q?xt,=20which=20could=20be=20different.=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2051156:=20CLOUD-1653:=20Add=20global=20flag=20to=20r?= =?UTF-8?q?egexps=20to=20ensure=20that=20the=20number=20of=20digits=20and?= =?UTF-8?q?=20symbols=20is=20correctly=20counted=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2051175:=20CLOUD-1682:=20"Hidden=20File=20Rename=20is?= =?UTF-8?q?=20Broken":=20fix=20and=20make=20sure=20the=20hidden=20aspect?= =?UTF-8?q?=20tests=20run=20as=20part=20of=20the=20build=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2051183:=20CLOUD-1682:=20"Hidden=20File=20Renam?= =?UTF-8?q?e=20is=20Broken":=20fix=20up=20test=20suite=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2051187:=20CLOUD-1682:=20"Hidden=20File=20Renam?= =?UTF-8?q?e=20is=20Broken":=20try=20again=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2051349:=20CLOUD-1682:=20"Hidden=20File=20Rename=20is=20Bro?= =?UTF-8?q?ken":=20further=20tests,=20deal=20with=20hidden=20aspect=20mani?= =?UTF-8?q?pulation=20by=20clients=20during=20rename=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2051383:=20CLOUD-1682:=20"Hidden=20File=20Rename?= =?UTF-8?q?=20is=20Broken":=20deal=20properly=20with=20all=20client=20cont?= =?UTF-8?q?rolled=20hidden=20aspect=20cases=20=20=20=2051843:=20CLOUD-1815?= =?UTF-8?q?:=20OPTIONS=20request=20for=20force.com=20not=20returning=20200?= =?UTF-8?q?=20=20=20=20Removed=20comment=20around=20publicapi=20URL=20patt?= =?UTF-8?q?ern=20for=20CORS=20filter.=20=20=20=2051845:=20Fixed=20ALF-1912?= =?UTF-8?q?8:=20Artifact=20alfresco-repository-*-config.jar=20contains=20t?= =?UTF-8?q?est=20files=20and=20configuration=20=20=20=20=20-=20Move=20test?= =?UTF-8?q?=20files=20into=20test-resources=20=20=20=2051853:=20ALF-9096?= =?UTF-8?q?=20-=20CLOUD-1825:=20Fixed=20issue=20with=20ordering=20of=20Tra?= =?UTF-8?q?nsactionSynchronizationAdapter=20when=20Activiti=20job=20fails?= =?UTF-8?q?=20=20=20=2051859:=20Merged=20PATCHES/V4.1.4=20to=20HEAD-QA=20(?= =?UTF-8?q?REMERGE)=20=20=20=20=20=20=2047738:=20ALF-18301=20(now=20MNT-63?= =?UTF-8?q?42):=20...=20NPE=20...=20when=20debug=20logging=20for=20'...Abs?= =?UTF-8?q?tractAsynchronouslyRefreshedCache'=20=20=20=20=20=20=20Merge=20?= =?UTF-8?q?note:=20The=20fix=20was=20not=20present=20even=20though=20it=20?= =?UTF-8?q?went=20to=20HEAD=20on=208=20March=20(rev=2047807)=20=20=20=2051?= =?UTF-8?q?889:=20Upgrade=20Spring=20Surf=20to=201.2.0-M7=20(r1274)=20=20?= =?UTF-8?q?=20=2051893:=20Removed=20old=20Activiti=20libraries=20that=20we?= =?UTF-8?q?re=20conflicting=20with=20new=20ones=20and=20causing=20compilat?= =?UTF-8?q?ion=20failure.=20=20=20=2051895:=20Merge=20HEAD-BUG-FIX=20to=20?= =?UTF-8?q?HEAD-QA=20(4.2)=20=20=20=20=20=20=2050984:=20BDE-103:=20Switch?= =?UTF-8?q?=20joda-time=20dependency=20to=20core=20=20=20=2051896:=20Upgra?= =?UTF-8?q?de=20activiti=20to=205.11-alf-20130627=20in=20POM=20for=20Cloud?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@51909 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/cmis-ws-context.xml | 11 + .../repository/audit/entry.delete.desc.xml | 19 + .../repository/audit/entry.delete.json.ftl | 3 + .../repository/audit/entry.properties | 2 + .../links/links-delete.post_de.properties | 2 +- .../links/links-delete.post_es.properties | 2 +- .../links/links-delete.post_ja.properties | 4 +- .../links/links-delete.post_nb_NO.properties | 2 +- .../links/links-delete.post_ru.properties | 2 +- .../site/membership/membership.delete.js | 15 +- .../repository/site/sites.post.json.js | 11 +- .../store/remoteshareresource.get.desc.xml | 9 - .../alfresco/repository/upload/upload.post.js | 8 +- .../application/logo.post.config.xml | 2 +- .../slingshot/application/logo.post.js | 3 +- .../slingshot/calendar/event.put.json.ftl | 2 +- .../documentlibrary-v2/filters.lib.js | 4 +- .../alfresco/slingshot/search/search.get.js | 4 +- .../slingshot/search/search.get.json.ftl | 3 + .../alfresco/slingshot/search/search.lib.js | 94 ++-- .../web-scripts-application-context.xml | 28 +- .../changelog/CMISChangeLogServiceTest.java | 468 ++++++++++++++++++ .../opencmis/AbstractBaseUrlGenerator.java | 95 +++- .../opencmis/AbstractOpenCMISTCKTest.java | 32 +- .../opencmis/AtomPubCMISDispatcher.java | 29 +- .../alfresco/opencmis/BaseUrlGenerator.java | 6 +- .../opencmis/BrowserCMISDispatcher.java | 33 ++ .../opencmis/CMISDispatcherRegistry.java | 2 +- .../opencmis/CMISHttpServletRequest.java | 71 ++- .../opencmis/CMISServletDispatcher.java | 10 +- .../opencmis/DefaultPathGenerator.java | 10 +- .../org/alfresco/opencmis/PathGenerator.java | 3 +- .../repo/cmis/ws/PasswordTypeInterceptor.java | 62 +++ .../imap/scripts/ServerStatusWebScript.java | 32 +- .../subsystems/test/SubsystemsTest.java | 110 ++++ .../web/scripts/TestWebScriptRepoServer.java | 2 +- .../scripts/audit/AbstractAuditWebScript.java | 28 ++ .../web/scripts/audit/AuditEntryDelete.java | 104 ++++ .../repo/web/scripts/bean/ADMRemoteStore.java | 47 +- .../web/scripts/bean/ShareResourceStore.java | 308 ------------ .../repo/web/scripts/googledocs/Status.java | 26 +- .../repo/web/scripts/invite/Invite.java | 6 +- .../web/scripts/invite/InviteServiceTest.java | 24 +- .../repo/web/scripts/solr/NodeContentGet.java | 2 +- .../workflow/AbstractWorkflowRestApiTest.java | 4 +- .../web/scripts/workflow/TaskInstancePut.java | 48 +- .../repo/web/util/AbstractJettyComponent.java | 2 +- .../alfresco/repo/webdav/DeleteMethod.java | 76 ++- .../org/alfresco/repo/webdav/GetMethod.java | 2 +- .../alfresco/repo/webdav/LockInfoImpl.java | 28 +- .../repo/webdav/LockInfoImplTest.java | 40 ++ .../org/alfresco/repo/webdav/LockMethod.java | 12 + .../org/alfresco/repo/webdav/MoveMethod.java | 35 +- .../alfresco/repo/webdav/PropFindMethod.java | 6 +- .../alfresco/repo/webdav/WebDAVHelper.java | 9 +- .../webdav/auth/AuthenticationFilter.java | 2 +- .../repo/cmis/ws/CXFAuthenticationTest.java | 56 +++ 57 files changed, 1475 insertions(+), 585 deletions(-) create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.desc.xml create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.json.ftl create mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.properties delete mode 100644 config/alfresco/templates/webscripts/org/alfresco/repository/store/remoteshareresource.get.desc.xml create mode 100644 source/java/org/alfresco/cmis/changelog/CMISChangeLogServiceTest.java create mode 100644 source/java/org/alfresco/opencmis/BrowserCMISDispatcher.java create mode 100644 source/java/org/alfresco/repo/cmis/ws/PasswordTypeInterceptor.java create mode 100644 source/java/org/alfresco/repo/management/subsystems/test/SubsystemsTest.java create mode 100644 source/java/org/alfresco/repo/web/scripts/audit/AuditEntryDelete.java delete mode 100644 source/java/org/alfresco/repo/web/scripts/bean/ShareResourceStore.java create mode 100644 source/test/java/org/alfresco/repo/cmis/ws/CXFAuthenticationTest.java diff --git a/config/alfresco/cmis-ws-context.xml b/config/alfresco/cmis-ws-context.xml index 340c38b15b..e3002c0447 100644 --- a/config/alfresco/cmis-ws-context.xml +++ b/config/alfresco/cmis-ws-context.xml @@ -13,6 +13,7 @@ implementorClass="org.alfresco.repo.cmis.ws.DMRepositoryServicePort"> + @@ -42,6 +43,7 @@ implementorClass="org.alfresco.repo.cmis.ws.DMNavigationServicePort"> + @@ -70,6 +72,7 @@ + @@ -100,6 +103,7 @@ implementorClass="org.alfresco.repo.cmis.ws.DMMultiFilingServicePort"> + @@ -129,6 +133,7 @@ implementorClass="org.alfresco.repo.cmis.ws.DMVersioningServicePort"> + @@ -158,6 +163,7 @@ implementorClass="org.alfresco.repo.cmis.ws.DMDiscoveryServicePort"> + @@ -187,6 +193,7 @@ implementorClass="org.alfresco.repo.cmis.ws.DMRelationshipServicePort"> + @@ -215,6 +222,7 @@ + @@ -244,6 +252,7 @@ implementorClass="org.alfresco.repo.cmis.ws.DMAclServicePort"> + @@ -371,6 +380,8 @@ + + diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.desc.xml new file mode 100644 index 0000000000..7ceff3f67a --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.desc.xml @@ -0,0 +1,19 @@ + + Alfresco Audit Service Entry Delete + Delete audit entry with the specified id + /api/audit/entries/{id} + + admin + required + Audit + internal + + + id + The audit entry id + + + + + + diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.json.ftl new file mode 100644 index 0000000000..89bdd9248d --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.delete.json.ftl @@ -0,0 +1,3 @@ +{ + "deleted" : ${deleted} +} diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.properties b/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.properties new file mode 100644 index 0000000000..fcf6a26d35 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/audit/entry.properties @@ -0,0 +1,2 @@ +audit.err.entry.id.notProvided=Audit Entry id not provided +audit.err.entry.id.notfound=Audit Entry id {1} not found \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_de.properties b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_de.properties index f7ee2038bb..e950b011e3 100755 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_de.properties +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_de.properties @@ -1,3 +1,3 @@ links-delete.err.not.found=Keine g\u00fcltigen Link-Namen angegeben -links-delete.access.denied=Sie sind nicht berechtigt, den Link mit dem Namen '{0}' zu l\u00f6schen +links-delete.access.denied=Sie sind nicht berechtigt, den Link mit dem Namen ''{0}'' zu l\u00f6schen links-delete.msg.deleted=Node {0} gel\u00f6scht \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_es.properties b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_es.properties index eb3ff32d4b..ab1ecf5064 100755 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_es.properties +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_es.properties @@ -1,3 +1,3 @@ links-delete.err.not.found=No se han proporcionado nombres de enlaces v\u00e1lidos -links-delete.access.denied=No tiene permisos para eliminar el enlace con el nombre '{0}' +links-delete.access.denied=No tiene permisos para eliminar el enlace con el nombre ''{0}'' links-delete.msg.deleted=Nodo {0} eliminado \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ja.properties b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ja.properties index 1326dac04c..62147f24ec 100755 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ja.properties +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ja.properties @@ -1,3 +1,3 @@ links-delete.err.not.found=\u6709\u52b9\u306a\u30ea\u30f3\u30af\u540d\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093 -links-delete.access.denied='{0}' \u3068\u3044\u3046\u540d\u524d\u306e\u30ea\u30f3\u30af\u3092\u524a\u9664\u3059\u308b\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093 -links-delete.msg.deleted=\u30ce\u30fc\u30c9 "{0}" \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f \ No newline at end of file +links-delete.access.denied=''{0}'' \u3068\u3044\u3046\u540d\u524d\u306e\u30ea\u30f3\u30af\u3092\u524a\u9664\u3059\u308b\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093 +links-delete.msg.deleted=\u30ce\u30fc\u30c9''{0}''\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_nb_NO.properties b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_nb_NO.properties index f5a5adc9ad..caeb816816 100755 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_nb_NO.properties +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_nb_NO.properties @@ -1,3 +1,3 @@ links-delete.err.not.found=Ingen gyldige koblingsnavn ble angitt -links-delete.access.denied=Du har ikke tillatelse til \u00e5 slette koblingen med navnet '{0}' +links-delete.access.denied=Du har ikke tillatelse til \u00e5 slette koblingen med navnet ''{0}'' links-delete.msg.deleted=Slettet node {0} diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ru.properties b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ru.properties index d8f88ac260..8e3ad7645c 100755 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ru.properties +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/links/links-delete.post_ru.properties @@ -1,3 +1,3 @@ links-delete.err.not.found=\u041D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0438\u043C\u0435\u043D\u0430 \u0441\u0441\u044B\u043B\u043E\u043A -links-delete.access.denied=\u041D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043D\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0441\u0441\u044B\u043B\u043A\u0438 \u0441 \u0438\u043C\u0435\u043D\u0435\u043C '{0}' +links-delete.access.denied=\u041D\u0435\u0442 \u043F\u0440\u0430\u0432 \u043D\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0441\u0441\u044B\u043B\u043A\u0438 \u0441 \u0438\u043C\u0435\u043D\u0435\u043C ''{0}'' links-delete.msg.deleted=\u0423\u0437\u0435\u043B {0} \u0443\u0434\u0430\u043B\u0435\u043D \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/membership.delete.js b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/membership.delete.js index 3009123d78..932d794dae 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/membership.delete.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/membership.delete.js @@ -15,7 +15,20 @@ function main() } // Remove the user from the site - site.removeMembership(userName); + try + { + site.removeMembership(userName); + } + catch (e) + { + // for a SiteServiceException - ensure it is not wrapped further + var msg = e.message; + if (msg.indexOf("SiteServiceException") != -1) + { + status.setCode(status.STATUS_INTERNAL_SERVER_ERROR, msg); + } + else throw error; + } } main(); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.json.js b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.json.js index ea3f027649..56b62e69b9 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.json.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.json.js @@ -16,8 +16,7 @@ function main() var shortName = json.get("shortName"); // See if the shortName is available - var site = siteService.getSite(shortName); - if (site != null) + if (siteService.hasSite(shortName)) { status.setCode(status.STATUS_BAD_REQUEST, "error.duplicateShortName"); return; @@ -45,7 +44,7 @@ function main() var sitetype = null; if (json.has("type") == true) { - sitetype = json.get("type"); + sitetype = json.get("type"); } // Use the visibility flag before the isPublic flag @@ -68,14 +67,14 @@ function main() } // Create the site - var site = null; + var site = null; if (sitetype == null) { - site = siteService.createSite(sitePreset, shortName, title, description, visibility); + site = siteService.createSite(sitePreset, shortName, title, description, visibility); } else { - site = siteService.createSite(sitePreset, shortName, title, description, visibility, sitetype); + site = siteService.createSite(sitePreset, shortName, title, description, visibility, sitetype); } // Put the created site into the model diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/remoteshareresource.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/store/remoteshareresource.get.desc.xml deleted file mode 100644 index 76bc4273d5..0000000000 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/remoteshareresource.get.desc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - Remote Share Resource Store - Remote service mirroring the Store interface - to an store for retrieving web resources for Share - /remote/share/resource/{method} - /remote/share/resource/{method}/{path} - none - required - argument - \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/upload/upload.post.js b/config/alfresco/templates/webscripts/org/alfresco/repository/upload/upload.post.js index 1a5a1adbc9..31ee534e82 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/upload/upload.post.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/upload/upload.post.js @@ -338,13 +338,13 @@ function main() var newFile; if (contentType !== null) { - newFile = destNode.createFile(filename, contentType); + newFile = destNode.createFile(filename, contentType); } else { - newFile = destNode.createFile(filename); + newFile = destNode.createFile(filename); } - // Use a the appropriate write() method so that the mimetype already guessed from the original filename is + // Use the appropriate write() method so that the mimetype already guessed from the original filename is // maintained - as upload may have been via Flash - which always sends binary mimetype and would overwrite it. // Also perform the encoding guess step in the write() method to save an additional Writer operation. newFile.properties.content.write(content, false, true); @@ -374,7 +374,7 @@ function main() } // final cleanup of temporary resources created during request processing - formdata.cleanup(); + formdata.cleanup(); } catch (e) { diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.config.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.config.xml index 22985a75f5..0f59390944 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.config.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.config.xml @@ -1,4 +1,4 @@ - 150 + 50 50 \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.js index d138b6918c..b65aaab984 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/application/logo.post.js @@ -42,8 +42,9 @@ function main() } var logoConfig = new XML(config.script); + var widthxheight = logoConfig.width + "x" + logoConfig.height; - var transformationOptions = "-resize " + logoConfig.width + "x" + logoConfig.height +"!"; + var transformationOptions = "-resize " + widthxheight + " -background none -gravity center -extent " + widthxheight; // create the new image node var nodeName = new Date().getTime() + "_" + filename; diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.json.ftl index ab90defd06..d2bb7c254c 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.json.ftl @@ -24,7 +24,7 @@ }, "uri" : "${result.uri}", "allday" : "${result.allday?string}", - "tags" : [<#list result.tags as tag>"${tag}"<#if tag_has_next>,, + "tags" : [<#list result.tags as tag>"${tag}"<#if tag_has_next>,], "docfolder": "${result.docfolder}" } diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary-v2/filters.lib.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary-v2/filters.lib.js index 5eede2545e..b8574e7f7d 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary-v2/filters.lib.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary-v2/filters.lib.js @@ -171,8 +171,8 @@ var Filters = case "editingOthers": filterQuery = this.constructPathQuery(parsedArgs); - filterQuery += " +ASPECT:\"workingcopy\""; - filterQuery += " +((-@cm\\:workingCopyOwner:\"" + person.properties.userName + '")'; + filterQuery += " +((+ASPECT:\"workingcopy\""; + filterQuery += " -@cm\\:workingCopyOwner:\"" + person.properties.userName + '")'; filterQuery += " OR (-@cm\\:lockOwner:\"" + person.properties.userName + '"'; filterQuery += " +@cm\\:lockType:\"WRITE_LOCK\"))"; filterParams.query = filterQuery; diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.js index c9c3c9d1cb..1c90c48c0d 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.js @@ -11,7 +11,9 @@ function main() query: (args.query !== null) ? args.query : null, rootNode: (args.rootNode !== null) ? args.rootNode : null, sort: (args.sort !== null) ? args.sort : null, - maxResults: (args.maxResults !== null) ? parseInt(args.maxResults, 10) : DEFAULT_MAX_RESULTS + maxResults: (args.maxResults !== null) ? parseInt(args.maxResults, 10) : DEFAULT_MAX_RESULTS, + pageSize: (args.pageSize !== null) ? parseInt(args.pageSize, 10) : DEFAULT_PAGE_SIZE, + startIndex: (args.startIndex !== null) ? parseInt(args.startIndex, 10) : 0 }; model.data = getSearchResults(params); diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.json.ftl index 81eb6446cb..573b37eaee 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.json.ftl @@ -1,5 +1,8 @@ <#escape x as jsonUtils.encodeJSONString(x)> { + "totalRecords": ${data.paging.totalRecords?c}, + "totalRecordsUpper": ${data.paging.totalRecordsUpper?c}, + "startIndex": ${data.paging.startIndex?c}, "items": [ <#list data.items as item> diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.lib.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.lib.js index dea3f2ceec..cb31643468 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.lib.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.lib.js @@ -18,6 +18,7 @@ */ const DEFAULT_MAX_RESULTS = 250; +const DEFAULT_PAGE_SIZE = 50; const SITES_SPACE_QNAME_PATH = "/app:company_home/st:sites/"; const DISCUSSION_QNAMEPATH = "/fm:discussion"; const COMMENT_QNAMEPATH = DISCUSSION_QNAMEPATH + "/cm:Comments"; @@ -87,7 +88,7 @@ function checkProcessedCache(key) /** * Returns an item outside of a site in the main repository. */ -function getRepositoryItem(folderPath, node) +function getRepositoryItem(folderPath, node, populate) { // check whether we already processed this document if (checkProcessedCache("" + node.nodeRef.toString())) @@ -102,6 +103,7 @@ function getRepositoryItem(folderPath, node) { if (node.isContainer || node.isDocument) { + if (!populate) return {}; item = { nodeRef: node.nodeRef.toString(), @@ -138,7 +140,7 @@ function getRepositoryItem(folderPath, node) /** * Returns an item of the document library component. */ -function getDocumentItem(siteId, containerId, pathParts, node) +function getDocumentItem(siteId, containerId, pathParts, node, populate) { // PENDING: how to handle comments? the document should // be returned instead @@ -156,6 +158,7 @@ function getDocumentItem(siteId, containerId, pathParts, node) { if (node.isContainer || node.isDocument) { + if (!populate) return {}; item = { site: getSiteData(siteId), @@ -191,7 +194,7 @@ function getDocumentItem(siteId, containerId, pathParts, node) return item; } -function getBlogPostItem(siteId, containerId, pathParts, node) +function getBlogPostItem(siteId, containerId, pathParts, node, populate) { /** * Investigate the rest of the path. the first item is the blog post, ignore everything that follows @@ -225,6 +228,7 @@ function getBlogPostItem(siteId, containerId, pathParts, node) } // child is our blog post + if (!populate) return {}; var item, t = null; item = { @@ -247,7 +251,7 @@ function getBlogPostItem(siteId, containerId, pathParts, node) return item; } -function getForumPostItem(siteId, containerId, pathParts, node) +function getForumPostItem(siteId, containerId, pathParts, node, populate) { // try to find the first fm:topic node, that's what we return as search result var topicNode = node; @@ -271,6 +275,7 @@ function getForumPostItem(siteId, containerId, pathParts, node) var postNode = topicNode.childAssocs["cm:contains"][0]; // child is our forum post + if (!populate) return {}; var item = t = null; item = { @@ -294,7 +299,7 @@ function getForumPostItem(siteId, containerId, pathParts, node) return item; } -function getCalendarItem(siteId, containerId, pathParts, node) +function getCalendarItem(siteId, containerId, pathParts, node, populate) { // only process nodes of the correct type if (node.type != "{http://www.alfresco.org/model/calendar}calendarEvent") @@ -308,6 +313,7 @@ function getCalendarItem(siteId, containerId, pathParts, node) return null; } + if (!populate) return {}; var item, t = null; item = { @@ -331,7 +337,7 @@ function getCalendarItem(siteId, containerId, pathParts, node) return item; } -function getWikiItem(siteId, containerId, pathParts, node) +function getWikiItem(siteId, containerId, pathParts, node, populate) { // only process documents if (!node.isDocument) @@ -345,6 +351,7 @@ function getWikiItem(siteId, containerId, pathParts, node) return null; } + if (!populate) return {}; var item, t = null; item = { @@ -368,7 +375,7 @@ function getWikiItem(siteId, containerId, pathParts, node) return item; } -function getLinkItem(siteId, containerId, pathParts, node) +function getLinkItem(siteId, containerId, pathParts, node, populate) { // only process documents if (!node.isDocument) @@ -386,6 +393,7 @@ function getLinkItem(siteId, containerId, pathParts, node) if (node.qnamePath.indexOf(COMMENT_QNAMEPATH) == -1 && !(node.qnamePath.match(DISCUSSION_QNAMEPATH+"$") == DISCUSSION_QNAMEPATH)) { + if (!populate) return {}; item = { site: getSiteData(siteId), @@ -409,7 +417,7 @@ function getLinkItem(siteId, containerId, pathParts, node) return item; } -function getDataItem(siteId, containerId, pathParts, node) +function getDataItem(siteId, containerId, pathParts, node, populate) { // make sure we haven't already added this item if (checkProcessedCache("" + node.nodeRef.toString())) @@ -422,6 +430,7 @@ function getDataItem(siteId, containerId, pathParts, node) // data item can be either ba containing dl:dataList or any dl:dataListItem subtype if (node.type == "{http://www.alfresco.org/model/datalist/1.0}dataList") { + if (!populate) return {}; // found a data list item = { @@ -444,6 +453,7 @@ function getDataItem(siteId, containerId, pathParts, node) } else if (node.isSubType("{http://www.alfresco.org/model/datalist/1.0}dataListItem")) { + if (!populate) return {}; // found a data list item item = { @@ -471,37 +481,37 @@ function getDataItem(siteId, containerId, pathParts, node) * Delegates the extraction to the correct extraction function * depending on containerId. */ -function getItem(siteId, containerId, pathParts, node) +function getItem(siteId, containerId, pathParts, node, populate) { var item = null; if (siteId == null) { - item = getRepositoryItem(pathParts, node); + item = getRepositoryItem(pathParts, node, populate); } else { - switch ("" + containerId) + switch ("" + containerId.toLowerCase()) { - case "documentLibrary": - item = getDocumentItem(siteId, containerId, pathParts, node); + case "documentlibrary": + item = getDocumentItem(siteId, containerId, pathParts, node, populate); break; case "blog": - item = getBlogPostItem(siteId, containerId, pathParts, node); + item = getBlogPostItem(siteId, containerId, pathParts, node, populate); break; case "discussions": - item = getForumPostItem(siteId, containerId, pathParts, node); + item = getForumPostItem(siteId, containerId, pathParts, node, populate); break; case "calendar": - item = getCalendarItem(siteId, containerId, pathParts, node); + item = getCalendarItem(siteId, containerId, pathParts, node, populate); break; case "wiki": - item = getWikiItem(siteId, containerId, pathParts, node); + item = getWikiItem(siteId, containerId, pathParts, node, populate); break; case "links": - item = getLinkItem(siteId, containerId, pathParts, node); + item = getLinkItem(siteId, containerId, pathParts, node, populate); break; - case "dataLists": - item = getDataItem(siteId, containerId, pathParts, node); + case "datalists": + item = getDataItem(siteId, containerId, pathParts, node, populate); break; } } @@ -560,40 +570,47 @@ function splitQNamePath(node, rootNodeDisplayPath, rootNodeQNamePath) * * @return the final search results object */ -function processResults(nodes, maxResults, rootNode) +function processResults(nodes, maxPageResults, startIndex, rootNode) { // empty cache state processedCache = {}; var results = [], - added = 0, + added = processed = failed = 0, parts, item, - failed = 0, rootNodeDisplayPath = rootNode ? utils.displayPath(rootNode).split("/") : null, rootNodeQNamePath = rootNode ? rootNode.qnamePath : null; if (logger.isLoggingEnabled()) logger.log("Processing resultset of length: " + nodes.length); - for (var i = 0, j = nodes.length; i < j && added < maxResults; i++) + startIndex = startIndex ? startIndex : 0; + for (var i = 0, j = nodes.length; i < j; i++) { - /** - * For each node we extract the site/container qname path and then - * let the per-container helper function decide what to do. - */ + // For each node we extract the site/container qname path and then + // let the per-container helper function decide what to do. try { + // We only want to populate node return structures if we are going to add the items to the results, + // so we skip (process, but don't populate or add to results) until we have reached the startIndex + // then we populate and add items up to the maxPageResults - after that we still need to process + // (but don't populate or add to results) each item to correctly calculate the totalRecordsUpper. + var populate = (processed >= startIndex && added < maxPageResults); parts = splitQNamePath(nodes[i], rootNodeDisplayPath, rootNodeQNamePath); - item = getItem(parts[0], parts[1], parts[2], nodes[i]); + item = getItem(parts[0], parts[1], parts[2], nodes[i], populate); if (item !== null) - { - results.push(item); - added++; + { + processed++; + if (populate) + { + results.push(item); + added++; + } } else { - failed++; - } + failed++; + } } catch (e) { @@ -613,6 +630,12 @@ function processResults(nodes, maxResults, rootNode) return ( { + paging: + { + totalRecords: results.length, + totalRecordsUpper: nodes.length - failed, + startIndex: startIndex + }, items: results }); } @@ -893,6 +916,7 @@ function getSearchResults(params) formQuery += (first ? '(' : ' AND ('); formQuery += processMultiValue(propName, propValue, modePropValue, false); formQuery += ')'; + first = false; } else { @@ -1031,7 +1055,7 @@ function getSearchResults(params) nodes = []; } - return processResults(nodes, params.maxResults, rootNode); + return processResults(nodes, params.pageSize < params.maxResults ? params.pageSize : params.maxResults, params.startIndex, rootNode); } /** diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index 6de78d4ff3..374d6da061 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -530,18 +530,6 @@ - - - - - - - - - - - - @@ -886,12 +874,8 @@ - - - - - - + + @@ -1304,6 +1288,12 @@ class="org.alfresco.repo.web.scripts.audit.AuditClearPost" parent="abstractAuditWebScript"> + + + + - + diff --git a/source/java/org/alfresco/cmis/changelog/CMISChangeLogServiceTest.java b/source/java/org/alfresco/cmis/changelog/CMISChangeLogServiceTest.java new file mode 100644 index 0000000000..2f6e4563c1 --- /dev/null +++ b/source/java/org/alfresco/cmis/changelog/CMISChangeLogServiceTest.java @@ -0,0 +1,468 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.cmis.changelog; + +import java.io.Serializable; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.transaction.Status; +import javax.transaction.UserTransaction; + +import junit.framework.TestCase; + +import org.alfresco.cmis.CMISCapabilityChanges; +import org.alfresco.cmis.CMISChangeEvent; +import org.alfresco.cmis.CMISChangeLog; +import org.alfresco.cmis.CMISChangeLogService; +import org.alfresco.cmis.CMISChangeType; +import org.alfresco.cmis.CMISInvalidArgumentException; +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; +import org.alfresco.repo.audit.model.AuditModelRegistryImpl; +import org.alfresco.repo.security.authentication.AuthenticationComponent; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.namespace.QName; +import org.alfresco.service.transaction.TransactionService; +import org.alfresco.util.ApplicationContextHelper; +import org.springframework.context.ApplicationContext; +import org.alfresco.util.Pair; + + +/** + * Base tests for {@link CMISChangeLogServiceImpl} + * + * @author Dmitry Velichkevich + */ +public class CMISChangeLogServiceTest extends TestCase +{ + private static final String CMIS_AUTHORITY = "cmis"; + private static final String CHANGE_PREFIX = "Changed"; + private static final String INVALID_CHANGE_TOKEN = ""; + private static final String[] NAME_PARTS = new String[] { "TestDocument (", ").txt", "TestFolder (", ")" }; + + private static int TOTAL_AMOUNT = 31; + private static int CREATED_AMOUNT = 18; + private static final int THE_HALFT_OF_CREATED_AMOUNT = CREATED_AMOUNT / 2; + private static final Map EXPECTED_AMOUNTS = new HashMap(); + static + { + EXPECTED_AMOUNTS.put(CMISChangeType.CREATED, 5); + EXPECTED_AMOUNTS.put(CMISChangeType.DELETED, 3); + EXPECTED_AMOUNTS.put(CMISChangeType.SECURITY, 4); + EXPECTED_AMOUNTS.put(CMISChangeType.UPDATED, 6); + } + + private AuditModelRegistryImpl auditSubsystem; + private CMISChangeLogService changeLogService; + private NodeService nodeService; + private FileFolderService fileFolderService; + private PermissionService permissionService; + private TransactionService transactionService; + private AuthenticationComponent authenticationComponent; + private RetryingTransactionHelper retryingTransactionHelper; + private UserTransaction testTX; + + private int actualCount = 0; + private Map actualAmounts = new HashMap(); + private List created = null; + private List deleted = null; + + private void disableAudit() + { + auditSubsystem.stop(); + auditSubsystem.setProperty("audit.enabled", "true"); + auditSubsystem.setProperty("audit.cmischangelog.enabled", "false"); + } + + private void enableAudit() + { + auditSubsystem.stop(); + auditSubsystem.setProperty("audit.enabled", "true"); + auditSubsystem.setProperty("audit.cmischangelog.enabled", "true"); + } + + /** + * Tests {@link CMISChangeLogServiceImpl} with disabled Auditing feature + * + * @throws Exception + */ + public void testServiceWithDisabledAuditing() throws Exception + { + disableAudit(); + String lastChangeLogToken = changeLogService.getLastChangeLogToken(); + createTestData(EXPECTED_AMOUNTS, false); + assertEquals(CMISCapabilityChanges.NONE, changeLogService.getCapability()); + try + { + changeLogService.getChangeLogEvents(lastChangeLogToken, null); + fail("Changes Logging was not enabled but no one Change Log Service method thrown exception"); + } + catch (Exception e) + { + assertTrue("Invalid exception type from Change Log Service method call with desabled Changes Logging", e instanceof AlfrescoRuntimeException); + } + } + + /** + * Tests {@link CMISChangeLogServiceImpl} with enabled Auditing feature + * + * @throws Exception + */ + public void testEnabledAuditing() throws Exception + { + enableAudit(); + String logToken = changeLogService.getLastChangeLogToken(); + createTestData(EXPECTED_AMOUNTS, false); + assertEquals(CMISCapabilityChanges.OBJECTIDSONLY, changeLogService.getCapability()); + CMISChangeLog changeLog = changeLogService.getChangeLogEvents(logToken, null); + assertChangeLog(logToken, changeLog); + assertChangeEvents(logToken, changeLog, null, FoldersAppearing.NOT_EXPECTED); + } + + /** + * Validates Change Log descriptor that was returned for some Change Log Token + * + * @param logToken {@link String} value that represents last Change Log Token + * @param changeLog {@link CMISChangeLog} instance that represents Change Log descriptor + */ + private void assertChangeLog(String logToken, CMISChangeLog changeLog) + { + assertNotNull(("'" + logToken + "' Change Log Token has no descriptor"), changeLog); + assertNotNull(("Event Etries for '" + logToken + "' Change Log Token are undefined"), changeLog.getChangeEvents()); + assertFalse(("Descriptor for '" + logToken + "' Change Log Token has no any Event Entry"), changeLog.getChangeEvents().isEmpty()); + } + + /** + * Creates test data which will represent Change Events of all possible types + * + * @param requiredAmounts {@link Map}<{@link CMISChangeType}, {@link Integer}> container instance that determines amount of Change Event for each Change Type + * @return pair containing list of created node refs, and list of deleted node refs + * @see CMISChangeType + */ + private Pair, List> createTestData(Map requiredAmounts, boolean withFolders) + { + changeLogService.getLastChangeLogToken(); + created = new LinkedList(); + deleted = new LinkedList(); + Pair, List> result = new Pair, List>(created, deleted); + NodeRef parentNodeRef = nodeService.getRootNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); + SecureRandom randomizer = new SecureRandom(); + for (CMISChangeType key : requiredAmounts.keySet()) + { + Integer amount = requiredAmounts.get(key); + for (int i = 0; i < amount; i++) + { + boolean folder = withFolders && (0 == ((Math.abs(randomizer.nextInt()) % amount) % 2)); + QName objectType = (folder) ? (ContentModel.TYPE_FOLDER) : (ContentModel.TYPE_CONTENT); + FileInfo object = fileFolderService.create(parentNodeRef, generateName(randomizer, folder), objectType); + created.add(object.getNodeRef()); + addOneToAmount(actualAmounts, CMISChangeType.CREATED); + switch (key) + { + case DELETED: + { + nodeService.deleteNode(object.getNodeRef()); + deleted.add(object.getNodeRef()); + addOneToAmount(actualAmounts, CMISChangeType.DELETED); + break; + } + case SECURITY: + { + permissionService.setPermission(object.getNodeRef(), CMIS_AUTHORITY, PermissionService.EXECUTE_CONTENT, true); + addOneToAmount(actualAmounts, CMISChangeType.SECURITY); + break; + } + case UPDATED: + { + StringBuilder nameBuilder = new StringBuilder(CHANGE_PREFIX); + nameBuilder.append(nodeService.getProperty(object.getNodeRef(), ContentModel.PROP_NAME)); + nodeService.setProperty(object.getNodeRef(), ContentModel.PROP_NAME, nameBuilder.toString()); + addOneToAmount(actualAmounts, CMISChangeType.UPDATED); + } + } + actualCount++; + } + } + return result; + } + + /** + * Deletes each element of created test data if element exist and current user has appropriate rights + * + * @param testData {@link Map}<{@link NodeRef}, {@link Map}<{@link QName}, {@link Serializable}>> container instance that contains test data + */ + private void deleteTestData() + { + if (created != null) + { + for (NodeRef object : created) + { + if (nodeService.exists(object) && (AccessStatus.ALLOWED == permissionService.hasPermission(object, PermissionService.DELETE))) + { + nodeService.deleteNode(object); + } + } + } + } + + /** + * @param folder {@link Boolean} value that determines which name should be generated (for Folder or Document Object) + * @return {@link String} value that represents generated uniquely name for Document Object + */ + private String generateName(SecureRandom randomizer, boolean folder) + { + StringBuilder nameBuilder = new StringBuilder(); + int i = (folder) ? (2) : (0); + nameBuilder.append(NAME_PARTS[i++]).append(Math.abs(randomizer.nextInt())).append(NAME_PARTS[i++]); + return nameBuilder.toString(); + } + + /** + * This method validates Change Event entries according to created earlier Objects. According to assertProperties parameter this method may and may not check properties + * of Change Event entry according to appropriate expected Object against Change Type + * + * @param expectedObjects {@link Map}<{@link NodeRef}, {@link Map}<{@link QName}, {@link Serializable}>> container instance that contains Ids and properties of + * expected Objects + * @param logToken {@link String} value that represents last Change Log Token + * @param changeLog {@link CMISChangeLog} instance that represents Change Log descriptor for last Change Log Token + * @param maxItems {@link Integer} value that determines high bound of Change Events amount + * @see CMISChangeType + */ + private void assertChangeEvents(String logToken, CMISChangeLog changeLog, Integer maxItems, FoldersAppearing foldersAppearing) + { + Map logAmounts = new HashMap(); + boolean folderWasFound = false; + int idx = 0; + for (CMISChangeEvent event : changeLog.getChangeEvents()) + { + // skip first change log entry if a log token has been specified, as the CMIS spec expects + // the change entry to be returned for the specified log token + idx++; + if (logToken != null && idx == 1) + { + continue; + } + + assertNotNull(("One of the Change Log Event Enries is undefined for '" + logToken + "' Change Log Token"), event); + assertNotNull(("Change Event Entry Id of one of the Change Entries is undefined for '" + logToken + "' Change Log Token"), event.getChangedNode()); + assertNotNull(("Change Event Change Type of one of the Change Entries is undefined for '" + logToken + "' Change Log Token"), event.getChangeType()); + assertTrue("Unexpected Object Id='" + event.getChangedNode().toString() + "' from Change Log Token Entries list for '" + logToken + "' Change Log Token", created + .contains(event.getChangedNode())); + if (!deleted.contains(event.getChangedNode())) + { + folderWasFound = folderWasFound || fileFolderService.getFileInfo(event.getChangedNode()).isFolder(); + assertTrue( + ("Object from Change Event Entries list is marked as '" + event.getChangeType().toString() + "' but does not exist for '" + logToken + "' Change Log Token"), + nodeService.exists(event.getChangedNode())); + } + else + { + assertTrue("Object has been deleted", deleted.contains(event.getChangedNode())); + assertFalse(("Object from Change Event Entries list is marked as 'DELETED' but it still exist for '" + logToken + "' Change Log Token"), nodeService.exists(event + .getChangedNode())); + } + addOneToAmount(logAmounts, event.getChangeType()); + } + if (FoldersAppearing.MUST_APPEAR == foldersAppearing) + { + assertTrue("No one Folder Object was returned", folderWasFound); + } + else + { + if (FoldersAppearing.NOT_EXPECTED == foldersAppearing) + { + assertFalse("Some Folder Object was found", folderWasFound); + } + } + if ((null == maxItems) || (maxItems >= TOTAL_AMOUNT)) + { + for (CMISChangeType key : actualAmounts.keySet()) + { + Integer actualAmount = actualAmounts.get(key); + Integer logAmount = logAmounts.get(key); + assertTrue(("Invalid Entries amount for '" + key.toString() + "' Change Type. Actual amount: " + actualAmount + ", but log amount: " + logAmount), actualAmount + .equals(logAmount)); + } + } + } + + private enum FoldersAppearing + { + NOT_EXPECTED, MAY_APPEAR, MUST_APPEAR + } + + /** + * Determines which kind of Change was handled and increments appropriate amount to 1 + * + * @param mappedAmounts {@link Map}>{@link CMISChangeType}, {@link Integer}< container instance that contains all accumulated amounts for each kind of Change + * @param changeType {@link CMISChangeType} enum value that determines kind of Change + */ + private void addOneToAmount(Map mappedAmounts, CMISChangeType changeType) + { + Integer amount = mappedAmounts.get(changeType); + amount = (null == amount) ? (Integer.valueOf(1)) : (Integer.valueOf(amount.intValue() + 1)); + mappedAmounts.put(changeType, amount); + } + + /** + * Test {@link CMISChangeLogServiceImpl} with enabled Auditing feature for Max Items parameter + * + * @throws Exception + */ + public void testEnabledAuditingForMaxItems() throws Exception + { + enableAudit(); + String logToken = changeLogService.getLastChangeLogToken(); + createTestData(EXPECTED_AMOUNTS, false); + assertEquals(CMISCapabilityChanges.OBJECTIDSONLY, changeLogService.getCapability()); + CMISChangeLog changeLog = changeLogService.getChangeLogEvents(logToken, THE_HALFT_OF_CREATED_AMOUNT); + assertChangeLog(logToken, changeLog); + assertChangeEvents(logToken, changeLog, THE_HALFT_OF_CREATED_AMOUNT, FoldersAppearing.NOT_EXPECTED); + assertEquals(THE_HALFT_OF_CREATED_AMOUNT, changeLog.getChangeEvents().size()); + assertTrue("Not all Change Log Entries were requested but result set is indicating that no one more Entry is avilable", changeLog.hasMoreItems()); + changeLog = changeLogService.getChangeLogEvents(logToken, TOTAL_AMOUNT + (logToken == null ? 0 : 1)); + assertChangeEvents(logToken, changeLog, TOTAL_AMOUNT, FoldersAppearing.NOT_EXPECTED); + assertFalse("All Change Log Entries were requested but result set is indicating that some more Entry(s) are available", changeLog.hasMoreItems()); + } + + /** + * This method tests {@link CMISChangeLogServiceImpl} on receiving Change Event Entries for Invalid Change Log Token with enable and disabled Changes Logging + * + * @throws Exception + */ + public void testReceivingChangeEventsForInvalidChangeToken() throws Exception + { + enableAudit(); + try + { + changeLogService.getChangeLogEvents(INVALID_CHANGE_TOKEN, null); + fail("Change Events were received normally for Invalid Change Log Token"); + } + catch (Exception e) + { + assertTrue("Invalid exception type from Change Log Service method call with enabled Changes Logging", e instanceof CMISInvalidArgumentException); + } + disableAudit(); + try + { + changeLogService.getChangeLogEvents(INVALID_CHANGE_TOKEN, null); + fail("Changes Logging was not enabled but not one Change Log Service method thrown exception"); + } + catch (Exception e) + { + assertTrue("Invalid exception type from Change Log Service method call with desabled Changes Logging", e instanceof AlfrescoRuntimeException); + } + } + + /** + * This method tests {@link CMISChangeLogServiceImpl} on working with Change Event entries which could contain Folder Objects + * + * @throws Exception + */ + public void testReceivingOfChangeEventsExpectingFolders() throws Exception + { + enableAudit(); + String changeToken = changeLogService.getLastChangeLogToken(); + createTestData(EXPECTED_AMOUNTS, true); + CMISChangeLog changeLogEvents = changeLogService.getChangeLogEvents(changeToken, null); + assertChangeLog(changeToken, changeLogEvents); + assertChangeEvents(changeToken, changeLogEvents, null, FoldersAppearing.MUST_APPEAR); + } + + /** + * This method tests {@link CMISChangeLogServiceImpl} on working with Change Event entries which could contain Folder Objects. Also this method tests behavior of Max Items + * parameter for Folder Objects + * + * @throws Exception + */ + public void testReceivingOfChangeEventsExpectingFoldersAndBoundedByMaxItems() throws Exception + { + enableAudit(); + String changeToken = changeLogService.getLastChangeLogToken(); + createTestData(EXPECTED_AMOUNTS, true); + CMISChangeLog changeLogEvents = changeLogService.getChangeLogEvents(changeToken, 15); + assertTrue("Not all Change Event Entries were requested but result set indicates that no more Entry(s) available", changeLogEvents.hasMoreItems()); + assertChangeLog(changeToken, changeLogEvents); + assertChangeEvents(changeToken, changeLogEvents, 15, FoldersAppearing.MAY_APPEAR); + changeLogEvents = changeLogService.getChangeLogEvents(changeToken, TOTAL_AMOUNT + (changeToken == null ? 0 : 1)); + assertChangeLog(changeToken, changeLogEvents); + assertChangeEvents(changeToken, changeLogEvents, TOTAL_AMOUNT, FoldersAppearing.MUST_APPEAR); + assertFalse("All Change Event Entries were requested but results indicating that some more Entry(s) available", changeLogEvents.hasMoreItems()); + } + + @Override + public void setUp() throws Exception + { + ApplicationContext applicationContext = ApplicationContextHelper.getApplicationContext(); + changeLogService = (CMISChangeLogService) applicationContext.getBean("CMISChangeLogService"); + nodeService = (NodeService) applicationContext.getBean("NodeService"); + permissionService = (PermissionService) applicationContext.getBean("PermissionService"); + fileFolderService = (FileFolderService) applicationContext.getBean("FileFolderService"); + transactionService = (TransactionService) applicationContext.getBean("transactionComponent"); + authenticationComponent = (AuthenticationComponent) applicationContext.getBean("authenticationComponent"); + retryingTransactionHelper = (RetryingTransactionHelper) applicationContext.getBean("retryingTransactionHelper"); + auditSubsystem = (AuditModelRegistryImpl) applicationContext.getBean("Audit"); + + // initialise audit subsystem + RetryingTransactionCallback initAudit = new RetryingTransactionCallback() + { + public Void execute() throws Exception + { + auditSubsystem.stop(); + auditSubsystem.setProperty("audit.enabled", "true"); + auditSubsystem.setProperty("audit.cmischangelog.enabled", "true"); + auditSubsystem.start(); + return null; + } + }; + retryingTransactionHelper.doInTransaction(initAudit, false, true); + + // start test transaction + testTX = transactionService.getUserTransaction(); + testTX.begin(); + this.authenticationComponent.setSystemUserAsCurrentUser(); + } + + @Override + protected void tearDown() throws Exception + { + deleteTestData(); + + if (testTX.getStatus() == Status.STATUS_ACTIVE) + { + testTX.rollback(); + } + AuthenticationUtil.clearCurrentSecurityContext(); + + auditSubsystem.destroy(); + } +} diff --git a/source/java/org/alfresco/opencmis/AbstractBaseUrlGenerator.java b/source/java/org/alfresco/opencmis/AbstractBaseUrlGenerator.java index aa69657b3e..553e4be4c8 100644 --- a/source/java/org/alfresco/opencmis/AbstractBaseUrlGenerator.java +++ b/source/java/org/alfresco/opencmis/AbstractBaseUrlGenerator.java @@ -21,7 +21,7 @@ package org.alfresco.opencmis; import javax.servlet.http.HttpServletRequest; import org.alfresco.opencmis.CMISDispatcherRegistry.Binding; -import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; +import org.alfresco.repo.web.scripts.TenantWebScriptServlet; /** * Generates an OpenCMIS base url based on the request, repository id and binding. @@ -46,10 +46,30 @@ public abstract class AbstractBaseUrlGenerator implements BaseUrlGenerator { this.overrideContext = overrideContext; } + + private String fixup(String urlSegment) + { + StringBuilder sb = new StringBuilder(); + int beginIndex = 0; + int endIndex = urlSegment.length(); + if(urlSegment != null) + { + if(!urlSegment.equals("") && !urlSegment.startsWith("/")) + { + sb.append("/"); + } + if(urlSegment.endsWith("/")) + { + endIndex -= 1; + } + } + sb.append(urlSegment.substring(beginIndex, endIndex)); + return sb.toString(); + } public void setContextOverride(String contextOverride) { - this.contextOverride = contextOverride; + this.contextOverride = fixup(contextOverride); } public void setOverrideServletPath(boolean overrideServletPath) @@ -59,12 +79,12 @@ public abstract class AbstractBaseUrlGenerator implements BaseUrlGenerator public void setServletPathOverride(String servletPathOverride) { - this.servletPathOverride = servletPathOverride; + this.servletPathOverride = fixup(servletPathOverride); } protected abstract String getServerPath(HttpServletRequest request); - protected String getContextPath(HttpServletRequest httpReq) + public String getContextPath(HttpServletRequest httpReq) { if(overrideContext) { @@ -76,7 +96,7 @@ public abstract class AbstractBaseUrlGenerator implements BaseUrlGenerator } } - protected String getServletPath(HttpServletRequest req) + public String getServletPath(HttpServletRequest req) { if(overrideServletPath) { @@ -87,26 +107,77 @@ public abstract class AbstractBaseUrlGenerator implements BaseUrlGenerator return req.getServletPath(); } } - + @Override - public UrlBuilder getBaseUrl(HttpServletRequest req, String repositoryId, Binding binding) + public String getRequestURI(HttpServletRequest req, String repositoryId, String operation) { - UrlBuilder url = new UrlBuilder(getServerPath(req)); + StringBuilder url = new StringBuilder(); String contextPath = getContextPath(req); if(contextPath != null && !contextPath.equals("")) { - url.addPathSegment(contextPath); + url.append(contextPath); } String servletPath = getServletPath(req); if(servletPath != null && !servletPath.equals("")) { - url.addPathSegment(servletPath); + url.append(servletPath); + url.append("/"); + } + + if(url.length() == 0 || url.charAt(0) != '/') + { + url.append("/"); + } + + if(repositoryId != null) + { + url.append(repositoryId == null ? TenantWebScriptServlet.DEFAULT_TENANT : repositoryId); + url.append("/"); + } + + if(operation != null) + { + url.append(operation); + } + + int length = url.length(); + if(length > 0 && url.charAt(length - 1) == '/') + { + url.deleteCharAt(length - 1); + } + + return url.toString(); + } + + @Override + public String getBaseUrl(HttpServletRequest req, String repositoryId, Binding binding) + { + StringBuilder url = new StringBuilder(); + String serverPath = getServerPath(req); + url.append(serverPath); + + String contextPath = getContextPath(req); + if(contextPath != null && !contextPath.equals("")) + { + url.append(contextPath); + } + + String servletPath = getServletPath(req); + if(servletPath != null && !servletPath.equals("")) + { + url.append(servletPath); + url.append("/"); + } + + if(url.length() > 0 && url.charAt(url.length() - 1) != '/') + { + url.append("/"); } pathGenerator.generatePath(req, url, repositoryId, binding); - - return url; + + return url.toString(); } } diff --git a/source/java/org/alfresco/opencmis/AbstractOpenCMISTCKTest.java b/source/java/org/alfresco/opencmis/AbstractOpenCMISTCKTest.java index 47a46558dc..1d3fcacfab 100644 --- a/source/java/org/alfresco/opencmis/AbstractOpenCMISTCKTest.java +++ b/source/java/org/alfresco/opencmis/AbstractOpenCMISTCKTest.java @@ -25,7 +25,7 @@ import org.apache.chemistry.opencmis.tck.impl.JUnitHelper; import org.apache.chemistry.opencmis.tck.tests.basics.BasicsTestGroup; import org.apache.chemistry.opencmis.tck.tests.control.ControlTestGroup; import org.apache.chemistry.opencmis.tck.tests.crud.CRUDTestGroup; -import org.apache.chemistry.opencmis.tck.tests.filing.UnfilingTest; +import org.apache.chemistry.opencmis.tck.tests.filing.FilingTestGroup; import org.apache.chemistry.opencmis.tck.tests.query.ContentChangesSmokeTest; import org.apache.chemistry.opencmis.tck.tests.query.QueryLikeTest; import org.apache.chemistry.opencmis.tck.tests.query.QuerySmokeTest; @@ -69,7 +69,7 @@ public abstract class AbstractOpenCMISTCKTest //@Test public void testCMISTCKFiling() throws Exception { - OverrideFilingTestGroup filingTestGroup = new OverrideFilingTestGroup(); + FilingTestGroup filingTestGroup = new FilingTestGroup(); filingTestGroup.init(clientContext.getCMISParameters()); JUnitHelper.run(filingTestGroup); } @@ -95,20 +95,20 @@ public abstract class AbstractOpenCMISTCKTest * * Override to OpenCMIS FilingTestGroup to allow me to disable failing tests. */ - class OverrideFilingTestGroup extends AbstractSessionTestGroup - { - @Override - public void init(Map parameters) throws Exception - { - super.init(parameters); - - setName("Filing Test Group"); - setDescription("Multifiling anf Unfiling tests."); - - //addTest(new MultifilingTest()); - addTest(new UnfilingTest()); - } - } +// class OverrideFilingTestGroup extends AbstractSessionTestGroup +// { +// @Override +// public void init(Map parameters) throws Exception +// { +// super.init(parameters); +// +// setName("Filing Test Group"); +// setDescription("Multifiling anf Unfiling tests."); +// +// //addTest(new MultifilingTest()); +// addTest(new UnfilingTest()); +// } +// } /** * Override to OpenCMIS QueryTestGroup to allow me to disable failing tests. diff --git a/source/java/org/alfresco/opencmis/AtomPubCMISDispatcher.java b/source/java/org/alfresco/opencmis/AtomPubCMISDispatcher.java index 04157f9de0..25f70728ea 100644 --- a/source/java/org/alfresco/opencmis/AtomPubCMISDispatcher.java +++ b/source/java/org/alfresco/opencmis/AtomPubCMISDispatcher.java @@ -21,9 +21,7 @@ package org.alfresco.opencmis; import javax.servlet.http.HttpServlet; import org.alfresco.opencmis.CMISDispatcherRegistry.Binding; -import org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils; import org.apache.chemistry.opencmis.server.impl.atompub.CmisAtomPubServlet; -import org.springframework.extensions.webscripts.WebScriptRequest; /** * Dispatches OpenCMIS requests to the OpenCMIS AtomPub servlet. @@ -33,24 +31,17 @@ import org.springframework.extensions.webscripts.WebScriptRequest; */ public class AtomPubCMISDispatcher extends CMISServletDispatcher { - private AtomPubUtils atomPubUtils; - - public void setAtomPubUtils(AtomPubUtils atomPubUtils) - { - this.atomPubUtils = atomPubUtils; - } - public void init() { super.init(); registry.registerDispatcher(getBinding(), this); } - @Override - protected CMISHttpServletRequest getHttpRequest(WebScriptRequest req) - { - return super.getHttpRequest(req); - } +// @Override +// protected CMISHttpServletRequest getHttpRequest(WebScriptRequest req) +// { +// return super.getHttpRequest(req); +// } @Override protected Binding getBinding() @@ -63,14 +54,4 @@ public class AtomPubCMISDispatcher extends CMISServletDispatcher HttpServlet servlet = new CmisAtomPubServlet(); return servlet; } - - protected Object getServletAttribute(String attrName) - { - if(attrName.equals("atomPubUtils")) - { - return atomPubUtils; - } - - return super.getServletAttribute(attrName); - } } diff --git a/source/java/org/alfresco/opencmis/BaseUrlGenerator.java b/source/java/org/alfresco/opencmis/BaseUrlGenerator.java index 12a5412ae9..8e6b4cee3c 100644 --- a/source/java/org/alfresco/opencmis/BaseUrlGenerator.java +++ b/source/java/org/alfresco/opencmis/BaseUrlGenerator.java @@ -21,7 +21,6 @@ package org.alfresco.opencmis; import javax.servlet.http.HttpServletRequest; import org.alfresco.opencmis.CMISDispatcherRegistry.Binding; -import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; /** * Generates an OpenCMIS base url based on the request, repository id and binding. @@ -31,5 +30,8 @@ import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; */ public interface BaseUrlGenerator { - public UrlBuilder getBaseUrl(HttpServletRequest request, String repositoryId, Binding binding); + String getContextPath(HttpServletRequest httpReq); + String getServletPath(HttpServletRequest req); + String getBaseUrl(HttpServletRequest req, String repositoryId, Binding binding); + String getRequestURI(HttpServletRequest req, String repositoryId, String operation); } diff --git a/source/java/org/alfresco/opencmis/BrowserCMISDispatcher.java b/source/java/org/alfresco/opencmis/BrowserCMISDispatcher.java new file mode 100644 index 0000000000..126a660784 --- /dev/null +++ b/source/java/org/alfresco/opencmis/BrowserCMISDispatcher.java @@ -0,0 +1,33 @@ +package org.alfresco.opencmis; + +import javax.servlet.http.HttpServlet; + +import org.alfresco.opencmis.CMISDispatcherRegistry.Binding; +import org.apache.chemistry.opencmis.server.impl.browser.CmisBrowserBindingServlet; + +/** + * Dispatches OpenCMIS requests to the OpenCMIS Browser Binding servlet. + * + * @author steveglover + * + */ +public class BrowserCMISDispatcher extends CMISServletDispatcher +{ + public void init() + { + super.init(); + registry.registerDispatcher(getBinding(), this); + } + + @Override + protected Binding getBinding() + { + return Binding.browser; + } + + protected HttpServlet getServlet() + { + HttpServlet servlet = new CmisBrowserBindingServlet(); + return servlet; + } +} diff --git a/source/java/org/alfresco/opencmis/CMISDispatcherRegistry.java b/source/java/org/alfresco/opencmis/CMISDispatcherRegistry.java index 0ae7e4af03..cc2cb1681b 100644 --- a/source/java/org/alfresco/opencmis/CMISDispatcherRegistry.java +++ b/source/java/org/alfresco/opencmis/CMISDispatcherRegistry.java @@ -33,7 +33,7 @@ public interface CMISDispatcherRegistry */ public static enum Binding { - atom; + atom, browser; }; public void registerDispatcher(Binding binding, CMISDispatcher dispatcher); diff --git a/source/java/org/alfresco/opencmis/CMISHttpServletRequest.java b/source/java/org/alfresco/opencmis/CMISHttpServletRequest.java index 3029a9892d..678e06dc1e 100644 --- a/source/java/org/alfresco/opencmis/CMISHttpServletRequest.java +++ b/source/java/org/alfresco/opencmis/CMISHttpServletRequest.java @@ -35,10 +35,12 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import org.alfresco.opencmis.CMISDispatcherRegistry.Binding; import org.alfresco.repo.tenant.TenantUtil; import org.alfresco.repo.web.scripts.TenantWebScriptServlet; import org.alfresco.repo.web.scripts.TenantWebScriptServletRequest; import org.apache.chemistry.opencmis.commons.impl.Constants; +import org.apache.chemistry.opencmis.server.shared.Dispatcher; import org.apache.commons.collections.map.HashedMap; import org.springframework.extensions.webscripts.Match; import org.springframework.extensions.webscripts.WebScriptRequest; @@ -56,11 +58,15 @@ public class CMISHttpServletRequest implements HttpServletRequest protected String repositoryId; protected String operation; protected String serviceName; + protected BaseUrlGenerator baseUrlGenerator; + protected Binding binding; - public CMISHttpServletRequest(WebScriptRequest req, String serviceName) + public CMISHttpServletRequest(WebScriptRequest req, String serviceName, BaseUrlGenerator baseUrlGenerator, Binding binding) { this.req = req; this.serviceName = serviceName; + this.baseUrlGenerator = baseUrlGenerator; + this.binding = binding; String pathInfo = req.getPathInfo(); WebScriptRequest baseReq = getBaseRequest(req); @@ -111,13 +117,41 @@ public class CMISHttpServletRequest implements HttpServletRequest @Override public Object getAttribute(String arg0) { - return httpReq.getAttribute(arg0); + if(arg0.equals(Dispatcher.BASE_URL_ATTRIBUTE)) + { + return baseUrlGenerator.getBaseUrl(this, repositoryId, binding); + } + else + { + return httpReq.getAttribute(arg0); + } } + @SuppressWarnings("unchecked") @Override public Enumeration getAttributeNames() { - return httpReq.getAttributeNames(); + Enumeration e = httpReq.getAttributeNames(); + List attrNames = new ArrayList(); + while(e.hasMoreElements()) + { + attrNames.add(e.nextElement()); + } + attrNames.add(Dispatcher.BASE_URL_ATTRIBUTE); + final Iterator it = attrNames.iterator(); + + return new Enumeration() + { + public boolean hasMoreElements() + { + return it.hasNext(); + } + + public Object nextElement() + { + return it.next(); + } + }; } @Override @@ -248,6 +282,7 @@ public class CMISHttpServletRequest implements HttpServletRequest return httpReq.getReader(); } + @SuppressWarnings("deprecation") @Override public String getRealPath(String arg0) { @@ -329,7 +364,8 @@ public class CMISHttpServletRequest implements HttpServletRequest @Override public String getContextPath() { - return httpReq.getContextPath(); + String contextPath = baseUrlGenerator.getContextPath(httpReq); + return contextPath; } @Override @@ -396,7 +432,23 @@ public class CMISHttpServletRequest implements HttpServletRequest @Override public String getQueryString() { - return httpReq.getQueryString(); + String queryString = httpReq.getQueryString(); + StringBuilder queryStringBuilder = new StringBuilder(); + if(queryString != null) + { + queryStringBuilder.append(queryString); + } + if(this.repositoryId != null) + { + if(queryString != null && queryString.length() > 0) + { + queryStringBuilder.append("&"); + } + queryStringBuilder.append(Constants.PARAM_REPOSITORY_ID); + queryStringBuilder.append("="); + queryStringBuilder.append(this.repositoryId); + } + return queryStringBuilder.toString(); } @Override @@ -406,8 +458,10 @@ public class CMISHttpServletRequest implements HttpServletRequest } @Override - public String getRequestURI() { - return httpReq.getRequestURI(); + public String getRequestURI() + { + String requestURI = baseUrlGenerator.getRequestURI(httpReq, repositoryId, operation); + return requestURI; } @Override @@ -425,7 +479,8 @@ public class CMISHttpServletRequest implements HttpServletRequest @Override public String getServletPath() { - return httpReq.getServletPath(); + String servletPath = baseUrlGenerator.getServletPath(httpReq); + return servletPath; } @Override diff --git a/source/java/org/alfresco/opencmis/CMISServletDispatcher.java b/source/java/org/alfresco/opencmis/CMISServletDispatcher.java index dedb3c9f46..72576283a9 100644 --- a/source/java/org/alfresco/opencmis/CMISServletDispatcher.java +++ b/source/java/org/alfresco/opencmis/CMISServletDispatcher.java @@ -57,7 +57,13 @@ public abstract class CMISServletDispatcher implements CMISDispatcher protected HttpServlet servlet; protected CMISDispatcherRegistry registry; protected String serviceName; + protected BaseUrlGenerator baseUrlGenerator; + public void setBaseUrlGenerator(BaseUrlGenerator baseUrlGenerator) + { + this.baseUrlGenerator = baseUrlGenerator; + } + public void setRegistry(CMISDispatcherRegistry registry) { this.registry = registry; @@ -118,11 +124,11 @@ public abstract class CMISServletDispatcher implements CMISDispatcher throw new AlfrescoRuntimeException("Failed to initialise CMIS webscript", e); } } - + protected CMISHttpServletRequest getHttpRequest(WebScriptRequest req) { String serviceName = getServiceName(); - CMISHttpServletRequest httpReqWrapper = new CMISHttpServletRequest(req, serviceName); + CMISHttpServletRequest httpReqWrapper = new CMISHttpServletRequest(req, serviceName, baseUrlGenerator, getBinding()); return httpReqWrapper; } diff --git a/source/java/org/alfresco/opencmis/DefaultPathGenerator.java b/source/java/org/alfresco/opencmis/DefaultPathGenerator.java index c11c8447d7..12d7be8e6e 100644 --- a/source/java/org/alfresco/opencmis/DefaultPathGenerator.java +++ b/source/java/org/alfresco/opencmis/DefaultPathGenerator.java @@ -22,7 +22,6 @@ import javax.servlet.http.HttpServletRequest; import org.alfresco.opencmis.CMISDispatcherRegistry.Binding; import org.alfresco.repo.web.scripts.TenantWebScriptServlet; -import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; /** * Default generator for OpenCMIS paths based on the repositoryId and binding. @@ -32,16 +31,17 @@ import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; */ public class DefaultPathGenerator implements PathGenerator { - public void generatePath(HttpServletRequest req, UrlBuilder url, String repositoryId, Binding binding) + public void generatePath(HttpServletRequest req, StringBuilder url, String repositoryId, Binding binding) { - url.addPathSegment(binding.toString()); + url.append(binding.toString()); + url.append("/"); if(repositoryId != null) { - url.addPathSegment(repositoryId); + url.append(repositoryId); } else { - url.addPathSegment(TenantWebScriptServlet.DEFAULT_TENANT); + url.append(TenantWebScriptServlet.DEFAULT_TENANT); } } diff --git a/source/java/org/alfresco/opencmis/PathGenerator.java b/source/java/org/alfresco/opencmis/PathGenerator.java index fd004cd9ea..f2dd621ac9 100644 --- a/source/java/org/alfresco/opencmis/PathGenerator.java +++ b/source/java/org/alfresco/opencmis/PathGenerator.java @@ -21,7 +21,6 @@ package org.alfresco.opencmis; import javax.servlet.http.HttpServletRequest; import org.alfresco.opencmis.CMISDispatcherRegistry.Binding; -import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; /** * Generates an OpenCMIS path based on the repositoryId and binding. @@ -31,5 +30,5 @@ import org.apache.chemistry.opencmis.commons.impl.UrlBuilder; */ public interface PathGenerator { - public void generatePath(HttpServletRequest req, UrlBuilder url, String repositoryId, Binding binding); + public void generatePath(HttpServletRequest req, StringBuilder url, String repositoryId, Binding binding); } \ No newline at end of file diff --git a/source/java/org/alfresco/repo/cmis/ws/PasswordTypeInterceptor.java b/source/java/org/alfresco/repo/cmis/ws/PasswordTypeInterceptor.java new file mode 100644 index 0000000000..a9f3f54be9 --- /dev/null +++ b/source/java/org/alfresco/repo/cmis/ws/PasswordTypeInterceptor.java @@ -0,0 +1,62 @@ +package org.alfresco.repo.cmis.ws; + +import java.util.Arrays; + +import javax.xml.namespace.QName; +import javax.xml.soap.SOAPMessage; + +import org.apache.cxf.binding.soap.SoapMessage; +import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.phase.Phase; +import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; +import org.apache.ws.security.WSConstants; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + + +/** + * Interceptor that by default adds PasswordText type to Password element + * if it doesn't have Type attribute. It should be done before WSSecurityEngine + * processes Security header in scope of WSS4JInInterceptor execution. + * + * @author Viachaslau Tsikhanovich + * + */ +public class PasswordTypeInterceptor extends AbstractSoapInterceptor +{ + + private QName securityHeader = new QName(WSConstants.WSSE_NS, WSConstants.WSSE_LN); + + public PasswordTypeInterceptor() + { + super(Phase.PRE_PROTOCOL); + addBefore(Arrays.asList(WSS4JInInterceptor.class.getName())); + } + + @Override + public void handleMessage(SoapMessage message) throws Fault + { + if (message.hasHeader(securityHeader)) + { + SOAPMessage saaj = message.getContent(SOAPMessage.class); + Document document = saaj.getSOAPPart(); + NodeList nodes = document.getElementsByTagNameNS("*", WSConstants.PASSWORD_LN); + if (nodes.getLength() > 0) + { + Node passwordNode = nodes.item(0); + NamedNodeMap atts = passwordNode.getAttributes(); + if (null == atts.getNamedItem(WSConstants.PASSWORD_TYPE_ATTR)) + { + Attr typeAttribute = document.createAttribute(WSConstants.PASSWORD_TYPE_ATTR); + typeAttribute.setValue(WSConstants.PASSWORD_TEXT); + atts.setNamedItem(typeAttribute); + } + } + } + } + +} diff --git a/source/java/org/alfresco/repo/imap/scripts/ServerStatusWebScript.java b/source/java/org/alfresco/repo/imap/scripts/ServerStatusWebScript.java index 323a25cbb4..10383fe2a5 100644 --- a/source/java/org/alfresco/repo/imap/scripts/ServerStatusWebScript.java +++ b/source/java/org/alfresco/repo/imap/scripts/ServerStatusWebScript.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -21,6 +21,10 @@ package org.alfresco.repo.imap.scripts; import java.io.IOException; import org.alfresco.repo.imap.ImapService; +import org.alfresco.repo.management.subsystems.ChildApplicationContextFactory; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.extensions.webscripts.AbstractWebScript; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; @@ -28,13 +32,25 @@ import org.springframework.extensions.webscripts.WebScriptResponse; /** * Shows the availability of the IMAP server via web script request. */ -public class ServerStatusWebScript extends AbstractWebScript +public class ServerStatusWebScript extends AbstractWebScript implements ApplicationContextAware { - private ImapService imapService; - + private ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.applicationContext = applicationContext; + } + public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException { - if (imapService.getImapServerEnabled()) + ChildApplicationContextFactory subsystem = (ChildApplicationContextFactory)applicationContext.getBean("imap"); + + // note: getting property (rather than getting imapService bean to check isEnabled) does not cause subsystem startup (if stopped) + // hence providing ability for subsystem to be disabled (whilst still supporting ability to check status and/or dynamically start via JMX) + String isEnabled = (String)subsystem.getProperty("imap.server.enabled"); + + if (new Boolean(isEnabled).booleanValue()) { res.getWriter().write("enabled"); } @@ -45,10 +61,4 @@ public class ServerStatusWebScript extends AbstractWebScript res.getWriter().flush(); res.getWriter().close(); } - - public void setImapService(ImapService imapService) - { - this.imapService = imapService; - } - } diff --git a/source/java/org/alfresco/repo/management/subsystems/test/SubsystemsTest.java b/source/java/org/alfresco/repo/management/subsystems/test/SubsystemsTest.java new file mode 100644 index 0000000000..9a06ea9929 --- /dev/null +++ b/source/java/org/alfresco/repo/management/subsystems/test/SubsystemsTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.management.subsystems.test; + +import org.alfresco.repo.management.subsystems.ApplicationContextFactory; +import org.alfresco.repo.management.subsystems.ChildApplicationContextFactory; +import org.alfresco.util.ApplicationContextHelper; +import org.alfresco.util.BaseSpringTest; +import org.apache.cxf.endpoint.ServerRegistryImpl; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * Ensures the following features of subsystems are working: + *
    + *
  • Subsystem default properties + *
  • Global property overrides (via alfresco-global.properties) + *
  • Subsystem instance specific property overrides (via extension classpath) + *
  • Subsystem instance specific Spring overrides (via extension classpath) + *
  • Composite property defaults + *
  • Composite property instance overrides + *
+ * + * @see ChildApplicationContextFactory + * @author dward + */ +public class SubsystemsTest extends BaseSpringTest +{ + + /* + * (non-Javadoc) + * @see org.alfresco.util.BaseSpringTest#getConfigLocations() + */ + @Override + protected String[] getConfigLocations() + { + return new String[] + { + ApplicationContextHelper.CONFIG_LOCATIONS[0], "classpath:subsystem-test-context.xml" + }; + } + + /** + * Test subsystems. + * + * @throws Exception + * the exception + */ + public void testSubsystems() throws Exception + { + ApplicationContextFactory subsystem = (ApplicationContextFactory) getApplicationContext().getBean( + "testsubsystem"); + ConfigurableApplicationContext childContext = (ConfigurableApplicationContext) subsystem + .getApplicationContext(); + assertTrue("Subsystem not started", childContext.isActive()); + TestService testService = (TestService) childContext.getBean("testService"); + // Make sure subsystem defaults work + assertEquals("Subsystem Default1", testService.getSimpleProp1()); + // Make sure global property overrides work + assertEquals(true, testService.getSimpleProp2().booleanValue()); + // Make sure extension classpath property overrides work + assertEquals("Instance Override3", testService.getSimpleProp3()); + // Make sure extension classpath Spring overrides work + assertEquals("An extra bean I changed", childContext.getBean("anotherBean")); + // Make sure composite properties and their defaults work + TestBean[] testBeans = testService.getTestBeans(); + assertNotNull("Composite property not set", testBeans); + assertEquals(3, testBeans.length); + assertEquals("inst1", testBeans[0].getId()); + assertEquals(false, testBeans[0].isBoolProperty()); + assertEquals(123456789123456789L, testBeans[0].getLongProperty()); + assertEquals("Global Default", testBeans[0].getAnotherStringProperty()); + assertEquals("inst2", testBeans[1].getId()); + assertEquals(true, testBeans[1].isBoolProperty()); + assertEquals(123456789123456789L, testBeans[1].getLongProperty()); + assertEquals("Global Default", testBeans[1].getAnotherStringProperty()); + assertEquals("inst3", testBeans[2].getId()); + assertEquals(false, testBeans[2].isBoolProperty()); + assertEquals(123456789123456789L, testBeans[2].getLongProperty()); + assertEquals("Global Instance Default", testBeans[2].getAnotherStringProperty()); + } + + public void testALF6058() throws Exception + { + ServerRegistryImpl serverRegistry = getApplicationContext().getBean(ServerRegistryImpl.class); + ApplicationContextFactory subsystem = (ApplicationContextFactory) getApplicationContext().getBean("testsubsystem"); + int beforeStop = serverRegistry.getServers().size(); + subsystem.stop(); + //Make sure CXF doesn't remove its endpoints after subsystem stops + assertEquals(beforeStop, serverRegistry.getServers().size()); + subsystem.start(); + + } + +} diff --git a/source/java/org/alfresco/repo/web/scripts/TestWebScriptRepoServer.java b/source/java/org/alfresco/repo/web/scripts/TestWebScriptRepoServer.java index ebbee8b240..652bb35c6d 100644 --- a/source/java/org/alfresco/repo/web/scripts/TestWebScriptRepoServer.java +++ b/source/java/org/alfresco/repo/web/scripts/TestWebScriptRepoServer.java @@ -148,7 +148,7 @@ public class TestWebScriptRepoServer extends TestWebScriptServer } // Check if we need to start/restart the context - if (TestWebScriptRepoServer.ctx == null) + if (TestWebScriptRepoServer.ctx == null || (TestWebScriptRepoServer.ctx != null && !TestWebScriptRepoServer.ctx.isActive())) { // Restart it final String[] configLocations; diff --git a/source/java/org/alfresco/repo/web/scripts/audit/AbstractAuditWebScript.java b/source/java/org/alfresco/repo/web/scripts/audit/AbstractAuditWebScript.java index a58b2627cc..4abf5d448a 100644 --- a/source/java/org/alfresco/repo/web/scripts/audit/AbstractAuditWebScript.java +++ b/source/java/org/alfresco/repo/web/scripts/audit/AbstractAuditWebScript.java @@ -63,6 +63,7 @@ public abstract class AbstractAuditWebScript extends DeclarativeWebScript public static final String JSON_KEY_NAME = "name"; public static final String JSON_KEY_PATH = "path"; public static final String JSON_KEY_CLEARED = "cleared"; + public static final String JSON_KEY_DELETED = "deleted"; public static final String JSON_KEY_ENTRY_COUNT = "count"; public static final String JSON_KEY_ENTRIES = "entries"; @@ -115,6 +116,33 @@ public abstract class AbstractAuditWebScript extends DeclarativeWebScript return app; } } + + /** + * Get the entry id from the request. + * + * @return Returns the id or null if not present + */ + protected Long getId(WebScriptRequest req) + { + Map templateVars = req.getServiceMatch().getTemplateVars(); + String id = templateVars.get("id"); + if (id == null || id.length() == 0) + { + return null; + } + else + { + try + { + return Long.parseLong(id); + } + catch (NumberFormatException e) + { + return null; + } + } + } + /** * Get the path from the request. * diff --git a/source/java/org/alfresco/repo/web/scripts/audit/AuditEntryDelete.java b/source/java/org/alfresco/repo/web/scripts/audit/AuditEntryDelete.java new file mode 100644 index 0000000000..9f5621a718 --- /dev/null +++ b/source/java/org/alfresco/repo/web/scripts/audit/AuditEntryDelete.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.web.scripts.audit; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.service.cmr.audit.AuditQueryParameters; +import org.alfresco.service.cmr.audit.AuditService.AuditApplication; +import org.alfresco.service.cmr.audit.AuditService.AuditQueryCallback; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptException; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * @author Mark Rogers + * @since 4.2 + */ +public class AuditEntryDelete extends AbstractAuditWebScript +{ + @Override + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + Map model = new HashMap(7); + + Long id = getId(req); + if (id == null) + { + throw new WebScriptException(Status.STATUS_BAD_REQUEST, "audit.err.entry.id.notProvided"); + } + final List auditEntryIds = new ArrayList(); + + // Need to check that the audit entry actually exists - otherwise we get into a concurrency retry loop + AuditQueryParameters params = new AuditQueryParameters(); + AuditQueryCallback callback = new AuditQueryCallback(){ + + @Override + public boolean valuesRequired() { + return false; + } + + @Override + public boolean handleAuditEntry(Long entryId, + String applicationName, + String user, long time, + Map values) { + auditEntryIds.add(entryId); + return false; + } + + @Override + public boolean handleAuditEntryError(Long entryId, String errorMsg, + Throwable error) + { + return true; + } + + }; + + params.setToId(id); + params.setFromId(id); + auditService.auditQuery(callback, params, 1); + + if(auditEntryIds.size() > 0) + { + // + int deleted = auditService.clearAudit(auditEntryIds); + + model.put(JSON_KEY_DELETED, deleted); + + // Done + if (logger.isDebugEnabled()) + { + logger.debug("Result: \n\tRequest: " + req + "\n\tModel: " + model); + } + return model; + } + else + { + // Not found + throw new WebScriptException(Status.STATUS_NOT_FOUND, "audit.err.entry.id.notfound", id); + } + } +} \ No newline at end of file diff --git a/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java b/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java index af1ad1dcad..c1477ca7b2 100644 --- a/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java +++ b/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java @@ -436,28 +436,14 @@ public class ADMRemoteStore extends BaseRemoteStore } } - private void writeDocument(final String path, final InputStream content) + protected void writeDocument(final String path, final InputStream content) { final String encpath = encodePath(path); final int off = encpath.lastIndexOf('/'); if (off != -1) { // check we actually are the user we are creating a user specific path for - String runAsUser = AuthenticationUtil.getFullyAuthenticatedUser(); - String userId = null; - Matcher matcher; - if ((matcher = USER_PATTERN_1.matcher(path)).matches()) - { - userId = matcher.group(1); - } - else if ((matcher = USER_PATTERN_2.matcher(path)).matches()) - { - userId = matcher.group(1); - } - if (userId != null && userId.equals(runAsUser)) - { - runAsUser = AuthenticationUtil.getSystemUserName(); - } + final String runAsUser = getPathRunAsUser(path); AuthenticationUtil.runAs(new RunAsWork() { @SuppressWarnings("synthetic-access") @@ -497,6 +483,33 @@ public class ADMRemoteStore extends BaseRemoteStore }, runAsUser); } } + + /** + * Get the RunAs user need to execute a Write operation on the given path. + * + * @param path Document path + * @return runas user - will be the Full Authenticated User or System as required + */ + protected String getPathRunAsUser(final String path) + { + // check we actually are the user we are creating a user specific path for + String runAsUser = AuthenticationUtil.getFullyAuthenticatedUser(); + String userId = null; + Matcher matcher; + if ((matcher = USER_PATTERN_1.matcher(path)).matches()) + { + userId = matcher.group(1); + } + else if ((matcher = USER_PATTERN_2.matcher(path)).matches()) + { + userId = matcher.group(1); + } + if (userId != null && userId.equals(runAsUser)) + { + runAsUser = AuthenticationUtil.getSystemUserName(); + } + return runAsUser; + } /** * Updates an existing document. @@ -916,7 +929,7 @@ public class ADMRemoteStore extends BaseRemoteStore rootRef, ContentModel.ASSOC_CONTAINS, assocQName, ContentModel.TYPE_FOLDER, properties); surfConfigRef = ref.getChildRef(); // surf-config needs to be hidden - applies index control aspect as part of the hidden aspect - hiddenAspect.hideNode(ref.getChildRef()); + hiddenAspect.hideNode(ref.getChildRef(), false, false, false); } return surfConfigRef; } diff --git a/source/java/org/alfresco/repo/web/scripts/bean/ShareResourceStore.java b/source/java/org/alfresco/repo/web/scripts/bean/ShareResourceStore.java deleted file mode 100644 index 6cdb261e61..0000000000 --- a/source/java/org/alfresco/repo/web/scripts/bean/ShareResourceStore.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (C) 2005-2010 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.web.scripts.bean; - -import java.io.IOException; -import java.io.InputStream; -import java.net.SocketException; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - -import org.alfresco.model.ContentModel; -import org.alfresco.repo.content.MimetypeMap; -import org.alfresco.repo.model.Repository; -import org.alfresco.repo.model.filefolder.HiddenAspect; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; -import org.alfresco.repo.security.permissions.AccessDeniedException; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.model.FileInfo; -import org.alfresco.service.cmr.model.FileNotFoundException; -import org.alfresco.service.cmr.repository.ContentIOException; -import org.alfresco.service.cmr.repository.ContentReader; -import org.alfresco.service.cmr.repository.ContentService; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.site.SiteService; -import org.alfresco.service.namespace.NamespaceService; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.extensions.webscripts.Status; -import org.springframework.extensions.webscripts.WebScriptException; -import org.springframework.extensions.webscripts.WebScriptResponse; - -public class ShareResourceStore extends BaseRemoteStore -{ - private static final Log logger = LogFactory.getLog(ShareResourceStore.class); - - // service beans - private NodeService nodeService; - private NodeService unprotNodeService; - private FileFolderService fileFolderService; - private NamespaceService namespaceService; - private SiteService siteService; - private ContentService contentService; - private HiddenAspect hiddenAspect; - - - /** - * @param nodeService the NodeService to set - */ - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - - /** - * @param nodeService the NodeService to set - */ - public void setUnprotectedNodeService(NodeService nodeService) - { - this.unprotNodeService = nodeService; - } - - /** - * @param fileFolderService the FileFolderService to set - */ - public void setFileFolderService(FileFolderService fileFolderService) - { - this.fileFolderService = fileFolderService; - } - - /** - * @param namespaceService the NamespaceService to set - */ - public void setNamespaceService(NamespaceService namespaceService) - { - this.namespaceService = namespaceService; - } - - /** - * @param siteService the SiteService to set - */ - public void setSiteService(SiteService siteService) - { - this.siteService = siteService; - } - - /** - * @param contentService the ContentService to set - */ - public void setContentService(ContentService contentService) - { - this.contentService = contentService; - } - - public void setHiddenAspect(HiddenAspect hiddenAspect) - { - this.hiddenAspect = hiddenAspect; - } - - private Repository repositoryHelper; - /** - * - */ - @Override - protected void getDocument(final WebScriptResponse res, final String store, final String path) throws IOException - { - AuthenticationUtil.runAs(new RunAsWork() { - @SuppressWarnings("synthetic-access") - public Void doWork() throws Exception { - final String encpath = encodePath(path); -// -// this.nodeService.getRootNode(storeRef) - NodeRef rootNode = repositoryHelper.getCompanyHome(); - FileInfo fileInfo = null; - List pathElements = new ArrayList(4); - final StringTokenizer t = new StringTokenizer(path, "/"); - while (t.hasMoreTokens()) - { - pathElements.add(t.nextToken()); - } - - try - { - fileInfo = fileFolderService.resolveNamePath(rootNode, pathElements); - - final ContentReader reader; - try - { - reader = contentService.getReader(fileInfo.getNodeRef(), ContentModel.PROP_CONTENT); - if (reader == null || !reader.exists()) - { - throw new WebScriptException("No content found for file: " + encpath); - } - - // establish mimetype - String mimetype = reader.getMimetype(); - if (mimetype == null || mimetype.length() == 0) - { - mimetype = MimetypeMap.MIMETYPE_BINARY; - int extIndex = encpath.lastIndexOf('.'); - if (extIndex != -1) - { - String ext = encpath.substring(extIndex + 1); - String mt = mimetypeService.getMimetypesByExtension().get(ext); - if (mt != null) - { - mimetype = mt; - } - } - } - - // set mimetype for the content and the character encoding + length for the stream - res.setContentType(mimetype); - res.setContentEncoding(reader.getEncoding()); - res.setHeader("Last-Modified", Long.toString(fileInfo.getModifiedDate().getTime())); - res.setHeader("Content-Length", Long.toString(reader.getSize())); - - if (logger.isDebugEnabled()) - logger.debug("getDocument: " + fileInfo.toString()); - - // get the content and stream directly to the response output stream - // assuming the repository is capable of streaming in chunks, this should allow large files - // to be streamed directly to the browser response stream. - try - { - reader.getContent(res.getOutputStream()); - } - catch (SocketException e1) - { - // the client cut the connection - our mission was accomplished apart from a little error message - if (logger.isDebugEnabled()) - logger.debug("Client aborted stream read:\n\tnode: " + encpath + "\n\tcontent: " + reader); - } - catch (ContentIOException e2) - { - if (logger.isInfoEnabled()) - logger.info("Client aborted stream read:\n\tnode: " + encpath + "\n\tcontent: " + reader); - } - catch (Throwable err) - { - if (err.getCause() instanceof SocketException) - { - if (logger.isDebugEnabled()) - logger.debug("Client aborted stream read:\n\tnode: " + encpath + "\n\tcontent: " + reader); - } - else - { - if (logger.isInfoEnabled()) - logger.info(err.getMessage()); - res.setStatus(Status.STATUS_INTERNAL_SERVER_ERROR); - } - } - } - catch (AccessDeniedException ae) - { - res.setStatus(Status.STATUS_UNAUTHORIZED); - } - } - catch (FileNotFoundException e) - { - res.setStatus(Status.STATUS_NOT_FOUND); - } - return null; - } - }, AuthenticationUtil.getSystemUserName()); - - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void lastModified(WebScriptResponse res, String store, String path) throws IOException - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void hasDocument(WebScriptResponse res, String store, String path) throws IOException - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void listDocuments(WebScriptResponse res, String store, String path, boolean recurse) throws IOException - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void listDocuments(WebScriptResponse res, String store, String path, String pattern) throws IOException - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void createDocument(WebScriptResponse res, String store, String path, InputStream content) - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void createDocuments(WebScriptResponse res, String store, InputStream content) - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void updateDocument(WebScriptResponse res, String store, String path, InputStream content) - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - /** - * Returns an HTTP 501 because this class does not support this API - */ - @Override - protected void deleteDocument(WebScriptResponse res, String store, String path) - { - res.setStatus(Status.STATUS_NOT_IMPLEMENTED); - } - - public Repository getRepositoryHelper() - { - return repositoryHelper; - } - - public void setRepositoryHelper(Repository repositoryHelper) - { - this.repositoryHelper = repositoryHelper; - } -} diff --git a/source/java/org/alfresco/repo/web/scripts/googledocs/Status.java b/source/java/org/alfresco/repo/web/scripts/googledocs/Status.java index 04f1bd20af..c99738deef 100644 --- a/source/java/org/alfresco/repo/web/scripts/googledocs/Status.java +++ b/source/java/org/alfresco/repo/web/scripts/googledocs/Status.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -21,12 +21,11 @@ package org.alfresco.repo.web.scripts.googledocs; import java.util.HashMap; import java.util.Map; -import org.alfresco.repo.googledocs.GoogleDocsService; -import org.alfresco.repo.management.subsystems.ApplicationContextFactory; +import org.alfresco.repo.management.subsystems.ChildApplicationContextFactory; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.DeclarativeWebScript; import org.springframework.extensions.webscripts.WebScriptRequest; @@ -47,12 +46,21 @@ public class Status extends DeclarativeWebScript implements ApplicationContextAw @Override protected Map executeImpl(WebScriptRequest req, org.springframework.extensions.webscripts.Status status, Cache cache) { - ApplicationContextFactory subsystem = (ApplicationContextFactory)applicationContext.getBean("googledocs"); - ConfigurableApplicationContext childContext = (ConfigurableApplicationContext)subsystem.getApplicationContext(); - GoogleDocsService googleDocsService = (GoogleDocsService)childContext.getBean("googleDocsService"); - Map model = new HashMap(1); - model.put("enabled", googleDocsService.isEnabled()); + try + { + ChildApplicationContextFactory subsystem = (ChildApplicationContextFactory)applicationContext.getBean("googledocs"); + + // note: getting property (rather than getting googleDocsService bean to check isEnabled) does not cause subsystem startup (if stopped) + // hence providing ability for subsystem to be disabled (whilst still supporting ability to check status and/or dynamically start via JMX) + String isEnabled = (String)subsystem.getProperty("googledocs.googleeditable.enabled"); + + model.put("enabled", isEnabled == null ? false : new Boolean(isEnabled).booleanValue()); + } + catch (NoSuchBeanDefinitionException nsbde) + { + model.put("enabled", false); + } return model; } } diff --git a/source/java/org/alfresco/repo/web/scripts/invite/Invite.java b/source/java/org/alfresco/repo/web/scripts/invite/Invite.java index 329e939fcc..9928aea854 100644 --- a/source/java/org/alfresco/repo/web/scripts/invite/Invite.java +++ b/source/java/org/alfresco/repo/web/scripts/invite/Invite.java @@ -21,7 +21,7 @@ package org.alfresco.repo.web.scripts.invite; import java.util.HashMap; import java.util.Map; -import org.alfresco.repo.admin.SysAdminParams; +import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.service.cmr.invitation.Invitation; import org.alfresco.service.cmr.invitation.InvitationExceptionForbidden; import org.alfresco.service.cmr.invitation.InvitationExceptionUserError; @@ -269,6 +269,10 @@ public class Invite extends DeclarativeWebScript { throw new WebScriptException(Status.STATUS_FORBIDDEN, "Unable to cancel workflow" , fe); } + catch(AccessDeniedException ade) + { + throw new WebScriptException(Status.STATUS_FORBIDDEN, "Unable to cancel workflow" , ade); + } } // handle action not recognised else diff --git a/source/java/org/alfresco/repo/web/scripts/invite/InviteServiceTest.java b/source/java/org/alfresco/repo/web/scripts/invite/InviteServiceTest.java index f6f7300304..7e91640e7d 100644 --- a/source/java/org/alfresco/repo/web/scripts/invite/InviteServiceTest.java +++ b/source/java/org/alfresco/repo/web/scripts/invite/InviteServiceTest.java @@ -143,18 +143,6 @@ public class InviteServiceTest extends BaseWebScriptTest // This MailExecutorAction bean is named "test-mail" but is in all other respects equivalent to the // 'real' executer bean. It is automatically included during OutboundSMTP subsystem startup. - // redeploy invite process definition in case it has been modified - WorkflowDefinition inviteWfDefinition = this.workflowService.getDefinitionByName( - "jbpm$" + WorkflowModelNominatedInvitation.WF_PROCESS_INVITE.toPrefixString(this.namespaceService)); - this.workflowService.undeployDefinition(inviteWfDefinition.id); - ClassPathResource inviteWfResource = new ClassPathResource( - "alfresco/workflow/invitation-nominated_processdefinition.xml"); - workflowService.deployDefinition( - JBPMEngine.ENGINE_ID, inviteWfResource.getInputStream(), MimetypeMap.MIMETYPE_XML); - - // Create new invitee email address list - this.inviteeEmailAddrs = new ArrayList(); - this.transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback(){ @Override @@ -167,6 +155,18 @@ public class InviteServiceTest extends BaseWebScriptTest { public Object doWork() throws Exception { + // redeploy invite process definition in case it has been modified + WorkflowDefinition inviteWfDefinition = workflowService.getDefinitionByName( + "jbpm$" + WorkflowModelNominatedInvitation.WF_PROCESS_INVITE.toPrefixString(namespaceService)); + workflowService.undeployDefinition(inviteWfDefinition.id); + ClassPathResource inviteWfResource = new ClassPathResource( + "alfresco/workflow/invitation-nominated_processdefinition.xml"); + workflowService.deployDefinition( + JBPMEngine.ENGINE_ID, inviteWfResource.getInputStream(), MimetypeMap.MIMETYPE_XML); + + // Create new invitee email address list + inviteeEmailAddrs = new ArrayList(); + // Create inviter person createPerson(PERSON_FIRSTNAME, PERSON_LASTNAME, USER_INVITER, INVITER_EMAIL); diff --git a/source/java/org/alfresco/repo/web/scripts/solr/NodeContentGet.java b/source/java/org/alfresco/repo/web/scripts/solr/NodeContentGet.java index 9394a1f8c6..97ae70dc44 100644 --- a/source/java/org/alfresco/repo/web/scripts/solr/NodeContentGet.java +++ b/source/java/org/alfresco/repo/web/scripts/solr/NodeContentGet.java @@ -178,7 +178,7 @@ public class NodeContentGet extends StreamContent transformerDebug.pushAvailable(reader.getContentUrl(), reader.getMimetype(), MimetypeMap.MIMETYPE_TEXT_PLAIN, options); long sourceSize = reader.getSize(); List transformers = contentService.getActiveTransformers(reader.getMimetype(), sourceSize, MimetypeMap.MIMETYPE_TEXT_PLAIN, options); - transformerDebug.availableTransformers(transformers, sourceSize, "NodeContentGet"); + transformerDebug.availableTransformers(transformers, sourceSize, options, "NodeContentGet"); if (transformers.isEmpty()) { diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java index 1a40973c12..fa723ed3d3 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java @@ -709,7 +709,9 @@ public abstract class AbstractWorkflowRestApiTest extends BaseWebScriptTest // Finish the start-task workflowService.endTask(startTask.getId(), null); - Response getResponse = sendRequest(new GetRequest(URL_TASKS + "/" + startTask.getId()), 200); + WorkflowTask firstTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); + + Response getResponse = sendRequest(new GetRequest(URL_TASKS + "/" + firstTask.getId()), 200); JSONObject jsonProperties = new JSONObject(getResponse.getContentAsString()).getJSONObject("data").getJSONObject("properties"); diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancePut.java b/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancePut.java index 0263788510..f455f9e3ce 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancePut.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancePut.java @@ -27,9 +27,11 @@ import java.util.Map; import javax.servlet.http.HttpServletResponse; +import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.cmr.repository.datatype.TypeConversionException; +import org.alfresco.service.cmr.workflow.WorkflowException; import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.service.namespace.QName; import org.json.JSONArray; @@ -63,31 +65,23 @@ public class TaskInstancePut extends AbstractWorkflowWebscript WorkflowTask workflowTask = workflowService.getTaskById(taskId); String currentUser = authenticationService.getCurrentUserName(); - // if the the current user is able to edit, updating the task is allowed - if (this.workflowService.isTaskEditable(workflowTask, currentUser)) + // read request json + json = new JSONObject(new JSONTokener(req.getContent().getContent())); + + // update task properties + workflowTask = workflowService.updateTask(taskId, parseTaskProperties(json, workflowTask), null, null); + + // task was not found -> return 404 + if (workflowTask == null) { - // read request json - json = new JSONObject(new JSONTokener(req.getContent().getContent())); - - // update task properties - workflowTask = workflowService.updateTask(taskId, parseTaskProperties(json, workflowTask), null, null); - - // task was not found -> return 404 - if (workflowTask == null) - { - throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Failed to find workflow task with id: " + taskId); - } - - // build the model for ftl - Map model = new HashMap(); - model.put("workflowTask", modelBuilder.buildDetailed(workflowTask)); - - return model; - } - else - { - throw new WebScriptException(HttpServletResponse.SC_UNAUTHORIZED, "Failed to update workflow task with id: " + taskId); + throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Failed to find workflow task with id: " + taskId); } + + // build the model for ftl + Map model = new HashMap(); + model.put("workflowTask", modelBuilder.buildDetailed(workflowTask)); + + return model; } catch (IOException iox) { @@ -97,6 +91,14 @@ public class TaskInstancePut extends AbstractWorkflowWebscript { throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Could not parse JSON from request.", je); } + catch (AccessDeniedException ade) + { + throw new WebScriptException(HttpServletResponse.SC_UNAUTHORIZED, "Failed to update workflow task with id: " + taskId, ade); + } + catch (WorkflowException we) + { + throw new WebScriptException(HttpServletResponse.SC_UNAUTHORIZED, "Failed to update workflow task with id: " + taskId, we); + } } @SuppressWarnings("unchecked") diff --git a/source/java/org/alfresco/repo/web/util/AbstractJettyComponent.java b/source/java/org/alfresco/repo/web/util/AbstractJettyComponent.java index 15bb7e3d21..b318cdeaeb 100644 --- a/source/java/org/alfresco/repo/web/util/AbstractJettyComponent.java +++ b/source/java/org/alfresco/repo/web/util/AbstractJettyComponent.java @@ -184,7 +184,7 @@ public abstract class AbstractJettyComponent } catch(Throwable t) { - logger.error("Failed to start Jetty server"); + logger.error("Failed to start Jetty server: " + t); throw new RuntimeException(t); } } diff --git a/source/java/org/alfresco/repo/webdav/DeleteMethod.java b/source/java/org/alfresco/repo/webdav/DeleteMethod.java index c9571850e0..a88d3cd340 100644 --- a/source/java/org/alfresco/repo/webdav/DeleteMethod.java +++ b/source/java/org/alfresco/repo/webdav/DeleteMethod.java @@ -19,10 +19,14 @@ package org.alfresco.repo.webdav; import java.util.List; +import java.util.Timer; +import java.util.TimerTask; import javax.servlet.http.HttpServletResponse; import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; @@ -30,6 +34,7 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.webdav.WebDavService; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.util.FileFilterMode; /** * Implements the WebDAV DELETE method @@ -67,6 +72,11 @@ public class DeleteMethod extends WebDAVMethod implements ActivityPostProducer // Nothing to do in this method } + /** + * @deprecated Hack for MNT-8704: WebDAV:Content does not disappear after being deleted + */ + @Deprecated + private static final Timer deleteHackTimer = new Timer(); /** * Execute the request * @@ -79,7 +89,7 @@ public class DeleteMethod extends WebDAVMethod implements ActivityPostProducer logger.debug("WebDAV DELETE: " + getPath()); } - FileFolderService fileFolderService = getFileFolderService(); + final FileFolderService fileFolderService = getFileFolderService(); NodeRef rootNodeRef = getRootNodeRef(); @@ -102,12 +112,63 @@ public class DeleteMethod extends WebDAVMethod implements ActivityPostProducer checkNode(fileInfo); - NodeService nodeService = getNodeService(); - NodeRef nodeRef = fileInfo.getNodeRef(); + final NodeService nodeService = getNodeService(); + final NodeRef nodeRef = fileInfo.getNodeRef(); + // As this content will be deleted, we need to extract some info before it's no longer available. + String siteId = getSiteId(); + NodeRef deletedNodeRef = fileInfo.getNodeRef(); + FileInfo parentFile = getDAVHelper().getParentNodeForPath(getRootNodeRef(), path); + + // Don't post activity data for hidden files, resource forks etc. + if (!getDAVHelper().isRenameShuffle(path)) + { + postActivity(parentFile, fileInfo, siteId); + } + // MNT-181: working copies and versioned nodes are hidden rather than deleted if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) || nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE)) { + // Mark content as hidden. This breaks many contracts and will be fixed for "ALF-18619 WebDAV/SPP file shuffles" fileFolderService.setHidden(nodeRef, true); + { + // Workaround for MNT-8704: WebDAV:Content does not disappear after being deleted + // Get the current user + final String deleteHackUser = AuthenticationUtil.getFullyAuthenticatedUser(); + // Add a timed task to really delete the file + TimerTask deleteHackTask = new TimerTask() + { + @Override + public void run() + { + RunAsWork deleteHackRunAs = new RunAsWork() + { + @Override + public Void doWork() throws Exception + { + // Ignore if it is NOT hidden: the shuffle may have finished; the operation may have failed + if (!nodeService.exists(nodeRef) || !fileFolderService.isHidden(nodeRef)) + { + return null; + } + + // Since this will run in a different thread, the client thread-local must be set + // or else unhiding the node will not unhide it for WebDAV. + FileFilterMode.setClient(FileFilterMode.Client.webdav); + + // Unhide the node, e.g. for archiving + fileFolderService.setHidden(nodeRef, false); + + // This is the transaction-aware service + fileFolderService.delete(nodeRef); + return null; + } + }; + AuthenticationUtil.runAs(deleteHackRunAs, deleteHackUser); + } + }; + // Schedule a real delete 5 seconds after the current time + deleteHackTimer.schedule(deleteHackTask, 5000L); + } getDAVLockService().unlock(nodeRef); } // We just ensure already-hidden nodes are left unlocked @@ -118,17 +179,8 @@ public class DeleteMethod extends WebDAVMethod implements ActivityPostProducer // A 'real' delete else { - // As this content will be deleted, we need to extract some info before it's no longer available. - String siteId = getSiteId(); - NodeRef deletedNodeRef = fileInfo.getNodeRef(); - FileInfo parentFile = getDAVHelper().getParentNodeForPath(getRootNodeRef(), path); // Delete it fileFolderService.delete(deletedNodeRef); - // Don't post activity data for hidden files, resource forks etc. - if (!getDAVHelper().isRenameShuffle(path)) - { - postActivity(parentFile, fileInfo, siteId); - } } } diff --git a/source/java/org/alfresco/repo/webdav/GetMethod.java b/source/java/org/alfresco/repo/webdav/GetMethod.java index cae4cae89c..e29596ca03 100644 --- a/source/java/org/alfresco/repo/webdav/GetMethod.java +++ b/source/java/org/alfresco/repo/webdav/GetMethod.java @@ -455,7 +455,7 @@ public class GetMethod extends WebDAVMethod rootURL = rootURL + WebDAVHelper.encodeURL(fileInfo.getName(), m_userAgent) + WebDAVHelper.PathSeperator; } // Start with a link to the parent folder so we can navigate back up, unless we are at the root level - if (fileInfo.getNodeRef().equals(getRootNodeRef()) == false) + if (! getDAVHelper().isRootPath(getPath(), getServletPath())) { writer.write(""); writer.write(" getSharedLockTokens() { - checkLockState(); return sharedLockTokens; } @@ -192,6 +195,11 @@ public class LockInfoImpl implements Serializable, LockInfo @Override public void setSharedLockTokens(Set sharedLockTokens) { + if (isExclusive()) + { + throw new IllegalStateException("Cannot add shared lock tokens [" + sharedLockTokens + + "] to exclusive lock [" + toString() + "]"); + } this.sharedLockTokens.clear(); this.sharedLockTokens.addAll(sharedLockTokens); } @@ -204,6 +212,11 @@ public class LockInfoImpl implements Serializable, LockInfo @Override public void addSharedLockToken(String token) { + if (isExclusive()) + { + throw new IllegalStateException("Cannot add shared lock token [" + token + + "] to exclusive lock [" + toString() + "]"); + } sharedLockTokens.add(token); } @@ -340,17 +353,6 @@ public class LockInfoImpl implements Serializable, LockInfo } } - /** - * Sanity check the state of this LockInfo. - */ - private void checkLockState() - { - if (isShared() && isExclusive()) - { - throw new IllegalStateException("Lock cannot be both shared and exclusive: " + toString()); - } - } - /** * Sets the expiry date/time to lockTimeout seconds into the future. Provide * a lockTimeout of WebDAV.TIMEOUT_INFINITY for never expires. diff --git a/source/java/org/alfresco/repo/webdav/LockInfoImplTest.java b/source/java/org/alfresco/repo/webdav/LockInfoImplTest.java index eae565b9a1..d2fa328644 100644 --- a/source/java/org/alfresco/repo/webdav/LockInfoImplTest.java +++ b/source/java/org/alfresco/repo/webdav/LockInfoImplTest.java @@ -20,6 +20,7 @@ package org.alfresco.repo.webdav; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.util.Date; @@ -84,6 +85,45 @@ public class LockInfoImplTest assertEquals(7, lockInfo.getRemainingTimeoutSeconds()); } + @Test(expected=IllegalStateException.class) + public void cannotChangeSharedLockToExclusive() + { + LockInfoImpl lockInfo = new LockInfoImpl(); + lockInfo.addSharedLockToken("shared-token"); + + // Not allowed + lockInfo.setExclusiveLockToken("token"); + } + + @Test(expected=IllegalStateException.class) + public void cannotChangeExclusiveLockToShared() + { + LockInfoImpl lockInfo = new LockInfoImpl(); + lockInfo.setExclusiveLockToken("token"); + + // Not allowed + lockInfo.addSharedLockToken("shared-token"); + } + + public void canSetShared() + { + LockInfoImpl lockInfo = new LockInfoImpl(); + lockInfo.setExclusiveLockToken("exc-token"); + + assertEquals("exc-token", lockInfo.getExclusiveLockToken()); + } + + public void canSetExclusive() + { + LockInfoImpl lockInfo = new LockInfoImpl(); + lockInfo.addSharedLockToken("shared1"); + lockInfo.addSharedLockToken("shared2"); + + assertEquals(2, lockInfo.getSharedLockTokens().size()); + assertTrue(lockInfo.getSharedLockTokens().contains("shared1")); + assertTrue(lockInfo.getSharedLockTokens().contains("shared2")); + } + public static class LockInfoImplEx extends LockInfoImpl { public static final Date DATE_NOW = new Date(86400000); diff --git a/source/java/org/alfresco/repo/webdav/LockMethod.java b/source/java/org/alfresco/repo/webdav/LockMethod.java index f9a5cd6a5a..46b9e8b038 100644 --- a/source/java/org/alfresco/repo/webdav/LockMethod.java +++ b/source/java/org/alfresco/repo/webdav/LockMethod.java @@ -18,6 +18,7 @@ */ package org.alfresco.repo.webdav; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -409,12 +410,23 @@ public class LockMethod extends WebDAVMethod { if (createExclusive) { + if (lockInfo.isLocked() && lockInfo.isShared()) + { + // http://www.webdav.org/specs/rfc2518.html#rfc.section.8.10.6 + throw new WebDAVServerException(WebDAV.WEBDAV_SC_LOCKED); + } + // Lock the node lockInfo.setTimeoutSeconds(getLockTimeout()); lockInfo.setExclusiveLockToken(lockToken); } else { + if (lockInfo.isLocked() && lockInfo.isExclusive()) + { + // http://www.webdav.org/specs/rfc2518.html#rfc.section.8.10.6 + throw new WebDAVServerException(WebDAV.WEBDAV_SC_LOCKED); + } lockInfo.addSharedLockToken(lockToken); } diff --git a/source/java/org/alfresco/repo/webdav/MoveMethod.java b/source/java/org/alfresco/repo/webdav/MoveMethod.java index 90ab31b2ee..990626c032 100644 --- a/source/java/org/alfresco/repo/webdav/MoveMethod.java +++ b/source/java/org/alfresco/repo/webdav/MoveMethod.java @@ -105,15 +105,15 @@ public class MoveMethod extends HierarchicalMethod // check for the existence of the destination node FileInfo destInfo = null; - boolean destExists = false; + boolean destNotHidden = false; try { destInfo = getDAVHelper().getNodeForPath(rootNodeRef, destPath); if (!destInfo.getNodeRef().equals(sourceInfo.getNodeRef())) { - // ALF-7079 fix, if destInfo is a hidden shuffle target then pretend it's not there - destExists = !getFileFolderService().isHidden(destInfo.getNodeRef()); - if (!hasOverWrite() && destExists) + // ALF-7079 (MNT-1601) fix, if destInfo is a hidden shuffle target then pretend it's not there + destNotHidden = !getFileFolderService().isHidden(destInfo.getNodeRef()); + if (!hasOverWrite() && destNotHidden) { if (logger.isDebugEnabled()) { @@ -139,7 +139,7 @@ public class MoveMethod extends HierarchicalMethod moveOrCopy(sourceNodeRef, sourceParentNodeRef, destParentNodeRef, name); // Set the response status - if (!destExists) + if (!destNotHidden) { m_response.setStatus(HttpServletResponse.SC_CREATED); } @@ -200,7 +200,7 @@ public class MoveMethod extends HierarchicalMethod // this is a move if (destFileInfo != null) { - copyContentOnly(sourceNodeRef, destFileInfo, fileFolderService); + copyContentOnly(sourceFileInfo, destFileInfo, fileFolderService); fileFolderService.setHidden(destFileInfo.getNodeRef(), false); if (isMove) { @@ -228,7 +228,7 @@ public class MoveMethod extends HierarchicalMethod else if (getDAVHelper().isRenameShuffle(destPath) && !getDAVHelper().isRenameShuffle(sourcePath)) { destFileInfo = fileFolderService.create(destParentNodeRef, name, ContentModel.TYPE_CONTENT); - copyContentOnly(sourceNodeRef, destFileInfo, fileFolderService); + copyContentOnly(sourceFileInfo, destFileInfo, fileFolderService); fileFolderService.setHidden(sourceNodeRef, true); // As per the WebDAV spec, we make sure the node is unlocked once moved @@ -267,11 +267,24 @@ public class MoveMethod extends HierarchicalMethod } } - private void copyContentOnly(NodeRef sourceNodeRef, FileInfo destFileInfo, FileFolderService fileFolderService) + private void copyContentOnly(FileInfo sourceFileInfo, FileInfo destFileInfo, FileFolderService fileFolderService) throws WebDAVServerException { ContentService contentService = getContentService(); - ContentReader reader = contentService.getReader(sourceNodeRef, ContentModel.PROP_CONTENT); - ContentWriter contentWriter = contentService.getWriter(destFileInfo.getNodeRef(), ContentModel.PROP_CONTENT, true); - contentWriter.putContent(reader); + ContentReader reader = contentService.getReader(sourceFileInfo.getNodeRef(), ContentModel.PROP_CONTENT); + if (reader == null) + { + // There is no content for the node if it is a folder + if (!sourceFileInfo.isFolder()) + { + // Non-folders should have content available. + logger.error("Unable to get ContentReader for source node " + sourceFileInfo.getNodeRef()); + throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); + } + } + else + { + ContentWriter contentWriter = contentService.getWriter(destFileInfo.getNodeRef(), ContentModel.PROP_CONTENT, true); + contentWriter.putContent(reader); + } } } diff --git a/source/java/org/alfresco/repo/webdav/PropFindMethod.java b/source/java/org/alfresco/repo/webdav/PropFindMethod.java index badd1eb612..fd8da1058c 100644 --- a/source/java/org/alfresco/repo/webdav/PropFindMethod.java +++ b/source/java/org/alfresco/repo/webdav/PropFindMethod.java @@ -194,9 +194,9 @@ public class PropFindMethod extends WebDAVMethod throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); } - // A node hidden during a 'shuffle' operation - send a 404 error back to the client, as some Mac clients need - // this - if (getFileFolderService().isHidden(pathNodeInfo.getNodeRef())) + // A node hidden during a 'shuffle' operation - send a 404 error back to the client, as some Mac clients need this + // Note the null check, as root node may be null in cloud. + if (pathNodeInfo.getNodeRef() != null && getFileFolderService().isHidden(pathNodeInfo.getNodeRef())) { throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); } diff --git a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java index 754ad2eb8f..1b3f92ca68 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java @@ -55,6 +55,7 @@ import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.util.EqualsHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.surf.util.URLDecoder; @@ -498,6 +499,12 @@ public class WebDAVHelper return fileInfo; } + public boolean isRootPath(String path, String servletPath) + { + // Check for the root path + return( path.length() == 0 || path.equals(PathSeperator) || EqualsHelper.nullSafeEquals(path, servletPath)); + } + public final FileInfo getParentNodeForPath(NodeRef rootNodeRef, String path) throws FileNotFoundException { if (rootNodeRef == null) @@ -999,7 +1006,7 @@ public class WebDAVHelper } // Ensure the prefix ends in the path separator. - if (urlStr.charAt(urlStr.length() - 1) != PathSeperatorChar) + if (urlStr.length() == 0 || urlStr.charAt(urlStr.length() - 1) != PathSeperatorChar) { urlStr.append(PathSeperator); } diff --git a/source/java/org/alfresco/repo/webdav/auth/AuthenticationFilter.java b/source/java/org/alfresco/repo/webdav/auth/AuthenticationFilter.java index d6b9a8c9dd..7a6b3ad50e 100644 --- a/source/java/org/alfresco/repo/webdav/auth/AuthenticationFilter.java +++ b/source/java/org/alfresco/repo/webdav/auth/AuthenticationFilter.java @@ -222,7 +222,7 @@ public class AuthenticationFilter extends BaseAuthenticationFilter implements De // Check if the user is authenticated, if not then prompt again - if ( user == null && !WebDAV.METHOD_OPTIONS.equalsIgnoreCase(httpReq.getMethod())) + if (user == null) { if (logger.isDebugEnabled()) logger.debug("No user/ticket, force the client to prompt for logon details."); diff --git a/source/test/java/org/alfresco/repo/cmis/ws/CXFAuthenticationTest.java b/source/test/java/org/alfresco/repo/cmis/ws/CXFAuthenticationTest.java new file mode 100644 index 0000000000..a5f3e7308b --- /dev/null +++ b/source/test/java/org/alfresco/repo/cmis/ws/CXFAuthenticationTest.java @@ -0,0 +1,56 @@ +package org.alfresco.repo.cmis.ws; + +import org.alfresco.repo.web.scripts.BaseWebScriptTest; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.TestWebScriptServer.PostRequest; + +public class CXFAuthenticationTest extends BaseWebScriptTest +{ + + // RepositoryServicePort used in AbstractServiceTest substitutes #PasswordDigest + // if Type is not set explicitly, so sending POST requests directly to remote Alfresco to test the case + private static RemoteServer remoteServer = new RemoteServer(); + + protected void setUp() throws Exception + { + super.setRemoteServer(remoteServer); + super.setUp(); + } + + public void testValidPasswordTypeCXFLogin() throws Exception + { + String cxfEndpoint = CmisServiceTestHelper.ALFRESCO_URL + "/cmis/RepositoryService"; + String postBody = "" + + "" + + "" + + "" + + "" + + "" + CmisServiceTestHelper.USERNAME_ADMIN +"" + + "" + CmisServiceTestHelper.PASSWORD_ADMIN + "" + + "" + + "" + + "" + + ""; + sendRequest(new PostRequest(cxfEndpoint, postBody, "text/xml"), Status.STATUS_OK); + } + + // Post request without PasswordType + public void testInvalidPasswordTypeCXFLogin() throws Exception + { + String cxfEndpoint = CmisServiceTestHelper.ALFRESCO_URL + "/cmis/RepositoryService"; + String postBody = "" + + "" + + "" + + "" + + "" + + "" + + ""+ CmisServiceTestHelper.USERNAME_ADMIN +"" + + ""+ CmisServiceTestHelper.PASSWORD_ADMIN +"" + + "" + + "" + + "" + + ""; + sendRequest(new PostRequest(cxfEndpoint, postBody, "text/xml"), Status.STATUS_OK); + } + +}