[SqueakSource] Changing the Root URL
David Tibbe
david.tibbe at student.hpi.uni-potsdam.de
Wed May 2 15:33:18 UTC 2007
Hi,
I've wanted to set up a SqueakSource, but that instance should not run
at the root URL. Changing the Root URL in the Repository Settings just
change it in some links.
So I introduced SSRepository class>>defaultPath which returns
'/squeaksource' for example. In that case, the whole repository would be
accessible from http://www.example.org/squeaksource/.
The change set containing my changes is attached to this mail.
I've also modified SSRepository>>superUserEmail. It did not work if no
superuser is in the repository and no superUserEmail is set in the
properties.
The changes were made to SqueakSource-lr.1016.mcz from
http://www.squeaksource.com/ss.html
Maybe it's helpful for some others or will be adapted in further versions.
Regards,
David
-------------- next part --------------
'From Squeak3.9 of 7 November 2006 [latest update: #7067] on 29 April 2007 at 9:36:09 pm'!
SSModel subclass: #SSRepository
instanceVariableNames: 'title members projects groups properties tags '
classVariableNames: 'Current Statistics StatisticsThread Storage RootUrl '
poolDictionaries: ''
category: 'SqueakSource-Model'!
!SSFrame methodsFor: 'accessing' stamp: 'dt 4/29/2007 21:14'!
actions
| controller path |
controller _ self component activeController.
path _ SSRepository defaultPath, '/feed.rss'.
^ Array streamContents: [ :stream |
self isHome ifTrue: [
stream nextPutAll: (Array with: 'RSS feed' with: path);
nextPutAll: #(
'Register Member' #registerMember
'Register Group' #registerGroup
'Register Project' #registerProject ).
self session isSuperUser ifTrue: [
stream nextPutAll: #('Edit Settings' #editSettings)]].
(controller respondsTo: #actions)
ifTrue: [ stream nextPutAll: controller actions ] ]! !
!SSKom class methodsFor: 'accessing' stamp: 'dt 4/29/2007 18:04'!
default
| application |
application _ (WAApplication path: SSRepository defaultPath )
sessionClass: SSSession;
preferenceAt: #entryPoint put: SSFrame;
preferenceAt: #showToolbar put: false;
preferenceAt: #errorPage put: WAEmailErrorPage;
yourself.
^self handler: application! !
!SSRepository methodsFor: 'accessing-settings' stamp: 'dt 4/29/2007 19:47'!
superUserEmail
^ self properties
at: #superUserEmail
ifAbsent: [String streamContents: [:strm |
self members ifNotEmpty: [
self members do: [:ea |
ea isSuperUser ifTrue: [
strm nextPutAll: ea email; nextPut: $,]].
strm skip: -1]]].
! !
!SSRepository class methodsFor: 'private' stamp: 'dt 4/29/2007 21:32'!
defaultPath
^'/squeaksource'! !
!SSRepository class methodsFor: 'private' stamp: 'dt 4/29/2007 19:16'!
defaultRootUrl
| hostName |
hostName _ NetNameResolver nameForAddress: (NetNameResolver localHostAddress) timeout: 5.
hostName ifNil: [hostName _ NetNameResolver localAddressString].
^'http://', hostName, ':', self defaultPort asString, self defaultPath, '/'! !
!SSSession methodsFor: 'private' stamp: 'dt 4/29/2007 21:30'!
getFile: aProject
| fileName accessPath |
accessPath _ self request accessPath.
(SSRepository defaultPath count: [:each | each = $/]) timesRepeat: [
accessPath ifNotEmpty: [accessPath removeFirst]].
fileName _ accessPath second.
"rss feed"
fileName = 'feed.rss'
ifTrue: [ ^self getRss: aProject ].
"robots.txt"
fileName = 'robots.txt'
ifTrue: [ ^self getRobotsTxt ].
aProject configs at: fileName
ifPresent: [:aConfig | ^ self getConfig: aConfig].
fileName = 'blessed'
ifTrue: [ accessPath size > 2
ifTrue: [fileName _ accessPath third]
ifFalse: [^ self getBlessed: aProject]].
"mc diff"
(fileName endsWith: MCMcdReader extension)
ifTrue: [^self getDiff: fileName from: aProject].
"ancestory graph"
SSGraphBuilder formats do: [ :each |
(fileName endsWith: '.' , each)
ifTrue: [ ^self getFile: fileName for: aProject ] ].
"mcz"
self getVersion: fileName from: aProject! !
!SSSession methodsFor: 'actions' stamp: 'dt 4/29/2007 21:30'!
getRequest: aProject
| accessPath |
self expire.
accessPath _ self request accessPath.
(SSRepository defaultPath count: [:each | each = $/]) timesRepeat: [
accessPath ifNotEmpty: [accessPath removeFirst]].
accessPath size > 1
ifTrue: [ self getFile: aProject ]
ifFalse: [ self getListing: aProject ] ! !
!SSSession methodsFor: 'actions' stamp: 'dt 4/29/2007 21:30'!
putRequest: aProject
| author data version response blessed accessPath |
self expire.
accessPath _ self request accessPath.
(SSRepository defaultPath count: [:each | each = $/]) timesRepeat: [
accessPath ifNotEmpty: [accessPath removeFirst]].
(self isAllowed: SSAccessPolicy write in: aProject)
ifFalse: [ self authentificateProject: aProject ].
author _ self user ifNil: [ SSMember anonymousMember ].
self storage log: 'PUT ', self request url, ' (', author initials, ')'.
data _ self request at: 'PUTData'.
(self request url endsWith: '.mcm')
ifTrue: [aProject addConfig: data author: author url: self request url]
ifFalse: [version _ aProject addVersion: data author: author].
(version notNil and: [ accessPath second = 'blessed'])
ifTrue: [blessed _ true.
aProject
blessVersion: version
ifForbidden: [ blessed _ false] ].
self save.
response _ SSCreatedResponse new.
blessed ifNotNil: [
blessed
ifTrue: [ response nextPutAll: 'Version blessed' ]
ifFalse: [ response nextPutAll: 'Version NOT blessed' ] ].
self returnResponse: response! !
!SSSession methodsFor: 'request handling' stamp: 'dt 4/29/2007 21:30'!
createRootFromRequest: aRequest
"Make a project home page for projectname.html"
| accessPath frame |
frame _ super createRootFromRequest: aRequest.
accessPath _ self request accessPath.
(SSRepository defaultPath count: [:each | each = $/]) timesRepeat: [
accessPath ifNotEmpty: [accessPath removeFirst]].
accessPath isEmpty ifFalse: [
(self projectNamed: (accessPath first copyUpToLast: $.))
ifNotNilDo: [:project | frame setComponent: project view]].
^ frame! !
!SSSession methodsFor: 'request handling' stamp: 'dt 4/29/2007 21:30'!
handleProject: aSymbol
" This method looks-up the project if outside a seaside-session and if successfull initializes a stateless environment with error-handler and escape continuation that can be used similarly while while inside a session. "
| actionDictionary |
^self withErrorHandler: [
self withEscapeContinuation: [
| accessPath project |
accessPath _ self request accessPath.
(SSRepository defaultPath count: [:each | each = $/]) timesRepeat: [
accessPath ifNotEmpty: [accessPath removeFirst]].
project _ self
projectNamed: accessPath first
ifNotAllowed: [ :pjct | self authentificateProject: pjct ].
project isNil
ifTrue: [
actionDictionary _ Dictionary new
at: 'feed.rss' put: [ self getRss ];
at: 'sitemap.xml.gz' put: [ self getSitemapZipped ];
at: 'robots.txt' put: [ self getRobotsTxt ];
at: self repository faviconFilename put: [ self getFavicon ];
yourself.
(actionDictionary
at: accessPath first
ifAbsent: [ self errorNotFound: accessPath first ]) value ]
ifFalse: [ self perform: aSymbol with: project ] ] ]! !
!SSSession methodsFor: 'request handling' stamp: 'dt 4/29/2007 21:30'!
wantsSessionForRequest: aRequest
"We want to start a regular session if the path is empty or a project home page (projectname.html)"
| accessPath fileName baseName |
accessPath _ self request accessPath.
(SSRepository defaultPath count: [:each | each = $/]) timesRepeat: [
accessPath ifNotEmpty: [accessPath removeFirst]].
"first visit, a url without a path"
accessPath isEmpty ifTrue: [^true].
"project listing"
accessPath size > 1 ifTrue: [^false].
fileName _ accessPath first.
(fileName endsWith: '.html') ifFalse: [^false].
baseName _ fileName copyUpToLast: $. .
^ (self projectNamed: baseName) notNil! !
SSModel subclass: #SSRepository
instanceVariableNames: 'title members projects groups properties tags'
classVariableNames: 'Current RootUrl Statistics StatisticsThread Storage'
poolDictionaries: ''
category: 'SqueakSource-Model'!
More information about the Squeak-dev
mailing list
|