Skip to content

Commit b96e456

Browse files
committed
find iri#issue
1 parent dd96643 commit b96e456

2 files changed

Lines changed: 49 additions & 8 deletions

File tree

src/authn/SolidAuthnLogic.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ export class SolidAuthnLogic implements AuthnLogic {
1717
currentUser(): NamedNode | null {
1818
const app = appContext()
1919
if (app.viewingNoAuthPage) {
20+
debug.log(`currentUser: viewingNoAuthPage webId=${app.webId}`)
2021
return sym(app.webId)
2122
}
2223
if (this && this.session && this.session.info && this.session.info.webId && this.session.info.isLoggedIn) {
24+
debug.log(`currentUser: session webId=${this.session.info.webId}`)
2325
return sym(this.session.info.webId)
2426
}
27+
debug.log('currentUser: no user found, falling back to offlineTestID')
2528
return offlineTestID() // null unless testing
2629
}
2730

src/typeIndex/typeIndexLogic.ts

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,22 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
1919
if (!user) throw new Error('loadTypeIndexesFor: No user given')
2020
const profile = await profileLogic.loadProfile(user)
2121

22-
const suggestion = suggestPublicTypeIndex(user)
23-
let publicTypeIndex
22+
let suggestion: NamedNode | null = null
2423
try {
25-
publicTypeIndex = await utilityLogic.followOrCreateLink(user, ns.solid('publicTypeIndex') as NamedNode, suggestion, profile)
24+
suggestion = suggestPublicTypeIndex(user)
2625
} catch (err) {
27-
const message = `User ${user} has no pointer in profile to publicTypeIndex file.`
26+
const message = `User ${user} has no usable profile document directory for publicTypeIndex.`
2827
debug.warn(message)
2928
}
29+
let publicTypeIndex
30+
if (suggestion) {
31+
try {
32+
publicTypeIndex = await utilityLogic.followOrCreateLink(user, ns.solid('publicTypeIndex') as NamedNode, suggestion, profile)
33+
} catch (err) {
34+
const message = `User ${user} has no pointer in profile to publicTypeIndex file.`
35+
debug.warn(message)
36+
}
37+
}
3038
const publicScopes = publicTypeIndex ? [{ label: 'public', index: publicTypeIndex as NamedNode, agent: user }] : []
3139

3240
let preferencesFile
@@ -40,11 +48,19 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
4048
if (preferencesFile) { // watch out - can be in either as spec was not clear. Legacy is profile.
4149
// If there is a legacy one linked from the profile, use that.
4250
// Otherwiae use or make one linked from Preferences
43-
const suggestedPrivateTypeIndex = suggestPrivateTypeIndex(preferencesFile)
51+
let suggestedPrivateTypeIndex: NamedNode | null = null
52+
try {
53+
suggestedPrivateTypeIndex = suggestPrivateTypeIndex(preferencesFile)
54+
} catch (err) {
55+
const message = `User ${user} has no usable preferences document directory for privateTypeIndex.`
56+
debug.warn(message)
57+
}
4458
let privateTypeIndex
4559
try {
4660
privateTypeIndex = store.any(user, ns.solid('privateTypeIndex'), undefined, profile) ||
47-
await utilityLogic.followOrCreateLink(user, ns.solid('privateTypeIndex') as NamedNode, suggestedPrivateTypeIndex, preferencesFile)
61+
(suggestedPrivateTypeIndex
62+
? await utilityLogic.followOrCreateLink(user, ns.solid('privateTypeIndex') as NamedNode, suggestedPrivateTypeIndex, preferencesFile)
63+
: null)
4864
} catch (err) {
4965
const message = `User ${user} has no pointer in preference file to privateTypeIndex file.`
5066
debug.warn(message)
@@ -109,13 +125,35 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
109125
return scopedAppInstances.map(scoped => scoped.instance)
110126
}
111127

128+
function docDirUri(node: NamedNode): string | null {
129+
const doc = node.doc()
130+
const dir = doc.dir()
131+
if (dir?.uri) return dir.uri
132+
const docUri = doc.uri
133+
if (!docUri) {
134+
debug.log(`docDirUri: missing doc uri for ${node?.uri}`)
135+
return null
136+
}
137+
const withoutFragment = docUri.split('#')[0]
138+
const lastSlash = withoutFragment.lastIndexOf('/')
139+
if (lastSlash === -1) {
140+
debug.log(`docDirUri: no slash in doc uri ${docUri}`)
141+
return null
142+
}
143+
return withoutFragment.slice(0, lastSlash + 1)
144+
}
145+
112146
function suggestPublicTypeIndex(me: NamedNode) {
113-
return sym(me.doc().dir()?.uri + 'publicTypeIndex.ttl')
147+
const dirUri = docDirUri(me)
148+
if (!dirUri) throw new Error(`suggestPublicTypeIndex: Cannot derive directory for ${me.uri}`)
149+
return sym(dirUri + 'publicTypeIndex.ttl')
114150
}
115151
// Note this one is based off the pref file not the profile
116152

117153
function suggestPrivateTypeIndex(preferencesFile: NamedNode) {
118-
return sym(preferencesFile.doc().dir()?.uri + 'privateTypeIndex.ttl')
154+
const dirUri = docDirUri(preferencesFile)
155+
if (!dirUri) throw new Error(`suggestPrivateTypeIndex: Cannot derive directory for ${preferencesFile.uri}`)
156+
return sym(dirUri + 'privateTypeIndex.ttl')
119157
}
120158

121159
/*

0 commit comments

Comments
 (0)