The root cause here is that we accidentally made a breaking change when
we removed the spell checking logic. We changed the
CONTEXT_DICTIONARY_FILE constant from "context.tlx" to string.Empty.
That means in the WriteSpellingContextDictionary() and
ReadSpellingContextDictionary() methods, we were resolving a dictionary
path as Path.Combine(SpellingContextDirectory, string.Empty); and then
tried to create a FileStream on a directory. The fix here is simple,
just change the dictionary filename back to "context.tlx".
The OAuth access token expires quickly (every hour) and we get an HTTP
403 error code when we attempt to call a Picasa API with an expired
access token. The BloggerService class provided by the Google API Client
library for .NET takes care of automatically refreshing the access token
when calling the Blogger API. This is not true of our Picasa
integration, which features direct HTTP requests to the Picasa API
endpoint, so I've added code to catch the HTTP 403 error code and force
refresh the access token.
in GetUserBlogs(), I had a return statement on the inner loop, not after
all blogs were added to list.
Verified that the proper XML RPC URL was saved, so as to not confuse
blogs using the same multisite installation.
Adjusted the exception thrown to mark the proper call method.
Squirrel is blowing away the entire %localappdata%\OpenLiveWriter folder
each upgrade, so to avoid OAuth tokens being lost on each upgrade we put
them over in %appdata%\OpenLiveWriter instead.
There was an issue around the first time the project built, the JSON
file was not getting included into the project because it hadn't been
generated yet. Moving the creation of the JSON file into a centralized
writer.build.targets fixed this.
The Google Blogger v3 API doesn't use the Atom protocol, so I added a
new Google Blogger v3 client to handle the connection instead. I updated
the Google Blogger detector to use the new OAuth APIs when attempting to
detect a Google Blogger blog. I also had to change some logic around for
homepage URLs. The main difference in the Google Blogger flow is that
the homepage URL isn't known until after the credentials are authorized.
All other blogs require the user to type in the homepage URL manually
before authorization happens, so I had to change some logic for this to
work properly.
The 'Sign in' button now automatically disables itself and changes text
dynamically to help make sure users know when they need to click it,
made the authentication panel automatically click the 'Next' button on
behalf of the user when it detects valid user credentials. I also
changed the FileDataStore to store one OAuth2 token per blog rather than
create a new folder per blog.
Most blog APIs take a simple username/password pair and our
IBlogCredentials are based around this concept. For OAuth, there is more
to store than just a simple username/password. The Google APIs already
provide an option to automatically handle the data storage for the
OAuth, so I'm using that instead.
Telligent Community hasn't been called "Community Server" since version
4.x. The metablog URL was updated in 8.x so the suggested URL when
picking "Community Server" no longer works.
- Updating the naming of "Community Server" to "Telligent Community"
- Adding new provider for "Telligent Community 8.0+" with updated URL
pattern and supporting in all markets
Google asked us not to check in the client id and client secret into the
source. Instead, we'll generate a client_secrets.json at runtime based
on environment variables. Developers that want to build the source code
locally will need to supply their own client ID and client secret. For
the official Open Live Writer installer, we'll make sure the client ID
and client secret are set to the official Open Live Writer client.
Fix postinstaller to be more tolerant: (i) Use quote marks to ensure spaces in the user profile directory (e.g. C:\Users\Tim Sneath) don't break the batch file; (ii) fail more gently if Nuget.exe isn't in the %localappdata% directory, since it's not installed by default with Visual Studio.