[Code] Locking down the API
-
From this post - just another in a long series of similar posts I did a wee experiment:
!!!!!API-LockDown.rb
<span class="syntaxdefault"><br />require </span><span class="syntaxstring">'sketchup.rb'<br /></span><span class="syntaxdefault">require </span><span class="syntaxstring">'extensions.rb'<br /></span><span class="syntaxdefault">require </span><span class="syntaxstring">'langhandler.rb'<br /><br /></span><span class="syntaxkeyword">Array.</span><span class="syntaxdefault">freeze<br />Bignum</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Binding</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Comparable</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Continuation</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Data</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Dir</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Enumerable</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Exception</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />FalseClass</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />File</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />FileTest</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Fixnum</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Float</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Geom</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Hash</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />IO</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Integer</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Interrupt</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span><span class="syntaxcomment">#Kernel.freeze<br /></span><span class="syntaxdefault">LanguageHandler</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Length</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Marshal</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />MatchData</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Math</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Method</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span><span class="syntaxcomment">#Module.freeze<br /></span><span class="syntaxdefault">NilClass</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Numeric</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span><span class="syntaxcomment">#Object.freeze<br /></span><span class="syntaxdefault">Precision</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Proc</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Process</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Range</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Regexp</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SKSocket</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Set</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Signal</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SignalException</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SketchupExtension</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />String</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Struct</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Symbol</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SystemExit</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Test</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Thread</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />ThreadGroup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Time</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />TrueClass</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />UnboundMethod</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span>After I placed this in the plugins folder, ensuring it's alphabetically first, I would get errors for every plugin that tries to mess around with Ruby's base classes and SketchUp's own classes.
With a plain vanilla installation in SU7 I get errors with Dynamic Components. Because it tries to add methods to the SketchUp classes.
The list was compiled from the root modules/classes of plain vanilla SketchUp7. I removed the sub-classes/modules and also the Error classes.
This can be useful in debugging - as you completely lock down the core of SU's API - preventing changes from other plugins. Saves you from looking into every RB files installed. And also catches whatever RBS files might try to do. (Though I'm not sure what error message you get then - if it's of any use.)
As you see, Kernel, Object, Class and Module is not frozen - that just cause havoc. There might be more classes that should not be frozen - I don't know. Haven't tested yet.
I would not freeze modules and classes in production code! This is just for personal debugging!
-
@thomthom said:
... I get errors with Dynamic Components. Because it tries to add methods to the SketchUp classes.
It NEEDS to modify several classes, so you will need to add a
require('dynamiccomponents.rb')at the top of the file, before freezing.You can shorten the file using
ObjectSpace.each_object()iterators:Freezes the 93 API modules and classes:
# Freeze the 93 API modules and classes; ObjectSpace.each_object(Module) {|o| o.freeze if o.name =~ /DC|Dynamic|Geom|Sketchup|UI/ } -
@dan rathbun said:
You can shorten the file using
ObjectSpace.each_object()iterators:I'm locking down more than the API - also the Ruby core classes.
@dan rathbun said:
It NEEDS to modify several classes, so you will need to add a require('dynamiccomponents.rb') at the top of the file, before freezing.
Well, "needs"... ...they chose to. But yes. One adds exceptions as one pleases. This list is just a boilerplate lock-down.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register LoginAdvertisement